Timer0 ATMEGA644

OP #4396457
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ß
Gast #4396543
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);
#4396642
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren