- Labornetzteil AliExpress         
Seite 3 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 21 bis 30 von 36

Thema: String über UART ausgeben

  1. #21
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    19.04.2005
    Ort
    Minden
    Alter
    39
    Beiträge
    227
    Anzeige

    Praxistest und DIY Projekte
    dein Beispiel

    char bCH = 65;
    char bStr[] = { 1,2,bCH, 78};

    geht bei mir nicht. gleiche Fehlermeldung wie oben.

    Hast du das mit winavr getestet?

    gruß ceekay

  2. #22
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    oje, das liegt am Compiler, er will einen konstanten wert haben. naja.

    Alternative:

    char bCH = 65;
    char bStr[] = { 1,2, 0 , 78}; // nur platzhalten

    bStr[2] = bCH; // jetzt muß er aber können

    bei vielen Werten ist das natürlich mühsam

    leider
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #23
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    19.04.2005
    Ort
    Minden
    Alter
    39
    Beiträge
    227
    nein sind nicht viele Werte ist nur ein Integer den ich in 2 char aufteile. Der Rest sind Konstanten.
    Dann will ichs mal testen.

    gruß ceekay

  4. #24
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    19.04.2005
    Ort
    Minden
    Alter
    39
    Beiträge
    227
    Achso, kannst du mir noch den Unterschied zwischen:

    char bStr[] = {irgentwas};

    und

    prog_char daten[] = {irgentwas};

    erklären ?

    gruß ceekay

  5. #25
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    19.04.2005
    Ort
    Minden
    Alter
    39
    Beiträge
    227
    Also ich hab jetzt folgendes:

    char pwm_wert_motor_fuer_uebertragung_low;
    char pwm_wert_motor_fuer_uebertragung_high;

    char daten[14] = {2,66,0,0,0,0,0,0,0,1,0,0,3,4,23};

    und dann schreibe ich in der main();
    {
    daten[10] = pwm_wert_motor_fuer_uebertragung_high;
    daten[11] = pwm_wert_motor_fuer_uebertragung_low;
    }

    wie kann ich diesen String jetzt wieder auslesen?


    p_string = daten;

    UDR = pgm_read_byte( p_string++ );

    gruß ceekay

  6. #26
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    19.04.2005
    Ort
    Minden
    Alter
    39
    Beiträge
    227
    ok jetzt funktioniert alles.
    Ich hätte mich vorher erstmal mit zeiger und arrays auseinandersetzen.
    da das arry ja jetzt nicht mehr im flash steht funktionierte natürlich "pgm_read_byte" nicht mehr

    Vielen Dank für eure Hilfe

    gruß ceekay

  7. #27
    Benutzer Stammmitglied
    Registriert seit
    03.02.2004
    Ort
    Köln
    Alter
    42
    Beiträge
    84
    hab kijons code genommen:

    Code:
    #include <avr/io.h> 
    #include <avr/interrupt.h> 
    #include <avr/signal.h> 
    #include <avr/pgmspace.h> 
    
    #define SYSCLK      7372800 
    #define BAUD      9600UL 
    #define UBRR_BAUD   ((SYSCLK/(16*BAUD))-1) 
    
    #define   TRUE   1 
    #define   FALSE   0 
    
    // USART initialisieren 
    void uart_init(void); 
    
    volatile unsigned char daten_gesendet = TRUE; 
    const prog_char* volatile p_string; 
    
    // Zeichenkette im Flashspeicher 
    prog_char daten[] = "Hello World!\n"; 
    
    int main(void) 
    { 
       // USART initialisieren 
       uart_init(); 
        
       sei(); 
        
       while (1) 
       { 
          if (daten_gesendet) 
          { 
             // Flag zurücksetzen 
             daten_gesendet = FALSE; 
              
             // Pointer zeigt auf die Daten im Flashspeicher 
             p_string = daten; 
              
             /* Interrupt aktivieren, damit wird sofort zur 
                Interruptroutine gesprungen und das erste Zeichen gesendet. */ 
             UCSRB |= (1<<UDRIE); 
          } 
       } 
    } 
    
    void uart_init(void) 
    { 
       // Baudrate einstellen ( Normaler Modus ) 
       UBRRH = (unsigned char) (UBRR_BAUD>>8); 
       UBRRL = (unsigned char) (UBRR_BAUD & 0x00FF); 
    
       // Aktivieren des Empfängers, des Senders und des "Daten empfangen"-Interrupts 
       UCSRB = (1<<RXEN)|(1<<TXEN); 
        
       // Einstellen des Datenformats: 8 Datenbits, 1 Stoppbit 
       UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);    
    } 
    
    /* Interrupt wird ausgelöst sobald der Sendepuffer leer ist */ 
    SIGNAL(SIG_UART_DATA) 
    { 
       char buffer = pgm_read_byte(p_string++); 
        
       /* Wenn nicht das Ende der Zeichenkette erreicht wurde, 
          dann weiteres Zeichen senden */ 
       if ( buffer != '\0' ) { 
          UDR = buffer; 
           
       } else { 
          // Flag setzen, das der String gesendet wurde 
          daten_gesendet = TRUE; 
           
          // Interrupt deaktivieren 
          UCSRB &= ~(1<<UDRIE); 
       } 
    }
    bekomme dann aber beim kompilieren immer folgende fehlermeldung:

    Code:
    Z:\AVRDevel\Test>make
    
    -------- begin --------
    avr-gcc (GCC) 3.4.3
    Copyright (C) 2004 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    
    
    Compiling: Test.c
    avr-gcc -c -mmcu=atmega162 -I. -gdwarf-2 -DF_CPU=8000000UL  -Os -funsigned-char
    -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-
    adhlns=Test.lst  -std=gnu99 -MD -MP -MF .dep/Test.o.d Test.c -o Test.o
    Test.c: In function `main':
    Test.c:41: error: `UCSRB' undeclared (first use in this function)
    Test.c:41: error: (Each undeclared identifier is reported only once
    Test.c:41: error: for each function it appears in.)
    Test.c:41: error: `UDRIE' undeclared (first use in this function)
    Test.c: In function `uart_init':
    Test.c:49: error: `UBRRH' undeclared (first use in this function)
    Test.c:50: error: `UBRRL' undeclared (first use in this function)
    Test.c:53: error: `UCSRB' undeclared (first use in this function)
    Test.c:53: error: `RXEN' undeclared (first use in this function)
    Test.c:53: error: `TXEN' undeclared (first use in this function)
    Test.c:56: error: `UCSRC' undeclared (first use in this function)
    Test.c:56: error: `URSEL' undeclared (first use in this function)
    Test.c:56: error: `UCSZ1' undeclared (first use in this function)
    Test.c:56: error: `UCSZ0' undeclared (first use in this function)
    Test.c: At top level:
    Test.c:60: warning: `SIG_UART_DATA' appears to be a misspelled signal handler
    Test.c: In function `SIG_UART_DATA':
    Test.c:67: error: `UDR' undeclared (first use in this function)
    Test.c:74: error: `UCSRB' undeclared (first use in this function)
    Test.c:74: error: `UDRIE' undeclared (first use in this function)
    make: *** [Test.o] Error 1
    Woran liegt das jetzt, das erste Beispiel bei dem ich auf ein Regsiter zugefriffen hab ging noch?

    das Makefile hab ich übrigens mit MFile erstellt.

  8. #28
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    19.04.2005
    Ort
    Minden
    Alter
    39
    Beiträge
    227
    hy bist du sicher das du beim erstellen der makefile auch deinen Controller angegeben hast?

  9. #29
    Benutzer Stammmitglied
    Registriert seit
    03.02.2004
    Ort
    Köln
    Alter
    42
    Beiträge
    84
    jo, hab den atmega162 wie man ja in der Ausgabe auch sieht...ich verstehs nicht, grrrr

  10. #30
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    19.04.2005
    Ort
    Minden
    Alter
    39
    Beiträge
    227
    hmm ich tippe trotzdem auf die makefile. da er die ganzen registerbezeichnungen nicht kennt.

Seite 3 von 4 ErsteErste 1234 LetzteLetzte

Berechtigungen

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

Labornetzteil AliExpress