- SF800 Solar Speicher Tutorial         
Ergebnis 1 bis 10 von 13

Thema: Controller startet bei atol neu?

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    HaWe
    Gast
    UART und LED-Code auch mal rauslöschen. wenn atol eine runtime-Exception auslöst, müsste es davon unabhängig sein.
    Stattdessen könntest du Zeichen aus UART auch durch const cstrings testweise ersetzen.

    On success, the function returns the converted integral number as a long int value.
    If no valid conversion could be performed, a zero value is returned.
    If the converted value would be out of the range of representable values by a long int, it causes undefined behavior. See strtol for a more robust cross-platform alternative when this is a possibility.
    http://www.cplusplus.com/reference/cstdlib/atol/
    Geändert von HaWe (06.04.2020 um 21:57 Uhr)

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    22.12.2019
    Beiträge
    19
    Ich habe jetzt

    uint8_t uart_getc(void){
    void uart_gets( char* Buffer, uint32_t MaxLen){

    Auskommentiert und den Aufruf USART_Init(9600); uart_gets(uart_buffer,512);

    jetzt bleibt die Blaue LED an. -> Also ok.

    Die Led brauche ich damit ich mit bekomme was das Programm tut.


    Wenn ich den Init wieder aktiviere geht es auch noch beim uart_gets(uart_buffer,512); habe ich wieder den Fehler.

  3. #3
    HaWe
    Gast
    das deutet für mich darauf hin, dass der UART-buffer aus uart_getc() oder uart_gets() einen ungültigen Wert liefern könnte, der eine Exception auslöst. Ich verstehe hier aber deinen Code zugegebenermaßen nicht.
    Kannst du diesen UART-Wert auslesen, anzeigen (Display?) und checken, bevor du ihn an atol übergibst?
    Geändert von HaWe (06.04.2020 um 22:06 Uhr)

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    22.12.2019
    Beiträge
    19
    Aber ich gebe ja atol inzwischen schon einen fixen String und nichts mehr aus den UART Buffer.

  5. #5
    HaWe
    Gast
    also passiert der Fehler gar nicht in atol? Sondern in uart_getc() oder uart_gets() ? Oder wie oder was?

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    22.12.2019
    Beiträge
    19
    Genau das versuche ich gerade heraus zu finden.
    Leider ist das ganze UART Thema für mich auch Neuland.

    - - - Aktualisiert - - -

    Ich hab schön langsam eine Ahnung, ich glaub ich hab mehr RAM verbraucht als der ATMEL hat und
    sobald ich dann irgendwo im RAM schreibe wo ich nicht sein sollte macht es boom

    Wenn ich nämlich wie jetzt hier den buffer auf 512 setze geht es noch bei 1024 gibt es undefiniertes verhalten.

    Und das Datenblatt bestätigt das wohl gerade
    – 1KByte Internal SRAM daran dachte ich wohl nicht.

    Klingt das für euch Logisch?

    Code:
    #define MCU  atmega8
    #define F_CPU 2000000UL
    //-U lfuse:w:0xe2:m -U hfuse:w:0xd9:m
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <util/delay.h>
    #include <inttypes.h>
    #include <stdlib.h> 
    #include <stdio.h>
    
    #define BT_EN_REGISTER DDRC
    #define BT_EN_PORT     PORTC
    #define BT_EN_PIN      PC0
    
    #define LED_REGISTER   DDRC
    #define LED_PORT       PORTC
    #define LED_RED_PIN    PC5
    #define LED_GREEN_PIN  PC4
    #define LED_BLUE_PIN   PC3
    
    //                                BAUDRATE
    #define BAUD_PRESCALE (((F_CPU / (9600 * 16UL))) - 1)	/* Define prescale value */
    
    //Data from App
    long pl_valid_time_sec = 0;
    
    void USART_SendString(char *str){
       int i=0;
       while (str[i]!=0){
          UDR = str[i];                    /* Write data to be transmitting in UDR */
          while (!(UCSRA & (1<<UDRE)));    /* Wait until data transmit and buffer get empty */
          i++;
       }
    }
    
    void get_BTData(){
       // INIT USART
       UCSRB |= (1 << RXEN) | (1 << TXEN);				/* Enable USART transmitter and receiver */
       UCSRC |= (1 << URSEL)| (1 << UCSZ0) | (1 << UCSZ1);	/* Write USCRC for 8 bit data and 1 stop bit */ 
       UBRRL = BAUD_PRESCALE;							/* Load UBRRL with lower 8 bit of prescale value */
       UBRRH = (BAUD_PRESCALE >> 8);					/* Load UBRRH with upper 8 bit of prescale value */
       
       LED_PORT |= (1<<LED_BLUE_PIN);
    
       int i=0;
       uint8_t c = '\0';
       uint8_t uart_buffer[1024];
       
       while( i < 512){
          while (!(UCSRA & (1<<RXC))){}
          c = UDR;
          if ( c == '\n' ){ break; }
          uart_buffer[i] = c;
          i++;
       }
       uart_buffer[i]='\0';
       
       USART_SendString("TEST");
       USART_SendString(uart_buffer);
        
       
       char spl_buffer[12];
       spl_buffer[0] = '1';    spl_buffer[1] = '2';      spl_buffer[1] = '\0';
       pl_valid_time_sec = atol(spl_buffer);
       
       _delay_ms(5000);
       LED_PORT &= ~(1<<LED_BLUE_PIN);
    }
    
    int main(void){
       // Direction Registers
       DDRB = 0x00;            // B as input
       DDRC = 0x00;            // D as Input
       DDRD = 0x00;            // D as Input
       
       // Set Output Registers
       BT_EN_REGISTER |= (1 << BT_EN_PIN);        // Bluetooth PWR Controll
       LED_REGISTER   |= (1 << LED_RED_PIN);      // LED as output
    	LED_REGISTER   |= (1 << LED_GREEN_PIN);    // LED as output
    	LED_REGISTER   |= (1 << LED_BLUE_PIN);     // LED as output
    
       // Ports to LOW (GND no Pullup)
       PORTB = 0x00;
       PORTC = 0x00;
       PORTD = 0x00;
       
       for (int i=0; i < 4; i++){
          LED_PORT ^= (1 << LED_GREEN_PIN);
          _delay_ms(500);
       }
       
       get_BTData();  // INIT MODE
       
       while(1){
           LED_PORT ^= (1 << LED_RED_PIN);
           _delay_ms(500);
       }
    
    }

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.674
    Blog-Einträge
    1
    Morgen Tux,

    Dein Buffer (uint8_t uart_buffer[1024] befindet sich innerhalb "void get_BTData()".
    Das Problem gab es hier schon in verschiedenen Fällen, dass so etwas dann Probleme bereitet (Stapelspeicher).
    Eventuell bringts Dir was, "
    uint8_t uart_buffer[1024];" global anzulegen, also außerhalb jeder Funktion, das könnte das Problem beseitigen.


    MfG



  8. #8
    shedepe
    Gast
    Mal noch so als idee: Du hast da einen 1kB großen Buffer -> Das ist ganz schön viel für einen kleinen Atmega. Überleg dir doch mal ob du die Daten nicht. Stückchenweise oder sogar Interrupt basiert verarbeiten kannst.

  9. #9
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    05.11.2007
    Beiträge
    1.076
    Hallo Tux12Fun,

    der ATMega8 hat nur 1 KByte RAM
    Diesen Speicher teilen sich Stack und Daten.
    Je mehr Speicher für den Stack angelegt wird, desto weniger bleibt also für den RAM übrig.

    Es ist unmöglich einen Puffer mit 1024 Bytes anzulegen
    und schon garnicht gleich zweie davon:

    char uart_buffer[UART_IN_BUFFER_LEN];
    char spl_buffer[UART_IN_BUFFER_LEN];

    Normalerweise merkt das ein Compiler und gibt eine entsprechende Fehler oder Warnmeldung raus.
    Da diese Arrays aber bei deinem Code lokal innerhalb der Funktion get_BTData(char mode) definiert sind,
    ist es vermutlich für den Compiler nicht eindeutig, weil der Speicher ja nicht ständig,
    sondern nur innerhalb der Funktion reserviert und auch wieder verworfen wird.

    Ich würde testweise mal vorschlagen die Arrays ausserhalb der Funktion zu platzieren
    und neu zu kompilieren. Meiner Meinung nach müsste es dann eine entsprechende Fehlermeldung geben.

    Du brauchts auch eher unwahrschienlich diese riesiegen Puffer von 512 oder sogar 1024 Bytes.
    Ich komme meistens mit 16 bis 32 Bytes für meine serielle Schnittstelle aus.

    Das Verhalten der Software bei solch einem Problem ist völlig zufällig und da kann man sich wirklich nen Wolf suchen.
    Wie HaWe auch gleich schrieb: Code auf das minimalste kürzen.
    Deine Idee mit den verschiedenen Optimierungen des Compilers ist übrigens eine sehr gute Testmethode,
    das mache ich auch oft bei unerklärlichem Verhalten. Der Code sollte aber immer mit allen Optimierungen laufen.
    Zumindest ist das generell mein oberstes Gebot.

    Siro
    Geändert von Siro (07.04.2020 um 09:50 Uhr)

Ähnliche Themen

  1. ISS: Tierbeobachtungssystem Icarus startet
    Von Roboternetz-News im Forum Neuigkeiten / Technik-News / Nachrichten / Aktuelles
    Antworten: 0
    Letzter Beitrag: 10.07.2019, 10:10
  2. [ERLEDIGT] PC startet nicht von CD/DVD
    Von oderlachs im Forum Offtopic und Community Tratsch
    Antworten: 6
    Letzter Beitrag: 08.01.2013, 19:24
  3. PC startet nur manchmal....
    Von Paulschen97 im Forum PC-, Pocket PC, Tablet PC, Smartphone oder Notebook
    Antworten: 3
    Letzter Beitrag: 12.12.2012, 13:12
  4. Controller, Board, Servo Controller fuer den Spiderbot?
    Von Kiraminh im Forum Microcontroller allgemeine Fragen/Andere Microcontroller
    Antworten: 1
    Letzter Beitrag: 11.12.2007, 16:38
  5. AVR startet bei Interrupt neu
    Von Jaecko im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 25.02.2007, 14:37

Berechtigungen

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

12V Akku bauen