PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Über UART empfangener Text auswerten in einer If-Schlaufe



Barracuda_cy
28.07.2009, 13: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, 14:29
ach ja und noch was: das programm sollte wenn möglich nicht stehen bleiben während es auf den empfang wartet

for_ro
28.07.2009, 18:11
Bemühe mal die Suche nach "URXC". Da findest du genügend Beispiele.

Carlos31
28.07.2009, 18: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, 19:08
ja danke, mir wurde geholfen:D

peterfido
28.07.2009, 19: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, 19: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, 21: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, 22: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, 09: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

for_ro
29.07.2009, 14:15
... 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, 15: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

for_ro
29.07.2009, 15:52
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, 16:23
Die Hauptschleife sollte schon drin bleiben...

Barracuda_cy
29.07.2009, 16: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, 16:36
Habe ich doch gerade geschrieben...

Mein Code von gestern 22:01 Uhr sollte auch funktionieren...

Barracuda_cy
29.07.2009, 17: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, 19: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
29.07.2009, 23: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, 20:03
Wenn das der gesamte Code ist, dann läuft das Programm nur 1mal durch und dann Ende...