Code:
;-------------------------------------------------------------
;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.
Lesezeichen