- Akku Tests und Balkonkraftwerk Speicher         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 12

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

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    10.05.2005
    Beiträge
    5

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

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo,
    Okay, mal nach langer Registrierungszeit und vielen gelesenen Tipps ist auch bei mir ein Problem aufgetreten.
    Ich verwende in einem 'Spielzeug' die Controller Tiny13 und Tiny25.
    Dabei werden alle Pins, also auch der Reset-Pin, als IO-Ports verwendet.
    Weil sich die Software oft ändert, kann ich die Tinys über einen Bootloader flashen.
    Für den Fall, dass ich mir mal den Bootloader zerstöre habe ich auf einen Mega88 eine kleine Funktion geschrieben, um die Fuses im High-Voltage Programmingmode auf die Defaultwerte aus dem Datenblatt zu setzen. Dies hat bisher auch Funktioniert. Nun wollte ich mal die Lockbits in Angriff nehmen.
    Dazu habe ich meine Funktion HV_FuseReset mit dem Chiperase-Befehl und NOP-Befehl erweitert.
    Zum Test habe ich einen Tiny13 ohne programmierte Lockbits genommen.
    Das Ergebniss war:
    -Fuses zurückgesetzt.
    -Flash- und Eepromspeicher gelöscht.
    -Calibrationbyte wurde auf 0xFF gesetzt.
    -Signaturebytes(0..2) wurden auf 0xFF gesetzt.

    Der PonyProg-Version mit Tiny13-Support erkennt den Tiny13 natürlich nicht mehr.
    Meine Frage nun:
    Ist dieses Verhalten bekannt?
    Gibt es irgendwo Infos wie die Signaturebytes und das Calibrationbyte wieder Reprogrammiert werden?
    Habe schon bei Atmel und diversen AVR-Seiten gesucht, vielleicht fehlt mir der richtige Suchbegriff...
    Bitte nicht Hauen, wenn ich irgendeine Application Note übersehen habe,
    oder ich die Lösung innerhalb des Forums nicht gefunden habe...

    Gruß
    Ralf

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Signature Bytes
    All Atmel microcontrollers have a three-byte signature code which identifies the device. This code can be read in both serial and parallel mode, also when the device is locked. The three bytes reside in a separate address space.
    Wenn du also 0xff liest, dann funzt entweder dein HV-Progger net, oder du hast die signature bytes tatsächlich überschrieben, d.h. das Teil frittiert...
    Disclaimer: none. Sue me.

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    22.04.2005
    Beiträge
    178
    Hallo gora,

    das Programm zum Resetten des Tiny13 würde mich auch interessieren. Kannst Du den Code und den Schaltplan dazu mal posten oder ist der streng geheim?

    felack

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    10.05.2005
    Beiträge
    5
    Hallo Georg-Johann,
    Ja, die signature ist wohl überschrieben. Aber ich Frage mich: Wie?
    Denn auf dem Scope konnte ich nichts Auffälliges entdecken...

    @felack,
    Ist nicht Geheim, ich werde mal den Sourcecode zusammenstellen und ein Eagleschaltbild erstellen. Muss es aber noch etwas überarbeiten, damit die 'Profis' nicht unterm Schreibtisch rutschen, wegen Lachkrampf...

    Gruß
    Ralf

  5. #5
    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  

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    22.04.2005
    Beiträge
    178
    Hallo gora,

    Vielen Dank für Schaltplan und Code. Werde ich demnächst mal testen

    felack

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    22.04.2005
    Beiträge
    178
    Hallo gora,
    ich hab mir das Programm mal angesehen, ist recht übersichtlich. Tritt der Fehler nur auf wenn du Chip-Erase zusammen mit Signatur- und Calibrationbyte programmierst, oder auch, wenn du zwischendrin den Chip abschaltest und alle Schritte einzeln ausführst?

    felack

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    22.04.2005
    Beiträge
    178
    Hallo gora,

    ich habe mir das Programm angesehen, ist ziemlich übersichtlich programmiert. Obwohl ich vor ca 20 Jahren zum letzten mal Assembler für 8051 programmiert habe habe ich das meiste aus deinem Programm verstanden. Folgende Sachen sind mir aufgefallen: Die Programmiersequenz des ATtiny13 ist etwas anders als die des ATtiny25.
    Datasheet S.112: Set Reset Pin to "0" and toggle SCl for at least six times.
    Datasheet S.115: Power-off Sequence: Set SCI to "0" and RESET to "1". Turn Vcc Power off.
    Den RESET kann man bei deiner Hardware garnicht auf 1 setzen.

    Seite 166: Errata : Bei RevisionB kann die Programmierung fehlschlagen, wenn man nicht mit dem Befehl "Poll RDY/BSY" den Erfolg der Programmierung abfragt. Das ist bei deinem Programm nicht vorgesehen.

    Zur Revisionsnummer: Wie im Bild unten zu sehen, steht bei den Chips von 0514 ein D hinter dem Produktiondatum (14.Woche 2005), bei den neueren Chips steht keine. Es gibt aber laut Datenblatt keine neue Revision. Ist das bei deinen ATtiny13 auch so?

    felack
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken tiny13s.jpg  

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    10.05.2005
    Beiträge
    5
    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

  10. #10
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    22.04.2005
    Beiträge
    178
    Reagieren die erlegten ATtinys denn noch auf de HV-Programmer? Dann könntest du sie doch auch so programmieren.

    felack

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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

12V Akku bauen