Forum: Mikrocontroller und Digitale Elektronik Timer "fehler" mit tiny 2313


von Flops (Gast)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

@  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

von Klaus 2. (klaus2m5)


Lesenswert?

Zum gefühlten eintausendsten Mal:

Fuses, speziell CKDIV8

von Flops (Gast)


Lesenswert?

Meine Fuses sind -U lfuse:w:0xe4:m -U hfuse:w:0xdf:m, CKDIV8 ist also 
nicht gesetzt.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Flops (Gast)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Flops (Gast)


Lesenswert?

Als ich heute morgen geschaut habe waren die LEDs aus, es lag wohl also 
tatsächlich an einem falschen Datentyp.

Nochmal vielen Dank für die Hilfe,

Flo

von Oliver (Gast)


Lesenswert?

"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

von Karl H. (kbuchegg)


Lesenswert?

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.

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.