Timer läuft nicht (ATMEGA8 und C)

OP #1547564
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
Das sieht mir wie der versuch aus, einen 16Bit Timer zu realisieren. 
MAch das mal so:
1
    // 16 bit timer:  
2
    TCCR1B = (1<<WGM12)|(1<<CS12)|(1<<CS10);      // CTC + Prescaler 1024 --> CPU/1024
3
  // bei 16MHz und prescaler 1024 --> 1s --> OCR1A  = 15624
4
    OCR1A  = 15624;              //vorladen, f_comp=fosc/(prescaler*(OCRnX+1)); OCRnX=fosc/(f_comp*prescaler)-1
5
    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.
OP
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);
}
Gast
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?
Gast
ach so, wie wäre es denn mal mit einer Schleife ;)
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3

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

15
}
16
}
17

18
ISR(TIMER1_COMPA_vect)
19
{
20
PORTD ^= (1<<PD0);
21
}
Gast
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

Eine eigene Frage? Dieser Thread ist über 16 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.