Hi Kennt jemand folgendes Problem: 1) Wenn ich USART und ADC initialisiere (single conversion) startet die ADC-ISR nicht. 2) Wenn ich USART und ADC initialisiere (Dauerwandlung) geht es 3) Wenn ich USART deaktiviere geht ADC in Single- und Dauer- Wandlung Ich starte meine Wandlung mit Hilfe des Timer0 jede msec. Ich verwende: ATmega128 @8MHz M103C Fuse deaktiviert (also nicht im Atmega103 kompatibilitätsmodus) SUT0 FUse programmiert, crystal oscillator fast rising power. Ich programmiere in C Interrupts sind enabled --Register-- wie folgt gesetzt: ADC: ADMUX=0x20; //AREF, Left Adjust, Channel 0 ADCSRA=0x8A; //ADC Enable, interrupt enable, Prescaler 16 SFIOR=SFIOR&0x8F; USART: UCSR0A=0x00; //Flag Register UCSR0B=0xF8; //Receive/Transmit Complete Interrupt aktiviert, Data Register Empty interrupt aktiviert, Receiver Enable, Transmitter enable, UCSR0C=0x06; //asynchron, no parity, 1 Stopbit,8Datenbits UBRR0H=0x00; //Baudrate 9600 UBRR0L=0x33; //Baudrate 9600 Timer0: ASSR=0x00; //Asynchron Status register TCCR0=0x02; //Prescaler=8, daher Timer-Takt 1Mhz TCNT0=0x05; //Vorladewert, zählt nur 255-5=250 Werte OCR0=0x00; //Überlauf-Modus, nicht Compare TIMSK=0x01; //Überlauf-Interrup enable ETIMSK=0x00; --ISR--: interrupt [ADC_INT] void adc_isr(void) { adc_data=ADCH; } interrupt [TIM0_OVF] void timer0_ovf_isr(void) { ADCSRA=0xCA; //Wandlung des ADC starten TCNT0=0x05; //Register des Timers wieder vorladen } --MAIN-- void main (void) { while(1) { } }
Kann es sein das der ADC mit der Wandlung nicht schnell genug fertig wird und der USART Interrupt eine höhere Priorität hat und daher die ADC ISR "abblockt"
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.