PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ATTiny13 HV-Programming: Löscht Chiperase auch die Signatur?



gora
22.11.2006, 15:32
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

SprinterSB
22.11.2006, 15:54
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...

felack
22.11.2006, 17:29
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

gora
22.11.2006, 19:57
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

gora
22.11.2006, 21:53
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

felack
23.11.2006, 16:51
Hallo gora,

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

felack

felack
24.11.2006, 10:22
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

felack
24.11.2006, 11:52
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

gora
24.11.2006, 21:00
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

felack
25.11.2006, 11:17
Reagieren die erlegten ATtinys denn noch auf de HV-Programmer? Dann könntest du sie doch auch so programmieren.

felack

gora
27.11.2006, 21:42
Programmieren kann ich sie noch. Auch die Fuses mit dem HV-Modul setzen. Aber ich muss mir noch etwas Software zusammenstellen, damit ich den Oszillator trimmen kann, weil auch das Calibrationbyte gelöscht wurde...

Gruß
Ralf

felack
28.11.2006, 15:53
Kannst du doch gleich in Adresse 31 (OSCCAL) schreiben.

In BASCOM kann man sogar einfach schreiben:

OSCCAL= xx

und dann zwei Tasten dran um die Frequenz zu ändern. Frequenzmesser dran und fertig.

felack