Timer "fehler" mit tiny 2313

Gast #2541634
Hallo µC Community,

gestern habe ich versucht einen Timer mit einem attiny 2313 zu 
realisieren. Über die PB3 und PB4 sind mit Transistoren LEDs 
angeschlossen, die ich durch de- und aktivieren der Pins an- und 
ausschalten kann.

Die LEDs sollen 12h brennen und dann für 12h aus sein. Wenn ich 
allerdings abends um 17:00 Uhr die Schaltung anschalte und morgens um 
7:00 Uhr schaue ob die LEDs brennen, dann sind diese immer noch an.

Wo liegt mein Fehler? Der AVR läuft mit 8Mhz und hier ist mein 
Sourcecode:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3

4
int stunden = 12*60*60;
5
int count_isr = 0;
6
int seconds = 0;
7

8
void initTimer() {
9
  TCNT0 = 0;  // reset timer
10
  TIMSK |= (1 << TOIE0);  // enable overflow interrupt
11
  TCCR0B |= (1 << CS00);
12
}
13

14
int main(void)
15
{
16
    /* insert your hardware initialization here */
17
    DDRB = 0xff;  // alles als ausgang
18
    DDRD = 0xff;  // alles als ausgang
19
    sei();
20
    initTimer();
21
    PORTD |= (1 << PD3);
22
    //PORTB |= (1 << PB2);
23
  //PORTB |= (1 << PB3);
24

25
    for(;;){
26
        /* insert your main loop code here */
27
        //PORTD ^= (1 << PD3);
28
    }
29
    return 0;   /* never reached */
30
}
31

32
ISR(TIMER0_OVF_vect) {
33
  // eine sekunde ist rum, wenn die ISR 31250 mal aufgerufen wurde
34
  count_isr++;
35
  if(count_isr >= 31250) {
36
    count_isr = 0;
37
    seconds++;
38
  }
39
  if(seconds >= stunden) {
40
        seconds = 0;
41
        PORTB ^= (1 << PB2);
42
    PORTB ^= (1 << PB3);
43
  }
44
}

Vielen Dank

Flops
@  Flops (Gast)

>Die LEDs sollen 12h brennen

leuchten. Brennen tun nur Kerzen und manchmal der Weihnachtsbaum ;-)

>und dann für 12h aus sein. Wenn ich
>allerdings abends um 17:00 Uhr die Schaltung anschalte und morgens um
>7:00 Uhr schaue ob die LEDs brennen, dann sind diese immer noch an.

>Wo liegt mein Fehler?

Du musst erstmal in kleinerem Zeitmassstab testen. Z.B. 1 Minute.

> Der AVR läuft mit 8Mhz

Interner RC-Oszillator? Ist eher ungenau. Für genauere Sachen braucht 
man einen Quarz.

http://www.mikrocontroller.net/articles/AVR-Tutorial:_Equipment#Erg.C3.A4nzende_Hinweise_zur_Taktversorgung_.28kann_.C3.BCbersprungen_werden.29

>und hier ist mein Sourcecode:

Sieht auf den ersten Blick OK aus.

MFG
Falk
Und zum gefühlt 500-tausendsten mal: Datentypen und deren Wertebereiche!

int stunden = 12*60*60;

geht schon schief. 12*60*60 ergibt 43200
int geht aber 'nur' von -32768 bis 32767.
Mit uint16_t wärs zumindest in dem Punkt gegangen.
Gast
Oh danke, ich hab darüber nachgedacht aber letztenendes nicht 
nachgeschaut, wie groß int wirklich ist.

Es wäre also besser ein unsigned int zu verwenden, oder?
Flops schrieb:
> Oh danke, ich hab darüber nachgedacht aber letztenendes nicht
> nachgeschaut, wie groß int wirklich ist.
>
> Es wäre also besser ein unsigned int zu verwenden, oder?

1) Es ist auf einem µC fast immer besser einen unsigned Datentyp
   zu nehmen. Es sei denn, man braucht explizit und zwingend ein
   Vorzeichen.

2) Es ist auf einem µC wie den Tinys und Megas fast immer besser, die
   Bitzahl explizit vorzugeben, anstatt sie dem Compiler zu überlassen
   Also: uint16_t oder uint8_t anstelle von unsigned int

3) Anrüchige Berechnungen mit der Tendenz große Zahlen zu liefern
   IMMER mit dem Maximalwerten kontrollieren und nachrechnen.
   Overflows sind im Nachhinein nur schwer zu finden.
Gast
"Aus" ist als Funktionskontrolle schlecht geeignet, vielleicht ist ja 
auch einfach was kaputt gegangen. Du solltest schon noch wieder warten, 
ob die LEDs in zur erwarteten Zeit auch wieder an gehen.

Oliver
Die 12 Stunden werden auch nicht exakt stimmen. Noch nicht mal dann, 
wenn du einen Quarz benutzt.

Schon alleine deshalb solltest du versuchen, den exakten Zeitpunkt 
vorherzusagen und zu kontrollieren, um festzustellen, wie groß die 
Abweichung tatsächlich ist.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 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.