PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [gelöst] Über RS-232 Bit im Atmega32 setzen/rücksetzen



Befedo
23.12.2009, 19:48
Hallo Jungs, ich brauch mal wieder eure Hilfe...

Und zwar möchte ich mit einem Terminalprogramm, über RS-232 ein Bit im Controller setzten bzw. rücksetzen.

Hier erstmal der Code:


$regfile = "m32def.dat"
$crystal = 16000000

$baud = 9600

$hwstack = 32
$framesize = 32
$swstack = 32


Dim Stehen As Byte
Stehen.0 = 0

Do

Dim A As Integer , B As Integer
A = 0
B = 0

A = Ischarwaiting()

If A = 1 Then
B = Inkey()
Print "Inkey: " ; B
Select Case B
Case 48 : Stehen.0 = 0

Case 49 : Stehen.0 = 1

End Select

End If

If Stehen.0 = 1 Then
Call ... 'Sub welches dann gestartet werden soll
End If

Loop



Wie gesagt, zuerst wird das Byte deklariert und auch gleich gesetzt (hatte es auch schon mit dem SET Befehl im Bascom versucht).
Je nachdem, welcher CHAR nun im Puffer des UART abgelegt wird, sollte nun die Routine gestartet werden oder nicht.

Wie es auch nicht anders zu erwarten ist, Funktioniert der Code so nicht und meine Erfahrungen in der Richtung sind eher Dünn gesät. Ich vermute, das irgendwas in der Kommunikation zwischen PC und UART nicht passt. Terminal Programm läuft und auch das Flaschen mittels Bootloader geht, PRINT Befehle kommen auch an.

Deshalb meine Frage an euch, wie man es zum Laufen bringen könnte, bzw. was falsch ist.

Danke für eure Hilfe!

Richard
23.12.2009, 20:11
Was sendest Du denn vom Terminal aus? 0 oder 1 werden ja
nicht als Hex 00 bzw Hex 01 gesendet sondern als ASCII und
darauf sollte Case dann auch prüfen.

Gruß Richard

Befedo
23.12.2009, 21:43
Richtig, sende 0 und 1. Was als ASCII 48 bzw. 49 kommt, doch auch wenn CASE darauf überprüft geht´s nicht.

Die Variable A (Ischarwaiting) wird nicht 1.

Danke für den Versuch...

Vitis
23.12.2009, 23:11
serial in buffered wird klemmen, weil das rxc-interrupt genutz wird
und daher auch das rxc-flag resettet wird, daher kein ischarwaiting

Neutro
24.12.2009, 09:00
Ich lese Daten vom PC immer mit dem Inkey Befehl ein, daher würde ich das ischrwaiting durch Inkey ersetzen das hat bei mir immer hingehauen.

A= Inkey ()

If A = 49 Then....

Befedo
24.12.2009, 10:53
Danke vitis und der Rest...

Hab SERIALIN auskommentiert und die CASE Abfrage auf die ASCII Werte 48 (0) bzw. 49 (1) geändert und es funktioniert.

Wird kein Puffer benötigt, wenn man nur ein Zeichen ausliest?


MfG Befedo und ein frohes Fest euch allen!

Dominik009
24.12.2009, 11:19
hi
könntest du den funktionierenden code posten?

MFG
Dominik

P.S.: Ein frohes Fest euch allen

Vitis
24.12.2009, 12:00
nein, der Buffer wird für ein Zeichen nicht benötigt, weil
der AVR einen Buffer von einem Zeichen schon
harwaremäßig dabei hat, nämlich das UDR-Register.
Da passt genau ein Byte rein.

Befedo
24.12.2009, 19:59
@Dominik009

Hab den Code im ersten Beitrag editiert, das ist der der läuft.
Wie gesagt, das Byte heist STEHEN und die CASE Anweisung überprüft ob 0 oder 1 (ASCII 48 bzw. 49) als INKEY empfangen wurde.

MfG Befedo