Gast
#53227
Hallo zusammen. Ich habe folgendes Problem beim Timer0 (AT90S1200). Es wird eine Funktion delay1ms(n) aufgerufen, die Interrupt Timer0 freigibt und für eine Verzögerung von n Millisekunden sorgt. Diese Funktion wurde 3 mal mit dem Übergabewert 600 (also Verzögerung um 600ms) aufgerufen und jedes mal ist die Sequenz anders. Ich habe die 3 Pulsbreiten mit dem Speicherosci gemessen. Die erste beträgt 600 ms und die anderen um die 300 bzw. 400 ms. Hier ein Ausschnitt aus dem Programm. #pragma interrupt_handler tim0:3 #define SEQUENZ 400 #define CLOCK 4000000L // Taktfrequenz static volatile unsigned int timeout_1ms; void tim0(void) { TCNT0 = 194; if(timeout_1ms) timeout_1ms--; } void delay1ms (unsigned int n) { timeout_1ms = n; SETBIT(TIMSK,TOIE0); // Interrupt Timer 0 frei while(timeout_1ms); CLRBIT(TIMSK,TOIE0); // Interrupt gesperrt } void initT0Int() { TCNT0 = 194; // 1 ms TCCR0 = 0x03; // Vorteiler =64, Timer 0 starten } void main() { CLI(); // alle Interrupts gesperrt initT0Int(); // Timer0 initialisieren asm("sei"); // allg. Interrupt Freigabe if((CHKBIT(infoRDEE,0))) { CLRBIT(infoWREE,0); _EEPUT(EEadr1,infoWREE); _EEPUT(EEadr2,infoWREE); _EEPUT(EEadr3,infoWREE); SETBIT(PORTD,0); delay1ms(50); CLRBIT(PORTD,0); } if((CHKBIT(infoRDEE,1))) { delay1ms(SEQUENZ); CLRBIT(infoWREE,1); _EEPUT(EEadr1,infoWREE); _EEPUT(EEadr2,infoWREE); _EEPUT(EEadr3,infoWREE); SETBIT(PORTD,1); delay1ms(50); CLRBIT(PORTD,1); } if((CHKBIT(infoRDEE,2))) { delay1ms(SEQUENZ); CLRBIT(infoWREE,2); _EEPUT(EEadr1,infoWREE); _EEPUT(EEadr2,infoWREE); _EEPUT(EEadr3,infoWREE); SETBIT(PORTD,2); delay1ms(50); CLRBIT(PORTD,2); } while(1); }