Bootloader Einstellungen Fuses, Makefile

Gast #6374537
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
Gast #6374559
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.
Gast #6374979
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.
Gast #6374985
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.
Gast #6375096
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
Gast #6375276
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
Gast #6375377
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.
Gast #6375389
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren