Arduino Bootloader - welcher ist für uns optimal?

; set follow equ to 0/1 to de/activate....
.equ UseBootMode = 0 ; 0 = start bootloader always
.equ UseWDR = 0 ; Watchdog support (2 sec timeout, remember to deactivate WDT in your application if not needed)
.equ UseSaveMCUSR = 0 ; save MCUSR on stack (RAMEND) for access by application (on UseWDR=1 MCUSR must be cleared)

.equ UseE2Write = 1 ; EEPROM write command (have implicit verify)
.equ UseE2Read = 1 ; EEPROM read command

.equ UseCrypt = 0 ; cryptography (crypt.inc)
.equ UseCryptFLASH = 0 ; explicit use of cryptography for writing to FLASH
.equ UseCryptE2 = 0 ; explicit use of cryptography for writing to EEPROM

.equ UseVerify = 1 ; Verify FLASH command (FLASH write/erase have implicit verify, can be deactivated)
.equ UseVersioning = 0 ; Versioning for application software (stored 4/6 bytes before BootStart)
.equ UseSRAM = 0 ; SRAM read/write commands (attention! can be a security risk)

.equ UseSpecialBootVect = 0 ; use a rjmp BootStart at end of FLASH to start bootloader from application code
.equ UseSpecialWrite = 0 ; special function "write_flash" to reprogram FLASH
.equ UseSpecialWriteBoot = 0 ; "write_flash" can write to bootloader section with magic code, only usefull if SPM is allowed by lockbit fuses in BLS
.equ UseSpecialRead = 0 ; special function "read_flash" to read from FLASH
.equ UseSpecialMsg = 0 ; special function to return address and size of BootMsg
; look into AVRootloader.h and M162 test project in folder \test\ for use of special funcs

.equ UseAutobaud = 1 ; Baudrate detection
.equ UseResetDelay = 1 ; Reset the boot delay everytime if any activity is detected on RX pin.
.equ UseUartInvert = 1 ; invert UART levels (for RS232 drivers such as MAX232)
.equ UseRS485 = 0 ; activate RS-485 Data Enable pin
.equ UseRS485Invert = 0 ; inverted logic of RS-485 DE pin (HIHGH for receive, LOW for transmit)

.equ RX_PORT = PORTD ; Receive port and pin
.equ RX = PD0
.equ TX_PORT = PORTD ; Transmit port and pin
.equ TX = PD0

.if UseRS485
.equ DE_PORT = PORTB ; DE enable pin of RS-485
.equ DE = PB2 ; must be only set if RS485 DE is used
.endif

