STK500-Besitzer schrieb:
> Matthias schrieb:
>> _delay_ms(30);
>
> Dafür sollte man dich einfach verhauen.
> In ISRs haben delays nichts zu suchen.
Ja genau!
Niemand will hier ein Delay haben!
Eine Vermutungt ist, dass es sich vielleicht um ein
Synchronisationsproblem der seriellen Schnittstelle handelt?
Deshalb wurde es eingebaut!
STK500-Besitzer schrieb:
> Matthias schrieb:
>> USART_Transmit(ADCH);
>
> Wie sieht die aus?
Oh, wie konnte ich sie nur vergessen...
1 | void USART_Transmit( unsigned char data )
|
2 | {
|
3 | /* Wait for empty transmit buffer */
|
4 | while ( !( UCSR0A & (1<<UDRE0)) )
|
5 | ;
|
6 | /* Put data into buffer, sends the data */
|
7 | UDR0 = data;
|
8 | }
|
Stefanus F. schrieb:
> Delays haben in einer ISR nichts zu suchen. Damit öffnest du die Büchse
> der Pandorra. Warte lieber, bis das Senderegister frei ist:
>
> loop_until_bit_is_set(UCSRA, UDRE);
Ok, aber warten wollen wir gerade nicht, wir sollen die Zeit während des
Sendens des aktuellen Werts für andere Berechnungen nutzen können.
Deshalb soll auch bei jedem abgeschlossenen Sendevorgang ein Interrupt
ausgeführt werden welcher den dann aktuellen Wert sendet.
Während dies passiert wollen wir andere Dinge erledigen lassen...
Stefanus F. schrieb:
>> reti();
>
> Das solltest du ganz weg lassen, darum kümmert sich der C Compiler
> bereits. Ich fürchte dass du durch diesen falschen Befehl den
> Stapelspeicher durcheinander bringst.
Da gebe ich dir im Grunde recht, er wurde ebenfalls nachträglich
eingefügt um dass Fehlverhalten der Wertefolgen, sowie den völligen
Sendestop beim Wert 255 eventuell zu beseitigen.
Hermann G. schrieb:
> Und in einer UARS-ISR sollte man ein UART-Register auslesen und nicht
> ADCH. Das ist das High-Byte des AD-Wandlers!
> Sorry, falsch gelesen. Hier wird ja in das UART geschrieben.
Dass Verstehe ich nun nicht, die Routine sollte nicht bei Empfang,
sondern bei abgeschlossenen senden ausgeführt werden... und dass ist
doch der richtige IRQ hierfür?
Stefanus F. schrieb:
> Hermann G. schrieb:
>> Und in einer UARS-ISR sollte man ein UART-Register auslesen und
>> nicht ADCH. Das ist das High-Byte des AD-Wandlers!
>
> Ich glaube er hatte folgendes vor: Man sendet ein byte an den
> Mikrocontroller, um eine Messung auszulösen. Er soll dann mit dem
> aktuellen Messwert des ADC antworten.
>
> Aber du hast Recht, es ist wichtig das UDR Register auszulesen, sonst
> kann er danach kein weiteres Zeichen mehr empfangen.
Im grunde möchten wir erstmal garnichts empfangen, sondern nur den
jeweils aktuellen AD-Wert an den PC schicken und gleichzeitig noch
Rechnezeit z.b. für vom PC empfangene Kommandos haben.
Hat nun leider etwas gedauert, aber SEHR vielen Dank für eure Antworten.
Ich hoffe die Sache ist nun etwas verständlicher :)