TIMER1 COMPA Interrupt löst nicht aus ATmega328P

OP #4384030
Lesenswert?
• ▲
▼
Hallo an alle,

ich versuche mich nun seit einigen Stunden daran einen
TIMER1 COMPA Interrupt auslösen zu lassen. Beim Debuggen
kann ich sehen, dass das TCNT1 bis 10 zählt und dann wieder
auf Null gesetzt wird. Allerdings springt er nicht in die ISR.
Komme nicht auf den Fehler. Könnt ihr mir bitte weiter helfen?
Vielen Dank im Voraus :)
Hier der ganze Code:
1
#include <avr/io.h>                 
2
#include <stdint.h>
3
#include <avr/interrupt.h>
4

5
int main(void)
6
{
7
  GTCCR = 0x00; 
8
  OCR1A = 10 - 1;    // CompareA-Register                                                                  
9
  TCCR1A =0x00;
10
  TCCR1B =0x0A;
11
  TCCR1C = 0x00;
12
  TIMSK1 = 0x02;
13

14
  sei();
15

16
  DDRD  = 0x0F;     // Port als Ausgang
17
  PORTD = 0xF0;     // Pull Ups 
18
  
19
    while (1) 
20
    {
21
    }
22
}
23

24
ISR(TIMER1_COMPA_vect)
25
{
26
if ((PIND & (1<<PIND5)))
27
   {
28
    PORTD ^= (1<<PD2);
29
   }
30
}
Gast #4384103
Lesenswert?
• ▲
▼
Zwei Sachen fallen mir ein:
1) schreibe mal nur "PORTD ^= (1<<PD2);" in die ISR. Geht es dann? Deine 
Init ist ansich richtig, würde ich auch so machen.
2) verschiebe den Zugriff auf das OCR1A hinter TIMSK1. Das war mal bei 
einem anderen Atmel bei mir von durchschlagender Wirkung. Keine Ahnung 
warum.
OP #4384564
Lesenswert?
• ▲
▼
@Felix Adam: welcher Code in der ISR steht ist erstmal irrelevant,
da er beim debuggen gar nicht erst in die ISR springt.
Und dein Vorschlag hat leider auch keine Änderung bewirkt.

@Thomas Eckmann: Ok, das Flag wird tatsächlich gesetzt. Aber er springt 
wie gesagt nicht in die ISR.

Grüße
Addi
#4384621
Lesenswert?
• ▲
▼
Felix A. schrieb:
> Könnte es sein, dass da unterschiedliche IDE benutzt werden (im Bild von
> Thomas scheint es das AVR Studio 4.xx zu sein) und da etwas anders ist?

Höchst wahrscheinlich wird das so sein.
Aber an dem Progrämmchen ist klar ersichtlich, nachdem man die Hexwerte 
bei der Initialisierung aufgedröselt hat, dass es in die ISR springen 
muss. Das habe ich ja auch gezeigt.
Der Unterschied, dass es das bei ihm angeblich nicht tut, ist aber eher 
der verwendete Debugger. Das wird bei ihm der Simulator sein, während es 
bei mir ein richtiger Debugger ist und alles auf einem richtigen 
Controller läuft.

mfg.
#4384709
Lesenswert?
• ▲
▼
Ach.
Im AVR.Studio gibt es eine Einstellung, mit dem dem Debugger gesagt 
wird, dass er ISR ignorieren soll. Die Simulation führt die Befehle 
richtig aus, aber im Debugger wird das nicht angezeigt.

ZU finden im Menü unter Tools / Options
Dann "Tools" "Tool settings" und dort dann der Punkt "Mask Interrupts 
while stepping"

Wer immer sich das ausgedacht hat, dass hier eine Einstellung von true 
als Default eine gute Idee wäre, sollte noch einmal darüber nachdenken.
OP #4384741
Lesenswert?
• ▲
▼
Um die restlichen Fragen zu beantworten:
Richtig, bei mir war es nur der Simulator von AtmelStudio 7 und es war 
tatsächlich so, wie Karl Heinz sagte, der Punkt "Mask Interrupts
while stepping" war tatsächlich enable :o  Aber jetzt geht es :D

Vielen Dank für eure Bemühungen :)

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.