Nochmal ich....
Habe den Sourcecode und ein Schaltbild von meinem HV-RescueModul zusammengestellt.
Hier der Code für einen M88, ist aber wohl auch von anderen Controllern zu verwenden...
;-------------------------------------------------------------
;HV-Notfall Progger
;------------------
; Befehlsliste:
; ResetFuseT13 Fuses Tiny13 auf Datenblattdefault setzen
; Signature Calibration- und Signaturebytes auslesen
; ChipErase Flash-, Eepromspeicher und Lockbits loeschen
;
; WICHTIG:
; TimeOutFunktion ist noch nicht implementiert.
; Funktionen können Hängen, wenn kein Probant in Fassung ist.
;
;-------------------------------------------------------------
;Registerbelegungen
;
.DEF b4=R18
.DEF b5=R19
.DEF b0=R20
.DEF b1=R21
.DEF b2=R22
.DEF b3=R23
.DEF a0= R24
.DEF a1= R25
;use xl,xh,yl,yh,zl,zh
;-------------------------------------------------------------
;GlobalConstant
.EQU quarz=16000000
;-------------------------------------------------------------
;HV-Pinbelegung Tiny13
; SDI PB0 I PIN5
; SII PB1 I PIN6
; SDO PB2 O PIN7
; SCK PB3 I PIN2
;
; Enter ProgMode
; SDI ProgEnable[0]:=0
; SII ProgEnable[1]:=0
; SDO ProgEnable[2]:=0
;
; VCC 4,5.. 5,5V PIN8
; GND PIN4
; RESET PB5 11,5..12,5V PIN1
;
;
; Pinbelegung M88
; PC5 Pin28 O -- SCK PIN2 PB3
; PC4 Pin27 O -- SDI PIN5 PB0
; PC3 Pin26 O -- SII PIN6 PB1
; PC2 Pin25 I -- SDO PIN7 PB2
; PC1 Pin24 O -- VCC-PIN8
; PC0 Pin23 O -- HVC-PIN1
;
.EQU TSCK= PortC5
.EQU TSDI= PortC4
.EQU TSII= PortC3
.EQU TSDO= PortC2
.EQU TVCC= PortC1
.EQU THVC= PortC0
.EQU SCKCYCTime= 24 ; ca.20khz,wegen Kabellaenge...
;-------------------------------------------------------------
;Macros
.macro ld_Wait
ldi xl,low(((quarz*@0/1000000)-8)/8) ;1
ldi xh,high(((quarz*@0/1000000)-8)/8);1
.endm
.macro Wait
ld_wait @0
rcall waitus
.endm
.macro com_exec
ldi zl,low(@0*2)
ldi zh,high(@0*2)
rcall funk_com_exec
.endm
.macro sbis_TSDO
sbis pinc,TSDO
.endm
.macro wait_TSDO
_m01:
sbis_TSDO
rjmp _m01
.endm
.macro PortsOutOff
ldi a0,0x00
ldi a1,(1<<THVC|1<<TVCC|1<<TSCK|1<<TSDO|1<<TSII|1<<TSDI)
out portc,a0
out ddrc,a1
.endm
.macro WritePort ;rx
out portc,@0
.endm
;-------------------------------------------------------------
.CSEG
;-------------------------------------------------------------
; Fuses vom Tiny13 auf Datenblattdefault setzen
;
ResetFuseT13:
rcall ChipPowerUp
; 4.1 Write Fuse Low
com_exec com_wfl
wait_tsdo
; 4.2 Write Fuse High
com_exec com_wfh
wait_tsdo
rcall ChipPowerDown
ret
;-------------------------------------------------------------
; SignatureBytes und Calibrationbyte auslesen
;Return
;b2 CalibrationByte
;b3 SignatureByte0
;b4 SignatureByte1
;b5 SignatureByte2
;
Signature:
rcall ChipPowerUp
; Read CalibrationByte
com_exec com_rcbb
mov b2,a1
; Read SignatureByte0
com_exec com_rsb0
mov b3,a1
; Read SignatureByte1
com_exec com_rsb1
mov b4,a1
; Read SignatureByte2
com_exec com_rsb2
mov b5,a1
rcall ChipPowerDown
ret
;-------------------------------------------------------------
; ChipErase Ablauf geändert
; wenn mit ';***'-Zeilen, werden die Signaturebytes und
; das Calibrationbyte geloescht.
; Geaenderter Ablauf ist noch ohne TEST...
;
ChipErase:
rcall ChipPowerUp
; 4.1 ChipErase
;!!!LÖSCHT AUCH DAS CALIBRATIONBYTE UND DIE SIGNATUREBYTES!!!
com_exec com_ce
wait_tsdo
;wait 100 ;***Bessere Sicht auf dem scope
; 4.2 NOP
com_exec com_nop
wait_tsdo
;***
;***
;*** ; 4.1 Write Fuse Low
;*** com_exec com_wfl
;*** wait_tsdo
;*** ; 4.2 Write Fuse High
;*** com_exec com_wfh
;*** wait_tsdo
;***
;***
rcall ChipPowerDown
ret
;-------------------------------------------------------------
;Einschalten des Probanden nach Tiny25Ablauf
;
ChipPowerUp:
CLI
clr b2
clr b3
clr b4
clr b5
; 1. (SDI:SII:SDO):=(0:0:0)
PortsOutOff
wait 50
; 2. VCC und HVCC einschalten
; 3. min. 100ns warten
ldi a0,(1<<TVCC)
WritePort a0
wait 50
ldi a0,(1<<THVC|1<<TVCC)
WritePort a0
wait 50
cbi DDRC,TSDO ;TSDO wieder Eingang
wait 500
ret
;-------------------------------------------------------------
;Ausschalten des Probanden
;
ChipPowerDown:
; 5. PowerDown HVCC=0, VCC=0
cbi portc,THVC ;Reset=0
wait 50
PortsOutOff
SEI
ret
;-------------------------------------------------------------
;KommandoTabelle
;---------------
;***
;*** Nur die benötigten Kommandos sind getestet ***
;***
; ChipErase TSDI 0x80,0x00,0x00 ;Wait TSDO high
; TSII 0x4C,0x64,0x6C
COM_CE: .DB 0x03,0x00,0x80,0x4C,0x00,0x64,0x00,0x6C
; NOP TSDI 0x00
; TSII 0x4C
COM_NOP: .DB 0x01,0x00,0x00,0x4C
; WriteFuseL TSDI 0x40,0x6A,0x00,0x00 ;Wait TSDO high
; TSII 0x4C,0x2C,0x64,0x6C
COM_WFL: .DB 0x04,0x00,0x40,0x4C,0x6A,0x2C,0x00,0x64,0x00,0x6C
; WriteFuseH TSDI 0x40,0x1F,0x00,0x00 ;Wait TSDO high
; TSII 0x4C,0x2C,0x74,0x7C
COM_WFH: .DB 0x04,0x00,0x40,0x4C,0x1F,0x2C,0x00,0x74,0x00,0x7C
; ReadLock- TSDI 0x04,0x00,0x00
; bits TSII 0x4C,0x78,0x7C ;LastInst DataReceive
COM_RLB: .DB 0x03,0x00,0x04,0x4C,0x00,0x78,0x00,0x7C
; ReadFuseL TSDI 0x04,0x00,0x00
; TSII 0x4C,0x68,0x6C ;LastInst DataReceive
COM_RFL: .DB 0x03,0x00,0x04,0x4C,0x00,0x68,0x00,0x6C
; ReadFuseH TSDI 0x04,0x00,0x00
; TSII 0x4C,0x7A,0x7E ;LastInst DataReceive
COM_RFH: .DB 0x03,0x00,0x04,0x4C,0x00,0x7A,0x00,0x7E
; ReadCali- TSDI 0x08,0x00,0x00,0x00
; brationByteTSII 0x4C,0x0C,0x78,0x7C ;LastInst DataReceive
COM_RCBB:.DB 0x04,0x00,0x08,0x4C,0x00,0x0C,0x00,0x78,0x00,0x7C
; ReadSigna- TSDI 0x08,0x00,0x00,0x00
; tureByte0 TSII 0x4C,0x0C,0x68,0x6C ;LastInst DataReceive
COM_RSB0:.DB 0x04,0x00,0x08,0x4C,0x00,0x0C,0x00,0x68,0x00,0x6C
; ReadSigna- TSDI 0x08,0x01,0x00,0x00
; tureByte1 TSII 0x4C,0x0C,0x68,0x6C ;LastInst DataReceive
COM_RSB1:.DB 0x04,0x00,0x08,0x4C,0x01,0x0C,0x00,0x68,0x00,0x6C
; ReadSigna- TSDI 0x08,0x02,0x00,0x00
; tureByte2 TSII 0x4C,0x0C,0x68,0x6C ;LastInst DataReceive
COM_RSB2:.DB 0x04,0x00,0x08,0x4C,0x02,0x0C,0x00,0x68,0x00,0x6C
;-------------------------------------------------------------
;Programmierkommando ausfuehren
; a0 ist der Mirror der HV-Schnittstelle
;
funk_com_exec:
lpm yl,Z+ ;Anzahl der Kommandowoerter
lpm yh,Z+
ldi yh,8
_nb00:
lpm b0,Z+ ;3 SDI_data laden
lpm b1,Z+ ;3 SII_data laden
Clock_TSCK:
sbr a0,(1<<TSCK);1
WritePort a0 ;2 Up___12
sbr a0,(1<<TSDI);0|1
sbrs b0,7 ;2|1
cbr a0,(1<<TSDI);0|1 3
sbr a0,(1<<TSII);0|1
sbrs b1,7 ;2|1
cbr a0,(1<<TSII);0|1 3
cbr a0,(1<<TSCK);1
add b0,b0 ;1
add b1,b1 ;1
nop ;1
rcall waitxus ;0
WritePort a0 ;2 Down_12
adiw xh:xl,0 ;2
sec ;1
sbis_TSDO ;2|1
clc ;0|1
adc a1,a1 ;1
rcall waitxus ;0
dec yh ;1
brne Clock_Tsck ;2|1 9|8
ldi yh,8 ;1
sbr a0,(1<<TSCK);1
WritePort a0 ;2 Up___12 Puls8 up
cbr a0,(1<<TSCK|1<<TSDI|1<<TSII);1
rcall waitxus9 ;0
WritePort a0 ;2 Down_03 Puls8 down
sbr a0,(1<<TSCK);1
rcall waitxus9 ;0
WritePort a0 ;2 Up___03 Puls8 ende
cbr a0,(1<<TSCK);1
rcall waitxus9 ;0
WritePort a0 ;2 Down_03
sbr a0,(1<<TSCK);1
rcall waitxus9 ;0
WritePort a0 ;2 Up___03 Puls9 ende
cbr a0,(1<<TSCK);1
rcall waitxus9 ;3
WritePort a0 ;2 Down_03 puls10 Halbzeit
;wait 100 ; ***Bessere Sicht auf dem Oscar
rcall waitxus ;0
dec yl ;1
brne _nb00 ;2
ret ;4
;-------------------------------------------------------------
waitxus9:
lpm xh,Z ;3
lpm xh,Z ;3
lpm xh,Z ;3
Waitxus:
ld_wait SCKCYCTime;2
adiw xh:xl,0 ;2
;Wait in microseconds
waitus: ;3 rcall
adiw xh:xl,0 ;2
adiw xh:xl,0 ;2
sbiw xh:xl,1 ;2
brne waitus ;2
adiw xh:xl,0 ;2
ret ;4 8n+8
;-------------------------------------------------------------
.EXIT
Das Schaltbild habe ich mal als Dateianhang beigefügt.
Gruß
Ralf
Hallo Felack,
Ich habe nur die D-Revisionen. Wenn auf der Oberseite keine Revision hinter dem Produktionsdatum angegeben ist, habe ich die Revisonsangabe immer auf der Unterseite vorgefunden. Meine Tinys sind von 0606 und 0621. Denn 0514D habe ich auch noch, so ein Zufall...
Bei dem Programm war es so, dass ich zuerst die Version ohne den Befehl 'ChipErase' erstellt hatte. Damit habe ich bei dem Tiny13 den Resetanschluss wieder an den Portpin gelegt.
Es wurden also nur die die Bytes 'FuseLowByte' und 'FuseHighByte' mit dem 'ResetFuseT13'-Unterprogramm zurückgesetzt. Die Fusebits sind in der Kommandotabelle bei COM_WFL und COM_WFH eingepflegt. Das Funktioniert bei mir auch so.
Dann kam das 'ChipErase'-Unterprogramm dazu, weil ich die Lockbits setzen wollte
Die Ablauffolge der Kommandos ist nach der Alternativmethode im Datenblatt des Tiny13 (Ref:2535E-AVR-10/04) auf Seite 112, wenn der Resetpin abgeschaltet ist.
Ich habe zwei Tiny13 mit der 'Chiperase'-Routine erlegt. Also 'ChipErase', 'WriteFuseLow' und 'WriteFuseHigh'. Der Erste hatte keine gesetzten Lockbits, beim Zweiten waren die Lockbits gesetzt. Das die Signaturebytes platt waren ist mir erst mit dem Ponyprog aufgefallen, weil der 'Device Missing' meldet. Danach habe ich keinen weiteren Versuch gemacht. Habe zur Zeit keinen Tiny13 mehr über...
Ja, zum Einschalten des Hochvoltprogrammiermodus, das ist so ne Sache...
Ich habe die Datenblätter vom Tiny24 und Tiny25 quergelesen. Bei diesen Typen werden keine Angaben gemacht wie den der Hochvoltprogramiermodus ohne Resetpin zu aktivieren ist.
Was aber bei allen Typen übereinstimmt, ist das Progenablemuster (SDI:SII:SDO):=(0:0:0)
Naja, wenn ich also bei Progenable und Resetpin=0 die Vcc einschalte, und danach die 12V an den Resetpin lege, wird der Tiny wohl in den Programmiermodus kommen. Das Verlassen des Programmiermodus wird mit PowerDown oder Resetpin=0 angegeben. So war meine Überlegung: Wenn Reset aktiv ist, dann kann ich auch die Vcc abschalten...
Das Warten auf "Poll RDY/BSY" erledige ich mit dem 'wait_TSDO'-Macro. Ist auf dem Scope auch gut zu Erkennen, wenn die Fusebytes programmiert oder der Speicher gelöscht wird.
Der Ausgang SDO geht nach ein paar Millisekunden auf High.
Gruß
Ralf
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.