Hallo,
ich benutze schon seit einiger Weile den tinysafeboot auf Attinys.
Nun wollte ich ihn auch auf einem Atmega168 einsetzen.
Problem: Da ich anders auf den verbauten µC nicht zugreifen kann,
brauche ich einen Soft-Reset, den man ja laut Atmel am besten mit dem
Watchdog machen sollte.
Der tsb steigt aber sofort aus, wenn er erkennt, dass es ein
"Watchdog-Reset ist.
Nun bin ich nicht der Assembler-Experte und habe einfach folgendes
getan:
Bei Zeile ~1200:
1 |
|
2 | ; Clear WDRF in MCUSR
|
3 | ldi tmp4, (0<<WDRF)
|
4 | out MCUSR, tmp4
|
5 | ; reset WDT
|
6 | wdr
|
7 | ; Write logical one to WDCE and WDE
|
8 | lds r16, WDTCSR
|
9 | ori r16, (1<<WDCE)|(1<<WDE)
|
10 | sts WDTCSR, r16
|
11 | ; Turn off WDT
|
12 | ldi r16, (0<<WDE)
|
13 | sts WDTCSR, r16
|
14 |
|
15 | ; in tmp4, MCUSR ; check reset condition
|
16 | ; sbrc tmp4, WDRF ; in case of a Watchdog reset
|
17 | ; rjmp APPJUMP ; immediately leave TSB
|
18 |
|
19 | ldi tmp1, low (RAMEND) ; write ramend low
|
20 | out SPL, tmp1 ; into SPL (stackpointer low)
|
21 | .ifdef SPH
|
22 | ldi tmp1, high(RAMEND) ; write ramend high for ATtinys
|
23 | out SPH, tmp1 ; with SRAM > 256 bytes
|
24 | .endif
|
Damit wurde der Bootloader um einige Byte zu fett, so dass ich versucht
habe, "Entbehrliches" an der Passwort-Kontrolle (die ich nicht brauche)
weg zu schnibbeln:
1 | CheckPassword:
|
2 | chpw0:
|
3 | ser tmp4 ; tmp4 = 255 enables comparison
|
4 | chpw1:
|
5 | lpm tmp3, z+ ; load pw character from Z
|
6 | and tmp3, tmp4 ; tmp3 = 0 disables comparison
|
7 | cpi tmp3, 255 ; byte value 255 indicates
|
8 | breq chpwx ; end of password -> success
|
9 | ;chpw2:
|
10 | ; rcall Receivebyte ; else receive next character
|
11 | ; cpi tmp1, 0 ; rxbyte = 0 will branch
|
12 | ; breq chpwee ; to confirm emergency erase
|
13 | ; cp tmp1, tmp3 ; compare password with rxbyte
|
14 | ; breq chpw0 ; if equal check next character
|
15 | ; clr tmp4 ; tmp4 = 0 to loop forever
|
16 | ; rjmp chpw1 ; all to smoothen power profile
|
17 | ;chpwee:
|
18 | ; rcall RequestConfirm ; request confirmation
|
19 | ; brts chpa ; not confirmed, leave
|
20 | ;~ rcall RequestConfirm ; request 2nd confirmation
|
21 | ;~ brts chpa ; can't be mistake now
|
22 | ; rcall EmergencyErase ; go, emergency erase!
|
23 | ; rjmp Mainloop ; return to main loop
|
24 | ;chpa:
|
25 | ; rjmp APPJUMP ; else start application
|
26 | chpwx:
|
27 | rjmp SendDeviceInfo ; go on to SendDeviceInfo
|
Das hat nicht geklappt - Beim Reset bleibt der µC hängen.
Watchdog-Timeout ist 1s. Bis zum nächsten Timeout sollte der tsb den
Watchdog also längst deaktiviert haben.
Warum hängt er?