Forum: Mikrocontroller und Digitale Elektronik TIMER1 COMPA Interrupt löst nicht aus ATmega328P


von Addi J. (addi24)


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
}

von Kurt B. (kurt-b)


Lesenswert?

Addi J. schrieb:

>     PORTD ^= (1<<PD2);
>    }

Hast du die Interrupst enabled?

 Kurt

von Addi J. (addi24)


Lesenswert?

Danke für die schnelle Antwort.
Mit TIMSK und sei() sind doch die benötigten gesetzt, oder?
Das was ich gepostet habe, ist der komplette Code.
Gruß
Addi

von Felix Adam (Gast)


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.

von Thomas E. (thomase)


Lesenswert?

Addi J. schrieb:
> Allerdings springt er nicht in die ISR.

Doch, tut er.

Wie kommst du darauf, dass er das nicht tut?

und gewöhn dir diesen Scheiss ab:
> TCCR1B =0x0A;

Hier geht es doch auch:
> PORTD ^= (1<<PD2);


mfg.

von Addi J. (addi24)


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

von Thomas E. (thomase)


Angehängte Dateien:

Lesenswert?

Addi J. schrieb:
> Aber er springt
> wie gesagt nicht in die ISR.

Aber sicher tut er das. Warum soll er das auch nicht tun? Der hat doch 
gar keine andere Wahl.

mfg.

von Felix A. (madifaxle)


Lesenswert?

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?

@Addi J.
könntest du das .lss-File mal posten, falls es immer ncoh nicht geht?

von Thomas E. (thomase)


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.

von Felix A. (madifaxle)


Lesenswert?

Simulator und Debugger hätte ich jetzt als unterschiedlich betrachtet. 
Es klang so, als hättest du den Simulator sowie Debugger und Addi J. den 
Debugger (wie geschrieben) genutzt ...

Wobei Debugging natürlich auch im Simulator erfolgen kann.

von Stefan K. (stefan64)


Lesenswert?

Kann es sein, daß Addi für den falschen ATmega übersetzt und eine andere 
Interrupt-Vektor-Tabelle benutzt?

Gruß, Stefan

von Karl H. (kbuchegg)


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.

von Addi J. (addi24)


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 :)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.