Forum: Mikrocontroller und Digitale Elektronik 1s Timer1 Mega8 CTC


von Thomas (Gast)


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

von Andreas K. (a-k)


Lesenswert?

Keine Geduld gehabt? Beim Mega8 in 1MHz Standardeinstellung komme ich 
auf einen Interrupt alle 9 Sekunden.

Tips:
- SIGNAL ist veraltet, ISR verwenden.
- OCR1A statt OCR1AH/L verwenden.
- Rechnen kann der Compiler selber. Also OCR1A = F_CPU / ... 
hinschreiben.

von Thomas (Gast)


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

von Thomas (Gast)


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

von Falk B. (falk)


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

von Thomas (Gast)


Lesenswert?

Ahh, danke. Du hast mir sehr geholfen. Nun wird mir einiges klar.

Ja, PD5/6 soll jeweils 0,5 Sek Ein/Aus sein, also wie in deinem 
Beispiel.


Grüße!

von Lowtzow .. (lowtzow)


Lesenswert?

muss ich jetzt ausgraben!

>
1
>   TCCR1A = (1<<COM1A0) | (1<<COM1B0);
2
3
>


hat das irgendeinen sinn?
ich glaub in dem programm nicht, eher &= ~((1<<COM1A0)|(1<<COM1A1)| 
(1<<COM1B0)|(1<<COM1B1))

weil sonst würd ich einen Pin verlieren.

mfg
low

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.