Forum: Mikrocontroller und Digitale Elektronik Timer1 läuft nicht an


von VON THRON (Gast)


Lesenswert?

Versuche gerade mit hilfe einens Uhrenquarz 6,5536MHz meinen Timer 1 von 
meinem Atmega644 zum laufen zu bekommen. Doch leider ergebnislos.

void timer1_init()
{
    OCR1A = 6400;         // Vergleichswert setzen

    TCCR1A = 0;           // Modus einstellen, Clear Timer on 
Compare-Mode

    TCCR1B = (1<<CS12) |(1<<CS10) | (1<<WGM12); //Teiler und Modus 
einstellen, Teiler 1024 //CTC-Mode (Clear Timer on Compare-Mode)

    TIMSK0 |= (1<< OCIE1A);// Interrupt zulassen bei TIMER1
}

von andy (Gast)


Lesenswert?

Hast du auch ein sei(); im Code?

von VON THRON (Gast)


Lesenswert?

ISR (TIMER1_OVF_vect)
{
    sei();
    sekunden++;
    if(sekunden == 60)
    {
      minuten++;
      sekunden = 0;
    }
    if(minuten == 60)
    {
      stunden++;
      minuten = 0;
    }
    if(stunden == 24)
    {
      stunden = 0;
    }
    if((stunden==23)&(minuten==59)&(sekunden==59))
    {
       speichern = 1;
    }
}

von Floh (Gast)


Lesenswert?

VON THRON schrieb:
> sei();

Das gehört bei dir nicht in den Timerinterrupt, das gehört zur 
Initialisierung.

Außerdem passt das
> ISR (TIMER1_OVF_vect)
und das
> TIMSK0 |= (1<< OCIE1A);// Interrupt zulassen bei TIMER1

nicht zusammen. (Overflow ungleich Compare)

von Admax (Gast)


Lesenswert?

Im übrigen must du nicht das Timer Mask Register "0" 
setzen/beschreiben/definieren, sonder das des Timer "1"!

von VON THRON (Gast)


Lesenswert?

Floh schrieb:
> Außerdem passt das
>> ISR (TIMER1_OVF_vect)
> und das
>> TIMSK0 |= (1<< OCIE1A);// Interrupt zulassen bei TIMER1
>
> nicht zusammen. (Overflow ungleich Compare)

??? Kapier ich gerade nicht.

Admax schrieb:
> Im übrigen must du nicht das Timer Mask Register "0"
> setzen/beschreiben/definieren, sonder das des Timer "1"!

Danke war ein Tipfehler!

von Floh (Gast)


Lesenswert?

VON THRON schrieb:
> Kapier ich gerade nicht.

Du aktivierst einen OutputCompare-Interrupt (OCIExx), definierst dir 
aber einen Overflow Interrupt. Das sind zwei verschiedene Sachen.

Zeig doch dein Programm mal ganz (als Anhang).

von VON THRON (Gast)


Lesenswert?

volatile unsigned char sekunden = 0;
volatile unsigned char minuten  = 0;
volatile unsigned char stunden  = 0;

void timer1_init()
{
    sei();
    OCR1A = 6400;

    TCCR1A = 0;

    TCCR1B = (1<<CS12) |(1<<CS10);// | (1<<WGM12);

    TIMSK1 |= (1<< OCIE1A);
}

ISR (TIMER1_OVF_vect)
{

  sekunden++;
  if(sekunden == 60)
    {
      minuten++;
      sekunden = 0;
    }
    if(minuten == 60)
    {
      stunden++;
      minuten = 0;
    }
    if(stunden == 24)
    {
      stunden = 0;
  }
  if((stunden==23)&(minuten==59)&(sekunden==59))
  {
   speichern = 1;
  }
}

von Floh (Gast)


Lesenswert?

Ich wiederhole mich :-)

> Du aktivierst einen OutputCompare-Interrupt (OCIExx), definierst dir
> aber einen Overflow Interrupt. Das sind zwei verschiedene Sachen.

Ändere mal deinen Interruptheader in
ISR(TIMER1_COMPA_vect)

Hoffe es ist richtig geschrieben, ansosnten kommt "misspelled 
interrupthandler".

von VON THRON (Gast)


Lesenswert?

Ja danke Flo das passt alles einwandfrei! jetzt zählt er schonmal nur 
noch net richtig! ;)

6553600/1024*1 das is doch die Formel oder?

von Karl H. (kbuchegg)


Lesenswert?

VON THRON schrieb:
> Ja danke Flo das passt alles einwandfrei! jetzt zählt er schonmal nur
> noch net richtig! ;)
>
> 6553600/1024*1 das is doch die Formel oder?

Einfach überlegen, wie der Timer arbeitet; wann daher welcher Interrupt 
kommt.

von VON THRON (Gast)


Lesenswert?

Ja hat sich erledigt!
hatte was vergessen umzustellen.

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.