.set XTAL = 16000000 ;
.set BootDelay = XTAL/4 ; about 250ms (don't set to fast to avoid connection problems)
.set BootBaudrate = 115200 ; only used if no Baudrate detection activated, XTAL is than important
.set BootVersion = 6 ; Version 6 (must be not changed)
.set BootCodeSize = 484 ; set to 0, compile and set to value in [.cseg] Used, compile again
; after this step cseg used is +2 bytes greater, ignore it (AVRStudio 4.16 bugfix)
 
Moin
Ich war mal fleißig, im Anhang ein Komplettpaket Avrootloader.zip.txt (das .txt am Ende löschen, dann entpacken)

Es ist alles inkl Compiler im Paket, es braucht keine Installation.

AVRootloader.asm öffnen, alle wichtigen Einstellungen sind jetzt ganz oben, inkl. einfacher Step by Step Anleitung.

Zum Compilieren:
-Unter Windows die Compile_Windows.bat ausführen
-Unter Linux die Compile_Linux.sh ausführen

Die Windowsversion konnte ich nicht testen, hoffe es funktioniert.
Bitte um einen Test unter Windows und Rückmeldung.

Unter Linux habe ich alles mit den vorgegeben Werten Am Uno gerade getestet.


Schön wäre wenn wir das gemeinsam weiter optimieren und vereinfachen könnten. Detailwerte, .bat und .sh Datei. Ideal wäre natürlich ein Git dazu.
 

Anhänge

  • AVROOTLOADER.zip.txt
    1,7 MB · Aufrufe: 181
Moin
Ich versuche gerade oben die Werte mit Kurzanleitung etwas übersichtlicher zu gestalten, und könnte etwas Hilfe gebrauchen, das es kurz wie möglich, aber verständlich ist. Anleitungen schreiben ist nicht so mein Ding.
Vielleicht mag sich jemand dem ein bissl annehmen.


Code:
; Modifizierte ASM für den AVRooloader von Hagen, copyright HR
; https://github.com/damadmai/AVRootloader 
; http://www.rc-network.de/forum/showthread.php/725772-Arduino-Bootloader-welcher-ist-f%C3%BCr-uns-optimal?p=4991445&viewfull=1#post4991445

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

.include "m328Pdef.inc"         ;   Schritt 1   Prozessor auswählen (Schreibweise siehe Liste unten)

.set  XTAL          = 16000000  ;   Schritt 2   CPU Clock wählen:

.equ  Onwire_PORT   = PORTB     ;   Schritt 3   Den Onewire-Port-Pin wählen 
.equ  Onwire_PIN    = PB4       ;                   (zum Identifizieren beim Arduino z.B. nach "Arduino Uno Pinout" googlen):

.set  BootCodeSize  = 528       ;   Schritt 4   Comilieren mit .set BootCodeSize = 0    um die Größe des Bootloaders zu erfassen
                                ;                   (Es ist der Wert in der oberen Zeite (.cseg) unter "Used", ca 500Byte groß.

                                ;   Schritt 5   Comilieren mit .set BootCodeSize = Die bei Schritt 4 erfasste Größe des Bootloaders 
                                ;                   Der Compiler dichtet nun 2Byte dazu, bitte ignorieren.

                                ;   Schritt 6   Den fertig compilierte Bootloader "AVRootloader.hex" brennen. 
                                ;               Die Fusebits dabei nach Anleitung setzen.  Z.B. für 328p 16MHz  L:0xFF   H:0xDA   E:0xFD

                                ;   Sonstiges:
                                ;   Comilieren mit Compile_Windows.bat bzw. Compile_Linux.sh
                                
                                ;   Default Werte für den späteren Fileupload sind:
                                ;   Sign: BOOTLOADER 
                                ;   Baudrate: Auto (bewährt haben sich 9600-57600Baud)  

                                ;   Beispielwerte sind für einen Arduino Uno/Nano 16Mhz, PB4 entspricht Pin D12
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

.nolist
 

onki

User
Hallo,

wenn ich die Doku richtig lese, ist der OneWire-Modus "nur" an den Standard-Ports möglich. Oder hab ich das falsch interpretiert.
Viele Sensorprojekte nutzen ja den UART zur Datenübertragung an den Empfänger und machen Softserial über die Standard-Ports z.B. für das GPS. Gibt es auch OneWire-Bootloader, die am µC am UART Port funktionieren?

Gruß
Onki
 
Moin
Hier mal eine Liste für die üblichen Arduinos mit dem 328p (UNO NANO MINI)
Code:
D0(RXD) PORTD   PD0
D1(TXD) PORTD   PD1
D2      PORTD   PD2
D3      PORTD   PD3
D4      PORTD   PD4
D5      PORTD   PD5
D6      PORTD   PD6
D7      PORTD   PD7
D8      PORTB   PB0
D9      PORTB   PB1
D10     PORTB   PB2
D11     PORTB   PB3
D12     PORTB   PB4
D13     PORTB   PB5
A0      PORTC   PC0
A1      PORTC   PC1
A2      PORTC   PC2
A3      PORTC   PC3
A4      PORTC   PC4
A5      PORTC   PC5

Hintergrund
Ein Port besteht aus 8Pins, Ein Byte besteht aus aus 8Bit.
Man kann so mit nur einem Befehl alle 8 Pins eines Ports lesen / schreiben / als Eingänge/Ausgänge definieren, Pullups setzen u.s.w.
https://www.arduino.cc/en/Reference/PortManipulation
+++++++++++++++++++++++++++++++

BTW - hat denn jemand mal die comile_windows.bat ausprobiert ? funzt die ? (ich habe nur Linux, und kann die nicht testen)

Im Anhang die etwas aufgehübschte ASM, das .txt am Ende entfernen, und einfach austauschen.
 

Anhänge

  • AVRootloader.asm.txt
    23,1 KB · Aufrufe: 152

Steini63

User
...
Zum Compilieren:
-Unter Windows die Compile_Windows.bat ausführen
-Unter Linux die Compile_Linux.sh ausführen

Die Windowsversion konnte ich nicht testen, hoffe es funktioniert.
Bitte um einen Test unter Windows und Rückmeldung.
....

Funktioniert unter Windows - DANKE! Ich habe es für einen Tiny85 genutzt - läuft. In der neuen ('aufgehübschten') Version ist auch die Warnung bezüglich der Portdefinitionen weg. Wenn du jetzt noch "Comilieren" in "Compilieren" änderst, wär's schon fast zu perfekt ;-)

Es hat so problemlos funktioniert, dass ich damit auch mal diesen Bootloader versucht habe:
https://sourceforge.net/projects/tinypicbootload/files/
Da scheint mir die PC-Software besser automatisierbar; außerdem soll sie per Mono auch mit Linux laufen. Das wär für mich nicht so interessant, aber vielleicht für die Linux-Jünger. Naja, jedenfalls lief das Compilieren (Assemblieren) mit deiner Zusammenstellung ebenfalls problemlos. Der Bootloader läuft auch gut mit dem AtTiny85.
ABER ich habe keinen Onewire-Modus hinbekommen, also keine Nutzung über ein "Servokabel" - jedenfalls nicht mit meinen Fähigkeiten.

Grüße
Steini
 
Hallo Steini

Vielen Dank für die Rückmeldung :) :)

