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 | |
2 | |
3 | |
4 | |
5 | |
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.
Gast
#1547574
Z.B. daß WGM12 nicht im TCCR1A liegt...
Gast
#1547575
Offensichtliche Korrektur: TIMSK |= (1 << OCIE1A); sei();
Gast
#1547581
> TIMSK |= (1 << OCIE1A); > sei(); Das ist kein Fehler, schaut nur nicht sauber aus. Funktioniert andersrum aber genauso.
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
#1547597
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
#1547603
ach so, wie wäre es denn mal mit einer Schleife ;)
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
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
Gast
#2163681
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. Kann man übrigens auch im Datenblatt nachlesen.
Gast
#2163844
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
Bitte melde dich an, um einen Beitrag zu schreiben.