Timer0 OnCompareMatch-Problem

RalfP

Neues Mitglied
20. Sep. 2007
1
0
0
Sprachen
Hallo.
Ich versuche schon seit Tagen, den Timer0 beim ATmega64 im "OnCompareMatch"-Modus zu betreiben und es klappt einfach nicht. Irgendetwas mache ich falsch. Aber was???

Ich hab´ mal mein Testprogramm (sinngemäß) angehängt, damit Ihr sehen könnt, wie ich es versuche.

Das Problem ist, daß der AVR gar nie im Hauptprogramm ankommt, sondern gleich in die ISR springt, als ob dauernd ein CompareMatch vorhanden wäre.

Wer kann mir bei meinem Problem helfen?

Gruß Ralf

P.S. Wenn Ihr Euch fragt, woher ich weiß, daß das Hauptprogramm nie durchlaufen wird und ständig die ISR angesprungen wird, ich hab´ in meinem kompletten Testprogramm eine Ausgabe eingebaut die mich das erkennen läßt.
Der Übersichtlichkeit halber hab ich diese hier aber weggelassen.
 

Anhänge

  • Timer0.txt
    762 Bytes · Aufrufe: 12
Hallo Ralf,

die Initialisierung des CTC-Mode und die Freigabe des Timer0Compare-Interrupts sieht richtig aus.

Hier einmal äquivalent die Initialisierung in Assembler (RegA ist hier ein Register ab r16):
Code:
   ldi RegA, 0
   out TCNT0, RegA        ; TimerCounter0 = 0

   ldi RegA, 250          ; Compare Value 250
   out OCR0, RegA

   ldi RegA, 0b00001101   ; CTC-Mode, prescaler 128 
   out TCCR0, RegA

   ldi RegA, 0b00000001   ; Enable OutputCompare Interrupt
   out TIMSK, RegA
Ich glaube du stellst den prescaler auf 128 ein, nicht auf 8. Aber das dürfte nicht das Problem sein.
Selbst wenn der Interrupt ständig wieder ausgelöst würde, müsste das Hauptprogramm weiter durchlaufen werden, wenn auch langsamer. Wird nach einem "Return from Interrupt" in das Hauptprogramm zurückgesprungen, wird in jedem Fall der nächste Befehl ausgeführt, bevor wieder in die Interruptroutine gesprungen wird. Wenn du nicht viel Programmcode zum Testen im Hauptprogramm und in der Interruptroutine hast, muss die Testroutine im Hauptprogramm irgendwann mal abgearbeitet sein (z.B. LED blinken lassen).

Du kannst folgende Bereiche prüfen:
  • Läuft denn das Hauptprogramm, wenn du keine Interrupts freigibst (GlobalInterruptEnable = 0)?
  • Ist der Stackpointer bei Programmstart richtig gesetzt?
  • Hast du Programmcode in der Interruptroutine? Wenn ja, achtest du darauf, dass das StatusRegister gesichert wird (auf den Stack)?
  • Ist das Return am Ende der Interruptroutine ein Return oder ein Return-from-Interrupt (kenne mich leider mit der von dir verwendeten Programmiersprache nicht aus)? Das zweite wäre richtig.
Ich hoffe, dass ich dir ein bisschen weiterhelfen konnte.

Gruß
Dirk
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)