Hi, hab folgendes Problem. Ich möchte einen Timer laufen lassen und bei
zwei verschiedenen Zeitpunkten soll jeweils ein Interrupt ausgelöst
werden. Der Timer läuft ohne Prescaler einfach durch.
WGM13:0 = 0
f_osc=12,2MHz
In der ISR sollen die Ausgänge abwechselnd hoch und runter gesetzt
werden.
Das Problem liegt beim Setzen der Interrupt enable bits. Wenn ich zuerst
das bit für OCIE1A setze und dann für OCIE1B, dann wird das bit für
OCIE1A wieder gecleart und es funktioniert nur der Interrupt für das
letzte von beiden. Andersrum hatte ich das gleiche Problem. Darf man nur
einen von beiden Interrupts verwenden? Oder ist da irgendwo ein Fehler
im Code? Ich hatte das Problem beim Simulieren und auf dem Osci sieht
man es auch. In dem Fall unten alterniert nur der Ausgang PD7. Die ISR
von OCR1B wird nicht ausgelöst.
1 | #include <stdint.h>
|
2 | #include <avr/io.h>
|
3 | #include <avr/interrupt.h>
|
4 | #include <util/delay.h>
|
5 |
|
6 | #define TEST_D6_HIGH (PORTD |= 1<<PD6)
|
7 | #define TEST_D6_LOW (PORTD &= ~(1 << PD6))
|
8 |
|
9 | #define TEST_D7_HIGH (PORTD |= 1<<PD7)
|
10 | #define TEST_D7_LOW (PORTD &= ~(1 << PD7))
|
11 |
|
12 | volatile uint8_t timertest=0;//*volatile
|
13 | volatile uint8_t firlefanz=0;
|
14 | uint16_t rtw;
|
15 |
|
16 | void Init_Timer1(void){
|
17 | TCCR1B=(1<<CS10); //prescaler=1
|
18 | }
|
19 |
|
20 | void Init_Interrupts(void){
|
21 | TIMSK1=(1<<OCIE1B); //Interrupt enable für err. des Wertes in OCR1B
|
22 | TIMSK1=(1<<OCIE1A); //Interrupt enable für err. des Wertes in OCR1A
|
23 | }
|
24 | void Init_Compares(void){
|
25 | OCR1A=20000; //
|
26 | OCR1B=40000; //
|
27 | }
|
28 | int main (void) {
|
29 | Init_Interrupts(); //Interrupts einschalten
|
30 | DDRD |= (1<<PD7); //D7 als ausgang
|
31 | DDRD |= (1<<PD6); //D6 als ausgang
|
32 | Init_Compares();
|
33 | Init_Timer1();
|
34 | sei();
|
35 |
|
36 | while(1){
|
37 | rtw++;
|
38 | }
|
39 | }
|
40 |
|
41 |
|
42 |
|
43 | ISR(TIMER1_COMPA_vect){
|
44 | if(firlefanz==0x00){
|
45 | TEST_D7_HIGH;
|
46 | firlefanz=0xFF;
|
47 | }else{
|
48 | TEST_D7_LOW;
|
49 | firlefanz=0;
|
50 | }
|
51 | }
|
52 |
|
53 | ISR(TIMER1_COMPB_vect){
|
54 | if(timertest==0x00){
|
55 | TEST_D6_HIGH;
|
56 | timertest=0xFF;
|
57 | }else{
|
58 | TEST_D6_LOW;
|
59 | timertest=0;
|
60 | }
|
61 | }
|