Hallo, Ich bin ein ziemlicher Anfänger zum Thema AVR-Programmierung. Ich will ein kleines Testprogramm zum seriellen Interrupt schreiben, doch es funzt nicht. Immer wenn ich Daten sende, bleibt er im Interrupt hängen (wie Endlosschleife). Muss ich irgendwas spezielles senden, oder wie geht das genau? Gibt es vielleicht ein Tutorial zu diesem Thema? Ich verwende einen ATmega8 in Verbindung mit Bascom. Hier das kleine Programm, das ich verwende: $regfile = "m8def.dat" $crystal = 4000000 $baud = 19200 Dim I As Byte Ddrb = &B11111111 On Urxc Test Enable Urxc Enable Interrupts I = 0 Portb = 255 Do I = I + 1 Loop Test: Print I Print "OK" Return Vielen Dank für Eure Hilfe!! mfg Andy
Ich glaube, dass das Verwenden des UART-Sendeinterrupts nur Sinn macht, wenn man die Ausgabe über einen Sende-Ringbuffer organisiert. Dann ist der Interrupt (UDRE) hilfreich, um (ohne Verzögerung) das nächste Byte aus dem Sende-Ringbuffer ins UDR zu schreiben. Mit dem TXC-Interrupt kann man dann UART deaktivieren, da jetzt auch das letzte Bit der Übertragung raus ist. Ich selbst nutze diese (TX-) Interrupts aber nicht, da die UART-Ausgabe bei mir mit über den LCD-Treiber erfolgt und somit vom Timer-Interrupt erledigt wird. (http://www.hanneslux.de/avr/stopuhr/index.html) Auch der Empfangs-Interrupt (RXC) macht nur in Verbindung mit einem Empfangs-Ringbuffer Sinn. Im RXC-Interrupt kopiert man nur das empfangene Byte in den Empfangsbuffer und teilt dem Hauptprogramm durch setzen einer Boolschen Variable mit, dass neue Daten da sind. Ich kann mir aber nicht vorstellen, dass all diese UART-Unterrupts unter BASCOM sinvoll verwendet werden können, dazu ist der BASCOM-Programmierer viel zu weit von der Hardware entfernt. Um das zu nutzen, müsstest du schon auf C oder besser ASM umsteigen. ...
Hi, Danke für die Antwort. Ich habe nun ein Beispielprogramm im Bascom-Ordner gefunden mit dem ser. Interrupt. Dieses funktioniert zwar, ich habe aber noch eine Frage: Und zwar habe ich ein Lauflicht programmiert, bei dem man über RS232 die Geschwindigkeit ändern kann. Nur habe ich das Problem, dass bei dem Programm mit dem Interrupt nur das letzte Zeichen, dass über die Serielle gesendet wurde angenommen wird. Wenn ich z.B. 45ms einstelle, kommt nur der 5er an, d.h. es werden 5ms eingestellt. Dann habe ich das Programm ohne Interrupt probiert; da kommt die ganze Zahl an. Ich will aber nicht ohne Interrupt arbeiten, da ich sonst immer das Schleifenende abwarten muss, bevor die neue Geschwindigkeit übernommen wird. Ich habe beide Dateien angehängt. Ich danke schon im Voraus für eure Hilfe!!!! mfg Andy
- Du nutzt die Variable P für die Wartezeit. - P ist als Integer deklariert, hat also den Wertebereich von 16 Bit. - Die Übertragung der Werte über UART erfolgt aber in ASCII. - Dabei kann eine Zahl 1..5 Ziffern lang sein. - Du brauchst also eine Kennung, an der das Ende der Ziffernfolge erkannt wird. - Dazu bietet sich das Steuerzeichen für 'nächste Zeile' an, also chr$(13) oder chr$(13)+Chr$(10) - Du kannst also deinen String solange mit Ziffern füllen, bis das Steuerzeichen auftritt, dann den String zur Zahl umwandeln (VAL sieht zwar sehr einfach aus, beschert dem AVR aber eine Menge Arbeit), als Wartezeit P übernehmen und den String löschen. ...
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.