-
        

Ergebnis 1 bis 7 von 7

Thema: Bootloader != Flash??

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.08.2008
    Ort
    DE
    Beiträge
    523

    Bootloader != Flash??

    Anzeige

    Hallo,
    ich will mir einen Bootloader über UART für meinen Mega8 schreiben.

    Ich habe ihn zuerst als normales Programm geschrieben, hier funktioniert er wunderbar. Wenn ich jetzt aber in die Bootsection schreibe dann bekomme ich nur noch Checksum errors der übertragenen Daten.

    Ich weiß jetzt echt nicht mehr weiter. Uart, Interrupts etc funktionieren einwandfrei im Bootloader, ich kann mich auch noch verbinden. Aber wenn ich dann die Daten senden, stimmen die Checksummen nicht mehr.

    mfg

  2. #2
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Zitat Zitat von Wsk8 Beitrag anzeigen
    Wenn ich jetzt aber in die Bootsection schreibe dann bekomme ich nur noch Checksum errors der übertragenen Daten.
    Was genau bedeutet "in die Bootsection schreibe"?
    MfG
    Stefan

  3. #3
    Erfahrener Benutzer Roboter Genie Avatar von HeXPloreR
    Registriert seit
    08.07.2008
    Ort
    24558
    Alter
    39
    Beiträge
    1.356
    Hallo,

    kann es sein das man einen Bootloader nicht per UART installieren kann?
    Vermutlich hast Du schon einen drauf...
    Ansonsten geht es wohl nur per ISP ... und ob man sich den Bootloader für eine m8 selber schreiben muss....jesus...wenn man kann und will.
    Aber gibt es da nicht auch was von ratiopharm

    Ich fürchte du wirst nicht drum rum kommen genauer zu sagen was du da machst.
    "Es ist schwierig, jemanden dazu zu bringen, etwas zu verstehen, wenn er sein Gehalt dafür bekommt, dass er es nicht versteht" [Upton Sinclair] gez-boykott

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.08.2008
    Ort
    DE
    Beiträge
    523
    Ja, den will ich selber schreiben, nur so lernt man auch was

    Also....
    Ich habe wie gesagt meinen Bootloader zuerst wie ein normales Programm geschrieben (Start 0x00). Hier funktioniert er perfekt. Sobald ich aber dann dem Linker das Offset übergebe und in den Fuses den Bootloader aktiviere (damit eben vom Offset zuerst gestartet wird), dann funktioniert der Empfang der Daten nicht mehr.
    UART etc funktioniert aber noch. Es wird die Startmessage ausgegeben, ich kann mich auch noch Verbinden (Also Startnachricht senden und auf Bestätigung warten). Nur der Emfpang der Daten funktioniert nicht mehr bzw. er funktioniert schon, da Zeichen empfangen werden, aber anscheinend die falschen.
    Die einzige andere Möglichkeit wäre höchstens, dass die CRC16 Berechnung fehlschlägt, aber ich könnte mir nicht erklären, warum die auf einmal falsch sein soll. Der Code wurde schließlich nicht geändert.

    mfg

  5. #5
    Erfahrener Benutzer Roboter Experte Avatar von Thomas E.
    Registriert seit
    29.12.2011
    Beiträge
    638
    Zitat Zitat von Wsk8 Beitrag anzeigen
    Hallo,
    ich will mir einen Bootloader über UART für meinen Mega8 schreiben.

    Ich habe ihn zuerst als normales Programm geschrieben, hier funktioniert er wunderbar. Wenn ich jetzt aber in die Bootsection schreibe dann bekomme ich nur noch Checksum errors der übertragenen Daten.

    Ich weiß jetzt echt nicht mehr weiter. Uart, Interrupts etc funktionieren einwandfrei im Bootloader, ich kann mich auch noch verbinden. Aber wenn ich dann die Daten senden, stimmen die Checksummen nicht mehr.
    Wie wärs, wenn du deinen Code hochlädst?
    Grüße
    Thomas

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.08.2008
    Ort
    DE
    Beiträge
    523
    Code:
    #include <avr/io.h>
    #include <avr/boot.h>
    #include <avr/interrupt.h>
    #include <util/delay.h>
    #include <string.h>
    #include "uart.h"
    
    
    #define PAGE_SIZE 64 + 3 // Bytes +1 PageNo +2 CRC16
    
    
    unsigned int mask = 0xA001;
    
    
    
    
    //-- Protoypes -----------
    void boot_program_page(uint32_t page, uint8_t *buf);
    unsigned int calcCRC16r(unsigned int crc, unsigned char c, unsigned int mask);
    
    
    
    
    int main(void) {
        unsigned char temp;
        char buffer[PAGE_SIZE];
        uint16_t page_cnt = 0;
        //uint8_t cnt = 0;
        
        void (*start)(void) = 0x0000;        /* Funktionspointer auf 0x0000 */
        
        // Init
        DDRD |= (1<<PD2) | (1<<PD0); //StatusLED RED Ausgang/ IR-Empfänger Eingang
        DDRB |= (1<<PB0) | (1<<PB3); //StatusLED GREEN Ausgang / IR-LED Ausgang
    
    
        //IR-Schnittstelle
        // fast PWM, set OC2A on compare match, clear OC2A at bottom, clk/1
        TCCR2 = _BV(WGM20) | _BV(WGM21) | _BV(COM20) | _BV(COM21) | _BV(CS20);
        // interrupt on timer overflow
        TIMSK |= _BV(TOIE2);
        
        OCR2  = 0x91;
        
        PORTD |= (1<<PD2); //StatusLED RED
        PORTB |= (1<<PB0); //StatusLED GREEN
        PORTB |= (1<<PB3); //IRTX = 1
        PORTD |= (1<<PD1); //IRTX = 0
        
        // Interrupt vektoren verbiegen
        char sregtemp = SREG;
        cli();
        temp = GICR;
        GICR = temp | (1<<IVCE);
        GICR = temp | (1<<IVSEL);
        SREG = sregtemp;
        
        // UART
        UartInit();
        
        sei();    //Interrupt Ein
        
        _delay_ms(10);
        
        //while(cnt < 16) {
        memset(buffer, 0, sizeof(buffer));
        //SerRead(buffer, 18, 65000);
        SerRead(buffer, 18, 0);
        
        if(strstr(buffer, "Flash")) {
            memset(buffer, 0, sizeof(buffer));
            unsigned int crc = 0, i = 0, h_crc = 0;
            
            //cnt = 20;
            
            _delay_ms(1);
            SerWrite("ASURO\0\0\0\0\0\0\0\0\0");
            _delay_ms(1);
            
            while(1) {
                // receive
                memset(buffer, 0, sizeof(buffer));
                
                SerRead(buffer, PAGE_SIZE, 0);
                
                crc = 0;
                for(i = 0; i < (PAGE_SIZE - 2); i++) {
                    crc = calcCRC16r(crc, buffer[i], mask);
                }
                
                memcpy(&h_crc, &buffer[i], 2);
                
                // Last page
                if(buffer[0] == 0xFF) {
                    _delay_ms(16);
                    SerWrite("OK");
                    break;
                }
                
                if(buffer[0] == 1) {
                    _delay_ms(16);
                    SerWrite("ER");
                }
                
                if(crc == h_crc) {
                    // transmission OK
                    // flash page
                    _delay_ms(16);
                    //boot_program_page(page_cnt, (uint8_t*)&buffer[1]);
                    //if(last_page != buffer[0])
                    page_cnt += 64;
                    
                    SerWrite("OK");
                } else {
                    _delay_ms(16);
                    SerWrite("CK");
                }
            }
        }
        //}
        
        PORTD &= ~(1<<PD2);
        
        // Interrupt Vektoren wieder gerade biegen
        cli();
        sregtemp = GICR;
        GICR = sregtemp | (1<<IVCE);
        GICR = sregtemp & ~(1<<IVSEL);
        
        // Rücksprung zur Adresse 0x0000
        start();
        
        return 0;
    }

  7. #7
    Erfahrener Benutzer Roboter Genie Avatar von HeXPloreR
    Registriert seit
    08.07.2008
    Ort
    24558
    Alter
    39
    Beiträge
    1.356
    merkwürdig, sieht irgendwie so ganz anders aus als z.B. der hier: bootloader für atmega88 schreiben
    ...nur so lernt man auch was...
    Na, wenn Du meinst.
    Also nochmal, über UART kannst Du das normlerweise nicht installieren. Falls es da Tricks gibt kenne ich sie nicht.
    Ich selbst habe bischer alles direkt über ISP geflasht und damit einen Bootloader bisher nicht benötigt.
    "Es ist schwierig, jemanden dazu zu bringen, etwas zu verstehen, wenn er sein Gehalt dafür bekommt, dass er es nicht versteht" [Upton Sinclair] gez-boykott

Ähnliche Themen

  1. Antworten: 6
    Letzter Beitrag: 30.03.2013, 22:17
  2. LCD Flash
    Von markusikarus im Forum Microcontroller allgemeine Fragen/Andere Microcontroller
    Antworten: 3
    Letzter Beitrag: 25.11.2012, 18:30
  3. Antworten: 18
    Letzter Beitrag: 06.05.2012, 19:40
  4. bootloader um Daten in Flash zu packen
    Von vajk im Forum C - Programmierung (GCC u.a.)
    Antworten: 7
    Letzter Beitrag: 19.09.2006, 15:25
  5. Flash-Wandler
    Von CodeX im Forum Sensoren / Sensorik
    Antworten: 7
    Letzter Beitrag: 12.01.2006, 06:12

Berechtigungen

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