mikrocontroller.net

Forum: Compiler & IDEs ATtiny2313


Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :)

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.