Archiv verlassen und diese Seite im Standarddesign anzeigen : Über UART empfangener Text auswerten in einer If-Schlaufe
Barracuda_cy
28.07.2009, 14:40
Hi Leute
Also, mein MC: ATmega32, 14.5Mhz ext. Quarz
Könnte mir jemand eine Seite sagen, wo ich nachlesen kann wie ich einen Text den ich per UART empfangen habe auswerten kann und, je nach Text, eine andere Aktion ausführen kann.
Also z.B.:
Wenn empfangener Text = "A" dann LED1 = ein
Wenn empfangener Text = "B" dann LED2 = ein
oder hat jemand einen Codeschnippsel?;)
Liebe Grüsse
Barracuda_cy
28.07.2009, 15:29
ach ja und noch was: das programm sollte wenn möglich nicht stehen bleiben während es auf den empfang wartet
Bemühe mal die Suche nach "URXC". Da findest du genügend Beispiele.
Carlos31
28.07.2009, 19:30
Hallo , ich bin mir sicher das du auf diese seite glücklich wirst :-),http://www.rn-wissen.de/index.php/Windows_Programm_zum_Steuern_des_AVR%27s
Barracuda_cy
28.07.2009, 20:08
ja danke, mir wurde geholfen:D
peterfido
28.07.2009, 20:24
$regfile = "m32def.dat"
$baud = 38400
$crystal = 14500000
$hwstack = 32 ' default use 32 for the hardware stack
$swstack = 10 ' default use 10 for the SW stack
$framesize = 40
Dim B1 As Byte
Config Porta.0 = Output
Config Porta.1 = Output
Led1 Alias Porta.0 'Port A0 für LED1
Led2 Alias Porta.1 'Port A1 für LED2
Do
B1 = Inkey() 'first uart
If B1 <> 0 Then
If B1 = 65 Then Set Led1 'A LED1 an
If B1 = 66 Then Set Led2 'B LED2 an
If B1 = 67 Then 'C beide aus
Reset Led1
Reset Led2
End If
End If
Loop
End
edit: Fenster zu lange offen gehabt... Ich lass es trotzdem drin
Barracuda_cy
28.07.2009, 20:53
okay danke für den letzten code-schnippsel, hab nur ne frage;
hab den code so verändert das er mir noch immer auf dem LCD anzeigt was er nun gemacht hat, doch er zeigt mir immer nur "LED B" an, egal was ich mache. Wiso das?
hier mein Code
$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 14745600
$baud = 9600
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.4 , Db6 = Portc.5 , Db7 = Portc.6 , E = Portc.2 , Rs = Portc.0
Dim B1 As Byte
Config Portc.0 = Output
Config Portc.1 = Output
Led1 Alias Portc.0 'Port A0 für LED1
Led2 Alias Portc.1 'Port A1 für LED2
Do
B1 = Inkey() 'first uart
If B1 <> 0 Then
If B1 = 65 Then Set Led1 'A LED1 an
Cls
Locate 1 , 1
Lcd "LED A"
If B1 = 66 Then Set Led2 'B LED2 an
Cls
Locate 1 , 1
Lcd "LED B"
If B1 = 67 Then 'C beide aus
Reset Led1
Reset Led2
Cls
Locate 1 , 1
Lcd "LED aus"
End If
End If
Loop
also ums klar zu stellen:
Ich schalte den controller aus und wieder ein und egal ob ich ihm A,B oder C sende, er zeigt immer nur LED B an
peterfido
28.07.2009, 22:01
$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 14745600
$baud = 9600
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.4 , Db6 = Portc.5 , Db7 = Portc.6 , E = Portc.2 , Rs = Portc.0
Dim B1 As Byte
Config Portc.0 = Output
Config Portc.1 = Output
Led1 Alias Portc.0 'Port A0 für LED1
Led2 Alias Portc.1 'Port A1 für LED2
Do
B1 = Inkey() 'first uart
If B1 <> 0 Then
If B1 = 65 Then
Set Led1 'A LED1 an
Cls
Locate 1 , 1
Lcd "LED A"
end if
If B1 = 66 Then
Set Led2 'B LED2 an
Cls
Locate 1 , 1
Lcd "LED B"
end if
If B1 = 67 Then 'C beide aus
Reset Led1
Reset Led2
Cls
Locate 1 , 1
Lcd "LED aus"
End If
end if
Loop
end
Che Guevara
28.07.2009, 23:47
Hallo Barracuda_cy,
probier mal das:
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 14745600
$baud = 9600
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.4 , Db6 = Portc.5 , Db7 = Portc.6 , E = Portc.2 , Rs = Portc.0
Dim B1 As Byte
Config Portc.0 = Output
Config Portc.1 = Output
Led1 Alias Portc.0
Led2 Alias Portc.1
dim old_val as byte
dim new_val as byte
old_val = 1
new_val = 0
do
b1 = inkey()
if b1 <> 0 then
Select case b1
case 65
set led1
if old_val <> new_val then cls : locate 1,1 : lcd "LED A"
old_val = 65
case 66
set led2
if old_val <> new_val then cls : locate 1,1 : lcd "LED B"
old_val = 66
case 67
reset led1
reset led2
if old_val <> new_val then cls : locate 1,1 : lcd "LED aus"
old_val = 67
end select
new_val = old_val
end if
loop
end
Gruß
Chris
Barracuda_cy
29.07.2009, 10:47
Bin am verzweifeln ^^
das geht alles nicht, bekomme immer "Variabelnfehler", bzw wenn ich das BSP von peterfido ausprobir bekomm ich immer "LCD aus" angezeigt, egal was ich dem MC sende.
Habs auch mit eigenem Code versucht (nur LCD ausgabe, keine LED's)
Hier mein Code:
$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 14745600
$baud = 9600
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.4 , Db6 = Portc.5 , Db7 = Portc.6 , E = Portc.2 , Rs = Portc.0
Dim B1 As Byte
B1 = Inkey() 'first uart
If B1 = 65 Then Cls : Locate 1 , 1 : Lcd "LED A"
If B1 = 66 Then Cls : Locate 1 , 1 : Lcd "LED B"
If B1 = 67 Then Cls : Locate 1 , 1 : Lcd "LED Aus"
End
... bekomm ich immer "LCD aus" angezeigt, egal was ich dem MC sende.
If B1 = 65 Then Cls : Locate 1 , 1 : Lcd "LED A"
If B1 = 66 Then Cls : Locate 1 , 1 : Lcd "LED B"
If B1 = 67 Then Cls : Locate 1 , 1 : Lcd "LED Aus"
Du kannst zwar mehrere Befehle durch Doppelpunkt getrennt in eine Zeile schreiben. Das heißt aber nicht, dass die alle zu der Bedingung gehören. Bei dir wird nur der CLS Befehl bedingt ausgeführt. Locate und Lcd dagegen immer. Also schreibt er zuerst "LED A", dann "LED B" und dann "LED Aus" aufs LCD. Die letzte Ausgabe bleibt dann stehen.
Wenn du unbedingt bei deinen schwer lesbaren Ein-Zeilern bleiben möchtest, sollte die Syntax so aussehen:
If B1 = 65 Then : Cls : Locate 1 , 1 : Lcd "LED A" : End IF
Barracuda_cy
29.07.2009, 16:27
okay danke, es zeigt nun immerhin nicht mehr von anfang an LCD aus an;)^^
und mit der Übersichtlichkeit hast du recht, hab den code dahingehend wieder geändert...
aber ich bin echt am verzweifeln, wieso geht das nicht wie es doch eigentlich sollte?!
Hier wieder mein Code (das ganze config zeug vom LCD und so obendran hab ich jetzt mal weggelassen, das stimmt ja auch;))
Dim B1 As Byte
Cls
If B1 = 65 Then
Cls
Locate 1 , 1
Lcd "LED A"
End IF
If B1 = 66 Then
Cls
Locate 1 , 1
Lcd "LED B"
End If
If B1 = 67 Then
Cls
Locate 1 , 1
Lcd "LED Aus"
End If
End
Du gibst aber schon ein großes "A" ein, oder? Das macht hier einen Unterschied.
In deinem letzten Code fehlt auch das B1 = Inkey(). Ist das noch drin?
Wenn keine der 3 Alternativen zuschlägt, würde ich hinter dem Inkey() den eingelesenen Wert direkt einmal ausgeben. Dann siehst du ja, was da ankommt. Also so:
LCD B1
Dahinter kein CLS, damit der Wert sichtbar bleibt.
peterfido
29.07.2009, 17:23
Die Hauptschleife sollte schon drin bleiben...
Barracuda_cy
29.07.2009, 17:27
So, ich glaub ich hab das Problem gefunden, hier zuerst der Code
Dim B1 As Byte
B1 = Inkey()
Cls
Lcd B1
Waitms 1000
Cls
If B1 = 65 Then
Cls
Locate 1 , 1
Lcd "LED A"
End IF
If B1 = 66 Then
Cls
Locate 1 , 1
Lcd "LED B"
End If
If B1 = 67 Then
Cls
Locate 1 , 1
Lcd "LED Aus"
End If
End
So, wenn ich nun den Controller resete und gerade dann den richtigen Grossbuchstaben sende bekomme ich den zugehörigen Text angezeigt, wenn ich jedoch nen kurzen Moment warte gehts nicht mehr. Woran liegts? Bzw was ist die Lösung des Problems?
Liebe Grüsse
peterfido
29.07.2009, 17:36
Habe ich doch gerade geschrieben...
Mein Code von gestern 22:01 Uhr sollte auch funktionieren...
Barracuda_cy
29.07.2009, 18:39
so, jetzt funktionierts zur zufriedenheit:D
Hier der Code
$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 14745600
$baud = 9600
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.4 , Db6 = Portc.5 , Db7 = Portc.6 , E = Portc.2 , Rs = Portc.0
Cls
Dim B1 As Byte
B1 = Waitkey()
Cls
Lcd B1
Waitms 1000
Cls
If B1 = 65 Then
Cls
Locate 1 , 1
Lcd "LED A"
Print "Empfangen A"
End IF
If B1 = 66 Then
Cls
Locate 1 , 1
Lcd "LED B"
Print "Empfangen B"
End If
If B1 = 67 Then
Cls
Locate 1 , 1
Lcd "LED Aus"
Print "Empfangen C"
End If
End
Vielen Dank für deine geduldige Hilfe;)
peterfido
29.07.2009, 20:49
Das das zu Deiner Zufriedenheit funktioniert wundert mich aber ein wenig. Das Programm startet, wartet, bis ein Zeichen über Uart reinkommt. wartet dann 1 Sekunde, leert das LCD und gibt das empfangene Zeichen aus, führt je nach Zeichen eine Aktion aus (oder auch nicht, bei falschem Zeichen) und dann? Wahrscheinlich hängt er sich irgendwo auf und macht einen Neustart. Oder der Watchdog ist aktiv und erledigt das...
Barracuda_cy
30.07.2009, 00:45
Ne, das Programm hängt sich eigentlich nirgends auf!...
Und ja, das mit der Sekunde warten mach ich dann im endgültigen Programm schon anders, das soll ja nur mal n'beispiel programm sein;)
peterfido
30.07.2009, 21:03
Wenn das der gesamte Code ist, dann läuft das Programm nur 1mal durch und dann Ende...
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.