Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

COM Port und Verbindung mit AVR Controller

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
gordon



Anmeldungsdatum: 16.01.2008
Beiträge: 13

BeitragVerfasst am: 20.09.2009, 10:52    Titel: COM Port und Verbindung mit AVR Controller Antworten mit Zitat

Hallo,

ich habe auf der einen Seite einen Microcontroller ATMEGA und auf
der anderen Seite einen PC.
Beide habe ich über eine COM-Verbindung verbunden.
Über ein Terminalprogramm kann ich Daten lesen und schreiben.
Über mein FB Programm kann ich Daten lesen und auch meine
Steuerbefehle senden.
Ein Wert als SINGLE kann ich nicht sende aber im Terminalprogramm
funktioniert das.
z.B.:
Steuerbefehl "S" wird gesendet MC führt dann Input Befehl aus
der Wert solte dann gesendet weden. (im MC Variable auch Single)
Hier mein Listing:
********************************
dim sw_eingabe as single
dim wert as single
dim t as string * 2

open Com "com10:9600,n,8,1,cs0,cd0,ds0,rs" for random as #1

prg:
cls
if err <> 0 Then
print "Error opening USB/COM Port"
sleep
end
end if

locate 3,3
input" Eingabe Sollwert...: ",sw_eingabe
print #1,"S" 'senden der Anfrage Sollwert
sleep 200,0
print #1,sw_eingabe
sleep 200,0
print #1,"C"
input #1,wert
print " Im Regler ";wert
input " Eingabe y = weiter / n = Ende ", t

if t = "y" then
goto prg
else
close 1
end
end if
end
*******************************

Was mache ich falsch?

Danke Gordon
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 20.09.2009, 12:00    Titel: Antworten mit Zitat

Hallo,

in welchem Format erwartet dein Mikrocontrollerprogramm denn den SINGLE-Wert? Falls die Schreibweise als Dezimalbruch gewünscht wird, mit wie vielen Nachkommastellen und welchem Dezimaltrennzeichen soll der Wert ausgegeben werden?

Viele Grüße!
Sebastian
_________________

Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
gordon



Anmeldungsdatum: 16.01.2008
Beiträge: 13

BeitragVerfasst am: 20.09.2009, 12:14    Titel: Antworten mit Zitat

Hallo Sebastian,

der Wert soll als Dezimalbruch übertragen werden.
im bereich von -50.0 bis 50.0.(Temperatur)
Also mit einer Stelle nach dem Komma.
Bei Eingabe über das Terminalprogramm war das egal.
Ich möchte das gern verstehen.

Danke!
Gordon
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 20.09.2009, 13:05    Titel: Antworten mit Zitat

Hallo,

funktioniert es vielleicht so? Code-Vorschlag: http://www.freebasic-portal.de/porticula/code-vorschlag-com-port-formatierter-single-wert-924.html

Viele Grüße!
Sebastian
_________________

Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
frebas



Anmeldungsdatum: 20.06.2008
Beiträge: 245

BeitragVerfasst am: 20.09.2009, 20:24    Titel: Antworten mit Zitat

du könntest auch statt 50,0 500 verschicken und bei z.B. 23,4° 234, so würde ich das machen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
gordon



Anmeldungsdatum: 16.01.2008
Beiträge: 13

BeitragVerfasst am: 21.09.2009, 07:32    Titel: Antworten mit Zitat

Hallo Sebastian,

ich habe das geänderte Programm getestet, aber es hat auch nicht
funktioniert!
Auch ganze Zahlen werden nicht übertragen!

Ausschnitt MC (Bascom):

Serdata = Inkey()
If Serdata = "S" Then
Input Sollwert
' ***** Parameter in den EEPROM Speicher schreiben *****
Writeeeprom Sollwert , 10 ' in den EEPROMSpeicher schreiben
End If

Mit dem Terminalprogramm funktioniert es ohne Probleme.
Der INPUT Befehl im Controller wird durch das "S" aktiviert.
Dieser Zustand funktioniert auch aus dem FB Programm.
Ich kann auch eine "5.7" die ich mit dem TP übertragen habe
mit dem FB Programm wieder ohne Probleme auslesen.
Meine Eingabe im TP erfolgt so.
1. Step: Shift + s
2. Step: Eingabe 5.7 + ENTER
Fertig!

Das senden der Steuerzeichen zum Auslesen funktioniert
mit FB ohne Probleme.
Das Einlesen von Isttemperaturen und Sollwerten als Single
mit FB auch ohne Probleme.

Wo könnte der Unterschied zwischen TP und FB beim senden liegen.

Danke!
Gordon
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 21.09.2009, 12:31    Titel: Antworten mit Zitat

Hallo,

dann versuch doch vielleicht mal, mit dem FB-Programm einen festen Wert zu übermitteln (z.B. "5.50"). So ließe sich schon mal feststellen, ob es an der Formatierung der SINGLE-Wertausgabe liegen könnte:
Code:
dim sw_eingabe as single
dim wert as single
dim t as string * 2

open Com "com10:9600,n,8,1,cs0,cd0,ds0,rs" for random as #1

prg:
cls
if err <> 0 Then
print "Error opening USB/COM Port"
sleep
end
end if

locate 3,3
input" Eingabe Sollwert...: ",sw_eingabe
print #1,"S" 'senden der Anfrage Sollwert
sleep 200,0
print #1, "5.50" '<= Zum Testen!   Auskommentiert: sw_eingabe
sleep 200,0
print #1,"C"
input #1,wert
print " Im Regler ";wert
input " Eingabe y = weiter / n = Ende ", t

