Praxis klappt, Theorie nicht :( UART AMTEGA328P Dringend!

Gast #4733290
Lesenswert?
• ▲
▼
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;
Gast #4733323
Lesenswert?
• ▲
▼
Mr.Unsigned schrieb:
> Hallo liebe Gemeinde, ich habe ein großes Problem.

Ich auch: du kannst nicht richtig lesen oder bist beratungsresistent:

-------------------------------------------
Wichtige Regeln - erst lesen, dann posten!

    Groß- und Kleinschreibung verwenden
    Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

    [ c ] C-Code[/c]
----^^^^^^^^^^^^^^^^^-----
#4733582
Lesenswert?
• ▲
▼
Mr.Unsigned schrieb:
> Thread darf geschlossen .. werden

So macht man das normalerweise

Mr.Unsigned schrieb:
> Thread darf geschlossen und gelöscht werden.

Ist unsinnig. Zuerst schliessen, und dann den geschlossenen Thread 
löschen? Dann könnte man den Thread ja auch direkt löschen.

Aber generell löscht man "sowas" nicht. Das kann immer noch als 
schlechtes Beispiel herhalten.


-> Erst Gedanken sortieren, dann formulieren, dann schreiben.
Gast #4733595
Lesenswert?
• ▲
▼
Hallo

Wirklich helfen und erklären hilft, auch anderen Neugierigen und 
lernwilligen, das ist der weiter Sinn eines öffentlichen Forum.
Über absolute Nebensächlichkeiten herziehen oder nutzlose allgemeine 
"Tipps" (Datenblatt) bringen wenig.

Ich kann auch keine Antwort geben, das Problem ist nicht akut bei mir, 
aber trotzdem ist es interessant dient allen zur Wissensvermehrung und 
Fehlervermeidung in der Zukunft.

Die Formulierung "...und die gilt es zu beweisen" deutet darauf hin das 
Mr.Unsigned die Info nicht nur aus Langeweile oder Spaß benötigt sondern 
aus einen wichtigen und ernsthaften Grund.
Soll er jetzt  Tage investieren um sich das eventuell selbst zu 
analysieren (und trotzdem nicht sicher sein kann ob es dann korrekt ist) 
wenn es jemand anderes sicher und gut belegbar erklären kann?

Wenn es hier nicht hin und wieder Threads geben würde wo das gemacht 
wird wäre das Forum hier (wohl nicht nur für mich)gestorben.

Sauer
(Firma: matzetronics) #4733955
Lesenswert?
• ▲
▼
Klugscheißer schrieb:
> Bei 8 Bit-Auflösung nicht.

Man kann den ADC so schnell takten. Aber ein Blick ins Datenblatt gibt 
bei 1MHz ADC Takt eine mögliche Ungenauigkeit von 4,5 Bit an. Das meinte 
ich mit

Matthias S. schrieb:
> merkwürdige Ergebnisse

Da bleibt also ein 5,5 Bit Wandler übrig. Wird bei 500kHz nicht ganz so 
wild sein, aber schön ist anders. Dabei geht Atmel von einer Quelle mit
geringem Innenwiderstand aus, das muss also auch stimmen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren