 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
gordon
Anmeldungsdatum: 16.01.2008 Beiträge: 13
|
Verfasst am: 20.09.2009, 10:52 Titel: COM Port und Verbindung mit AVR Controller |
|
|
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 |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
|
Nach oben |
|
 |
gordon
Anmeldungsdatum: 16.01.2008 Beiträge: 13
|
Verfasst am: 20.09.2009, 12:14 Titel: |
|
|
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 |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
|
Nach oben |
|
 |
frebas
Anmeldungsdatum: 20.06.2008 Beiträge: 245
|
Verfasst am: 20.09.2009, 20:24 Titel: |
|
|
du könntest auch statt 50,0 500 verschicken und bei z.B. 23,4° 234, so würde ich das machen. |
|
Nach oben |
|
 |
gordon
Anmeldungsdatum: 16.01.2008 Beiträge: 13
|
Verfasst am: 21.09.2009, 07:32 Titel: |
|
|
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 |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 21.09.2009, 12:31 Titel: |
|
|
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 |
|
 |
gordon
Anmeldungsdatum: 16.01.2008 Beiträge: 13
|
Verfasst am: 21.09.2009, 13:59 Titel: |
|
|
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 |
|
 |
gordon
Anmeldungsdatum: 16.01.2008 Beiträge: 13
|
Verfasst am: 21.09.2009, 14:07 Titel: |
|
|
Hallo nochmal,
der INPUT Befehl in Bascom wartet nach der Datenübertragung auf "CARRIAGE RETURN"(CR).
Gruß Gordon |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 21.09.2009, 14:21 Titel: |
|
|
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.
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 |
|
 |
gordon
Anmeldungsdatum: 16.01.2008 Beiträge: 13
|
Verfasst am: 21.09.2009, 15:38 Titel: |
|
|
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 |
|
 |
gordon
Anmeldungsdatum: 16.01.2008 Beiträge: 13
|
Verfasst am: 23.09.2009, 03:39 Titel: |
|
|
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 |
|
 |
|
|
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.
|
|