www.mikrocontroller.net

Forum: Compiler & IDEs Timer funktioniert nicht


Autor: fritz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Ich hab ein einfaches Programm mit AVR geschrieben aber irgendwie
funktioniert es nicht... Ich weiß nicht mehr weiter, wäre nett wenn mir
einer helfen würde.

Hier ist das Code
#include <avr/io.h>
#include <avr/interrupt.h>

unsigned char flag = 0;
void Init(void);

ISR (TIMER1_OVF_vect)
{
   TCNT1 = 0xBDB;
   flag = 1;
}
int main (void)
{
   Init();

   while(1)
   {
   if(flag)
  {
      PORTB = 0x00;
      flag = 0;
  }
  else PORTB=!PORTB;
    
   }
   return 0;
}

void Init(void)
{
    DDRB = 0xFF;
    TCCR1B = (1<<CS12);
    TCNT1 = 0xBDB;
    TIMSK = (1<<TOIE1);
    sei();
}

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
http://www.nongnu.org/avr-libc/user-manual/FAQ.htm...

Rücksetzen des Zählers im Interrupt ist keine schöne Lösung.  Besser
den "CTC"-Modus benutzen (clear timer on compare match), siehe
Datenblatt.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
volatile unsigned char flag = 0;

Autor: PIC FTW! (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PORTB=!PORTB;

macht auch nicht was du denkst.

Autor: Knut (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab dein Timing nicht nachgerechnet, aber sieht Du machst den Port aus 
und danach für einen kurzen Augenblick an und danach wieder aus?  Ich 
denke nicht das du da groß was siehst!  Aber beschreib erstma was du 
willst!

Gruß Ingo

Autor: fritz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab es ein wenig umgeändert aber geht trotzdem nicht...

Hier ist die neue Version:


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

volatile unsigned char flag = 0;



ISR (TIMER1_OVF_vect)
{
  TCNT1 = 0x9E57;
  flag = 1;
}



int main(void)
{

  DDRB = 0xFF;
  PORTB = 0xFF;
  TCCR1B = (1<<CS11) | (1<<CS10);
  TCNT1 = 0x9E57;
  TIMSK = (1<<TOIE1);
  sei();
  while(1)
  {
    if(flag)
    {
      PORTB = 0xFF;
      flag = 0;
    }
    else PORTB = 0x00;
  }
  return 0;
}

Ich will das die LED´s in 2 Sekunden Takt blinken...

Wäre nett, wenn einer helfen würde!

Autor: Magnus M. (magnetus) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
fritz schrieb:
> Ich will das die LED´s in 2 Sekunden Takt blinken...
  while(1)
  {
    if(flag)
    {
      PORTB ^= 0xFF;
      flag = 0;
    }
  }

Gruß,
Magnetus

Autor: fritz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab beim debuggen bemerkt, das der Overflow interrupt nie gesetzt 
wird und ich wüsste gern den Grund..

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
fritz schrieb:
> Ich hab beim debuggen bemerkt, das der Overflow interrupt nie gesetzt
> wird und ich wüsste gern den Grund..


Wie lang hast du denn den Simulator laufen lassen?
Bis der 25000 Timerticks bei einem Vorteiler von 64 durchsimuliert hat 
.... das kann schon eine Weile dauern.

Autor: Magnus M. (magnetus) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
fritz schrieb:
> Ich hab beim debuggen bemerkt, das der Overflow interrupt nie gesetzt
> wird

Ähm... was nutzt du zum debuggen? Mein AVR Studio ist fest davon 
überzeugt dass alle 1600063 Takte ein Overflow Interrupt aufgerufen 
wird.

und ich wüsste gern den Grund..

...Brett vorm Kopf?  ;)

Gruß,
Magnetus

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.