Forum: Mikrocontroller und Digitale Elektronik Timer Interrupt


von mike (Gast)


Lesenswert?

Hallo,

ich möchte für einen ATmega32 einen Timer mit Interrupt programmieren. 
Der 8bit Timer0 soll im CTC-Modus arbeiten.
1
#include <avr/io.h>;
2
#include <avr/interrupt.h>
3
4
void init(void) {
5
6
  // LED auf PD1
7
  DDRD |= 0x01;
8
  PORTD |= 0x01;
9
10
  /* CTC aktivieren */
11
  TCCR0 &= ~(1<<WGM00);
12
  TCCR0 |= (1<<WGM01);
13
14
  /* prescaler 1*/
15
  TCCR0 |= (1<<CS00);
16
  TCCR0 &= ~(1<<CS01);
17
  TCCR0 &= ~(1<<CS02);
18
19
  OCR0 = 100;
20
        TIMSK |= (1 << OCIE0);
21
22
  sei();
23
}
24
25
ISR(TIMER0_COMP_vect) {
26
  PORTD &= ~0x01;
27
}
28
29
int main(void) {
30
31
  init();
32
  while(1) {
33
  }  
34
35
}
Da die LED nicht ausgeschaltet wird, gehe ich davon aus, dass die 
Interruptroutine nicht ausgeführt wird. Kann mich vielleicht jemand 
helfen und sagen wo mein Fehler bei der Timerinitialisierung ist? Oder 
was ich sonst falsch gemacht habe?
Vielen Dank schon mal im Voraus!
Mike

von Axel D. (axel_jeromin) Benutzerseite


Lesenswert?

mike schrieb:
> /* CTC aktivieren */
>   TCCR0 &= ~(1<<WGM00);
>   TCCR0 |= (1<<WGM01);
>
>   /* prescaler 1*/
>   TCCR0 |= (1<<CS00);
>   TCCR0 &= ~(1<<CS01);
>   TCCR0 &= ~(1<<CS02);

die ledtzten beiden Zeilen killen alle Veroderungen dadrüber

von Falk B. (falk)


Lesenswert?

@  Axel Düsendieb (axel_jeromin) Benutzerseite

>> /* CTC aktivieren */
>>   TCCR0 &= ~(1<<WGM00);
>>   TCCR0 |= (1<<WGM01);
>
>   /* prescaler 1*/
>>   TCCR0 |= (1<<CS00);
>>   TCCR0 &= ~(1<<CS01);
>>   TCCR0 &= ~(1<<CS02);

>die ledtzten beiden Zeilen killen alle Veroderungen dadrüber

Nö, die löschen gezielt Bits, auch wenn die nach dem Reset sowieso 
gelösht sind. Siehe Bitmanipulation. Man beachte das "~"

MFG
Falk

von Thomas E. (thomase)


Lesenswert?

mike schrieb:
> // LED auf PD1
>
>   DDRD |= 0x01;
>
>   PORTD |= 0x01;

Das ist aber nicht PD1 sondern PD0.


Das gleiche hier:
mike schrieb:
> ISR(TIMER0_COMP_vect) {
>
>   PORTD &= ~0x01;
>
> }

hier wird auch PD0 auf 0 gesetzt.


mfg.

von Andreas B. (Gast)


Lesenswert?

mike schrieb:
> ISR(TIMER0_COMP_vect) {
>   PORTD &= ~0x01;
> }

Bit 1 wird im ISR immer nur gelöscht, nicht gewechselt wie wohl die 
Absicht war. Dazu brauchts ein XOR:
1
ISR(TIMER0_COMP_vect) {
2
  PORTD ^= 0x01;
3
}

von Thomas E. (thomase)


Lesenswert?

Andreas B. schrieb:
> Bit 1 wird im ISR immer nur gelöscht

Das ist nicht Bit 1, das ist Bit NULL.

Und wenn man den Kommentar oben richtig deutet, hat er seine LED an PD1 
angelötet.

mfg.

von Andreas B. (Gast)


Lesenswert?

Öh ja, habe nicht genau genug gelesen, ich dachte es ging ums Blinken.

von mike (Gast)


Lesenswert?

also die LED hängt an PD0 (hab vorhin ausversehen PD1 geschrieben). Das 
ändert aber nichts an der Tatsache, dass der Interrupt nicht 
funktioniert. Zu Testzwecken, ob mein Interrupt ausgelöst wird, wollt 
ich die LED beim ersten Interrupt ausschalten. Sie bleibt aber an. 
Daraus schließe ich, dass bei der Timerinitialisierung irgendwo ein 
Fehler ist.

von Karl H. (kbuchegg)


Lesenswert?

mike schrieb:
> also die LED hängt an PD0 (hab vorhin ausversehen PD1 geschrieben). Das
> ändert aber nichts an der Tatsache, dass der Interrupt nicht
> funktioniert. Zu Testzwecken, ob mein Interrupt ausgelöst wird, wollt
> ich die LED beim ersten Interrupt ausschalten. Sie bleibt aber an.

WIe ist denn die LED an den Portpin angeschlossen?

von spess53 (Gast)


Lesenswert?

Hi

Bist du sicher, das du das richtige File aufspielst?

MfG Spess

von mike (Gast)


Lesenswert?

über einen Widerstand auf Masse. Die LED funktioniert. Ich kann sie ja 
auch bei der Initialisierung anschalten. Nur die Interruptroutine wird 
nicht ausgeführt.

von mike (Gast)


Lesenswert?

Ja bin ich.

von spess53 (Gast)


Lesenswert?

Hi

Schon mal im Simulator getestet? In Assembler funktioniert es.

MfG Spess

von Karl H. (kbuchegg)


Lesenswert?

Laut Simulator ist da nichts auffälliges in deinem Code. Simulator sagt: 
es funktioniert.

von MWS (Gast)


Lesenswert?

Anderer Controller im Makefile eingetragen ?

von mike (Gast)


Lesenswert?

So ... ich hab mir heute morgen mal von einem Bekanntenen einen anderen 
ATmega32 besorgt ... und siehe da, es geht! Anscheinden hat meiner eine 
defekt. Vielen Dank für euere Hilfe.

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.