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
intmain(void)
5
{
6
uint8_tlc=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
return0;
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
intmain(void)
7
{
8
uint8_tlc=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
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.
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.
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.
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?
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.
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.
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
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.
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
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.
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.
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.