if t = "y" then
goto prg
else
close 1
end
end if
end

Vielleicht kann aber auch die INPUT-Funktion des BASCOM-AVR die Daten nur nicht schnell genug verarbeiten. Innerhalb der PRINT-Ausgabe des SINGLE-Werts findet ja zwischen den einzelnen Zeichen keine nennenswerte Verzögerung statt. Gibt man hingegen in HyperTerminal o.ä. den Wert manuell ein, hat man ja mindestens 300ms Verzögerung zwischen den einzelnen Zeichen des Werts.
Wenn auch die Ausgabe eines festen Werts nicht funktionieren sollte, müsste man vielleicht mal versuchen, da anzusetzen, also den Wert Zeichen für Zeichen etwas langsamer auszugeben.

Viele Grüße!
Sebastian
_________________

Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
gordon



Anmeldungsdatum: 16.01.2008
Beiträge: 13

BeitragVerfasst am: 21.09.2009, 13:59    Titel: Antworten mit Zitat

Hallo,

so hatte ich es schon vor dem Forum probiert.
Der INPUT Befehl von Bascom wartet auf ENTER vom TP und
danach läuft das Programm erst weiter.

Bascom UART INPUT Beschreibung:
Diese Funktion arbeitet intern nach der Poll-Methode und kehrt erst zurück, wenn alle angegebenen Bytes empfangen wurden. Will man mit Input z.B. Zeichen in einen String einlesen, der mit 10 Bytes Länge dimensioniert wurde, dann kehrt Input erst zurück, wenn tatsächlich 10 Bytes empfangen wurden, vorher nicht(!). Das kann beim Test im Terminalprogramm den Eindruck erwecken, als wenn das Programm hängengeblieben ist. Analog gilt dies für Integer: Hat man eine Variable z.B. als WORD dimensioniert, dann kehrt Input erst zurück, wenn 2 Bytes empfangen wurden - ein WORD besteht nun einmal aus zwei Bytes.

Gruß Gordon
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
gordon



Anmeldungsdatum: 16.01.2008
Beiträge: 13

BeitragVerfasst am: 21.09.2009, 14:07    Titel: Antworten mit Zitat

Hallo nochmal,

der INPUT Befehl in Bascom wartet nach der Datenübertragung auf "CARRIAGE RETURN"(CR).

Gruß Gordon
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 21.09.2009, 14:21    Titel: Antworten mit Zitat

gordon hat Folgendes geschrieben:
so hatte ich es schon vor dem Forum probiert.
Der INPUT Befehl von Bascom wartet auf ENTER vom TP und
danach läuft das Programm erst weiter.

Code:
print #1, "5.50" '<= Zum Testen!   Auskommentiert: sw_eingabe

sollte normalerweise einen Zeilenumbruch mitsenden. PRINT schließt automatisch mit "Enter" (CrLf = Chr(13,10)) ab, wenn kein Semikolon ans Ende der Zeile angefügt wird. verwundert

Welchen Datentyp hat eigentlich Sollwert im BASCOM-Programm?
gordon hat Folgendes geschrieben:
Analog gilt dies für Integer: Hat man eine Variable z.B. als WORD dimensioniert, dann kehrt Input erst zurück, wenn 2 Bytes empfangen wurden - ein WORD besteht nun einmal aus zwei Bytes.

Erwartet INPUT, mit dem die Variable eingelesen wird, da nicht vielleicht die "Rohdaten" der 4 Bytes langen Gleitkommazahl-Variable statt eines formatierten Dezimalbruchstrings? Wenn es sich bei Sollwert um keinen String handelt, sind vermutlich die Binärdaten gefragt.
Andererseits scheint es ja zu funktionieren, wenn du die Zahl als "plain text" im Terminal eingibst oder sendest du die 4-Byte-Variable da als Hexstring oder so?
_________________

Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
gordon



Anmeldungsdatum: 16.01.2008
Beiträge: 13

BeitragVerfasst am: 21.09.2009, 15:38    Titel: Antworten mit Zitat

Hallo,

ich erwarte auf der Bascom Seite ein SINGLE.

Ich hatte Folgendes geschrieben:
" Bascom UART INPUT Beschreibung:.. . . . "
Das war aus der Beschreibung über INPUT aus der Bascom Software.

Über die Übertragung (Datenaufbau) gibt es sehr wenig Informationen.

Gibt es eine Möglichkeit die Übertragungen vom TP anzuzeigen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
gordon



Anmeldungsdatum: 16.01.2008
Beiträge: 13

BeitragVerfasst am: 23.09.2009, 03:39    Titel: Antworten mit Zitat

Hallo ,

ich habs jetzt!
So funktioniert es!

Code:

dim key as string
dim an_sys as byte

open Com "com10:9600,n,8,1,cs0,cd0,ds0,rs" for random as #1

cls
if err <> 0 Then
print "Error opening USB/COM Port"
sleep
end
end if

an_sys = 1

locate 3,3   
print" Eingabe Sollwert: ";

    do   
        Key = Inkey$
       
        if an_sys = 1 then
            Key = "S"
            an_sys = 0
        end if   
     
            If Key <> "" Then
                    if Key = chr$(13) then                 
                        print #1, chr$(13);       
                        print chr$(10);           
                        exit do
                    end if
                   
                    print #1,Key;                 

                    if key <> "S" then               
                        print Key;           
                    end if   
            end if       
    loop 
Close #1
End


Ich danke euch für eure Anregungen.
Gruß Gordon
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz