- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 7 von 7

Thema: UART funktioniert nicht

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    17.07.2005
    Ort
    Oberwil
    Alter
    43
    Beiträge
    131

    UART funktioniert nicht

    Anzeige

    Praxistest und DIY Projekte
    Hallo Leute

    Ich möchte eigentlich nur zuerste einmal einen einzigen Buchstaben über die UART an den PC senden. Aber mit folgendem Code funktioniert das nicht.

    #include <avr/io.h>

    #define F_CPU 16000000

    #define UART_BAUD_RATE 9600

    #define UBRR_BAUD ((F_CPU/(16*UART_BAUD_RATE))-1)





    int main( void )
    {
    UCSRB |= (1<<TXEN);
    UCSRC |= (1<<URSEL)|(1<<UCSZ0) | (1<<UCSZ1);
    UBRRH = 0;
    UBRRL = 103;

    while (!(UCSRA & (1<<UDRE))) {
    }

    UDR = 'c';

    return 0;
    }

    Habe eine AVR Atmega16 mit 16MHz Quarz

    Was habe ich falsch gemacht???

    Danke

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    29.05.2005
    Ort
    Rott am Inn
    Alter
    36
    Beiträge
    373
    Hi,
    kann sein dass ich mich täusche, aber werden in C Buchstaben und Wörter nicht " gekennzeichnet.
    mfg franz

  3. #3
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Schau mal da bei den GCC-Beispielen
    https://www.roboternetz.de/wissen/in...ourcevergleich
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    26.05.2005
    Ort
    Kaiserslautern
    Beiträge
    794
    Hi,

    "Buchstaben", also Chars werden mit 'c' gekennzeichnet, Strings (automatisch mit \0 terminiert) werden mit "foobar" angegeben.

    Ich könnte mir vorstellen, dass es helfen würde, nach dem
    UDR = 'c';
    noch ein while(1); einzubauen, damit der Controller noch sendet und nicht gleich resetted (was auch immer er dann macht, es ist vermutlich nichts schönes).

    Ansonsten Baudrate kontrollieren:
    - UBBRH / UBBRL nach Datenblatt
    - Taktfrequenz des µC richtig? (wirklich 16 MHz?, Fuseeinstellungen)
    - Max232 überprüfen

    Gruß, CowZ

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    19.03.2005
    Ort
    Villach
    Alter
    33
    Beiträge
    995
    Hallo.

    also so hab ichs gemacht: http://www.gruebler.at/index.php?id=126

    schaus dir mal durch.
    UBRRH = 0;
    UBRRL = 103; schaut unschön aus. du berechnest eh oben mit einem #define den richtigen wert. und dann so einsetzten:

    UBRRH = (uint8_t) (UBRR_BAUD>>;
    UBRRL = (uint8_t) (UBRR_BAUD & 0x0ff);
    --------------
    while (!(UCSRA & (1<<UDRE))) {
    }
    solltest du zu
    while (!(UCSRA & (1<<UDRE))) {
    ;
    }
    tauschen da GCC sonst die schleife wegoptimiert.

    lg
    Thomas

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    17.07.2005
    Ort
    Oberwil
    Alter
    43
    Beiträge
    131
    Mit Hilfe dieses Links, habe ich folgenden Source verwendet:
    https://www.roboternetz.de/wissen/in...ourcevergleich

    #include <avr/io.h>

    #define F_CPU 16000000
    #define USART_BAUD_RATE 9600
    #define USART_BAUD_SELECT (F_CPU/(USART_BAUD_RATE*16L)-1)

    //-----------------------------------------------------
    void _writeString (const char *string)
    {
    while (*string)
    {
    while (!(UCSRA & (1<<UDRE)))
    {;}

    UDR = *string++;
    }
    }

    //-----------------------------------------------------
    int main()
    {
    char bZeichen;

    UCSRB = (1 << RXEN) | (1 << TXEN);
    UCSRC = (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0);
    UBRRL = (unsigned char) USART_BAUD_SELECT;

    while (1)
    {
    while ( !(UCSRA & (1 << RXC)) )
    {;}
    bZeichen = UDR;

    while (!(UCSRA & (1 << UDRE)))
    {;}
    UDR = bZeichen;
    }

    return 0;
    }


    Aber leider tut sich gar nichts am Terminal. Da bin ich mir sicher, dass alles richtig eingestellt ist. 8-Bit, 1 Stopp-Bit, no parity and no flowcontrol, Baud-Rate 9600!!!
    Dann kann ich wirklich nichts anderes einstellen.

    Hat jemand noch eine Idee, was hier nicht geht???

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    19.03.2005
    Ort
    Villach
    Alter
    33
    Beiträge
    995
    Du hast UBBRH vergessen:
    UBRRH = (uint8_t) (UBRR_BAUD>>8);
    UBRRL = (uint8_t) (UBRR_BAUD & 0x0ff);

    Schau mal meine sources an. die wurden speziell auf ATmega16 und atmega32 verwendet. die haben shcon unmengen an bytes geschickt.

    wenn dein controller kein zeichen empfangt, kann er auch nichts senden. sendn ist am anfang einfacher als empfangen.

    while (!(UCSRA & (1 << UDRE)))
    {;}
    UDR = '#';

    sollte machen dass du auch ein # empfangs wenn du nichts empfangst.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress