Forum: Mikrocontroller und Digitale Elektronik Bootloader Einstellungen Fuses, Makefile


von Rainer Müller-Knoche (Gast)


Lesenswert?

Bin am verzweifeln. Brauche ein CAN Bootloader für den Arduino NANO. 
habe diesen Artikel 
[[http://www.kreatives-chaos.com/artikel/can-bootloader]] gefunden, im 
Prinzip genau was ich brauche muss ich nur an den atmega328p anpassen. 
Tut aber nicht wie ich will. Also 1 kleines Programm
1
#include <avr/io.h>
2
#include <util/delay.h>
3
4
int main(void)
5
{
6
    uint8_t lc = 0;
7
    void (*start)( void ) = 0x0000;        /* Funktionspointer auf 0x0000 */
8
  DDRB |= (1<<DDB5);
9
    while (lc < 10) 
10
    {
11
        PORTB |= (1<<PORTB5);
12
        _delay_ms(1000);
13
        PORTB &= ~ (1<<PORTB5);
14
        _delay_ms(1000);
15
        lc = lc + 1;
16
    }
17
    start(); 
18
    return 0;
19
}

soll 10 mal blinken und dann auf Adresse 0 springen.
Fuses sind so eingestellt, Startadresse im Makefile ist 2x3c00 also 
7800. Steht so auch im HEX file.
Lade ich das Programm tut es auch es blink mit den richtigen Zeiten an 
der richtige LED.

So dann zweites Programm
1
#define F_CPU 16000000UL
2
#include <avr/io.h>
3
#include <util/delay.h>
4
5
6
int main(void)
7
{
8
    uint8_t lc = 0;  DDRD |= (1<<DDD2);
9
    while (5 < 10) 
10
    {
11
        PORTD |= (1<<PORTD2);
12
        _delay_ms(200);
13
        PORTD &= ~ (1<<PORTD2);
14
        _delay_ms(1500);
15
        lc = lc + 1;
16
    }
17
}
soll nach dem 10 maligen ausführen des dummy bootloaders ausgeführt 
werden. Fuses unverändert, geladen ab 0x0h, steht auch so im HEX file.
Auch der Teil tut was er soll, blinkt in richtiger Frequenz an richtiger 
LED.
Nur das erste Programm (Dummy Bootloader), das vorher ausgeführt werden 
soll ist weg oder wird zumindest nicht angesprungen.
Was mache ich falsch, wo ist mein Denkfehler. Habe 
[[https://www.mikrocontroller.net/articles/AVR_Bootloader_in_C_-_eine_einfache_Anleitung]] 
x mal durchgegangen, dto. das atmega328p Datenplatt, den Fusebit Rechner 
bemüht und noch x andere Artikel zu Bootloader und Fusebit gelesen. 
Stecke nun seit Tagen fest.

Kann mir bitte wer helfen.
Danke

Gruß Rainer

von Rainer Müller-Knoche (Gast)


Lesenswert?

P.S. Fuse vergessen
Fuses OK (E:FD, H:DA, L:FF)

mk

von Uwe (de0508)


Lesenswert?

Hallo,

was soll das in deinen Augen bewdeuten?
1
return 0;

und zu was führt es real?

Tipp Stack und Register!

von Einer K. (Gast)


Lesenswert?

Uwe S. schrieb:
> Hallo,
>
> was soll das in deinen Augen bewdeuten?return 0;
> und zu was führt es real?
>
> Tipp Stack und Register!

Das ist doch klar!
Es entspricht der natürlichen C und C++ Vorgehensweise.

OK, auf einem µC Winzling nicht nötig.
Aber auch kein Fehler, so das Programm anzuhalten.

"Damals" hagelte es sogar Meldungen, wenn man auf das Return verzichtet 
hat.

von Stefan F. (Gast)


Lesenswert?

Rainer Müller-Knoche schrieb:
> Nur das erste Programm (Dummy Bootloader), das vorher ausgeführt werden
> soll ist weg oder wird zumindest nicht angesprungen.

Vermutlich hast du (wie üblich) beim flashen den Programmspeicher 
gelöscht. Wenn du das über die ISP Schnittstelle machst, ist der 
Bootloader nicht automatisch schreibgeschützt.

von Rainer Müller-Knoche (Gast)


Lesenswert?

Das soll den Sprung zum normalen Programm bewirken, wenn der Bootloader 
abgearbeitet ist. Stammt so 1.1 aus aus dem oben erwähnten Bootloader 
Tutorial.

von Stefan F. (Gast)


Lesenswert?

Rainer Müller-Knoche schrieb:
> Das soll den Sprung zum normalen Programm bewirken, wenn der
> Bootloader abgearbeitet ist. Stammt so 1.1 aus aus dem oben
> erwähnten Bootloader> Tutorial.

Worauf beziehst du dich mit "das" (am Satzanfang) und inwiefern geht 
deine Antwort auf meine Bemerkung bezüglich "Programmspeicher gelöscht" 
ein?

von Rainer Müller-Knoche (Gast)


Lesenswert?

Also wenn ich die erwähnten Artikel und das Datenblatt richtig verstehe 
wird der Bootloader beim laden des "Hauptprogrammes" nicht 
überschrieben. Wie soll ich sonst das Hauptprogramm laden wenn nicht via 
ISP, solange der Bootloader noch nicht fertig ist. Erbitte 
Lösungsvorschlag das Hauptprogramm zu laden ohne den Bootloader zu 
löschen.

von Stefan F. (Gast)


Lesenswert?

Rainer Müller-Knoche schrieb:
> Also wenn ich die erwähnten Artikel und das Datenblatt richtig verstehe
> wird der Bootloader beim laden des "Hauptprogrammes" nicht
> überschrieben.

zitiere bitte die Stelle. ich denke, das ist nicht korrekt.

> Wie soll ich sonst das Hauptprogramm laden wenn nicht
> via ISP, solange der Bootloader noch nicht fertig ist.

Entweder installiert man nur den Bootloader via ISP, oder den Bootloader 
und das Hauptprogramm als eine zusammenhängende Einheit. Arduino macht 
das so.

Danach kannst du das Hauptprogramm durch die (serielle) Schnittstelle 
des Bootloaders aktualisieren.

> Erbitte Lösungsvorschlag das Hauptprogramm zu laden ohne den
> Bootloader zu löschen.

Ich denke, das geht zumindest mit avrdude nicht, weil der Befehl "erase 
chip" Pflicht ist und eben auch den Bootloader löscht.

von Rainer Müller-Knoche (Gast)


Lesenswert?

Wie gesagt, dass das schreiben des Bootloadersdas normal Programm löscht 
ja, umgekehrt jedoch nicht. Wenn ich mit die avrdude Ausgabe der Arduino 
IDE ansehe wird da nicht jedesmal der Bootloader geschrieben, sonst 
müsste man den Bootloader nicht separat schreiben, ausserdem kann der 
Bootloader nut via ISP geschrieben werden, das normale Programm jedoch 
auch via Bootloader über z.B. die serielle oder wie ich es brauche via 
CAN Bus.
Werde das morgen nochmal im Detail checken heute habe ich keinen Geist 
mehr.
Danke vorerst mal für die Hilfe.

Rainer

von Stefan F. (Gast)


Lesenswert?

Was verstehst du an "erase chip" nicht?

Beim flashen wird IMMER der ganze Flash Speicher gelöscht.

Wenn dir das nicht in den Kram passt, musst du dir einen anderen 
Mikrocontroller aussuchen.

von Rainer Müller-Knoche (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Beim flashen wird IMMER der ganze Flash Speicher gelöscht.

nicht wirklich, die -D Option im Avrdude ist das Zauberwort. Also erst 
den Bootloader flashen und dann das zweite Programm mit -D und schon tut 
es. Das erease hat nicht mit dem Mikrocontroller zu tun.

Aber trotzdem Danke, Du hast mich auf die richtige Spur gebracht. Jetzt 
weiss ich zumindest meine Fusebits und Speichergrenzen sind OK und ich 
kann mit der Anpassung des CAN Bootloaders weitermachen.

Gruß Rainer

von MaWin (Gast)


Lesenswert?

Uwe S. schrieb:
> was soll das in deinen Augen bewdeuten?return 0;

Solltest du das Programm etwa so überhaupt nicht verstanden haben ?

Irrelevant weil er aus dem Aufruf von start() sowieso nicht mehr zurück 
kommt, aber return 0 keeps the compiler happy wenn man main mit int 
Rückgabewert statt void deklariert.

von Einer K. (Gast)


Lesenswert?

Rainer Müller-Knoche schrieb:
> die -D Option im Avrdude ist das Zauberwort.
Ja, falls du einen ATXMega verwenden würdest, hättest du sogar Wahr.
Aber bei einem Nano mit ATMega328P ist das einfach nur ein Irrtum oder 
die Unwahrheit.

Mein Tipp:
Bevor du anfängst Bootloader zu schreiben, oder sonst welche exotischen 
Dinge mit deinem Nano anstellen möchtest, solltest du das Datenblatt und 
das AvrDude Manual lesen.
Und das so oft, bis es verstanden ist.

MaWin schrieb:
> Irrelevant weil er aus dem Aufruf von start() sowieso nicht mehr zurück
> kommt,
Natürlich unsinnig, aber dennoch völlig gültig, und damit doch ok.

von S. Landolt (Gast)


Lesenswert?

Rainer Müller-Knoche schrieb:
> nicht wirklich, die -D Option im Avrdude ist das Zauberwort.

Das funktionierte nur, wenn es im 'Serial Programming Instruction set' 
des ATmega328 einen Befehl 'Erase Program Memory Page' gäbe.

von Stefan F. (Gast)


Lesenswert?

Das Löschen einzelner Pages geht eben leider nicht via ISP. Nur der 
Bootloader kann das.

von N. M. (mani)


Lesenswert?

Rainer Müller-Knoche schrieb:
> while (5 < 10)
>     {
>     }

Nur so nebenbei: Ist das so gewollt?

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.