Forum: Mikrocontroller und Digitale Elektronik timer am avr startet nicht oder es wird nicht in die ISR gesprungen


von Kai (Gast)


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).

von Dietrich L. (dietrichl)


Lesenswert?

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!

von Kai (Gast)


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

von Dietrich L. (dietrichl)


Lesenswert?

Kai schrieb:
>> 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.

Wenn das so wirklich ist ziehe ich meine Aussage zurück. Ich bin kein 
C-Fachmann... ;-(

von Peter II (Gast)


Lesenswert?

1
  static uint8_t millis = 0;
2
  millis++;
3
  if(millis >= 1000 )

fällt dir nichts auf? Vermutlich gibt es sogar eine Warnung.

in 8 bit passt keine 1000 rein.

von Dietrich L. (dietrichl)


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 ;-)

von Matthias S. (Firma: matzetronics) (mschoeldgen)


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.

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.