-         
+ Antworten
Ergebnis 1 bis 10 von 10

Thema: rs232 oder Timer Interrupt Priorität?

  1. #1
    avrler
    Gast

    rs232 oder Timer Interrupt Priorität?

    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?

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    02.03.2004
    Ort
    Paderborn
    Alter
    32
    Beiträge
    614
    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)

  3. #3
    Administrator Robotik Einstein Avatar von Frank
    Registriert seit
    30.10.2003
    Beiträge
    4.943
    Blog-Einträge
    1
    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?

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    02.03.2004
    Ort
    Paderborn
    Alter
    32
    Beiträge
    614
    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)

  5. #5
    Administrator Robotik Einstein Avatar von Frank
    Registriert seit
    30.10.2003
    Beiträge
    4.943
    Blog-Einträge
    1
    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

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    02.03.2004
    Ort
    Paderborn
    Alter
    32
    Beiträge
    614
    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)

  7. #7
    Administrator Robotik Einstein Avatar von Frank
    Registriert seit
    30.10.2003
    Beiträge
    4.943
    Blog-Einträge
    1
    Thank, das dürfte ich finden.

    Gruß Frank

  8. #8
    avrler
    Gast
    Zitat Zitat von Gottfreak
    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?

  9. #9
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    02.03.2004
    Ort
    Paderborn
    Alter
    32
    Beiträge
    614
    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)

  10. #10
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.07.2004
    Ort
    Mammendorf
    Alter
    59
    Beiträge
    1.058
    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

+ Antworten

Benutzer, die dieses Thema gelesen haben: 0

Derzeit gibt es keine Benutzer zum Anzeigen.

Berechtigungen

  • Neue Themen erstellen: Ja
  • Themen beantworten: Ja
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •