Hi, ich habe mich seit Jahren erfolglos an Bootladern für meine
Modellfahrzeuge versucht.
Inzwischen stelle ich aber fest, dass es einfacher wäre, mein
vorhandenes Infrarot zum Programm-Update zu nutzen.
Und zwar auf ein Tastenkommando hin bzw. das erste gesendete Byte einer
SIgnalfolge.
Von den vielen auch hier im Forum beschriebenen Bootladern waren aber
erst einmal die Speicher-Befehle zu verstehen.
Für andere User, die ähnliche Fragen beschäftigt, hier meine Lösung, den
Flash eines µC zu füllen.
Die einzige übersichtliche Vorlage, stammt von
http://www.g-heinrichs.de/attiny/Bootloader.pdf.
Wie der Puffer addressiert wird, habe ich aus keiner Vorlage verstanden,
auch nicht Figure 19-1. des ATtiny25-85-Manual.
Mit Probieren stellte ich fest, es ist kein eingener Pointer, sondern
das ZL-Register, welches auch den Flash addressiert ( 0, 64, 128, 192,
mit der folgendeden Seite ZL wieder 0 aber ZH +1 ).
Da hatte mich das z.B. von PeDa vewendete .dseg lange Zeit sehr
verwirrt. Wo der von mir verwendete Puffer liegt, weiss ich immer noch
nicht.
Im Hex-Dump sieht man in Seite 2 (Zeilen 5-6) den Rest des
Programmcodes.
Ab Zeile 9 kommen die Seiten, die mit ihren Nummern gefüllt sind.
Im Programmlauf kommt die Seite 80hex an die Addresse 0. Weil dort nur
ein Sprungbefehl war, wurde dann die Seite 1 noch gelöscht und dann
starb das Programm. Mit LEDs ist auch was zu sehen.
Ich stelle hier auch die Avrdude-Kommandos rein, denn dann kann auch ich
hier nachsehen, wenn ich wieder was vergessen habe.
1 | ;avrdude -P /dev/ttyUSB0 -c stk500v2 -p t85 -F -V -Uefuse:w:0xfe:m
|
2 | ;avrdude -P /dev/ttyUSB0 -c stk500v2 -p t85 -V -Uflash:w:prog.hex:i
|
3 | ;avrdude -P /dev/ttyUSB0 -c stk500v2 -p t85 -F -Uflash:r:-:i
|
4 | .include "tn45def.inc"
|
5 | ; _________
|
6 | ; 1 / |8
|
7 | ; Reset o--| |--o Vcc
|
8 | ; | AT |
|
9 | ; < PB3 o--| |--o PB2 >
|
10 | ; | tiny |
|
11 | ;IR>PB4 o--| |--o PB1 > Gn-LED
|
12 | ; | 45 |
|
13 | ; GND o--| |--o PB0 > IR-LED
|
14 | ; |__________|
|
15 | ;
|
16 | .def wert = r16
|
17 | .def seite = r17
|
18 | .def RWCount = r23
|
19 | .def spmcsrval = r22
|
20 | .def A = r27
|
21 |
|
22 | rjmp Anfang
|
23 |
|
24 | .org 32
|
25 | Anfang:
|
26 | ldi A,15 ; LEDs
|
27 | out ddrb,A
|
28 |
|
29 | ldi seite,4
|
30 |
|
31 | Testen:
|
32 | out portb,wert
|
33 | rcall WrPage
|
34 | inc seite
|
35 | rjmp Testen
|
36 |
|
37 | WrPage:
|
38 | rcall Zhl
|
39 | ldi RWCount, 32
|
40 | Puffer_fuellen:
|
41 | Schreib_schleife:
|
42 | rcall getByte
|
43 | mov r0, wert
|
44 | rcall getByte
|
45 | mov r1, wert
|
46 | ldi spmcsrval, 1
|
47 | ; 1 Wort in Puffer schreiben
|
48 | out spmcsr, spmcsrval
|
49 | spm
|
50 | inc ZL ; Adresse um 1 Word erhöhen
|
51 | inc ZL
|
52 | dec RWCount
|
53 | brne Schreib_schleife
|
54 | SeiteLoeschen:
|
55 | subi ZL,64
|
56 | ldi spmcsrval, 3
|
57 | out spmcsr, spmcsrval
|
58 | spm
|
59 | ldi A,200
|
60 | rcall Pause
|
61 | Puffer_in_FLASH-Seite_schreiben
|
62 | ldi spmcsrval, 5
|
63 | out spmcsr, spmcsrval
|
64 | spm
|
65 | ret ;WrPage
|
66 |
|
67 | getByte:
|
68 | mov wert,seite
|
69 | ret
|
70 |
|
71 | Zhl:
|
72 | mov ZH,seite ; Bsp =11
|
73 | lsr ZH ; 0000 0100
|
74 | lsr ZH ; 0000 0010
|
75 | mov ZL,seite ; 0000 1001
|
76 | ror ZL ;1 0000 0001
|
77 | ror ZL ;1 1000 0000
|
78 | ror ZL ;0 1100 0000 =192
|
79 | ret
|
80 |
|
81 | Pause:
|
82 | ldi r24,255
|
83 | ldi r25,255
|
84 | sbiw r24,1
|
85 | dec A
|
86 | brpl Pause
|
87 | ret
|
Ich frage Euch nun, wohin denn mein Anwendungsprogramm sollte.
Mehrmals? Wie hier im Forum neulich vorgeschlagen wurde,Platz wäre da.
Nur die Infrarotroutine oder wie bei den Bootladern die Laderoutine ans
obere Flshende. Ich denke auch daran, Datenbereiche, z.B. für die
Bremsrampen auf glatte Seiten zu speichern und da gezielt zu ändern.
Den Code zum RC5-IR-Empfangsteil gebe ich gern bei Interesse preis.
Basiert auf AVR410, adaptiert von Rudolf Drabek.
Jewils einzelne Flashseiten habe ich mit Addressieren der Seite durch
den Tastencode einer TV-Fernbedienung beschrieben.
Noch habe ich keinen IR-Sender, der beliebige Byte sendet.
Eigentlich sollte das mit einem Raspberry sein, aber der bringt wohl
keinen sauberen Takt und außer Lirc finde ich keine anderen Codes.
Aber in Kombinatin gefällt mir
https://daniel-ziegler.com/arduino/esp/mikrocontroller/2017/07/28/arduino-universalfernbedienung/
Arduino/ESP und auch C ist neu für mich. Habt Ihr noch Lösungen, für
beliebige Bytes, bei RC5 geteilt z.B. in 2 Bit Addresse und 6 Bit
Kommando.
Danke für nützliche Vorschläge.