Ich nutze den AVRootloader auch primär für meine Attiny-Projekte, auch da er mit dem BLHelibootloader kompaktibel ist (BLHeliboot = AVRootloader).

Wenn man für einen Attiny ein Boothex mit der sign: BLHeli / 19200Baud erzeugt, kann man den Attiny auch über die BLHelioberfläche flashen, und über die BLHelioberfläche sogar die Parameter-Schieber im EEprom im Attiny für andere Zwecke zweckentfremden (= einfachste Anwenderfreundlichkeit, könnte ja evtl auch für Deine Telemetrie Projekte interessant sein, Kalibration etc ?).

Umgekehrt kann man sich auch mit der AVRootloaderoberfläche auf den BLHeliregler draufschalten, und so z.B: den EEprom-Editor nutzen.

Hier ist die BLHeliversion vom Avrootloader:
https://github.com/4712/BLHeliSuite...der/Atmel/AVRootloader Source for BLHeliSuite

Beide Oberflächen, BLHelisuite und Avrootloader funktionieren unter Linux mit Wine.
https://github.com/4712/BLHeliSuite/blob/master/Manuals/BLHeliSuiteWine.pdf
(USB0 ist dann Com33, USB1 Com34 u.s.w.)

Btw, Steini, ich habe mich im Winter mal etwas mit der USI Schnittstelle (Universal Serial Interface)vom Attiny 84/85 auseinandergesetzt, und One-Wire Hott-Telemetrie als Hardware Uart zum rennen gebracht (mit viel Schweiß) Wenn Du da Interesse hast...


Im Anhang die neue Version mit den ganzen Ps ;)
 

Anhänge

  • AVROOTLOADER.zip.txt
    1,7 MB · Aufrufe: 172

onki

User
Hallo Holger,

