www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Timer läuft nicht (ATMEGA8 und C)


Autor: Scholly ... (scholly)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
wieder einmal das leidige Thema Timer beim ATMEGA8 in C :-)

Ich habe folgenden Code bereits geschrieben und komme nicht weiter, am 
PB0 tut sich nix...

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

int main(void)
{
DDRD = 0x01;
DDRB = 0x00;
PORTB = 0xFF;
TCCR1A |= (1 << WGM12);
OCR1A = 250;
TCCR1B |= ((1 << CS10)|(1 << CS11));
sei();
TIMSK |= (1 << OCIE1A);
}

ISR(TIMER1_COMPA_vect)
{
PORTD ^= (1<<0);
}

Aufgrund der kurzen Compareeinstellung (250) müsste die LED doch 
praktisch konstant leuchten, oder nicht ????

Ich schätze ich habe irgendwo einen Fehler bei den Registernamen, komme 
aber nicht drauf...

Danke und Gruß
Scholly

Autor: Remote One (remote1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das sieht mir wie der versuch aus, einen 16Bit Timer zu realisieren. 
MAch das mal so:
    // 16 bit timer:  
    TCCR1B = (1<<WGM12)|(1<<CS12)|(1<<CS10);      // CTC + Prescaler 1024 --> CPU/1024
  // bei 16MHz und prescaler 1024 --> 1s --> OCR1A  = 15624
    OCR1A  = 15624;              //vorladen, f_comp=fosc/(prescaler*(OCRnX+1)); OCRnX=fosc/(f_comp*prescaler)-1
    TIMSK |= (1<<OCIE1A);              //Output Compare Match A aktivieren

OCR1A musst du natürlich anpassen und der Rest stimmte eigentlich 
soweit. Ich würde evtl noch PORTD ^= ( 1 << PD0 ); schreiben, aber das 
ist Geschmackssache.

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Z.B. daß WGM12 nicht im TCCR1A liegt...

Autor: Stefan B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Offensichtliche Korrektur:

TIMSK |= (1 << OCIE1A);
sei();

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> TIMSK |= (1 << OCIE1A);
> sei();

Das ist kein Fehler, schaut nur nicht sauber aus. Funktioniert andersrum 
aber genauso.

Autor: Scholly ... (scholly)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für die schnellen Antworten.
Mein Code sieht jetzt so aus, läuft aber immer noch nicht (LED an PD0 
aus):

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

int main(void)
{
DDRD = 0x01;
DDRB = 0x00;
PORTB = 0xFF;
TCCR1B |= (1 << WGM12)|(1 << CS12)|(1 << CS10);
OCR1A = 10; //Hab nur auf 1MHz laufen, zum testen sollte es reichen
TIMSK |= (1 << OCIE1A);
sei();
}

ISR(TIMER1_COMPA_vect)
{
PORTD ^= (1<<PD0);
}

Autor: remote (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vom Code her schauts gut aus. Bekommst du irgendwelche Warnings/Fehler 
gemeldet? Hast du die Hardware überprüft? Hast du die includes für 
Interupts mit drin?

Autor: remote (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ach so, wie wäre es denn mal mit einer Schleife ;)
#include <avr/io.h>
#include <avr/interrupt.h>

int main(void)
{
DDRD = 0x01;
DDRB = 0x00;
PORTB = 0xFF;
TCCR1B |= (1 << WGM12)|(1 << CS12)|(1 << CS10);
OCR1A = 10; //Hab nur auf 1MHz laufen, zum testen sollte es reichen
TIMSK |= (1 << OCIE1A);
sei();
while(1){

}
}

ISR(TIMER1_COMPA_vect)
{
PORTD ^= (1<<PD0);
}

Autor: Scholly ... (scholly)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
remote schrieb:
> ach so, wie wäre es denn mal mit einer Schleife ;)
>

Oooops :-)
Das kommt davon wenn man zu lange davor sitzt....


Vielen Dank, jetzt gehts.
Schönes, verschneites WE noch

Autor: H4nn32 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
kann mir einer sagen was die Zeile:

OCR1A = 10; //Hab nur auf 1MHz laufen, zum testen sollte es reichen

macht?

Autor: Daniel K. (epyx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Setzt den Vergleichswert für den Timer, wenn der erreicht wurde, springt 
der uC in die ISR.

Kann man übrigens auch im Datenblatt nachlesen.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Hallo,
>kann mir einer sagen was die Zeile:
>OCR1A = 10; //Hab nur auf 1MHz laufen, zum testen sollte es reichen
>macht?

>Setzt den Vergleichswert für den Timer, wenn der erreicht wurde, springt
>der uC in die ISR.

Der Timer läuft im CTC-Mode mit OCR1A als Topwert. Damit wird bei 
Erreichen von OCR1A der Timer wieder auf Null gesetzt. Gleichzeitig 
wird, wenn freigegeben, der zugehörige Interrupt ausgelöst und/oder, 
wenn erlaubt, das OC1A-Pin getoggled. Der Wert in OCR1A bestimmt den 
Abstand dieser Ereignisse.

MfG Spess

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.