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

Gast #4824137
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
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
Gast
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.
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)
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

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.