; Orange programmer module v4.0 beta ; (c) 2002-2012 CnCLab ; Atmel AVR Tiny ;CHIP=ATtiny13 HV,1K,ATTIN13h.hpl ;AREA=FLASH,1K(32),0 ;AREA=EEPROM,64 ; High-voltage (12V) Serial programming mode ; primary tested ; auto-erase of EEPROM is not available in High-voltage Serial Programming, ; only in SPI Programming. SOCKET=0 ; OPTIONS=mf, ;FLASH: no modify, skip blank INFO="PIC-AVR Adapter" PINO=SDIN, 2,5 ;PB0 PINO=SIIN, 1,6 ;PB1 PING=SDOUT,0,7 ;PB2 PINO=SCK, 12,2 ;PB3 ! PINO=PB5VPP,5,1 ;RESET PINO=GND,255,4 PINO=VCC,254,8 R8=Fuses,B8 R9=Lock,L,All,Prog,Off R10=CKSEL,L,"00: Ext Clk,01: IntRC 4.8MHz,10: IntRC 9.6MHz,11: IntRC 128k" ;R11=SUT,L,00,01,10,11 R11=SUT,C2 R12=CKDIV,L,"0 - On,1 - Off" R13=WDTON,L,"0 - On,1 - Off" R14=EESAVE,L,"0 - Save,1 - Clear" R15=SPIEN,L,"0 - On,1 - Off" R16=RSTDISBL,L,"0 - PB5:IO,1 - PB5:RST" R17=BODLEVEL,L,"00,01,10,11" R18=DWEN,L,"0 - On,1 - Off" R19=SELFPRG,L,"0 - On,1 - Off" R1A=Calibration,H2 CDELAY=1 ; [_SCKP] SCK=1,P=1,SCK=0,P=1 [_DOUT] R1=0; LOOP=(7,0){SDIN=R0[I],SCK=1,R1[I]=SDOUT,SCK=0} [_DIN] R0=0 LOOP=(7,0){SCK=1,R0[I]=SDOUT,SCK=0,P=1} [_INSTR] R2=0 SDIN=0,SIIN=0 _SCKP LOOP=(7,0){ R2[I]=SDOUT SDIN=R0[I] SIIN=R1[I] _SCKP } SDIN=0,SIIN=0 _SCKP _SCKP [_RdID] R0=00001000B ;1 R1=01001100B _INSTR R8=0 R3=0 ;adr LOOP=(0,2){ R0=R3 ;2 R1=00001100B _INSTR R0=0 ;3 R1=01101000B _INSTR R0=0 ;4 R1=01101100B _INSTR R8=*256 R8=|R2 R3=+1 } [INIT] SDOUT=Z PB5VPP=0,SDIN=0,P=1000 SDOUT=0 SDIN=0 SIIN=0 LOOP=(6){SCK=P} SCK=0 P=100 PB5VPP=1 VPP=12000 P=100000 SDOUT=1 P=50 _RdID R8?0xFFFFFF{ PRINT=A("Wring Chip ID detected!\nContinue?") RA?0{EXIT} ; If RST pin disabled try unlock: ;PRINT=S("Unlock mode 1") PB5VPP=0 VPP=0 P=200 VCC=0 P=100000 VCC=1 PB5VPP=1 VPP=12000 P=100000 SDOUT=1 P=50 _RdID R8=&0xFFFF00 R8?!0x1E9000{ PRINT=S("Unlock failed!") LOOP(10){ _RdID R8=&0xFFFF00 R8?0x1E9000{BREAK} R0=00000000B ;Load "No Operation" Command R1=01001100B _INSTR } PRINT=S("") } } [READ] $AREA?0{ ;R9=0x20 ;program memory area ;Read Flash High and Low Address R0=00000010B ;1 R1=01001100B _INSTR R0=ADR,R0=/512 ;2 adr l R1=00011100B _INSTR R0=ADR,R0=/2,R0=&0xFF ;3 adr h R1=00001100B _INSTR ;Read Flash R0=00000000B ;1 R1=ADR,R1=&1,R1=<<4,R1=|01101000B ;Low or High _INSTR R0=00000000B ;2 R1=01101100B _INSTR } $AREA?1{ ;Enter EEPROM Read mode. R0=00000011B ;1 R1=01001100B _INSTR ;Read EEPROM address lo R0=ADR ;2 adr l R1=00001100B _INSTR ;Read R0=ADR,R0=/256 ;3 R1=01101000B _INSTR R0=00000000B ;4 R1=01101100B _INSTR } DATA=R2 [WRITE] $AREA?0{ ;R0=0x40 ;program memory PRINT=("Only Page Write Supported!") EXIT } $AREA?1{ ;Write EEPROM ; Enter EEPROM Programming mode. R0=00010001B ;1 R1=01001100B _INSTR ;Write EEPROM R0=ADR ;1 adr l R1=00001100B _INSTR R0=DATA ;2 R1=00101100B _INSTR R0=00000000B ;3 R1=01101101B ;R1=01100100B _INSTR R0=00000000B ;4 R1=01100100B _INSTR R0=00000000B ;5 R1=01101100B _INSTR P=20000 ; 4ms } [WRITEBLOCK] $AREA?1{EXIT} ; For Flash ;Enter Flash Programming code. R0=00010000B ;1 R1=01001100B _INSTR R6=ADR R7=$BLOCKSIZE,R7=/2 LOOP=(R7){ R0=ADR ;1 adr lo R0=/2 R1=00001100B _INSTR R0=DATA ;2 R1=00101100B _INSTR ADR=+1 R0=DATA ;3 R1=00111100B _INSTR ADR=+1 R0=00000000B ;4 R1=01111101B _INSTR R0=00000000B ;5 R1=01111100B _INSTR } ;Wait after Instr 3 until SDO goes high. Repeat Instr. 2 - 3 for each ;loaded Flash Page until the entire Flash or all data is programmed. ;Repeat Instr. 1 for a new R6=/512 R0=R6 ; 1 Load Flash High Address and Program Page R1=00011100B _INSTR R0=00000000B ;2 R1=01100100B _INSTR R0=00000000B ;3 R1=01101100B _INSTR ;P=5000 ; min 4ms LOOP(200){ P=100 SDOUT?1{BREAK} } [WRITEEND] P=20000 ["Read Fuses"] _INSTR(00000100B,01001100B) ;1 _INSTR(0,01101000B) ;2 _INSTR(0,01101100B); ;3 R8=R2 R10=0,R11=0,R12=0,R13=0,R14=0,R15=0 R10[0]=R8[0] ;R10=CKSEL,L R10[1]=R8[1] ;R10=CKSEL,L R11[0]=R8[2] ;R11=SUT R11[1]=R8[3] R12[0]=R8[4] ;CKDIV R13[0]=R8[5] ;WDTON R14[0]=R8[6] ;EESAVE R15[0]=R8[7] ;SPIEN SPIEN Fuse is not accessible in SPI Programming mode. ;Read Fuse High Bits.... _INSTR(00000100B,01001100B) ;1 _INSTR(0,01111010B) ;2 _INSTR(0,01111110B); ;3 R8=R2 R16=0,R17=0,R18=0,R19=0 R16[0]=R8[0] ;RSTDISBL,L,"0 - PB5:IO,1 - PB5:RST" R17[0]=R8[1] ;BODLEVEL,L,"00,01,10,11" R17[1]=R8[2] ; R18[0]=R8[3] ;DWEN,L,"0 - On,1 - Off" R19[0]=R8[4] ;SELFPRG,L,"0 - On,1 - Off" SCK=0, PB5VPP=0 GET=("Read Fuses",R10,R11,R12,R13,R14,R15,R16,R17,R18,R19) ["Write Fuses"] GET=("Write Fuses",R10,R11,R12,R13,R14,R15,R16,R17,R18,R19) RA?0{EXIT} R5=0 R18?0{R5=1} ;DWEN ;R16?0{R5=1} R5?1{ PRINT=A("This fuses value disable HV Programming, continue?") RA?0{EXIT} } R8=0xFF R8[0]=R10[0] ;R10=CKSEL,L R8[1]=R10[1] ;R10=CKSEL,L R8[2]=R11[0] ;R11=SUT R8[3]=R11[1] R8[4]=R12[0] ;CKDIV R8[5]=R13[0] ;WDTON R8[6]=R14[0] ;EESAVE R8[7]=R15[0] ;SPIEN _INSTR(01000000B,01001100B) ;1 R0=R8 ;2 fuses R1=00101100B _INSTR R0=0 ;3 R1=01100100B _INSTR R0=0 ;4 R1=01101100B _INSTR P=30000 R8=0xFF R8[0]=R16[0] ;RSTDISBL,L,"0 - PB5:IO,1 - PB5:RST" R8[1]=R17[0] ;BODLEVEL,L,"00,01,10,11" R8[2]=R17[1] ; R8[3]=R18[0] ;DWEN,L,"0 - On,1 - Off" R8[4]=R19[0] ;SELFPRG,L,"0 - On,1 - Off" ;Write Fuse High Bits.... _INSTR(01000000B,01001100B) ;1 R0=R8 ;2 fuses R1=00101100B _INSTR _INSTR(0,01110100B) ;3 _INSTR(0,01111100B) ;4 P=30000 ["Read Lock"] R0=00000100B ;1 R1=01001100B _INSTR R0=0 ;2 R1=01111000B _INSTR R0=0 ;3 R1=01111100B _INSTR SCK=0, PB5VPP=0 ;PRINT=("LOCK %02X",R2) R2=&3 R9=R2 R9?1{PRINT=("Undefined lock value 1"),EXIT} R2?2{R9=1} R2?3{R9=2} GET=("Lock Bits",R9) ["Write Lock"] R9=0 GET=("Lock Bits",R9) RA?0{EXIT} R9?2{R9=3} R9?1{R9=2} R0=00100000B ;1 R1=01001100B _INSTR R0=R9 ;,R0=*2 ;2 R1=00101100B _INSTR R0=0 ;3 R1=01100100B _INSTR R0=0 ;4 R1=01101100B _INSTR P=20000 ["Read Calibration"] R0=00001000B ;1 R1=01001100B _INSTR R0=0 ;2 R1=00001100B _INSTR R0=0 ;3 R1=01111000B _INSTR R0=0 ;3 R1=01111100B _INSTR SCK=0, PB5VPP=0 R1A=R2 GET=("Read Calibration",R1A) [ReadID] R0=00001000B ;1 R1=01001100B _INSTR R8=0 R7=0 ;adr LOOP=(0,2){ R0=R7 ;2 R1=00001100B _INSTR R0=0 ;3 R1=01101000B _INSTR R0=0 ;4 R1=01101100B _INSTR R8=*256 R8=|R2 R7=+1 } SCK=0, PB5VPP=0 R8?0x1E9004{PRINT=("ID: %06lX - ATTiny11",R8),EXIT} R8?0x1E9005{PRINT=("ID: %06lX - ATTiny12",R8),EXIT} R8?0x1E9006{PRINT=("ID: %06lX - ATTiny15",R8),EXIT} R8?0x1E9007{PRINT=("ID: %06lX - ATTiny13",R8),EXIT} PRINT=("ID: %06lX",R8) [Erase] R0=10000000B ;1 R1=01001100B _INSTR R0=0 ;2 R1=01100100B _INSTR R0=0 ;3 R1=01101100B _INSTR P=20000 R0=0 ;4 R1=01001100B _INSTR P=50000 [END] SCK=0, PB5VPP=0 VPP=0 P=1000