Hallo,
kann man sich bei einem AVR die Timer-Einheit kaputt machen, und der
Rest läuft noch?
Ich hab ein längeres Programm, was bzgl. Timer problemlos lief, hab
etwas anderes am Code geändert und nun spielen die Timer (bzw. Timer0
und Timer2 hab ich versucht) verrückt:
Eine LED (an C6), die eigentlich mit einer konstanten Frequenz blinken
sollte, macht das nicht: Zuerst ist sie etwas länger(3-4 Sekunden) an,
dann ganz kurz aus, so dass man es gerade erkennen kann. Das wiederholt
sich dreimal, dann vertauschen sich die Zeiten, d.h. sie ist länger aus
und geht ganz kurz an. Nach dreimal wieder zurück zu lange an-kurz
aus...
Unten ist der zusammengekürzte Code, bei dem das Problem auftritt. Wenn
ich statt dem Timer ein delay für das Blinken nehme, geht das wie
erwartet, der Quarz ist also in Ordnung. Auch USART-Kommunikation
geht...
µC ist ein ATmega644p mit 20MHz-Quarz. Das Problem tritt bei zwei
verschiendenen Platinen auf, an der äußeren Beschaltung kann es also
eigentlich nicht liegen, hab auch zig mal stromlos gemacht und/oder neu
programmiert...
Fuses sollten auch stimmen (low F7-high D9-ext FF), da es mit denen bis
jetzt geklappt hat...
1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 | #include <util/delay.h>
|
4 |
|
5 | volatile uint8_t timecounter0 = 0;
|
6 |
|
7 | ISR(TIMER0_OVF_vect)
|
8 | {
|
9 | timecounter0++;
|
10 | }
|
11 |
|
12 | int main()
|
13 | {
|
14 | DDRC |=(1<<DDC6)|(1<<DDC5); //C5 C6 als Ausgang
|
15 |
|
16 | TCCR0B |= (1 << CS00) |(1 << CS02); // Timer 0 starten, Prescaler = 1024
|
17 | TIMSK0 |= (1<<TOIE0);
|
18 |
|
19 | PORTC = (1<<PORTC6)|(1<<PORTC5);
|
20 |
|
21 | sei();
|
22 | while (1)
|
23 | {
|
24 | if (timecounter0 == 32)
|
25 | {
|
26 | //_delay_ms(500);
|
27 | PORTC ^= (1<<PORTC6);
|
28 | }
|
29 |
|
30 | }
|
31 | }
|