PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : String seriell entgegen nehmen



Predat0r
06.07.2008, 21:50
Hallo,

ich will über die serielle Schnittstelle alle Ports (B, C und D) steuern. Wie hier (http://www.rowalt.de/mc/avr/avrboard/04/avrb04.htm) unter Interrupts steht nehme ich mit diesem code einen string entgegen:


On URXC OnRxD
Enable URXC
Enable Interrupts

...

OnRxD:
i = UDR
Return

Ich dachte mir ich sende um beispielsweise PC3 einzuschalten c31 (also Port C, Nummer 3, Zustand ein), fürs ausschalten c30 (bessere Vorschläge?).

Nun wird ja der Onrxd-Teil bei jedem Zeichen das reinkommt ausgeführt. Ich sende und empfange also prinzipiell drei Zeichen. Wie liest man eine Nachricht nun am schnellsten/elegantesten ein?

Muss ich hierfür ein viertes "Stopzeichen" mitschicken (-> c31;) und ein Array füllen solange bis das Stopzeichen kommt, oder geht das irgendwie einfacher?

Und wie gehe ich mit c31, c30 (oder was auch immer) um? In Delphi würde das hier gehen:



Port + erstesElement + . + zweitesElement + " " = + " " + drittesElement

was dann soviel heisst wie

PortC.3 = 1


So oder so ähnlich. Das Prinzip sollte ersichtlich sein. In Bascom muss ich hierfür doch keine riesige verschachtelte Case/If-Anweisung machen, oder?

p_mork
07.07.2008, 10:30
Hallo Predat0r!


Nun wird ja der Onrxd-Teil bei jedem Zeichen das reinkommt ausgeführt. Ich sende und empfange also prinzipiell drei Zeichen. Wie liest man eine Nachricht nun am schnellsten/elegantesten ein?

Muss ich hierfür ein viertes "Stopzeichen" mitschicken (-> c31;) und ein Array füllen solange bis das Stopzeichen kommt, oder geht das irgendwie einfacher?

Z.B so: Du hast eine Variable, die immer den Index des zuschreibenden Zeichens im String hält. Bei jedem Interrupt schreibst Du das empfangene Zeichen an diese Position und erhöhst die Indexvariable. Sollt das Zeichen ein Enter sein, ist der String vollständig und Du kannst ihn auswerten.


...In Bascom muss ich hierfür doch keine riesige verschachtelte Case/If-Anweisung machen, oder?

Doch, leider musst Du genau das machen. Ein Alternative wär vllt, ein Array anzulegen, wo die Zustände alles Ports gespeichert sind. Dann könnte man das Array indirekt über das erste Zeichen im Sting adressieren und am Ende alle Ports mit dem Inhalt des Arrays aktualisieren.

MfG Mark

Predat0r
07.07.2008, 17:54
So mit der Indexvariable habe ich es im Moment, kam mir so umständlich vor :).


Und wenn ich eine funktion vom PC aus aufrufen möchte, geht das also auch nur so?



OnRxD:
i = UDR
if i = "meineSub" then
call meineSub
end if
Return


NICHT gehen würde



OnRxD:
i = UDR
call i
Return


Das würde doch einiges vereinfachen. Aber dafür braucht man wohl eine objektorienterte Programmiersprache...

python_rocks
07.07.2008, 18:38
Nun wird ja der Onrxd-Teil bei jedem Zeichen das reinkommt ausgeführt. Ich sende und empfange also prinzipiell drei Zeichen. Wie liest man eine Nachricht nun am schnellsten/elegantesten ein?
Hallo Predat0r!

Vielleicht ist CONFIG SERIALIN etwas für dich:
http://halvar.at/elektronik/kleiner_bascom_avr_kurs/029_uart_rs232_vom_computer_2/

mfg
Gerold
:-)

Predat0r
07.07.2008, 19:50
Hi Gerold,

erstmal danke für die ganzen Beiträge von dir. Vor allem die Screenshots von den Fuse-Bits, einmalig für Anfänger! Hat mich bereits gerettet.

SerialIn sieht schonmal gut aus. Habe mal deinen Quellcode kopiert, kannst du was mit dieser Fehlermeldung anfangen?

http://pic.leech.it/thumbs/8d2ee7rs232.gif (http://pic.leech.it/pic.php?id=8d2ee7rs232.gif)

Nur den Quarz habe ich auf 16,0 geändert. Der Fehler verschwindet erst mit auskommentieren von Bytematch.

Habe das auch mal in mein Projekt eingebettet, dort kommt der gleiche Fehler. Sollte also definitiv am Config SerialIn Parameter Bytematch liegen, nicht an den anderen "Statisten" wie den Compiler-Einstellungen ($...) oder ähnliches.

python_rocks
07.07.2008, 20:52
Habe das auch mal in mein Projekt eingebettet, dort kommt der gleiche Fehler. Sollte also definitiv am Config SerialIn Parameter Bytematch liegen
Hallo Predat0r!

Zwei Möglichkeiten fallen mir im Moment ein, warum es nicht funktionieren könnte:

1.) Du verwendest eine ältere oder neuere Bascom Version, die mit diesem Befehl Probleme hat. Ich arbeite mit Version 1.11.9.1.

2.) Es hat sich irgend ein unsichtbares Zeichen beim Kopieren des Codes eingeschlichen, welches jetzt Probleme bereitet. Es wäre toll, wenn du Bascom beenden, den Computer neu starten und das Programm manuell (nicht kopieren) neu eingeben könntest.

Mehr fällt mir im Moment nicht dazu ein. :-(

mfg
Gerold
:-)

Predat0r
07.07.2008, 22:19
Ich hab die freie 4kb beschränkte 1.11.7.9.

Config SerialIn nimmt überhaupt keinen dritten Parameter. Laut Onlinehilfe hat es auch nur zwei Parameter. Hatte bisher nur in die Hilfe auf der MCS Homepage nachgeschaut.

http://pic.leech.it/thumbs/8b8f4serialin.gif (http://pic.leech.it/pic.php?id=8b8f4serialin.gif)

Ich nehme an, deine Bascom-Version hat in der OH den Parameter Bytematch mit aufgeführt?

python_rocks
08.07.2008, 07:40
Ich hab die freie 4kb beschränkte 1.11.7.9.
Hallo Predat0r!

Dann ist die Lösung ja einfach. Installiere dir die neueste Demo-Version. :-)

mfg
Gerold
:-)