Forum: Mikrocontroller und Digitale Elektronik UART 8535, Problem beim Übertragen von Daten


von Pascal (Gast)


Lesenswert?

Hey,
Ich habe einen ATmega8535 und versuchen ein paar Bytes von meinem PC auf 
den Controller zu senden. Eigentlich nichts wirklich schwieriges aber 
weil ich sowas noch nie gemacht habe, finde ich für ,mein Problem 
einfach keine Lösung. Ich wäre sehr dankbar für jede Hilfe.
Als IDE benutze ich AVR Studio und als Programmer STK500.
Hier mal mein Code den ich zum initialisieren der Register benutze:

#define FOSC 8000000 // Clock Speed
#define BAUD 19200
#define MYUBRR 25

void USART_Init( unsigned int baud )
{
/* Baudrate setzen */
  UBRRH = (unsigned char)(baud>>8);
  UBRRL = (unsigned char)baud;
/* Empfangen und Senden Einschalten */
  UCSRB = (1<<RXEN)|(1<<TXEN);
/* 8daten, 2stop bit */
  UCSRC = (1<<USBS)|(3<<UCSZ0);
}

unsigned char USART_Receive( void )
{
/* Auf Daten warten */
while ( !(UCSRA & (1<<RXC)) );
/* Daten ausgeben */
return UDR;
}

int main()
{
  while(1){
    c = USART_Receive();
  }
}

Vielen Dank schonmal im Vorraus
MFG Pascal

von Spess53 (Gast)


Lesenswert?

Hi

> Eigentlich nichts wirklich schwieriges aber
>weil ich sowas noch nie gemacht habe, finde ich für ,mein Problem
>einfach keine Lösung.

Und was ist dein Problem?

MfG Spess

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Pascal schrieb:
> Eigentlich nichts wirklich schwieriges aber weil ich sowas noch nie
> gemacht habe, finde ich für ,mein Problem einfach keine Lösung.
Was ist denn eigentlich das Problem?

von Pascal (Gast)


Lesenswert?

Dake für die schnelle Antwort,
Das Problem ist einfach dass ich auf dem Controller nichts zu empfangen 
scheine, weil er an der Stelle hängen bleibt wo er das Zeichen auslesen 
soll, egal wieviel ich über die COM-Schnittstelle sende.

von Spess53 (Gast)


Lesenswert?

Hi

>Als IDE benutze ich AVR Studio und als Programmer STK500.

RXD und TXD richtig verbunden?

>weil er an der Stelle hängen bleibt wo er das Zeichen auslesen
>soll, egal wieviel ich über die COM-Schnittstelle sende.

Woran merkst du das?

MfG Spess

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Als Tipp: probier erst mal die andere Richtung: vom uC zum PC.
Das ist einfacher, weil die Anzeige besser funktioniert.

Also zuerst einfach immmer stur ein Zeichen nach dem anderen senden, 
zwischendurch evtl. ein kleines _delay_ms(50)...
Und wenn das geht, dann ist das empfangen auch kein Problem.

Als Hardwaretest: versetz den Controller in den Reset. Dann verbindest 
du RX+TX am uC und tippst ein paar Zeichen im Teminal am PC ein. Du 
solltest jetzt die vom PC gesendeten Zeichen wieder am PC empfangen.

EDIT: Spess hat recht, RX und TX können dann immer noch vertauscht sein, 
aber das ist dann der nächste Schritt...

von Pascal (Gast)


Lesenswert?

Also hab das jetzt mal getestet... Problem ist dass ich immer nur das 
Zeichen kriege was ich vorhin gesendet habe... an Tx und Rx kanns also 
schonmal nicht liegen...

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Pascal schrieb:
> Problem ist dass ich immer nur das Zeichen kriege was ich vorhin
> gesendet habe...
Mein Glückwunsch, das ist doch gut, dass da nicht ein falsches oder gar 
kein Zeichen ankommt...

> Also hab das jetzt mal getestet...
Soso, was denn?
Und was ist dabei rausgekommen?

> an Tx und Rx kanns also schonmal nicht liegen...
Hast du das am Anfang auch schon gewusst?
Warum hast du das dann nicht gleich gesagt?
Wozu diese Salamitaktik?

von Pascal (Gast)


Lesenswert?

Auf dem umgekehrten Weg(also Controller -> PC) krieg ich nichts 
gesendet... Kann halt nur das Zeichen auslesen was ich vorher 
reingeschrieben habe...
Sorry hatte das ganz vergessen hinzuzuschreiben...

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Pascal schrieb:
> Kann halt nur das Zeichen auslesen was ich vorher
> reingeschrieben habe...
Wo liest du das aus? Am uC? Wozu?

> Problem ist dass ich immer nur das Zeichen kriege was ich vorhin
> gesendet habe...
Was hättest du erwartet?

> Problem ist dass ich immer nur das Zeichen kriege was ich vorhin
> gesendet habe...
Das Problem ist, dass du offenbar eine ganz andere Software verwendest, 
als die oben gepostete. Denn dort wird nichts gesendet.

> an Tx und Rx kanns also schonmal nicht liegen...
Ja, hast du das mit dem PC ausprobiert?
Geht das?

Schlag mal mit Google nach, was Salamitaktik bedeutet.