Mea Culpa - leider nimmt mich die ASH 26 gerade so ein, dass für solche "Spielereien" leider gerade keine Zeit ist. Aber spätestens wenn ich das ACL flashen muss (HK Regler) werde ich das angehen.
Ich muss noch den ein oder anderen Sensor für Kumpels oder unsere Jugend bauen und da wäre die OneWire-Geschichte über die UART-Ports super, weil ich mir so die sperrige 6er Pfostenleiste schenken könnte an den ProMicros um das über den Telemetriestecker zu erledigen.
Der Programmupload (also nicht der Bootloader) ginge ja dann auch via OneWire über die Arduino IDE - oder?

Gruß
Onki
 
Hallo Onki

Mit der Arduino-IDE mache ich das immer so, das ich zuerst mit Sketch > kompilierte Binärdatei erzeugen ein Hex erstelle, und es dann mit dem AVRootloaderprogramm hochlade.

Man könnte der Arduino-IDE auch Avrootloader beibringen, aber das ist einiges an Fummelei in den Arduino-Dateien.
Man braucht AVRDUDE mit Avrootloadersupport: https://github.com/burghardt/avrdude-avrootloader
Und müsste dann den Boardmanager in den Textdateien entsprechend erweitern.
Beim nächstem Arduino-IDE Update könnte dann aber alles wieder weg sein...
 

Steini63

User
Btw, Steini, ich habe mich im Winter mal etwas mit der USI Schnittstelle (Universal Serial Interface)vom Attiny 84/85 auseinandergesetzt, und One-Wire Hott-Telemetrie als Hardware Uart zum rennen gebracht (mit viel Schweiß) Wenn Du da Interesse hast...
Habe Interesse! Ich muss (will) es nur in "meine" Programmiersprachen umsetzen können. Was ich bisher zu USI gelesen habe, hatte immer das Fazit: "So kompliziert, dass man es besser gleich komplett in Software macht.

Ich wäre an FlySky (iBus) Telemetrie interessiert. Das braucht 115.200 Baud. Schafft USI das auf einem 16 MHz Tiny 85?


Grüße
Steini
 
Moin Steini

Evtl wären dann die neuen series-1 Attiny evtl das richtige bei 115200baud ?

http://www.technoblogy.com/show?2OCH (verweist dort auf SpenceCode für die Arduino-IDE)

Die kleinen haben den fetten X-Mega Kern drauf, ohne Quarz können die bis 20MHz, ich arbeite mich grade in die Dinger ein, aktuell mit dem 412 8Pin, der ist kleiner(schmaler) als der Attiny85 kostet ca. 45Cent, hat einen Hardware Uart, kann von Haus aus One-Wire Mode für Uart, Servokanalauslesen kmpl im Hintergrund, und allerlei anderes nützliches Modellbauer-Zeug.

OneWire Upload kann der von Haus aus (UPDI über ein Nano als Adapter), aber leider nur auf einen externen Pin. Ich habe die auf solch billigen SMD/DIP Platinchen, und das Lötauge vom UDPI-Pin einfach frei gelassen, so das man einen Pin für Uploads einfach einstecken kann. Der Vorteil, rennt direkt über die Arduino-IDE ohne irgendwelches Gestecke oder Resetknoppgedrücke (wie bei den USB-Arduinos, glaube Onki hatte da mal nach gefragt).

(edit, für Uart OneWire die Errata lesen oder das: https://www.avrfreaks.net/forum/attiny1614-one-wire-errata-datasheet-errors
Die Reihenfolge mit (de)aktivieren ist wichtig, hatte da ewig dran gesessen, bis das gefunden hatte :rolleyes:)


Die Attinyübersicht in Wiki wurde um die neuen Attinys aktualisiert : https://en.wikipedia.org/wiki/ATtiny_microcontroller_comparison_chart




