Forum: Mikrocontroller und Digitale Elektronik Praxis klappt, Theorie nicht :( UART AMTEGA328P Dringend!


von Mr.Unsigned (Gast)


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;

von Codeversteher (Gast)


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]
----^^^^^^^^^^^^^^^^^-----

von Dieter F. (Gast)


Lesenswert?

Mr.Unsigned schrieb:
> Wie kann das sein, dass die Routine trotzdem läuft?

Ja!

(Sinnvolle Antworten erfordern sinnvolle Informationen zur 
Fragestellung)

von Jochen (Gast)


Lesenswert?

Langfassung: Wenn Praxis klappt, aber Theorie dem widerspricht, dann 
Theorie falsch.

von Kaj G. (Firma: RUB) (bloody)


Lesenswert?

Mr.Unsigned schrieb:
> Die Atmegas besitzen ja priorisierter interrupt?
Datenblatt lesen hilft.

von Mr.Unsigned (Gast)


Lesenswert?

Entschuldigt bitte mein "forderndes Verhalten", ich stand unter 
Zeitdruck ;)

Habe das Datenblatt gelesen.. Thread darf geschlossen und gelöscht 
werden.

Danke.

von Wegstaben V. (wegstabenverbuchsler)


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.

: Bearbeitet durch User
von Sauer (Gast)


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

von analPhabet (Gast)


Lesenswert?

Codeversteher schrieb:
>     Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Wat verstehse denn als längeren Sourcecode oda verstehse den nich? Sons 
hasse ja Recht.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Und wenn du den ADC mit über 500kHz taktest, darfst du dich über 
merkwürdige Ergebnisse nicht wirklich wundern.

von Klugscheißer (Gast)


Lesenswert?

Matthias S. schrieb:
> Und wenn du den ADC mit über 500kHz taktest, darfst du dich über
> merkwürdige Ergebnisse nicht wirklich wundern

Bei 8 Bit-Auflösung nicht.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


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.

: Bearbeitet durch User
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
Noch kein Account? Hier anmelden.