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).
it works best if you plug it (aus leidvoller Erfahrung)
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?
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.).
it works best if you plug it (aus leidvoller Erfahrung)
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
Bei den AVRs, die nur ein UART haben (ich glaube alle bis auf Mega12 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.Code:Do nop Loop Until UCSRA.UDRE 'Wartet bis UDRE in UCSRA gesetzt, also UDR ins Schieberegister gepackt ist UDR=Variable
it works best if you plug it (aus leidvoller Erfahrung)
Thank, das dürfte ich finden.
Gruß Frank
Da man ja nicht weiss welche Register Bascom in der Interrupt-Funktion nutzt, kann man doch nur alle sicher lassen. Oder?Zitat von Gottfreak
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?).
it works best if you plug it (aus leidvoller Erfahrung)
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?
MfG
Hellmut
Lesezeichen