mikrocontroller.net

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


Autor: Pascal (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Pascal (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Pascal (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Pascal (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Pascal (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Oliver Ju. (skriptkiddy)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Pascal (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;

}
}

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>    UDR = 10;

Hat das jetzt einen Sinn, den ich nicht verstehe?

MfG Spess

Autor: Oliver Ju. (skriptkiddy)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Pascal (Gast)
Datum:

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

Autor: Oliver Ju. (skriptkiddy)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Pascal (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Oliver Ju. (skriptkiddy)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.