von Pascal (Gast)


Lesenswert?

Hab mir die Sende Prozedur aus dem Datenblatt des ATmega 8535 kopiert 
und dann versucht ein Zeichen zu übermitteln. Doch am Pc kann ich immer 
nur das Zeichen auslesen was ich vorher(vom Pc aus) gesendet habe. 
Ausserdem stelle ich nicht dauernd neue Ansprüche... Das Problem bleibt 
immer nur das gleiche und zwar dass ich keine Verbindung zwischen Pc und 
Controller hinkriege.

von Oliver J. (skriptkiddy)


Lesenswert?

Pascal schrieb:
> Ausserdem stelle ich nicht dauernd neue Ansprüche...
glaube das hier war gemeint:
"Große, unübersichtliche Aufgaben werden dabei in kleinere, 
überschaubare Schritte zerlegt."

Wenn man dir helfen soll, dann poste endlich mal deinen aktuellen 
Quelltext.

von Pascal (Gast)


Lesenswert?

#define FOSC 8000000 // Clock Speed
#define BAUD 19200
#define MYUBRR 25

void USART_Init( unsigned int baud )
{
/* Set baud rate */
  UBRRH = (unsigned char)(baud>>8);
  UBRRL = (unsigned char)baud;
/* Enable receiver and transmitter */
  UCSRB = (1<<RXEN)|(1<<TXEN);
/* Set frame format: 8data, 2stop bit */
  UCSRC = (1<<USBS)|(3<<UCSZ0);
}

unsigned char USART_Receive( void )
{
/* Wait for data to be received */
while ( !(UCSRA & (1<<RXC)) );
/* Get and return received data from buffer */
return UDR;
}

int main(){

while(1){
    unsigned char c = USART_Receive();

    /* Wait for empty transmit buffer */
  while ( !( UCSRA & (1<<UDRE)) )
  ;
    /* Put data into buffer, sends the data */
    UDR = 10;

}
}

von Spess53 (Gast)


Lesenswert?

Hi

>    UDR = 10;

Hat das jetzt einen Sinn, den ich nicht verstehe?

MfG Spess

von Oliver J. (skriptkiddy)


Lesenswert?

Wo initialisierst du den Uart?

>>UBRRH = (unsigned char)(baud>>8);
>>UBRRL = (unsigned char)baud;
Das ist Blödsinn. UBRR ist dafür da, um ein geigneten Teiler für die 
jeweilige Baudrate einzutragen. Die gewünschte Baudrate kommt dort also 
nicht rein.

Schau mal ins AVR-GCC-Tutorial/Der UART und ins Datenblatt deines 
µC.

Gruß Skriptkiddy

von Pascal (Gast)


Lesenswert?

wollte einfach einen mal irgendeinen Wert in das Register schreiben den 
ich dann auslesen kann...

von Oliver J. (skriptkiddy)


Lesenswert?

Pascal schrieb:
> wollte einfach einen mal irgendeinen Wert in das Register schreiben den
> ich dann auslesen kann...

Hast du überhaupt annähernd ne Ahnung was du da tust?

Und kannst du dich bitte verständlich ausdrücken? Das macht keinen Spaß 
deine Darbietungen hier zu entschlüsseln.

von Pascal (Gast)


Lesenswert?

Also ich wollte das UDR Register was , soweit ich weiss, das Register 
ist in dem die Ankommenden/Ausgehenden Werte solange gespeichert werden, 
bis sie vom Pc/dem Controller ausgelesen werden.
Wollte nun einfach einen Wert ins Register schreiben und ihn dann vom Pc 
aus auslesen, um zu sehen ob meine Initialisation funktioniert hat.

Das Problem ist aber im Moment dass ich nur den Wert den ich vom Pc aus 
gesendet habe mit dem Pc wieder einlesen kann. Den Wert den der 
Controller eigentlich ausgeben solle kann ich jedoch nicht auslesen.

Tut mir leid wenn ich manchmal etwas undeutlich bin.

Mfg

von Spess53 (Gast)


Lesenswert?

Hi

Um es mal klar zu stellen: Der PC liest das UD-Register nicht aus. 
Entweder sendet der PC und dein Controller empfängt oder umgekehrt.

So richtig hast du das Prinzip nicht verstanden.

MfG Spess

von Oliver J. (skriptkiddy)


Lesenswert?

Pascal schrieb:
> Wollte nun einfach einen Wert ins Register schreiben und ihn dann vom Pc
> aus auslesen, um zu sehen ob meine Initialisation funktioniert hat.
Welche Initialsierung denn. Du rufst von main aus die 
Initialisierungsfunktion nicht auf.

> Das Problem ist aber im Moment dass ich nur den Wert den ich vom Pc aus
> gesendet habe mit dem Pc wieder einlesen kann.
Da du den Uart nicht initialisierst, kann der auch nichts senden und 
nichts empfangen. Das deutet darauf hin, dass du entwerder RXD und TXD 
kurzgeschlossen hast, oder eine Terminalemulation mit Echo nutzt.


Und schau dir bitte die Tutorials hier zum UART an. Denn du hast noch 
nicht mal ansatzweise verstanden, wie der Uart funktioniert.

Gruß Skriuptkiddy

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.