www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 1s Timer1 Mega8 CTC


Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;
  }
}

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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;

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

int main(void)
{
  DDRD = 0b01100000;

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

  OCR1A = F_CPU /(1024*2);

  TIMSK = (1<<OCIE1A);

  sei();

  for(;;)
  {}

}


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


MFG
Falk

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Lowtzow .... (lowtzow)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
muss ich jetzt ausgraben!

>

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

> 


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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.