Forum: Mikrocontroller und Digitale Elektronik IR-Bootlader oder was?


von My T. (mtram)


Angehängte Dateien:

Lesenswert?

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.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

My T. schrieb:
> Danke für nützliche Vorschläge.

 Da deine Routine "Pause" am Ende liegt, habe ich die zuerst gesehen
 und da war es auch schon Schluss mit lesen.

 Wo hast du denn diese blödsinnige Routine her und wozu soll sie gut
 sein?

 Und der Rest (den ich nicht gelesen habe) ist wahrscheinlich wieder mal
 ein C&P Beitrag ohne zu verstehen was da überhaupt vor sich geht.

: Bearbeitet durch User
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.