Forum: Mikrocontroller und Digitale Elektronik Timerproblem atmega


von Kai (Gast)


Lesenswert?

Hi,
ich habe ein Problem mit dem Timer0 vom atmega und hoffe, dass ihr mir 
weiterhelfen könnt.
1
#define F_CPU 16000000UL
2
#include <avr/io.h>
3
#include <avr/interrupt.h>
4
#include <util/delay.h>
5
6
int main(void)
7
{
8
  DDRB |= (1<<PINB5);
9
  PORTB &= ~(1 << PINB5);
10
  
11
  TCCR0A |= (1 << WGM01); // CTC-Mode
12
  TCCR0B |= (1 << CS00) | (1 << CS01); // clkI/O/64
13
  OCR0A |= (250 - 1);
14
  TIMSK0 |= (1 << TOIE0);
15
  
16
  sei();
17
    while (1) 
18
    {
19
    
20
    }
21
}
22
23
ISR (TIMER0_OVF_vect)
24
{
25
  static int32_t milliseconds = 0;
26
  milliseconds++;
27
  
28
  if(milliseconds>=1000)
29
  {
30
    PORTB ^= (1<<PINB5);
31
    milliseconds = 0;
32
  }
33
}

Der Code ist noch ganz übersichtlich. Ich möchte zunächst die LED in der 
ISR im Sekundentakt toggeln lassen. Doch leider bleibt diese aus. (auch 
wenn ich die LED direkt beim eintreten in der ISR toggeln lassen möchte, 
bleibt diese aus). Wenn ich in der while-schleife allerdings ein 
_delay_ms(500); und dann die LED Toggle, blinkt diese im 500ms-Takt.
Aber was ist am Timer falsch? Oder warum wird nicht in die ISR 
gesprungen?

von Theor (Gast)


Lesenswert?

Ich empfehle, den Code im Debugger laufen zu lassen.

von Thomas E. (thomase)


Lesenswert?

Falscher Interrupt. Im CTC mußt du den Compare Match A nehmen.

von Kai (Gast)


Lesenswert?

Thomas E. schrieb:
> Falscher Interrupt. Im CTC mußt du den Compare Match A nehmen.

Mhh, danke

von Nebel Stocherer (Gast)


Lesenswert?

Kai schrieb:
> ich habe ein Problem mit dem Timer0 vom atmega und hoffe, dass ihr mir
> weiterhelfen könnt.

Wäre es zuviel Arbeit für dich anzugeben welchen Controller
du genau meinst .. denn die Vielfalt an ATMegas ist immens.

Jedenfalls würdest du den hilfsbereiten Leuten hier eventuell
viel Arbeit abnehmen wenn sie nicht auf den ersten Blick sehen
welcher Controller zu deinem Timer passt.

Dies nur für eventuell zukünftige Fälle ...

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

> ISR {
>  static int32_t milliseconds = 0;
>  milliseconds++;
>  [..]
> }
Bewirkt das nicht, daß die Variable immer wieder neu mit 0 initialisiert 
wird? Wenn ja, kann man wirklich lange drauf warten, daß sie irgendwann 
1000 annimmt.

von H.Joachim S. (crazyhorse)


Lesenswert?

Ben B. schrieb:
> Bewirkt das nicht, daß die Variable immer wieder neu mit 0 initialisiert
> wird?

Nö. Alles gut.

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

Ok thx... ich hasse C.

von J. Zimmermann (Gast)


Lesenswert?

Streich diese Zeile:   TCCR0A |= (1 << WGM01); // CTC-Mode
mfg
Achim

von Kai (Gast)


Lesenswert?

J. Zimmermann schrieb:
> Streich diese Zeile:   TCCR0A |= (1 << WGM01); // CTC-Mode
> mfg
> Achim

Warum? Dann würde der Timer doch im Normalen modus laufen und immer bis 
nach 0xFF zählen oder nicht? So zählt dieser nur bis OCR0A

Ahso, es geht um einen Atmega328

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.