1s Timer1 Mega8 CTC

Gast #732105
Lesenswert?

Guten Abend,

schon seit Tagen versuche ich, einen 16 Bit Timer im CTC-Modus zum 
Laufen zu bringen, der einen Takt von 1s geben soll. Leider bin ich bei 
der Suche hier nicht wirklich fündig geworden bzw. sie hat mich noch 
mehr verwirrt. Das ist das Erste mal, dass ich einen 16-Bit Timer 
benötige, hab damit also noch keine Erfahrung.

Naja, daraus ist dann folgender Code entstanden, der aber leider keinen 
Takt an den Ausgängen hervorbringt (Blinker).
Was muss ich noch machen, damit ich endlich einen Sekundentakt habe?

Vielen Dank!


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

SIGNAL (SIG_OUTPUT_COMPARE1A);

int main(void)
{
  DDRD = 0b01100000;

  TCCR1A = (1<<COM1A0) | (1<<COM1B0);
  TCCR1B = (1<<WGM12) | (1<<CS12);

  OCR1AH = 0x85;
    OCR1AL = 0x5E;


  TIMSK = (1<<OCIE1A);

  sei();

  for(;;)
  {}

}


SIGNAL (SIG_OUTPUT_COMPARE1A)
{
  if(PORTD == 0b01100000)
  {
    PORTD = 0b00000000;
  }
  else
  {
    PORTD = 0b01100000;
  }
}
Gast #732125
Lesenswert?

Der µC ist mit 8 Mhz getaktet. Leider blinkt immer noch nichts.
Wie meinst du das mit OCR1A statt OCR1AH/L verwenden und was muss ich 
bei "OCR1A = 8000000 / ..." hinschreiben? Sorry, für die dummen Fragen, 
aber ich hab diesen Timertyp echt noch nicht verstanden.

Könntest du evtl. meinen Quellcode mal so verändern, dass er 
funktioniert (1s)? Wäre dir und allen Anderen wirklich sehr dankbar.

Grüße Thomas
Gast #732135
Lesenswert?

So, blinken tut er jetzt, das Problem lag an einem nicht gesetzten 
Jumper auf dem Pollin-Board. Leider ist der Takt zu langsam, genau alle 
2 Sekunden. Das mit dem "OCR1A = 8000000 / ..."  versteh ich noch nicht.

Wenn ich OCR1A und OCR1B statt OCR1AH und OCR1AL verwende, leuchten  die 
LED's am Ausgang nur dauerhaft.

Was muss ich für "OCR1A = 8000000 / ..."  einsetzen, um genau 1 Sekunde 
heraus zu bekommen?

Vielen Dank!

Grüße Thomas
#732144
Lesenswert?

@ Thomas (Gast)

>Wenn ich OCR1A und OCR1B statt OCR1AH und OCR1AL verwende, leuchten  die
>LED's am Ausgang nur dauerhaft.

???

>Was muss ich für "OCR1A = 8000000 / ..."  einsetzen, um genau 1 Sekunde
>heraus zu bekommen?

Was soll 1s sein? LED 1s an, 1s aus, oder LED 0,5s an, 0,5s aus = 1s?

Lies nochmal das Kaptiel über den Timer und seine Vorteiler im 
Datenblatt.

Der Timer wird vom Hauptoszillator getaktet. Entweder direkt (Vorteiler 
=1) oder eben mit durch 8/32/256/1024 geteilten Takt. Welchen Vorteiler 
hast du eingestellt (hab jetzt das Datenblatt nicht)? Ich nehem mal an 
1024. Wieviel Takt braucht man dann für 1 Sekunde?

allgemein

OCR1A = F_CPU/(Vorteiler*Timerfrequenz)-1;

hier also.

OCR1A = F_CPU/(1024*2)-1;

1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3

4
int main(void)
5
{
6
  DDRD = 0b01100000;
7

8
  TCCR1A = (1<<COM1A0) | (1<<COM1B0);
9
  TCCR1B = (1<<WGM12) | (1<<CS12);
10

11
  OCR1A = F_CPU /(1024*2);
12

13
  TIMSK = (1<<OCIE1A);
14

15
  sei();
16

17
  for(;;)
18
  {}
19

20
}
21

22

23
ISR(hier noch den Vektor einsetzen)
24
{
25
  PORTD ^= 0b01100000;
26
}


MFG
Falk

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren