Überwachung des Datenaustauches zwischen USART0 und USART1

OP #2705011
Hallo,

Ich arbeite mit dem Mikrocontrollerboard 644P und versuche vor einigen 
Tagen den datenaustauch zwischen dem USART0 und USART1 zu aufbauen bzw 
zu überwachen.Ich habe im Puffer UDR0 von USART0 ein Zeichen 'b' 
geschrieben und habe wieder dieses Zeichen zum Puffer UDR1 übertragen.

Als ich mein C-Code compiliere,  läuft das Programm einwandfrei. Aber 
die
Puffer UDR0 und UDR1 bekommen nicht das Zeichen im Laufe der Simulation.
Außerdem wird mein Interrupt Routine im Laufe der Simulation überhaupt
nicht verarbeitet. Ich verstehe nicht, was schieflauft.

Bitte,kann jemand mir was vorschlagen ?

Mein C-Code befindet sich im Anhang.

Danke im Voraus.

mfg monkeydluffy.
#2705101
Luffy Monkey schrieb:

> Mein C-Code befindet sich im Anhang.

Dann poste ihn auch als C-File.
Das Forum kann mit Files der Endung .c umgehen und macht dann Syntax 
Coloring.


Ähm
1
void USART1_Transmit (unsigned char data1)
2

3
{
4

5
/* Wait for empty transmit buffer */
6

7
while ( !(UCSR1A & (1<<UDRE1)) ); //warten bis Senden moeglich
8

9
/* Put data into buffer and sends the data */
10

11
data0 = UDR0 ;
12
UDR1 = data0 ;
13

14
}

Sag mal, was machst du eigentlich die ganze Zeit mit deinen UDRx 
Registern? Dir ist schon klar, dass du da nicht einfach nach Belieben 
und beliebig oft auslesen bzw. reinschreiben darfst?

Du darfst UDRx nur EINMAL auslesen. Danach ist das Byte aus der UART 
raus und ein weiterer Leseversuch von UDRx liefert nicht mehr dieses 
Byte.

Auch kann man UDRx NICHT als Zwischenspeicher benutzen.
Wenn du von UDRx liest, greifst du hardwaremässig auf etwas anderes zu, 
als wie wenn du hineinschreibst.

   UDR0 = x;
   y = UDR0;

liefert dir in y NICHT das ab, was du mittels x hineingeschrieben hast!
Bei der Zuweisung an UDR0 gibst du der UART implizit die Anweisung: 
dieses Byte raussenden. Das Byte landet in der AUsgangsstufe der UART.
Beim Lesen von UDR0 holst du dir aber das nächste Byte von der 
Eingangsstufe der UART (und das Byte ist danach in der Eingangsstufe 
nicht mehr verfügbar). Das sind 2 getrennte Beriche in der UART, die mit 
demselben Registernamen angesprochen werden, mehr aber auch nicht. Die 
haben so gesehen nichts miteinander zu tun.
OP #2705341
Hallo nochmal,

danke schön für die Erklärung Karl Heinz. Jetzt habe ich zumindestens 
eine Ahnung, wie man die Registern UDRx ansprechen muss. Ich habe noch 
mal mein C-Code geändert. Aber ich sehe  im Laufe der Compilierung das 
Zeichen 'b' nicht im Register UDR0 als auch im Register UDR1. Außerdem 
reagiert mein Interrupt Routine nicht im laufe der Compilierung.

Was mache ich denn falsch ? Übrigens, ich bin kein Profi und mache mein 
besten, um keine blöde Fragen zu stellen.

Mein Code liegt im Anhang.

Danke im Voraus.

mfg  monkeydluffy.
Angehängte Dateien:
Gast #2705348
Hi

>Was mache ich denn falsch

Die UARTs werden vom Simulator nur eingeschränkt unterstützt. Der 
Interrupt sollte aber durch manuelles setzen von RXC ausgelöst werden

>  USART_Init(UBRR_VAL) ;
>  sei();
>  ISR(USART1_RX_vect) <-------

Eine ISR wird nicht direkt aufgerufen.

MfG Spess
OP #2705414
Hi,

Ertsmal danke für deinen Tipp Spess53.

