timer am avr startet nicht oder es wird nicht in die ISR gesprungen

Gast #4824137
Lesenswert?
• ▲
▼
Hallo,
eigentlich wollte ich mir gestern ein DCF77-Modul besorg haben, aber es 
war keins mehr da. Daher würde ich dann jetzt mit dem Timer des 
Controllers anfangen.
1
#define F_CPU 16000000UL
2

3
#include <avr/io.h>
4
#include <avr/interrupt.h>
5

6
int main(void)
7
{
8
  DDRB |=  (1 << PB2);
9
  PORTB |= (1 << PB2);
10

11
  TCCR0A |= (1 << WGM01);
12
  TCCR0B |= (1 << CS00) | (1 << CS01);
13
  OCR0A = 250-1;
14
  TIMSK0 |= (1 << OCIE01);
15
  sei();
16

17
  while(1)
18
  {}
19
}
20

21
ISR(TIMER0_COMPA_vect)
22
{
23
    static uint8_t millis = 0;
24
    static uint8_t seconds = 0;
25
    static uint8_t minutes = 0;
26
    static uint8_t hours = 0;
27
    millis++;
28
    if(millis >= 1000 )
29
    {
30
        PORTB ^= ( 1 << PB2 );
31
        seconds++;
32
        millis = 0;
33
        if(seconds >= 60 )
34
        {
35
            minutes++;
36
            seconds = 0;
37
            if(minutes >= 60)
38
            {
39
                hours++;
40
                minutes = 0;
41
                if(hours >= 12)
42
                {
43
                    hours = 0;
44
                }
45
            }
46
        }
47
    }
48
}
habe einen Quarz mit 16Mhz. Das heisst, alle millisekunde sollte in die 
ISR gesprungen werden

Allerdings bleibt die LED immer am leuchten (noch soll diese erstmal 
blinken).
Gast #4824148
Lesenswert?
• ▲
▼
Dietrich L. schrieb:
> Kai schrieb:
>> static uint8_t millis = 0;
>> ISR(TIMER0_COMPA_vect)
>> {
>>     static uint8_t seconds = 0;
>>     static uint8_t minutes = 0;
>>     static uint8_t hours = 0;
>>     millis++;
>
> Du löschst jedesmal bei Eintritt in die ISR die Variablen neu!

aber deswegen habe ich doch static, die werden doch nur einmalig mit 
null beschrieben.

Der fehler war, dass ich 1000 millis haben wollte, diese aber nur mit 
uint8_t deklariert habe
-> 1000 werden nie erreicht
#4824159
Lesenswert?
• ▲
▼
Peter II schrieb im Beitrag #4824155 um 09:40:
> fällt dir nichts auf? Vermutlich gibt es sogar eine Warnung.
>
> in 8 bit passt keine 1000 rein.

Kai schrieb im Beitrag #4824148 um 9:21:
> Der fehler war, dass ich 1000 millis haben wollte, diese aber nur mit
> uint8_t deklariert habe
> -> 1000 werden nie erreicht

Kai war selber viel schneller ;-)
(Firma: matzetronics) #4824161
Lesenswert?
• ▲
▼
Da du allerdings deine Uhrzeit Bytes lokal in der ISR hältst, kommst du 
von aussen nicht ran, um sie z.B. anzuzeigen oder z.B. einzustellen. 
Erkläre sie besser als globale volatile Bytes ausserhalb der ISR, damit 
auch andere Programmteile drauf zugreifen können.

Die millis können ja lokal in der ISR bleiben.

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