- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 6 von 6

Thema: UART String bzw. Variable senden funktioniert nicht

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    28.02.2007
    Beiträge
    10

    UART String bzw. Variable senden funktioniert nicht

    Anzeige

    Powerstation Test
    Hallo,

    arbeite mich nun schritt für schritt in dem Tutorial von www.microcontroller.net durch wie empfohlen. Allerdings häng ich jetzt schon seit einiger Zeit an einem Problem um steig nicht dahinter an was es scheitert.

    "#include <avr/io.h>
    #ifndef F_CPU
    #define F_CPU 4000000
    #endif
    #define UART_UBRR_CALC(BAUD_,FREQ_) ((FREQ_)/((BAUD_)*16L)-1)
    #define UART_BAUD_RATE 9600
    int main (void) {
    UCSRB |= (1<<TXEN);
    UCSRC |= (1<<URSEL)|(3<<UCSZ0);
    UBRRH = (uint8_t)( UART_UBRR_CALC( UART_BAUD_RATE, F_CPU ) >> 8 );
    UBRRL = (uint8_t)UART_UBRR_CALC( UART_BAUD_RATE, F_CPU );
    while (!(UCSRA & (1<<UDRE))) {
    }
    UDR = 'c';
    return 0;
    }"

    Dies ist mein letztes "funktionierendes" Programm um im HyperTerminal ein "c" darzustellen.

    Dies ist der Code nach dem Punkt "Schreiben einer Zeichenkette (String)":

    "#include <avr/io.h>
    #ifndef F_CPU
    #define F_CPU 4000000
    #endif
    #define UART_UBRR_CALC(BAUD_,FREQ_) ((FREQ_)/((BAUD_)*16L)-1)
    #define UART_BAUD_RATE 9600
    int main (void) {
    UCSRB |= (1<<TXEN);
    UCSRC |= (1<<URSEL)|(3<<UCSZ0);
    UBRRH = (uint8_t)( UART_UBRR_CALC( UART_BAUD_RATE, F_CPU ) >> 8 );
    UBRRL = (uint8_t)UART_UBRR_CALC( UART_BAUD_RATE, F_CPU );
    int uart_putc(unsigned char c)
    {
    while (!(UCSRA & (1<<UDRE))) /* warten bis Senden moeglich */
    {
    }
    UDR = c; /* sende Zeichen */
    return 0;
    }
    }"

    Beim kompilieren scheint alles zu klappen, nur wird nichts ausgegeben??? Warum???

    Auch beim nächsten Versuch mit einer Variable bringt gleich der Compilere ne Meldung: for loop initial declaration used outside c99 mode

    hier der code:
    "#include <avr/io.h>
    #ifndef F_CPU
    #define F_CPU 4000000
    #endif
    #define UART_UBRR_CALC(BAUD_,FREQ_) ((FREQ_)/((BAUD_)*16L)-1)
    #define UART_BAUD_RATE 9600
    int main (void) {
    UCSRB |= (1<<TXEN);
    UCSRC |= (1<<URSEL)|(3<<UCSZ0);
    UBRRH = (uint8_t)( UART_UBRR_CALC( UART_BAUD_RATE, F_CPU ) >> 8 );
    UBRRL = (uint8_t)UART_UBRR_CALC( UART_BAUD_RATE, F_CPU );
    char c;
    for (uint8_t i=0; i<=9; ++i) {
    c = i + '0';
    uart_putc( c );
    // verkuerzt: uart_putc( i + '0' );
    }
    }"

    Auch das versteh ich nicht. Währe mir über eine korrekte Lösung und kleine erklärung warum und weshalb dankbar. Ansonsten denk ich komm ich zufriedenstellend voran. Input Output war kein Problem.

    MfG
    Blue

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    12.01.2007
    Beiträge
    93
    mach doch das senden via interrupts das spart rechenzeit.

    Code:
    SIG(SIG_UART_DATA)
    {
    //udr ist leer, lade neues zeichen in UDR
    //wenn zeichen, zb gleich null disable UDRE interrupt
    }
    
    SIG(SIG_UART_TRANS)
    {
    //senden ist fertig
    }

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    28.02.2007
    Beiträge
    10
    hm soweit bin ich noch ned...

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Zitat Zitat von GCC
    for loop initial declaration used outside c99 mode
    Code:
    for (uint8_t i=0; ...
    Ist kein ISO C99.

    Korrekt:

    Code:
    uint8_t i;
    for (i=0; ...
    Disclaimer: none. Sue me.

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    21.10.2005
    Ort
    Erde
    Alter
    57
    Beiträge
    1.195
    Doch ist C99, mann muss das dem GCC aber als option mitgeben:

    GCC -std=c99 ...

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    28.02.2007
    Beiträge
    10
    und wo??? im makefile???

    des weiteren bringt er dass uart_putc( c ); ungültig ist (im 2. Teil des Codes)

    und warum funktioniert der 1. teil so nicht? gibt wie gesagt absolut nix aus...

Berechtigungen

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

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad