Forum: Mikrocontroller und Digitale Elektronik Timer0 ATMEGA644


von Marco G. (grmg2010)


Lesenswert?

Moin, ich versuche gerade den Timer0 im ATMEGA644 in Betrieb zu nehmen. 
Im Interrupt soll dann ein Pin gesetzt werden. Dies funktioniert jedoch 
nicht wie gewünscht, die Interruptroutine wird nicht angesprungen. Hier 
mal mein Code dazu:
1
#define  F_CPU 1000000UL
2
3
#include <avr/io.h>
4
#include <avr/interrupt.h>
5
#include <util/delay.h>
6
7
8
9
ISR(TIMER0_OVF_vect)
10
{
11
  PORTD ^= (1<<PD3);
12
}
13
14
15
int main(void)
16
{
17
  DDRD |= (1<<DDD3);
18
  PORTD |= (1<<PD3);
19
20
  
21
  //Timer einsetzen
22
  
23
  TCCR0B |= (1<<CS00) | (1<<CS02);
24
  TIMSK0 |= (TOIE0);
25
  
26
  sei();
27
  
28
    while (1) 
29
    {
30
31
    
32
    }
33
}

Woran könnte es liegen, dass die ISR nicht genutzt wird?

Gruß

von Thomas E. (thomase)


Lesenswert?

Marco G. schrieb:
> Woran könnte es liegen, dass die ISR nicht genutzt wird?

Wie kommst du darauf?

Wenn du uns weiter verheimlichst, dass du das im Simulator testest, 
erzählt dir auch keiner, dass der in der Default-Einstellung nicht in 
die ISRs springt.

mfg.

: Bearbeitet durch User
von Marco G. (grmg2010)


Lesenswert?

Der Zustand des Pins sollte sich ja in der ISR ändern, dies macht er 
jedoch nicht.

Ich habe auch bereits den CTC-Modus probiert, mit dem selben Ergebnis.

von Thomas E. (thomase)


Lesenswert?

Marco G. schrieb:
> Der Zustand des Pins sollte sich ja in der ISR ändern, dies macht er
> jedoch nicht.

Dann ist deine Hardware nicht in Ordnung oder du überträgst das falsche 
Programm. Oder du kompilierst für einen anderen Controller.

mfg.

: Bearbeitet durch User
von Marco G. (grmg2010)


Lesenswert?

Beides überprüft. Das Programm hat das korrekte Datum und Uhrzeit. Der 
uC ist soweit in Ordnung, ich hatte es auch schon auf einen MEGA48 und 
MEGA2561 probiert mit dem selben Ergebnis.

von Karl M. (Gast)


Lesenswert?

Moin Moin,

hier ist der Schreibfehler !
1
TIMSK0 |= (TOIE0);

von S. Landolt (Gast)


Lesenswert?

"Wo sich nichts mit nichts verbindet,
ist und bleibt die Summe klein."

von Carl D. (jcw2)


Lesenswert?

Karl M. schrieb:
> Moin Moin,
>
> hier ist der Schreibfehler !

Und so wäre es richtig:
1
TIMSK0 |= (1<<TOIE0);

von Marco G. (grmg2010)


Lesenswert?

Betriebsblind.. Ist doch klar, dass es so heißen muss :(
Wieso bin ich nicht darüber gestolpert...
1
TIMSK0 |= (1<<TOIE0);

Danke für die Unterstützung :)

: Bearbeitet durch User
von S. Landolt (Gast)


Lesenswert?

Anderes Thema und eher allgemein: wie kommt es eigentlich zu der 
Unsitte, Erstzuweisungen per 'oder' zu machen? Oder hat das tatsächlich 
einen Sinn, der mir bislang entging?

von Carl D. (jcw2)


Lesenswert?

S. Landolt schrieb:
> Anderes Thema und eher allgemein: wie kommt es eigentlich zu der
> Unsitte, Erstzuweisungen per 'oder' zu machen? Oder hat das tatsächlich
> einen Sinn, der mir bislang entging?

Vielleicht aus Ermangelung der Erkenntnis, daß
1
TIMSK0 |= (0<<TOIE0);
nichts bringt ;-)

von Karl M. (Gast)


Lesenswert?

Hallo S. Landolt,

kann man machen, da im Datenblatt der Initwert steht.
Ich bevorzuge auch eine direkte Wertzuweisung.
Man könnte ja auch schreiben:
1
// clear Timer0 register
2
TIMSK0 = 0;
3
TCCR0A = 0;
4
TCCR0B = 0;
5
TCNT0 = 0;
6
OCR0A = 0;
7
OCR0B = 0;
8
// clear Timer0 interrupt flags
9
TIFR0 = TIFR0;
10
11
TCCR0B |= (1<<CS00) | (1<<CS02);
12
TIMSK0 |= (1<<TOIE0);

von Thomas E. (thomase)


Lesenswert?

S. Landolt schrieb:
> Anderes Thema und eher allgemein: wie kommt es eigentlich zu der
> Unsitte, Erstzuweisungen per 'oder' zu machen? Oder hat das tatsächlich
> einen Sinn, der mir bislang entging?

Erstmal ist es nicht falsch.

Zweitens ist eine Erstzuweisung manchmal nur eine vermeintliche 
Erstzuweisung. Nämlich dann, wenn ein Register, zB. bei vielen Attiny 
aber auch alten Atmega das TIMSK, nicht einem Timer alleine gehört.

Natürlich ist das eine Sache der Sorgfalt. Aber wer kopiert nicht eine 
funktionierende Konfiguration von einem Programm ins andere oder hat 
dafür fertige Makros?

In solchen Fällen, wäre nur die tatsächlich erste Konfiguration 
diejenige, die zuweisen darf. Die für den nächsten Timer muss dann das 
Setzen mit OR machen, sonst überschreibt sie die vorherige 
Konfiguration. Aber woher soll sie wissen, dass sie jetzt nicht die 
erste ist?

Das Setzen nach Reset mit OR funktioniert immer. Es ist reine Paranoia, 
anzunehmen, dass die Register nach Reset nicht die Default-Werte haben.

Und wenn ein Bootloader, bevor er in die Applikation geht, nicht "klar 
Schiff" macht, gehört dem Programmierer von diesem Bootloader, dieser 
mitsamt Controller auf die Stirn genagelt.

mfg.

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.