Gast
#4733290
Hallo liebe Gemeinde, ich habe ein großes Problem.
Der Code läuft prima und alle Werte funktionieren. Aber in der Theorie
haut das irgendwie nicht hin... und die gilt es zu beweisen:(
FCPU: 9.216MHz
Uart: Baud 230.4k, 8N1
/*Einstellung der UART-Kommunikation*/
void USART_init(void){
UCSR0A = (1<<U2X0); //Double Speed Modus
UBRR0H = (uint8_t)(4>>8); //Prescaler
UBRR0L = (uint8_t)(4); //Prescaler
UCSR0B = (1<<RXEN0)|(1<<TXEN0); //Aktivieren Receiver und
Transmit-ter
UCSR0C = (3<<UCSZ00); // Asynchron, 8N1
}
ISR wird aufgerufen in 9k6 Hz durch Timer0CompareMatch,
ADC autogetriggert an den Timer0,
void adc_init(void){
ADMUX |= ((1<<REFS0)|(1<<REFS1)); //Intern AREF(1V1)
ADMUX |= (1<<ADLAR); //Left Adjusted
ADCSRA |= (1<<ADEN); //ADC aktivieren
ADCSRA |= (1<<ADPS2); //9.216Mhz/16 = 576Khz the ADC
refe-rence clock, in 13 Zyklen: 44 kHz.
ADCSRA |= (1<<ADSC); //Probewandlung, da die erste
falsch ist
ADCSRA |= (1<<ADATE); //Enable Autotrigger
ADCSRA |= (1<<ADIF); //Interrupt Flag; Data register
is updated
ADCSRB |= (1<<ADTS1)|(1<<ADTS0); //Autotrigger Timer0/Counter
Compare Match A
}
Prescaler 16 = 576KHz mit 13 Takte für eine Wandlung wären das =44.30
KHz
somit dauert eine AD-Wandlung : 1/44.30Khz= 0.0225ms
Für 2 mal 8-bit Werte senden (1 start, 8 Bit, 1 Stopp) =
benötigte Zeit: 20/230.4k = 0.0868ms
mein switch-Case bzw. Interrupt erfolgt im 9k6Hz.
also liegt zwischen Case1 und case2.. 1/9k6Hz = 0.1041ms.
Wie kann das sein, dass die Routine trotzdem läuft?
Die Atmegas besitzen ja priorisierter interrupt? Heißt würde trotzdem zu
ende laufen?
Aber der nächste Interrupt etc.. gemessen mit logic-Analyzer an den
beiden Messwerten haben immer den gleichen Abstand: 1/9k6Hz :( :( ??
case 1:
while (ADCSRA & (1<<ADSC));
A[0] = ADCH;
UDR0=(A);
UDR0=(A);
break;