1s Timer1 Mega8 CTC

Gast #732105
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;
  }
}
#732115
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.
Gast #732125
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
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
@ 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
Gast #732203
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!
#1136489
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.