Hallo Allerseits,
Ich weiß, es gibt schon viele Threads, trotzdem komme ich hier auch nach
vielem stöbern und machen nicht weiter.
Mein Programm auf das Timerproblem reduziert:
1 | #include <avr/io.h>
|
2 | #include <avr/io.h>
|
3 | #include <avr/interrupt.h>
|
4 | volatile unsigned long millis;
|
5 |
|
6 | int main(void)
|
7 | {
|
8 | PORTC |= ((1<<5)|(1<<4)|(1<<3));
|
9 | DDRC |= ((1<<5)|(1<<4)|(1<<3));
|
10 | TCCR0A |= (1<<WGM01);
|
11 | TCCR0B |= (1<<CS01)|(1<<CS00);
|
12 | TIMSK0 |= (1<<OCIE0A);
|
13 | OCR0A = 125;
|
14 | sei();
|
15 |
|
16 | while (1)
|
17 | {
|
18 | }
|
19 | }
|
20 |
|
21 | ISR(TIMER0_COMPA_vect)
|
22 | {
|
23 | millis++;
|
24 | if(millis>1000)
|
25 | {
|
26 | cli();
|
27 | PORTC ^= ((1<<5)|(1<<4)|(1<<3));
|
28 | millis=0;
|
29 | sei();
|
30 | }
|
31 | }
|
LED soll einfach nur Toggeln.
Mit WGM01 im TCCR0A Register setz ich laut Datenblatt den CTC-Mode.
Hab zwar nen Quarz dran hängen aber um Fehler auszuschließen hab ich den
int. RC-Osz gesetzt. Ich will das der Timer ca jede ms die ISR auslöst.
8.000.000 Hz / Prescale(64) / Gewünschte Frequenz (1000Hz) = 125
Deshalb hab ich das Compare Register OCR0A auf 125 gesetzt.
Zähl ich jetzt die unsigned long variable millis auf 1000 hoch sollte 1s
vergangen sein. Also die LEDs sollten mit 0,5Hz blinken.
Problem ist jetzt dass die LED ca 8s an bzw aus bleiben...
Hier nochmal die Fuses:
1 | BODLEVEL = DISABLED
|
2 | RSTDISBL = [ ]
|
3 | DWEN = [ ]
|
4 | SPIEN = [X]
|
5 | WDTON = [ ]
|
6 | EESAVE = [X]
|
7 | BOOTSZ = 2048W_3800
|
8 | BOOTRST = [ ]
|
9 | CKDIV8 = [X]
|
10 | CKOUT = [ ]
|
11 | SUT_CKSEL = INTRCOSC_8MHZ_6CK_14CK_65MS
|
12 |
|
13 | EXTENDED = 0xFF (valid)
|
14 | HIGH = 0xD1 (valid)
|
15 | LOW = 0x62 (valid)
|
Ich bin am Verzweifeln und hoffe mir kann hier einer weiter helfen....
--
Dieses Forum sieht Tags für das Formatieren von Quelltext vor. Nutze
sie!
-rufus