Forum: Compiler & IDEs Probleme mit Bootloader


von SkySurfer (Gast)


Lesenswert?

Hi,

ich verwenden den foodloader von lochraster.org auf einem m644p.
Bootloader funktioniert soweit bis ich mit AVR Dude etwas darauf 
übertragen will. Dann kommt irgendwann beim Übertragen ein Timeout.

Habe das ganze auf uart_getc Funktion eingrenzen können:
1
static noinline uint8_t uart_getc(void)
2
    /* wait if a byte has been received */
3
    while (!(_UCSRA_UART0 & _BV(_RXC_UART0)));
4
    /* return received byte */
5
    return _UDR_UART0;
6
}

Es scheint als würde die Funktion Zeichen verpassen und ewig auf weitere 
warte obwohl AVRdude bereits alle Daten des Blocks übertragen hat.

Da es soweit funktioniert dürfen alle Probleme der die auf der 
Checkliste behandelt wurden nicht zutreffen.

Was kann ich machen?

Gruß SkySurfer

von Stefan B. (stefan) Benutzerseite


Lesenswert?

SkySurfer schrieb:

> Da es soweit funktioniert dürfen alle Probleme der die auf der
> Checkliste behandelt wurden nicht zutreffen.

Mir ist diese Schlussfolgerung nicht so klar wie dir. Ich würde von 
einer fehlerfreien UART-Übertragung soft- und hardwareseitig ausgehen, 
wenn ein Nicht-Bootloaderprogramm größere Datenmengen fehlerfrei senden 
und empfangen kann.

> ich verwenden den foodloader von lochraster.org auf einem m644p.
> Bootloader funktioniert soweit bis ich mit AVR Dude etwas darauf
> übertragen will. Dann kommt irgendwann beim Übertragen ein Timeout.
>
> Es scheint als würde die Funktion Zeichen verpassen und ewig auf weitere
> warte obwohl AVRdude bereits alle Daten des Blocks übertragen hat.

Die gezeigte Funktion ist dafür IMHO nicht verantwortlich. Diese 
Funktion ist nur "ausführendes Organ" und bekommt von ihrem Cheffe den 
Auftrag, auf das nächste Zeichen zu warten. Wieso meint der Cheffe, also 
die aufrufende Funktion, dass noch Zeichen kommen? Dieser Frage solltest 
du nachgehen.

von Pit (Gast)


Lesenswert?

Hallo Liste,

zuerstmal vielen Dank für die Programmierung des Foodloaders, den ich 
auf dem Etherrape-Board mit Erfolg verwende (War beim Kauf schon drauf).
Neuerdings besitze ich ein Pollin AVR-NetIO, auf dem ein AtMega32 sitzt. 
Für den habe ich den Foodloader auch kompiliert und per ISP aufgespielt. 
Er meldet sich einwandfrei und reagiert auch auf die Kommandos, die ich 
per RS232 und minicom an ihn sende. Einzig beim Aufspielen einer neuen 
Firmware mit avrdude zickt er: Read und Erase funktionieren, aber beim 
anschliessenden Write (der Fortschrittsbalken ist schon da, bleibt aber 
bei 0% stehen) kommt die Fehlermeldung, dass der Foodloader sich nicht 
mehr meldet.
Das klingt genauso, wie oben. Hat irgendjemand dieses Problem inzwischen 
gelöst?

Mit freundlichen Grüßen

P. Hartmann

P.S: anbei meine config.mk und die avrdude kommandos.


config.mk:
SERIAL_DEV=/dev/ttyS0
ISP_DEV=/dev/ttyS0
ISP_PROG=avr109
AVRDUDE_BAUDRATE=115200
MCU=atmega32
F_CPU=16000000
DEBUG=1
CFLAGS += -DBOOTLOADER_DDR=DDRB
CFLAGS += -DBOOTLOADER_PORT=PORTB
CFLAGS += -DBOOTLOADER_PIN=PINB
CFLAGS += -DBOOTLOADER_PINNUM=PINB1
CFLAGS += -DSEND_BOOT_MESSAGE=1
CFLAGS += -DBOOTLOADER_JUMPER=1
CFLAGS += -DBOOTLOADER_CHAR=1

avrdude kommandos:
avrdude -v -p m32 -c ponyser -P /dev/ttyS0 -U lfuse:w:0xef:m  -U 
hfuse:w:0xdc:m -U lock:w:0x2f:m
avrdude -v -p m32 -c ponyser -b 115200 -P /dev/ttyS0 -U 
flash:w:foodloader.hex

von SkySurfer (Gast)


Lesenswert?

Beheben konnte ich den Fehler leider noch nicht aber wenn du die 
Programmiergeschwindigkeit auf 38400 runter drehst tritt er zumindest 
bei mir wesentlich seltener auf.
Was irgendwie für ein Timingproblem spricht.

Habe meinen Code im Github unter: 
http://github.com/NeoBelerophon/foodloader reingestellt falls noch 
jemand experimentieren will.

Sollte ich noch eine bessere Lösung finden werde ich sie dort 
veröffentlichen.

von Pit (Gast)


Lesenswert?

Hallo SkySurfer,

vielen dank für die Antwort. Was mich wundert ist, dass der foodloader 
auf meinem Etherrape board überhaup keine Probleme macht.
Ich glaube ich werde den Avr-NetIO heute abend mal mit einem AtMega644 
bestücken und die ganze Sache damit probieren...

Gruß

Pit

von Pit (Gast)


Lesenswert?

Hallo SkySurfer,

also einen 644 habe ich jetzt doch nicht eingebaut. Habe aber beim Lesen 
zum Thema Umbau gefunden, dass die serielle Schnittstelle (im Gegensatz 
zur ISP) beim NetIO noch niemals bei 115 kbaud funktioniert hat. Dein 
Tipp war also goldrichtig.
Habe dann die Baudrate des foodloaders durch einen anderen Teiler in der 
uart.h des foodloaders sogar auf 19200 baud runtergesetzt (30k brauchen 
18 sec.). Das hat bis jetzt einwandfrei funktioniert!

Dankst!

Pit

von Pit (Gast)


Lesenswert?

Auf einen Tipp von A. Neumann hin habe ich mal ins Datenblatt des 
AtMega32 geguckt (macht man ja immer zuletzt ;-) und siehe da: der 
AtMega32 selbst macht bei 16 MHz und 115.2 kB einen Baudratenfehler von 
mindestens 2.1%, bei ungeeigneter Einstellung (U2X=1) sogar 3.5%.
Eine Baudrate von 38.4 kB ist wohl am geeignetsten, da der Fehler dort 
lt. Datenblatt nur 0.2% beträgt. 57.6 könnte mit U2X=1 auch noch 
funktionieren (Fehler 0.8%).

von Peter D. (peda)


Lesenswert?

Man nimmt ja auch üblicher Weise Standardquarze wie 11,0592 oder 
14,7456MHz.


Peter

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.