mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVR ATmega88 UART Problem


Autor: Modellflieger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

bin noch Anfänger im C Programmieren und habe ein Problem mit dem UART 
vom ATmega 88. Es tut sich weder was, wenn der UART über nen MAX232 was 
an den PC senden soll, noch wenn der UART irgendwelche Zeichen vom PC 
empfangen soll.

Baudrate: 9600
Datenbits: 8
Parität: keine
Stopbit: 1


USART.C
 
//usart.c

void usart_init(void)
{
    UCSR0A |= 0x00;
    UCSR0B |= 0x18;
    UCSR0C |= 0x06;
    UBRR0H |= 0x00;
    UBRR0L |= 0x67;
}

unsigned char usart_getchar(void)
{
while(!(UCSR0A & (1<<RXC0)))
    {
        ;
    }    
    
return UDR0;
} 

void usart_putchar(unsigned char c)
{
while(!(UCSR0A & (1<<UDRE0)))
    {
        ;
    }

UDR0 = c;
}

MAIN.C
//main.c

void main(void)
{
    unsigned char zeichen;
    
    app_init();
    
    lcd_init();
                    
    delay_ms(50);
    
    lcd_clear();
    
    lcd_home;

    lcd_string("USART-Zeichen:");
    
    usart_init();
      
    delay_ms(50);
    
    usart_putchar('T');
    usart_putchar('E');
    usart_putchar('S');
    usart_putchar('T'); 
     
    while (1)
    {
        zeichen = usart_getchar();
    
        set_cursor(5,2);
    
        lcd_data(zeichen);
             
    }
}
    

Habe schon alles mögliche ausprobiert und finde trozdem keine Lösung.
Sind die Register alle richtig gesetzt?

Mit dem Oscar habe ich auch schon gemessen, ob überhaupt was am RX vom 
µC ankommt. Alles in Ordnung. MAX232 funktioniert.
Aber es geht kein Signal vom TX pin des µC raus.

Was mache ich nur wieder falsch?

Danke im Voraus

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
void usart_init(void)
{
    UCSR0A |= 0x00;
    UCSR0B |= 0x18;
    UCSR0C |= 0x06;
    UBRR0H |= 0x00;
    UBRR0L |= 0x67;
}

Ach nö.
Drösel das bitte in Bits auf und benutze die dafür vorgesehenen 
Bitnamen. So macht das keinen Spass.

Autor: Modellflieger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
void usart_init(void)
{
// im UCSR0A wird nichts gesetzt

UCSR0B = (1<<RXEN0) | (1<<TXEN0)
UCSR0C = (1<<UCSZ01) | (1<<UCSZ00)

//für 16 MHz und 9600 8N1 muss im UBBR 103 stehen
UBBR0H = 0x00
UBBR0L = 0x67
}

Autor: Smdfreak (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wofür so lange delays?!

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schritt für Schritt, nicht gleich alles auf einmal testen wollen:

Kürze RxD und TxD am Prozessorsockel und schau, ob ein Terminalprogramm 
die eigenen Zeichen zurückbekommt.

Mach' einen while(1) oder for(;;) um die 4 uart_putchar()s von "TEST" 
herum.  So kannst Du den Sender für sich prüfen.  Erfolgt eine 
Dauersendung am TxD-Pin?  Am Ausgang des MAX232?  Wird der Text im 
Terminalprogramm dargestellt?  Wenn nicht, weißt Du, wo Du suchen musst 
oder kannst hier Deine Anfrage genauer eingrenzen.

Sobald das geht, sende empfangene Zeichen über den UART zurück.  Dass 
dessen Senderoutine geht, weißt Du ja jetzt.

Und zum krönenden Abschluss gibst Du das Zeug auf'm Display aus.

Autor: Modellflieger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

hab es gerade probiert, aber es hat sich nichts geändert:

Wenn ich RXD und TXD überbrücke, bekommt man im Terminal alles korrekt 
zurück.

Aber auch in der Endlosschleife kommt garnichts aus dem µC raus.Habs mit 
nem Oskar und Logikprüfer geprüft.

Hab den MAX232 nochmal überprüft: alles einwandfrei.

Ich finde einfach keinen Fehler.

Danke für die Antwort.

Autor: ccc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
dann liegt der fehler wohl in der software!

Autor: Modellflieger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hilfreicher Beitrag!

Hat echt niemand eine Idee??

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Modellflieger (Gast)

>Hat echt niemand eine Idee??

Nach dem fünfmillionsten Thread "Hilfe, mein UART spinnt" hat kaum einer 
der "alten Hasen" noch Bock, den gleichen Kram immer wieder 
durchzukauen.

Wenn du dich an das Tutorial und die Checkliste WIRKLICH hälst, wird 
dein UART laufen. Da er es nicht tut, hast du was nicht beachtet, was 
dort aber steht!!!

MFG
Falk

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Aber es geht kein Signal vom TX pin des µC raus.

Dir ist aber schon klar, dass mit dem Code oben nur ganz kurz mal direkt 
nach dem Reset am Tx-Pin was zu sehen ist, oder?

Am besten sendest du jetzt mal in einer Endlosschleife ein 'U'. Das 
ergibt eine kontinuierliche 0/1-Abfolge. Schau nochmal mit dem 
Oszilloskop nach, und kontrolliere dabei auch gleich die Bitlänge.

Autor: Modellflieger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

danke für die Antwort.
Aber nach dem Rat von Hazeh Zimmerer läuft "TEST" nun immer in einer 
Schleife.
Aktueller Code ist also dieser:

MAIN.C
void main(void)
{
    unsigned char zeichen;
    
    app_init();
    
    lcd_init();
                    
    delay_ms(50);
    
    lcd_clear();
    
    lcd_home;

    lcd_string("USART-Zeichen:");
    
    usart_init();
      
    delay_ms(50);
    
    for(;;)
    {
    usart_putchar('T');
    usart_putchar('E');
    usart_putchar('S');
    usart_putchar('T'); 
    } 

}


Und dabei ist sowohl mit dem Oskar als auch mit einem Logikprüfer nichts 
am Pin des µC zu sehen.
Könnte natürlich auch kontinuierlich ein "U" senden, aber ich denke dass 
es die Sache nicht verbessern wird.

Autor: Modellflieger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe es gerade nochmal mit nur einem Zeichen ausprobiert.
Code ist aktuell also folgender:

MAIN.C
void main(void)
{
    unsigned char zeichen;
    
    app_init();
    
    lcd_init();
                    
    delay_ms(50);
    
    lcd_clear();
    
    lcd_home;

    lcd_string("USART-Zeichen:");
    
    usart_init();
      
    delay_ms(50);
    
    for(;;)
    {
    usart_putchar('U');
 
    } 

}
    

Autor: Modellflieger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Funktioniert aber trozdem garnichts wie schon vorher.

Autor: Smdfreak (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Müsste eigentlich schon funktionieren. Wüsste auch nicht wo der Fehler 
liegt. Im Datenblatt stehen das ja auch so.

Autor: smdfreak (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
void usart_init(void)
{
// im UCSR0A wird nichts gesetzt

UCSR0B = (1<<RXEN0) | (1<<TXEN0)
UCSR0C = (1<<UCSZ01) | (1<<UCSZ00)

//für 16 MHz und 9600 8N1 muss im UBBR 103 stehen
UBBR0H = 0x00
UBBR0L = 0x67
}


Das ist übrigens falsch. Richtig wäre:
void usart_init(void)
{
// im UCSR0A wird nichts gesetzt

UCSR0B = (1<<RXEN0) | (1<<TXEN0)
UCSR0C = (3<<UCSZ01) | (3<<UCSZ00)

//für 16 MHz und 9600 8N1 muss im UBBR 103 stehen
UBBR0H = 0x00
UBBR0L = 0x67
}

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
smdfreak schrieb:


>
> UCSR0C = (3<<UCSZ01) | (3<<UCSZ00)
> 

Was ist denn das für ein Käse? Warum soll er bitte UCPOL0 setzen? Und 
warum bitte UCSZ00 zweimal auf 1 setzen?

Autor: Modellflieger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

jetzt blick ich garnicht mehr durch.
Ich dachte in dieser Schreibweise würde das Bit um 3 Stellen nach links 
verschoben, oder wie?
Müsste dann nicht eigentlich UPM00 und UPM01 gesetzt werden??

Danke

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

Bewertung
0 lesenswert
nicht lesenswert
Dein Problem ist nicht die RS232 Schnittstelle. Dein Problem ist das 
hier:
> UCSR0C = (3<<UCSZ01) | (3<<UCSZ00)
Wieder mal das Thema "Bitmanipulation in C" nicht verstanden.
> Ich dachte in dieser Schreibweise würde das Bit um 3 Stellen nach links
> verschoben, oder wie?
Nein, es wird die 3 um irgendwas verschoben.
Es wird aber nicht irgendwas um 3 verschoben.
3 = 0x03 = 0b00000011 wird um UCSZ01 (#define UCSZ01 2) nach links 
geschoben: 0b00001100.
3 = 0x03 = 0b00000011 wird um UCSZ00 (= 1) nach links geschoben: 
0b00000110.
0b00001100 verodert mit 0b00000110 ergibt 0b00001110.
Wolltest du das?

BTW:
    UCSR0A |= 0x00;
    UCSR0B |= 0x18;
    UCSR0C |= 0x06;
    UBRR0H |= 0x00;
    UBRR0L |= 0x67;
Dort wird irgendwas zu irgendwas anderem dazugeodert. Willst du das 
wirklich? Mal angenommen, im UBRROL wäre vorher schon 0xFF drin. Was 
würden diese Zuweisungen dann ändern?
Das war vermutlich deine Absicht:
    UCSR0A = 0x00;
    UCSR0B = 0x18;
    UCSR0C = 0x06;
    UBRR0H = 0x00;
    UBRR0L = 0x67;

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lothar Miller schrieb:
> Dein Problem ist nicht die RS232 Schnittstelle. Dein Problem ist das
> hier:
>> UCSR0C = (3<<UCSZ01) | (3<<UCSZ00)
> Wieder mal das Thema "Bitmanipulation in C" nicht verstanden.

Der Quark kommt von smdfreak, modellflieger hatte es imo schon 
richtig...

Autor: Modellflieger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für diese Erklärung!

Jetzt habe ich diese Bitmanipulation endlich verstanden.
Für mich hat das auch immer garkeinen Sinn gemacht das um eins nach 
links zu verschieben. Deswegen verwende ich lieber die direkte 
Schreibweise mit hex.

Dann ergeben mir die Codes aus dem Forum auch viel mehr Sinn.

Also nochmals vielen Dank!!!

Ich glaube es wurde auch langsam mal Zeit das ich diese Schreibweise nun 
endlich verstanden habe.

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

Bewertung
0 lesenswert
nicht lesenswert
Justus Skorps schrieb:
> Der Quark kommt von smdfreak, modellflieger hatte es imo schon richtig...
Oh, das hatte ich übersehen...

Modellflieger schrieb:
> Jetzt habe ich diese Bitmanipulation endlich verstanden.
> Für mich hat das auch immer garkeinen Sinn gemacht das um eins
> nach links zu verschieben.
Aber der letzte Schubser hatte offenbar trotzdem noch gefehlt  ;-)

Autor: Modellflieger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja wie gesagt wäre ich auch garnicht auf diese Schreibweise gekommen, 
wenn  Karl heinz Buchegger mir nicht dazu geraten hätte, weil ich 
wusste, dass ich das garnicht verstanden habe.
Mich wundert es nur, dass ich es sonst auch immer irgendwie hingemurkst 
bekommen habe. Naja das hab ich dann eben immer mit hex gemacht.

Wie kann man Lothar Miller nur dafür danken ?! =)

Aber die Lösung meines Problems ist es ja auch nicht!
Also es funktioniert immer noch nicht.

Hier nochmal der aktuelle Code:

USART.C
void usart_init(void)
{
    UCSR0A = 0x00;
    UCSR0B = 0x18;
    UCSR0C = 0x06;
    UBRR0H = 0x00;
    UBRR0L = 0x67;

}




unsigned char usart_getchar(void)
{
while(!(UCSR0A & (1<<RXC0)))
    {
        ;
    }    
    
return UDR0;
} 

void usart_putchar(unsigned char c)
{
while(!(UCSR0A & (1<<UDRE0)))
    {
        ;
    }

UDR0 = c;
}



MAIN.C
void main(void)
{
    
    app_init();
    
    lcd_init();
                    
    delay_ms(50);
    
    lcd_clear();
    
    lcd_home;

    lcd_string("USART-Zeichen:");
    
    usart_init();
      
    delay_ms(50);
    
    for(;;)
    {
    usart_putchar('U');
 
    } 

}

Autor: Helmut Lenzen (helmi1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#include <avr/io.h>

void usart_putchar(unsigned char c)
{
    while(!(UCSR0A & (1<<UDRE0)))
    {
        ;
    }

    UDR0 = c;
}
void  main(void)
{

    UCSR0A = 0x00;
    UCSR0B = 0x18;
    UCSR0C = 0x06;
    UBRR0H = 0x00;
    UBRR0L = 0x67;


  for(;;)
    {
    usart_putchar('T');
    usart_putchar('E');
    usart_putchar('S');
    usart_putchar('T');

    }
}

Also ich habe das gerade mal getestet und es funktioniert.
Hast du auch den ATMega 88  im AVR-Studio richtig eingetragen ?

Gruss Helmi

Autor: Modellflieger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

also ich benutze CodeVision AVR und da war alles richtig eingestellt.
Also auf dem LCD wird auch "UART Zeichen" angezeigt.
Deswegen kann nicht grundsätzlich was kaputt sein oder was auch immer.
Oder kann es sein das nur der UART kaputt geht und der Rest noch 
funktioniert?!

Ich meine mich zu erinnern, dass der UART unter Bascom schonmal was 
ausgespuckt hat.
Werde wohl mal wieder das Bascomprogramm draufmachen und gucken, wenn 
ich Zeit habe.

Danke für die Antwort und viele Grüße.

Autor: Helmut Lenzen (helmi1)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Dann versuch mal diese Hex-File. Bei mir funktioniert es.

Autor: Modellflieger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

da ich im Moment in der Klausurphase bin, konnte ich den .hex-file 
gerade erst ausprobieren.
Und siehe da, es funktioniert! Ich bin verwirrt! Ich zweifle langsam an 
mir selbst.
Naja aber herzlichen Dank für die super Hilfe (besonders durch Helmut 
Lenzen)!!!

Dann werde ich mal weiter suchen; kann jetzt den Fehler ja sehr weit 
eingrenzen!

Autor: Modellflieger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

hab mal alles mögliche nochmal ausprobiert und exakt den gleichen Code 
von Helmut Lenzen verwendet. Doch mein Programm funktioniert immer noch 
nicht.
So langsam weiß ich echt nicht mehr was ich noch machen kann.

Wenn noch jemand eine Idee hat, dann wäre ich dankbar.

Autor: Helmut Lenzen (helmi1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Modellflieger

Versuch mal das AVR Studio mit dem GCC zu installieren.
Das ist der Compiler den ich verwende.
Kann sein das in Codevision noch was einzustellen ist. Was weiss ich 
aber nicht da ich mit dem bisher noch nichts zu tun hatte.

Autor: Modellflieger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe ich auch schon gedacht.
Werde es jetzt mal versuchen.
Danke

Autor: Helmut Lenzen (helmi1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na dann berichte mal obs geklappt hat

Autor: Fabio W. (modellbu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

bekomme immer folgende Fehlermeldung:

Build started 8.12.2009 at 20:14:29
avr-gcc -I"C:\Users\Fabio\Documents\µC\UARTTest\."  -mmcu=atmega88 -Wall 
-gdwarf-2 -std=gnu99   -DF_CPU=16000000UL -Os -funsigned-char 
-funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT main.o -MF 
dep/main.o.d  -c  ../main.c
/usr/bin/sh: avr-gcc: command not found
make: *** [main.o] Error 127
Build failed with 1 errors and 0 warnings...


Kann mir jemand helfen?

Autor: Fabio W. (modellbu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
P.S: ICh hieß vorher Modellflieger, damit ihr Bescheid wisst.

Autor: Fabio W. (modellbu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe alles noch einmal neu installiert.
Hat sich aber nicht an dem Error geändert.
Wo soll denn der Ordner /usr/bin/sh sein?
Und was muss da drin sein?

Danke

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Habe alles noch einmal neu installiert.

Wohin? Unter welcher Windowsversion?

>avr-gcc -I"C:\Users\Fabio\Documents\µC\UARTTest\."  -mmcu=atmega88 -Wall

Sonderzeichen wie in "µC" sind im Pfad gefährlich. Mach da besser "uC" 
draus.

Oliver

Autor: Fabio W. (modellbu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe es unter Vista installiert.

Autor: Fabio W. (modellbu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe alles nochmal unter uC installiert und funktioniert trozdem nicht.

Autor: Fabio W. (modellbu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

habe mal wieder Zeit gefunden mich mit dem Problem zu beschäftigen.
Und siehe da es funktioniert. Was genau falsch war, weiß ich nicht, ist 
aber auch egal, denn es funktioniert ja nun !
Das Problem ist nur, dass die Zeichen nur solange empfangen werden wie 
der Programmer noch aufgesteckt ist. Wenn man ihn abzieht (bei keiner 
Stromversorgung) kommt garnichts mehr (auch nach reset).
Weiß jemand woran das liegen könnte?

Danke

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Weiß jemand woran das liegen könnte?

Sieht nach fehlender Masseverbindung aus.

MfG Spess

Autor: Fabio W. (modellbu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So jetzt funktioniert alles.

Danke an alle "Helfer" !

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.