PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : rs232 oder Timer Interrupt Priorität?



avrler
14.07.2004, 15:38
Welcher Interrupt hat eigentlich Priorität bei den Megas (8 und 16). rs232 oder Timer?
Wenn der Timer INT genutzt wird gibt es mit der rs232 Übertragung machmal Probleme. Wie löst ihr das?

Gottfreak
14.07.2004, 16:05
Während der Timer-Interrupt läuft, wird das Flag für den UART-Interrupt trotzdem gesetzt. Wenn der Interrupt also fertig ist, kommt der nächste an die Reihe. Du musst nun den Timer-Interrupt ausreichend kurz halten, damit das UART bei deiner Baudrate(man braucht ja nicht immer eine furchtbar hohe) rechtzeitig drankommt.
Bascom sichert in der Voreinstellung z.B. alle Register beim Start eines Interrupt und holt sie nachhher wieder alle zurück(was etwas dauert).

Frank
14.07.2004, 17:39
Hi Gottfreak,

ich hab zwar ein andere Frage, aber geht in den ähnlichen Bereich. Ich benutze zum Debuggen gerne die Print Anweisung von Bascom um auf dem Terminalprogramm ein paar Zustände/Spannungen zu überwachen. Da ist mir auch aufgefallen das die mit dem Timer Interrupt manchmal ein Problem hat. Hat das den selben Grund wie du es oben geschildert hast. Gibt es da einen Trick um Print und längere Timer Interrupts zu nutzen?

Gottfreak
14.07.2004, 18:33
Wie der Print-Befehl funktioniert, weis ich nicht genau. Egal ist die Länge der Timer-Interrupts, wenn du den auszugebenden Wert direkt in UDR schreibst(was natürlich nur mit Bytes geht).
Ansonsten fiehle mir höchstens noch ein, die Interrupts vor dem Print aus- und nachher wieder einzuschalten(dann verspätet sich aber dafür der Timer-Interrupt - vielleicht geht's mit Printbin besser, die Anweisung ist schneller. Dann könntest du bloß leider keine Einheitenzeichen und so übertragen.).

Frank
14.07.2004, 18:47
Danke, na das ist doch schon was. In welches UDR-Register muss man Byte schreiben, hast du da ne Bascom zeile für mich. Und wie schnell darf ich Bytes da rein schreiben, gibts da Register das ich abfragen kann um ne Warteschleife oder so einzufügen.
Werde mir dann mal ne eigene Print-Subroutine basteln. Das mit dem kurzen Timer-Interrupt abschalten vor Print ist in manchen Fällen vielleicht auch ne Lösung, zumindest beim Debuggen. Muss ich mal testen, daran hab ich garnicht gedacht ](*,)

Gottfreak
14.07.2004, 19:21
Bei den AVRs, die nur ein UART haben (ich glaube alle bis auf Mega128) gibt's nur ein UDR-Register.
Zum Prüfen, ob ein neues Byte geschrieben werden kann(aus dem Datenblatt des Mega8 Registerdefinition UCSRA- ist leider bei den meisten AVRs 'nen anderes Register):


• Bit 5 – UDRE: USART Data Register Empty
The UDRE Flag indicates if the transmit buffer (UDR) is ready to receive new data. If
UDRE is one, the buffer is empty, and therefore ready to be written.



Do
nop
Loop Until UCSRA.UDRE 'Wartet bis UDRE in UCSRA gesetzt, also UDR ins Schieberegister gepackt ist
UDR=Variable

Frank
14.07.2004, 19:24
Thank, das dürfte ich finden.

Gruß Frank

avrler
15.07.2004, 19:18
Während der Timer-Interrupt läuft, wird das Flag für den UART-Interrupt trotzdem gesetzt. Wenn der Interrupt also fertig ist, kommt der nächste an die Reihe. Du musst nun den Timer-Interrupt ausreichend kurz halten, damit das UART bei deiner Baudrate(man braucht ja nicht immer eine furchtbar hohe) rechtzeitig drankommt.
Bascom sichert in der Voreinstellung z.B. alle Register beim Start eines Interrupt und holt sie nachhher wieder alle zurück(was etwas dauert).

Da man ja nicht weiss welche Register Bascom in der Interrupt-Funktion nutzt, kann man doch nur alle sicher lassen. Oder?

Gottfreak
19.07.2004, 15:16
Stimmt. Man könnte höchstens in der Interrupt-Routine Assembler schreiben oder von Hand nachgucken, welche Register Bascom benutzt(in der Hilfe steht da zumindest zu einigen, dass die nur für Gleichkommakram sind.).
PS: In 'nem anderen Forum hat wer erzählt, GCC sichere automatisch nur die benutzten Register(was ist daran eigentlich so schwer, dass Bascom das dann nicht kann?).

Hellmut
19.07.2004, 16:41
Sehts, das ist genau der Grund warum ich Assembler so liebe. Da weiß man was passiert, bzw. kann sich den Code genau ansehen. Eine Frage dazu, zu meiner Zeit konnte man sich bei Compilern den erzeugten Assembler ansehen und so Fragen wie eure klären. Außerdem konnte man beim Debugger auch einen "disassembler" benutzen um sich "binärcode" in Assembler anzusehen. Wie ist das bei Bascom?