Forum: Mikrocontroller und Digitale Elektronik timer/counter-verständnis?


von daniela (Gast)


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);

      }
    }

von Achim M. (minifloat)


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

von daniela (Gast)


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);

      }
    }

von Rolf Magnus (Gast)


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);

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.