Forum: Compiler & IDEs ATtiny2313


von Andreas (Gast)


Lesenswert?

Hallo,

ich habe momentan irgendein Problem, dass der Timer nicht funktioniert. 
Das Programm sollte im Sekundentakt die LEDs (PORTB) an und auschalten, 
allerdings gehen die LEDs nur an, aber nciht mehr aus.

Den Takt soll das Programm von dem 16MHz Quarzbaustein bekommen.

Der PreScaler 1024 ist nur probeweise, weil ich mir nicht sicher war, ob 
die LEDs nicht zu schnell an und ausgehen...

Hier ist mal mein Programm:

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>

volatile unsigned char time_ist = 0;

SIGNAL (SIG_OVERFLOW1) {
  time_ist++;
}

void timer (unsigned char time_soll) {
  TCNT1 = 0;                //Rücksetzen des Timers
  TCCR1B = _BV(CS12) | _BV(CS10);    //Prescaler 1024
  TIMSK = _BV(TOIE1);            //Timer Overflow Interrupt enable
  sei ();
  while (time_soll >= time_ist) {}
}

int main (void) {
  DDRB = 0xff;
  for (;;) {
    timer (1);
    PORTB = 0xff;
    timer (1);
    PORTB = 0x00;
    timer (1);
  }
}

Vielen Dank schon einmal im Vorraus :)

von Johannes M. (johnny-m)


Lesenswert?

Doch, die gehen schon aus, aber dann auch gleich wieder an, und zwar so 
schnell, dass Du es nicht siehst. time_ist wird nirgends zurückgesetzt, 
so dass beim zweiten Aufruf von timer(1) die Bedingung der 
while-Schleife schon nicht mehr erfüllt ist (time_ist ist ja noch 
mindestens 1) und dementsprechend die Funktion sofort wieder verlassen 
wird.

BTW: SIGNAL und die signal.h sind veraltet und sollten für neuen Code 
nicht mehr verwendet werden. Wenn Du keine aktuelle Version der libc 
hast, dann solltest Du mal updaten und ISR für die Interrupt-Handler 
verwenden.

von Andi (Gast)


Lesenswert?

Danke :)

Jetzt sollte ich das nur noch genau auf den Sekundentakt bekommen...

Das Programm sieht gerade so aus:

volatile unsigned char time_ist;

SIGNAL (SIG_OVERFLOW1) {
  time_ist++;
}

void timer (unsigned char time_soll) {
  time_ist = 0;
  TCNT1 = 0;                //Rücksetzen des Timers
  TCCR1B = _BV(CS11) | _BV(CS10);    //Prescaler 64
  TIMSK = _BV(TOIE1);            //Timer Overflow Interrupt enable
  sei ();
  while (time_soll >= time_ist) {}
}

int main (void) {
  DDRB = 0xff;
  for (;;) {
    PORTB = 0xff;
    timer (1);
    PORTB = 0x00;
    timer (1);
  }
}

Was bringt die aktuelle Version für Vorteile? Ziemlich viel, was ich 
hier finde ist anscheinend mit älteren Versionen gemacht worden...

von Johannes M. (johnny-m)


Lesenswert?

Andi wrote:
> Danke :)
>
> Jetzt sollte ich das nur noch genau auf den Sekundentakt bekommen...
Dafür solltest Du dann aber nicht den Overflow-Interrupt benutzen, 
sondern einen Compare-Interrupt und den Timer im CTC-Modus betreiben.

> Was bringt die aktuelle Version für Vorteile? Ziemlich viel, was ich
> hier finde ist anscheinend mit älteren Versionen gemacht worden...
Ich weiß nicht, was für eine Version Du hast. Möglicherweise (wenn Du 
sie in letzter Zeit heruntergeladen hast) ist das sogar die aktuelle 
Version. Dann müsstest Du aber zumindest eine Warnmeldung beim 
Compilieren bekommen, weil es die signal.h gar nicht mehr gibt (SIGNAL 
ist zwar in der interrupt.h noch definiert, aber nur aus 
Kompatibilitätsgründen zu alten Versionen). Neue Versionen haben meist 
den Vorteil, dass Bugs aus älteren Versionen behoben sind (was natürlich 
nicht bedeutet, dass keine neuen Bugs drin sind;-) und dass auch schon 
mal Erweiterungen eingebaut werden, die einem das Leben erleichtern 
können.

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.