Hi,
ich habe versucht, den Timer0 des ATTiny25 zum Laufen zu bringen, aber
irgendwas klappt nicht so ganz, bzw. ich übersehe wahrscheinlich
irgendeinen trivialen Fehler :( Das Programm soll einfach ein LED am Pin
2 anschalten und beim Aufruf des entsprechenden Interruptvektors wieder
ausschalten (nur um zu sehen, ob der Vektor überhaupt angesprungen
wird). Die LED ist gegeb Masse angeschlossen, und verwendet wird der
Timer0 im CTC-Modus. Der Rest müsste aus dem Quelltext ersichtlich sein:
1 | #define F_CPU 8000000L
|
2 | #include <avr/io.h>
|
3 | #include <avr/interrupt.h>
|
4 |
|
5 | //Anschluss ReadyLED
|
6 | #define DDR_READY_LED DDRB
|
7 | #define PORT_READY_LED PORTB
|
8 | #define PIN_READY_LED PB3
|
9 |
|
10 | ISR(TIMER0_COMPA_vect)
|
11 | {
|
12 | PORT_READY_LED &= ~(1<<PIN_READY_LED);
|
13 | }
|
14 |
|
15 | //Timer zu debugzwecken einstellen (auf 50Hz)
|
16 | void TIMER0_init(void)
|
17 | {
|
18 | //CTC-Modus aktivieren
|
19 | TCCR0A |= (1<<WGM01);
|
20 |
|
21 | //Vorteiler auf 1024
|
22 | TCCR0B |= (1<<CS00) | (1<<CS02);
|
23 |
|
24 | //Vergleichsregister A beschreiben (8mhz/1024/50 ~ 160, soll ungefähr 50Hz Netzfrequenz entsprechen
|
25 | OCR0A = 160;
|
26 |
|
27 | //Compare A Interrupt aktivieren
|
28 | TIMSK |= (1<<OCIE0A);
|
29 | }
|
30 |
|
31 | int main(void)
|
32 | {
|
33 | uint8_t i = 0;
|
34 |
|
35 | //ReadyLEDpin auf Ausgang setzen
|
36 | DDR_READY_LED |= (1<<PIN_READY_LED);
|
37 | PORT_READY_LED |= (1<<PIN_READY_LED);
|
38 |
|
39 | TIMER0_init();
|
40 | sei();
|
41 |
|
42 | while(1)
|
43 | {
|
44 | i++;
|
45 | }
|
46 |
|
47 | return 0;
|
48 | }
|
Die LED geht an, aber dann nicht mehr aus. Daraus schließe ich, dass der
Vektor nie angesprungen wird. Findet jemand den Fehler? Vielen Dank
schon mal im Voraus!
Grüße,
Kai