timer/counter-verständnis?

Gast #2391309
Lesenswert?
• ▲
▼
hallo

Ich bin Anfängerin und beschäftige mich erst seit einigen Wochen mit dem
Thema µC.Ich habe mir auch schon das Tutorial über den Timer/Counter
durchgelesen und bin mir nicht sicher ob ich es auch verstanden hab.

Ich hab auch schon ein kleines LED-Blicklicht hingekriegt nun
wollte ich eine LED einfach nur 5s lang leuchten lassen :(

Ich hoffe ihr könnt mir helfen:


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

unsigned char t= 5;



int main(void)
{

DDRC|= (1<<PC5);

TCCR1B|= (1<<WGM12);

TIMSK|= (1<<OCIE1A);

sei();

OCR1A = 15624;

TCCR1B|= (1<<CS10)|(1<<CS11);

  for(;;)
  {

  }
}
    ISR(TIMER1_COMPA_vect)
    {
      t--;
      if(t==5)
      {
      counter= 0;
      PORTC^= (1<<PC5);

      }
    }
#2391328
Lesenswert?
• ▲
▼
Hallo. Was funktioniert denn nicht?

daniela schrieb:
> unsigned char t= 5;
mach mal ein "volatile unsigned char" daraus, weil in der 
Interruptroutine t verändert wird. Siehe AVR-GCC-Tutorial.

daniela schrieb:
> ISR(TIMER1_COMPA_vect)
>     {
>       t--;
>       if(t==5)
>       {
>       counter= 0;
>       PORTC^= (1<<PC5);
>
>       }
>     }

Problem2: die Variable t wird nur ein einziges mal bei Programmstart auf 
5 gesetzt.
Ich würde vorschlagen:
1
ISR(TIMER1_COMPA_vect)
2
    {
3
      t--;
4

5
      if(t==0)
6
      {
7
      t = 5;
8
      PORTC ^= (1<<PC5);
9
      }
10
    }

Die Timer-Initialisierung hab ich jetzt nicht auf Korrektheit überprüft.
mfg mf
Gast #2391354
Lesenswert?
• ▲
▼
naja ich wollt eigentlich eine LED 5Min lang leuchten lassen und habe
als Muster diese 5sekunden gewählt. Nun warte ich 5sekuden und dann
geht die LED erst an aber die LED soll gleich an gehen und 5 Sekunden 
lang leuchten :(

Ich habs abgeändert es funktioniert auch danke aber troztdem müsste ich
dann 5min warten bis die LED in den Rhythmus kommt.


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

volatile unsigned char t= 5;



int main(void)
{

DDRC|= (1<<PC5);

TCCR1B|= (1<<WGM12);

TIMSK|= (1<<OCIE1A);

sei();

OCR1A = 15624;

TCCR1B|= (1<<CS10)|(1<<CS11);

  for(;;)
  {

  }
}
    ISR(TIMER1_COMPA_vect)
    {
      t--;
      if(t==0)
      {
      t = 5;
      PORTC^= (1<<PC5);

      }
    }
Gast #2391395
Lesenswert?
• ▲
▼
daniela schrieb:
> naja ich wollt eigentlich eine LED 5Min lang leuchten lassen und habe
> als Muster diese 5sekunden gewählt. Nun warte ich 5sekuden und dann
> geht die LED erst an aber die LED soll gleich an gehen und 5 Sekunden
> lang leuchten :(

Warum schaltest du sie dann nicht einfach gleich ein?
Also vor deiner Endlosschleife ein
1
       PORTC |= (1<<PC5);

Antwort schreiben

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.

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.