- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 10 von 12

Thema: ATTiny13 HV-Programming: Löscht Chiperase auch die Signatur?

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    10.05.2005
    Beiträge
    5
    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...
    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.

    Gruß
    Ralf
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken setbox-m88-rescuemodul.png  

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen