- 3D-Druck Einstieg und Tipps         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 16 von 16

Thema: Anfänger Problem mit der UART (RS232) zwischen PC und ATMega8

  1. #11
    Erfahrener Benutzer Roboter Experte Avatar von ePyx
    Registriert seit
    14.05.2008
    Ort
    Falkensee
    Beiträge
    700
    Anzeige

    Praxistest und DIY Projekte
    Das [20] bei char[20] definiert die Länge eines Arrays vom Typ char.

    \0 ist nur das Null-Zeichen aus dem ASCII-Standard. Das wird benutzt um das Ende eines String (Zeichenkette) oder eines Arrays ( auch eine Zeichenkette wenn vom Typ char) zu erkennen.

    Sprich irgendwann hat man sich darauf geeinigt, dass \0 die Zeichenfolge abschließt. Was aber nicht automatisch heisst, dass eine Zeile auch beendet wird. Das macht man je nach System mit einer Variation von \r oder \n, also Linefeed und Carriage-Return.

    Versuch doch mal mittels deiner UART Funktion das Folgende :
    uart_write ("Hallo\r\n") und stell bei hterm als Zeilenende CR+LF ein.
    Grüße,
    Daniel

  2. #12
    Neuer Benutzer Öfters hier
    Registriert seit
    10.11.2010
    Beiträge
    23
    Genau so hab ich es auch im Tutorial gelesen mit \r \n.
    Aber leider funktioniert es nicht. Ich hab jetzt eine Delay von 1 sec mit ein gebaut, dass ich es besser sehen kann. Das Funktioniert einwandfrei.
    Nur eben das Linefeed nicht.

    #include <avr/io.h>
    #include <stdio.h>
    #define F_CPU 3686400UL
    #include <util/delay.h>
    #define Baud 38400
    #define CR "\0\r\n"


    void uart_init(void)
    {
    UCSRB = (1 << TXEN);
    UCSRC = (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0);
    UBRRL=0x05; // Baudrate festlegen
    UBRRH=0x00; // Baudrate festlegen
    }

    int uart_send(unsigned char c)
    {
    while (!(UCSRA & (1<<UDRE)))
    {
    // mach nichts
    }
    //senden
    UDR=c;
    return 0;
    }


    void uart_write(char *s)
    {
    while(*s)
    {
    uart_send(*s);
    s++;
    }
    }

    int main(void)
    {
    uart_init();
    while(1==1)
    {
    uart_write("Das ist ein Test" CR);
    _delay_ms(1000);
    }
    }

  3. #13
    Erfahrener Benutzer Roboter Experte Avatar von ePyx
    Registriert seit
    14.05.2008
    Ort
    Falkensee
    Beiträge
    700
    Nicht
    Code:
    uart_write("Das ist ein Test" CR);
    sondern :

    Code:
    uart_write("Das ist ein Test\r\n");
    Das #define CR "\0\r\n" zusammen mit zeichenkette+zeichenkette geht in die Hose. Da du letzendlich versuchst eine Adresse mit einer Konstanten zu addieren.
    Grüße,
    Daniel

  4. #14
    Neuer Benutzer Öfters hier
    Registriert seit
    10.11.2010
    Beiträge
    23
    Perfekt jetzt funktioniert auch das. Besten Dank!!!
    Wieso kann ich mir jetzt eigentlich das \0 sparren?

  5. #15
    Erfahrener Benutzer Roboter Experte Avatar von ePyx
    Registriert seit
    14.05.2008
    Ort
    Falkensee
    Beiträge
    700
    Wie gesagt, das schließt die Zeichenfolge ab. Wenn du eine Zeichenfolge mittels char[xy] definierst, passiert das automatisch.
    Grüße,
    Daniel

  6. #16
    Hallo,

    ich habe diesen Code auf meinem ATmega8 ausprobiert und nutze dabei das "Debug Terminal" unter Windows 7.
    Das Terminal zeigt mir auch im Abstand von 1 Sekunde immer neue Zeichen an, allerdings nur in Hex, Binär, Dec und etwas nicht lesbares in ASCII.
    Meine Baudrate habe ich auf 9600 geändert, mein Quarz hat 8MHz. Ich erwartet eigentlich den Text "Das ist ein Test" in meinem Terminal.
    Liege ich damit falsch oder ist noch etwas mehr dabei zu beachten?

    #include <avr/io.h>
    #include <stdio.h>
    #define F_CPU 8000000UL
    #include <util/delay.h>
    #define Baud 9600


    void uart_init(void)
    {
    UCSRB = (1 << TXEN);
    UCSRC = (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0);
    UBRRL=0x05; // Baudrate festlegen
    UBRRH=0x00; // Baudrate festlegen
    }

    int uart_send(unsigned char c)
    {
    while (!(UCSRA & (1<<UDRE)))
    {
    // mach nichts
    }
    //senden
    UDR=c;
    return 0;
    }


    void uart_write(char *s)
    {
    while(*s)
    {
    uart_send(*s);
    s++;
    }
    }

    int main(void)
    {
    uart_init();
    while(1==1)
    {
    uart_write("Das ist ein Test\r\n");
    _delay_ms(1000);
    }
    }

    Mit freundlichen Grüßen,
    Stewie Griffin

Seite 2 von 2 ErsteErste 12

Ähnliche Themen

  1. [ERLEDIGT] Problem bei UART Kommunikation zwischen ATmega und VB.net
    Von masasibe im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 15
    Letzter Beitrag: 10.09.2011, 18:41
  2. ATmega8 RS232 Problem
    Von EngineMan im Forum Schaltungen und Boards der Projektseite Mikrocontroller-Elektronik.de
    Antworten: 60
    Letzter Beitrag: 26.02.2010, 11:26
  3. Problem mit Bascom Software UART und ATmega8
    Von Buzii12 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 23.10.2008, 13:20
  4. UART zwischen Atmega32 und ATmega8
    Von Lunarman im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 07.06.2007, 17:22
  5. Uart-Kommunikation zwischen µCs
    Von ProgDom im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 20.04.2006, 01:37

Stichworte

Berechtigungen

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

12V Akku bauen