Hallo, ich bin neu im Forum, habe aber schon etwas Erfahrung mit uC's.
Für eine Timer-Anwendung brauche ich einen Timer Interrupt vom ATtiny26
und verwende hierfür Timer/Counter0 (mit Timer/Counter1 habe ich das
gleiche Problem).
Sobald ich den Interrupt enable (sei() und TCCR0) führt der uC endlos
Resets durch.
Das Verhalten ist gleich, auch wenn die ISR gar nicht definiert ist.
Das Verhalten ist gleich bei interner Clock und Crystal Oscillator.
Durch "LED-Debugging" habe ich herausgefunden, dass der Zähler TCNT0
funktioniert, und dass der Interrupt Flag TOV0 gesetzt wird.
Ich vermute, dass der Interrupt ausgelöst wird aber anstatt zur ISR zum
Reset Vektor springt.
Ich kompiliere und programmiere mit:
1 | $ avr-gcc -I. -O6 -g -mmcu=attiny26 -Wcpp -o $@ $<
|
2 | $ avrdude -p t26 ...
|
Fällt jemandem hier was auf?
1 | #define F_CPU (1600000L)
|
2 |
|
3 |
|
4 | #include<avr/io.h>
|
5 | #include<avr/interrupt.h>
|
6 | #include<util/delay.h>
|
7 |
|
8 |
|
9 | ISR( TIMER0_OVF0_vect ) {
|
10 | PORTA &= ~(1<<7);
|
11 | }
|
12 |
|
13 | void greeting () {
|
14 | uint8_t i, ii;
|
15 | for (ii=0; ii<2; ii++ ) {
|
16 | for ( i=0; i<10; i++ ) {
|
17 | PORTA ^= (1<<(0+ii));
|
18 | _delay_ms(40);
|
19 | }
|
20 | }
|
21 | }
|
22 |
|
23 | main()
|
24 | {
|
25 |
|
26 | DDRA=0xFF;
|
27 | PORTA=0xFF;
|
28 |
|
29 | TIMSK = (1<<TOIE0);
|
30 | TCNT0 = 0;
|
31 | greeting();
|
32 |
|
33 | TIFR &= ~(1<<TOV0);
|
34 | TIFR &= ~(1<<TOV1);
|
35 | sei();
|
36 | TCCR0 = 5;
|
37 |
|
38 | while(1) {}
|
39 | }
|