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

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.