PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bootloader != Flash??



Wsk8
29.08.2013, 21:36
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

sternst
30.08.2013, 11:07
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"?

HeXPloreR
30.08.2013, 11:40
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.

Wsk8
30.08.2013, 12:28
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

Thomas E.
31.08.2013, 02:14
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?

Wsk8
31.08.2013, 12:16
#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;
}

HeXPloreR
31.08.2013, 13:15
merkwürdig, sieht irgendwie so ganz anders aus als z.B. der hier: bootloader für atmega88 schreiben (http://www.mikrocontroller.net/articles/AVR_Bootloader_in_C_-_eine_einfache_Anleitung)


...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.