Atmega8 Timer funktioniert nicht

OP #3429910
Lesenswert?
• ▲
▼
Hallo,

ich habe erst vor kurzem mit Mikrocontrollern angefangen und stehe nun 
vor einem Problem mit den Timern beim Atmega8.
Zum Testen habe ich eine LED an Pin PB0 angeschlossen.

Hier einmal mein Code:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3

4
#define F_CPU 8000000UL  // 8 MHz
5

6
ISR (TIMER0_OVF_vect){
7
    PORTB |= (1 << PB0);
8
}
9

10
int main(){
11
  DDRB = (1 << PB0);
12
  PORTB = 0;
13

14
  TCCR0 = (1 << CS00);
15
  TIMSK |= (1 << TOIE0);
16

17
  sei();
18

19
  while(1){
20
    //PORTB |= (1 << PB0);
21
  }
22
  return 0;
23
}

Ich habe den Code auf das Nötigste reduziert, um den Fehler besser 
finden zu können.
Anscheinend wird aber die Interruptfunktion nicht ein einziges Mal 
aufgerufen, da die LED aus bleibt.
In der Schaltung sollte kein Fehler sein, da die LED leuchtet wenn ich 
den Port in der main()-Funktion aktiviere.
Ich suche schon die ganze Zeit im Datenblatt/Internet, ob ich nicht 
etwas wichtiges vergessen habe, kann aber leider nichts finden. Auch mit 
einem Atmega88 funktioniert es nicht.

Low-Fuse: 0xe4 High-Fuse: 0xd9
gcc-Version 4.8.2 (Gentoo 4.8.2 p1.0, pie-0.5.8)

Ich hoffe ich habe keine Information vergessen und mir kann jemand 
helfen.

mfg Kevin
Gast #3429918
Lesenswert?
• ▲
▼
Es wird sich wohl weniger um einen Fall von: "Atmega8 Timer funktioniert 
nicht" handeln, sondern um "Programm ist fehlerhaft" handeln, meinst Du 
nicht?

Also, dann wohln wir mal schauen.
Was, meinst Du, tut das hier:
1
PORTB |= (1 << PB0);

Schaltet es die LED ein oder aus?

Und was ändert sich an der LED wenn Du diesen Befehl mehrfach ausführst?
Gast #3429935
Lesenswert?
• ▲
▼
Bitkracherl schrieb:
> Es wird sich wohl weniger um einen Fall von: "Atmega8 Timer funktioniert
> nicht" handeln, sondern um "Programm ist fehlerhaft" handeln, meinst Du
> nicht?
>
> Also, dann wohln wir mal schauen.
> Was, meinst Du, tut das hier:
>
>
1
> PORTB |= (1 << PB0);
2
>
>
> Schaltet es die LED ein oder aus?
>
> Und was ändert sich an der LED wenn Du diesen Befehl mehrfach ausführst?

Lieber Bitkracher:
Das schaltet die LED zumindest einmal ein, er sagt aber sie sei aus !
#3429971
Lesenswert?
• ▲
▼
Gewünscht: 1 s
Am nächsten gelegen: 0.032768 s
Verwendeter prescaler: 1024
Verwendeter preload: 0

TCCR0 |= (1<<CS02) | (1<<CS00)
TCNT0 = 0

Läßt Deinen Interrupt einmal pro Sekunde tickern.

Statt PORTB |= (1 << PB0); schreibst Du PORTB ^= (1 << PB0); und Deine 
LED sollte im 1 Hz-Takt blinken.

Gruß
Frank
#3429973
Lesenswert?
• ▲
▼
Bitkracherl schrieb:
> @  jojo1970
>
>>Das schaltet die LED zumindest einmal ein...
> Tut es das?

ZUmindest sagt er es.
Ich wäre ja auf einen Vorteiler 1024 gegangen und hätte die LED toggeln 
lassen. Dann ist es wurscht, ob die LED bei einer 1 oder bei einer 0 am 
Pin leuchtet. 15Hz blinken (bei 8Mhz) sollte man noch flackern sehen
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3

4
#define F_CPU 8000000UL  // 8 MHz
5

6
ISR (TIMER0_OVF_vect){
7
    PORTB ^= (1 << PB0);
8
}
9

10
int main(){
11
  DDRB = (1 << PB0);
12
  PORTB = 0;
13

14
  TCCR0 = (1<<CS02) | (1 << CS00);
15
  TIMSK |= (1 << TOIE0);
16

17
  sei();
18

19
  while(1){
20
  }
21
  return 0;
22
}
Gast #3430002
Lesenswert?
• ▲
▼
@ Karl Heinz

Bitkracherl schrieb:
>> @  jojo1970
>>
>>>Das schaltet die LED zumindest einmal ein...
>> Tut es das?

>ZUmindest sagt er es.

Er hat gesagt, das sie nicht leuchtet:
>..., da die LED aus bleibt.

Es war also zumindest wahrscheinlich, dass er die andere Seite der LED 
an Vcc angeschlossen hat.

>Ich wäre ja...
Du hast vermutlich recht, wie so oft. Ich muss zugeben, das bei so 
einfachen Fragen, möglicherweise eine Vorgabe sinnvoll sein mag.
OP #3430073
Lesenswert?
• ▲
▼
Wow kommen hier schnell viele antworten. Vielen Dank!

Ich habe nun den Fehler gefunden. Ich habe immer ein raw binary benutzt, 
statt ein Intel hex. Da sonst immer alles ging, hatte ich das gar nicht 
in Frage gestellt.
Der Fehler saß also wirklich vor dem Monitor. Jetzt fühle ich mich 
richtig dämlich.
Nun muss ich erst mal die genauen Eigenschaften der beiden Formate 
herausfinden, damit ich nicht nochmal eure Zeit verschwenden muss ;)

Nochmal danke an alle, die versucht haben mir zu helfen und tut mir Leid 
für die verschwendete Zeit.

Kevin

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.