> Die UARTs werden vom Simulator nur eingeschränkt unterstützt. Der
> Interrupt sollte aber durch manuelles setzen von RXC ausgelöst werden.

ich habe deinen Tipp befolgt und habe die USART0 und USART1 mit dem 
Mikrocontrollerboard 644P in Betrieb genommen. Außerdem habe ich nicht 
mehr die Funktion ISR direkt aufgerufen.

Leider bekomme ich wieder nicht das Zeichen 'b' im UDR0 und UDR1 und die 
Funktion ISR ist immer nicht ausführbar.

Bemerkung: Als ich mein Code compiliere, läuft das Programm ohne Ende.

Hat jemand noch eine Idee ??

mfg monkeydluffy
#2705430
> UCSR1B = (0<<RXEN1)|(1<<TXEN1) | (0<<RXCIE1)|(1<<TXCIE1);

Du schreibst jetz 100 mal:
Ich soll einen Interrupt nicht freigeben, wenn ich keine ISR dafür habe.

Du gibst hier den Transmit Complete Interrupt der UART 1 frei, hast aber 
keine ISR dafür.
OP #2706942
Hallo nochmal,

ich bedanke mich erstmal bei Karl Heinz und spess53 für ihre Ratschläge. 
ich habe ihre Anweisung befolgt und bin ziemlich gut voran gegangen.

Spess53 schrieb :

> Die UARTs werden vom Simulator nur eingeschränkt unterstützt.

zwar bin ich kein Profi, aber ich habe selber mein Experiment mit 
Erfolgreich durch den Simulator durchgeführt. Eigentlich war es möglich 
für mich durch den simulator das Zeichen 'b' im Register UDR0 zu 
schreiben. Dafür habe ich manuel die Parameter RXC0 (receive complete), 
TXC0 (transmit complete)und RXC1 (receive complete) auf High gesezt.

Aber der Register UDR1 empfängt immer nicht das Zeichen 'b'. Ich habe 
verschidene Variante probiert, aber das klappt einfach nicht.

Woran liegt das ?

Anbei liegt mein C-Code.

Danke im Voraus.

mfg monkeydluffy.
Angehängte Dateien:
Gast #2706970
Du hast sicherlich vergessen im Simulator USART1 mit USART0 mit einem 
Nullmodemkabel zu verbinden.
Falls du dich jetz fragst wie man das macht :
Gar nicht !
#2707145
Luffy Monkey schrieb:
> Hi,
>
> UWE schrieb:
>
>> Du hast sicherlich vergessen im Simulator USART1 mit USART0 mit einem
>> Nullmodemkabel zu verbinden.
>> Falls du dich jetz fragst wie man das macht :
>> Gar nicht !
>
> gibt´s dann einen anderen Lösungsweg ?

soweit ich dich verstanden habe, und auch dein Progamm sieht so aus 
kommen Daten über die serielle Schnittstelle an USART0 an und die Daten 
willst du über USART1 wieder ausgeben. Das heist das extern keine 
Verbindung zwischen USART0 und USART1 besteht. Damit musst du das auch 
nicht simulieren.
Eingehende Daten an USART0 kannst du über den Simulator auch nicht 
simulieren, hab ich gerade mal gestestet. Ändert man den Wert des 
Registers, dann steht nach dem nächsten Takt wieder 0 drin. Setzt man 
RXC0 dann wird zwar die ISR ausgelöst, aber es wird immer 0 eingelesen.

Fazit: Eine Simulation deines Programms ist so nicht möglich!

Sascha
Gast #2707153
Physikalisch über die Schnittstellen raus und wieder rein.

TXD RXD anzapfen und über ein Proramm (Unicom) welches beide Richtungen 
mitliest debuggen.
So machen das Männer die sich auskennen.
Gast #2708210
Hallo,

Erstmal danke schön an alle, die mir helfen. Ich komme langsam mit der 
Sache klar. Dank eurer Tipps und Unterstützungen verstehe ich besser, 
wie man die USARTs ansprechen muss. Sobald ich noch Fragen habe, werde 
ich mich noch bei euch melden.

Noch mal vielen Dank.

mfg monkeydluffy

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.