USI,
So schlimm isses nicht, nur etwas chaotisch. Eigentlich ist es i2c, und clont frech die clock intern mit einem Timer.
Man muss den Pin per Pinchance-ISR überwachen, geht der auf 0, gehts los. Der zugehörige Timer wird mit etwas vorlauf konfiguriert, liest dann im Hintergrund das Byte ein, wenn fertig, meldet sich der USI per ISR.
Jetzt geht das Chaos eigentlich erst los, das Byte liegt dann seitenverkehrt im USI-Register, und muss noch gedreht werden (oder erstmal zwischenlagern, und drehen wenn Zeit ist). Schreiben ist noch chaotischer.

Bei Hott warte ich ja immer nur auf ein entsprechendes Byte, und frage daher gleich invers ab, spare so diese Rumdreherei, sende dann in den Pausen Bitweise. Die Codes kann ich dir mal schicken ist alles C.

Nette Infos dazu: http://www.technoblogy.com/show?RPY
 

Steini63

User
Wow!

Das ist ja richtig viel Stoff. Eigentlich das Richtige für Anfang Herbst. Demnächst wollte ich ferngesteuerte Kleinflugzeuge an der frischen Luft bewegen, anstatt Mikrocontroller mit meinen geistigen Ergüssen zu füllen. Ich werde mir trotzdem alles aufmerksam zu Gemüte führen.

Mein aktuelles Projekt sind übrigens GPS-Geschwindigkeitsmesser in drei Varianten:
  1. Anzeige der Höchstgeschwindigkeit auf einem externen LCD, das nach der Landung angeschlossen wird.
  2. Loggen der GPS Daten mittels OpenLog und anschließender Auswertung am PC.
  3. Übermittlung der Geschwindigkeit per Telemetrie.
Mein Fernziel:
Um Windeinflüsse zu kompensieren, werden automatisch die besten beiden entgegengesetzten Flüge (180 Grad versetzt) gemittelt und das als Höchstgeschwindigkeit ausgegeben. Mittels Variante 2 und einem PC-Auswerteprogramm läuft das schon. Mit 'nem Mikrocontroller wir das noch dauern.
Noch ein Fernziel:
Variante 3 so zu programmieren, dass das mit anderen Sensoren parallel laufen kann; bevorzugt mit BLHeli-Telemetrie.

Steini
 
Moin Steini

Sehr ähnliches hatte ich vor 2Jahren gebastelt, ging da um die Solarflieger, Strecke messen u.s.w., einfach ne GPS-Klingel an Openlog, den Rest hats Notebook erledigt. Das Openlog dann irgendwann geflasht und es um Hott erweitert.

Fürs Speeden hatte ich damit auch rumprobiert, es aber nie wirklich fertig bekommen. Erst mit 115200Baud mit 10Hz und die Klingel auf RMC reduziert ging es halbwegs erträglich. Mit den Parsern aus irgendwelchen ArduinoLibs war es zu langsam, am Ende habe ich mir den Von Herbert Dingfelder umgeschrieben, der funzte dann. http://www.herbert-dingfelder.de/?page_id=678

Normal durchfliegt man die 200m Messstrecke in beiden Richtungen. Problem war Anfang und Ende Messstrecke. Ich habe versucht das über den Abstand vom Startpunkt festzumachen, sobald Abstand <100m dann Messung starten, und wenn dann wieder >100m dann Messung beenden, hatte leider nur mäßig funktioniert. Die zündende Idee fehlte mir dazu.

Ab hier etwa:
http://www.rc-network.de/forum/show...ntschlüsselt?p=4506256&viewfull=1#post4506256

Weiter unten ein paar Beiträge weiter der umgeschriebene Parser.
Und das passende AVRootloaderhex fürs Openlog:)

Die ganze Hardware müsste noch irgendwo in den Bastelkisten rummliegen, einige GPS Klingeln (die guten Mediatec, nicht die blöden Neo-Flatschen mit Batterie) und ein paar von den Winzteilen mit Dipolantenne (<1g), Openlogs, evtl kann ich die abgeben, mache da vermutlich eh nix mehr mit.
 
Ansicht hell / dunkel umschalten
Oben Unten