www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 2 Interrupts (Timer0 und Rx)


Autor: Markus Wagner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Leute!

Also ich programmiere grade einen ATMega 128 auf dem STK500 (mit 
STK501-Zusatzboard) und habe Probleme damit auf 2 Interrupts zu 
reagieren. Ich benötige den Timer0-Interrupt um ein Rechteckssignal zu 
erzeugen und den Receive-Interrupt vom USART1, um mit dem PC zu 
kommunizieren. Leider funktioniert letzterer überhaupt nicht mehr seit 
ich den Timer0-Interrupt enabled und die Routine geschrieben habe. Die 
logische Schlussfolgerung für mich war, dass durch die höhere Wertigkeit 
des Timers (und das ständige Kommen des Interrupts, alle 1ms) der 
Receive-Interrupt nicht mehr durchkommt. Könnt ihr mir meine Vermutung 
bestätigen und mir zu einem Lösungsweg verhelfen oder könnte dies an 
einem komplett anderen Problem liegen? Bin leider ein Anfänger bei 
AVR-Controllern aber trotzdem über jeden Tipp dankbar.

mfg
markus

Autor: Christian Schifferle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Markus

Wenn du nicht mit allzu hohen Baudraten arbeitest, kannst du den UART 
auch in deiner normalen Programmschleife pollen, also gar nicht über den 
Interrupt steuern.
Dazu musst du lediglich das RXC-Bit im USR-Register prüfen und, falls 
gesetzt, das UART-Datenregister UDR auslesen. Mit dem Auslesen des 
UDR-Registers wird das RXC-Bit automatisch wieder gelöscht.

Gruss
Christian

Autor: mikki merten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Von der Hardware ist der Mega128 problemlos in der Lage mehrere 
Interrupt-Routinen zu bearbeiten. Es dürfte wohl eher ein Logikfehler in 
deinem Programm vorliegen. So beliebte Fehler wie 
Prozessor-Statusregister nicht retten oder auch fehlerhafte PUSH / POP 
Sequenzen sind recht häufig.

Autor: Markus Wagner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo ihr beiden, vielen Dank für eure Antworten. Ich habe es jetzt mal 
so versucht, dass ich im Timer-Interrupt den Befehl #asm("sei") einbaue, 
sodass dieser Interrupt unterbrochen wird, sobald der Rx-Interrupt 
kommt. Für die Zählung macht das im Prinzip keinen Unterschied.

danke nochmal!
markus

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.