; Orange programmer module v4.0 ; (c) 2002-2012 CnCLab ; Atmel AVR Tiny ; ATTINY25: ; FLASH 2K(32), EEPROM 128 ; ATTINY45: ; FLASH 4K(64), EEPROM 256 ; ATTINY85: ; FLASH 8K(64), EEPROM 512 ;CHIP=ATtiny25 HV,2K,attin85h.hpl ;AREA=FLASH,2K(32),0,0,m ;AREA=EEPROM,128,0,0 ;CHIP=ATtiny45 HV,4K,attin85h.hpl ;AREA=FLASH,4K(64),0,0,m ;AREA=EEPROM,256,0,0 ;CHIP=ATtiny85 HV,8K,attin85h.hpl ;AREA=FLASH,8K(64),0,0,m ;AREA=EEPROM,512,0,0 ; High-voltage (12V) Serial programming mode ; primary tested ATtiny45 ; TODO: extended fuse 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,"0000: Ext Clk,0001: PLL,0010: IntRC 8MHz,0011: IntRC 6.4 MHz,0100: Watchdog 128kHz,0101: reserved,0110: Ext lo OSC,0111: reserved,1000: Crystal,1001: Crystal,1010: Crystal,1011: Crystal,1100: Crystal 0.9-3.0,1101: Crystal 0.9-3.0,1110: Crystal,1111: Crystal" R11=SUT,C2 R12=CKOUT,L,"0 - On,1 - Off" R13=CKDIV8,L,"0 - On,1 - Off" R14=BODLEVEL,d R15=EESAVE,L,"0 - Save,1 - Clear" R16=WDTON,L,"0 - On,1 - Off" R17=SPIEN,L,"0 - On,1 - Off" R18=DWEN,L,"0 - On,1 - Off" R19=RSTDISBL,L,"0 - PA2:IO,1 - PA2:RST" R1B=Calibration,H2 ;R1C=Calibr6.4M,H8 ;R1A=SELPROGEN,L,"0 - On","1 - Off" ;???????? 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 R0=0 ;2 R1=00001100B _INSTR R0=0 ;3 R1=01101000B _INSTR R0=0 ;4 R1=01101100B _INSTR [_RDLOCK] R0=00000100B ;1 R1=01001100B _INSTR R0=0 ;2 R1=01111000B _INSTR R0=0 ;3 R1=01111100B _INSTR [INIT] LOOP(4){ SDOUT=Z ;??? PB5VPP=0 VPP=0 SDIN=0 SCK=0 P=20 PB5VPP=1 VPP=12000 P=60000 SDOUT=Z P=80000 ;VCC=0,P=500000 ;VCC=1,P=500000 _RDID R2?0x1E{BREAK} PB5VPP=0 VPP=0 VCC=0,P=200000 SDIN=0 SCK=0 VCC=1,P=200000 } R2?!0x1E{PRINT=("ID error: %02X",R2),EXIT} RE?1{ ;Read mode? _RDLOCK R2=&3 R2?0{ PRINT=A("MCU Locked.\nContinue?") RA?0{EXIT} } } [READ] $AREA?0{ ;program memory area R0=00000010B ; Flash read code. R1=01001100B _INSTR ;Read Flash High and Low Address R0=ADR ,R0=/2 ;1 adr l R1=00001100B _INSTR R0=ADR,R0=/512 ; R0=/128,R0=&0xFF ;2 adr h R1=00011100B _INSTR R0=00000000B ;3 R1=01101000B _INSTR R0=00000000B ;4 R1=01101100B _INSTR DATA=R2 R0=00000000B ;5 R1=01111000B _INSTR R0=00000000B ;6 R1=01111100B _INSTR R0=ADR,R0=&1,R0?1{DATA=R2} } $AREA?1{ ;Read EEPROM address lo R0=00000011B ;1 R1=01001100B _INSTR R0=ADR ;2 adr l R1=00001100B _INSTR ;Read R0=00000000B ;1 R1=01101000B ;Low or High _INSTR R0=00000000B ;2 R1=01101100B _INSTR DATA=R2 } [READBLOCK] $AREA?!0{EXIT} ;program memory area only R0=00000010B ; Flash read code. R1=01001100B _INSTR LOOP($BLOCKSIZE){ ;Read Flash High and Low Address R0=ADR ,R0=/2 ;1 adr l R1=00001100B _INSTR R0=ADR,R0=/512 ; R0=/128,R0=&0xFF ;2 adr h R1=00011100B _INSTR R0=00000000B ;3 R1=01101000B _INSTR R0=00000000B ;4 R1=01101100B _INSTR DATA=R2 R0=00000000B ;5 R1=01111000B _INSTR R0=00000000B ;6 R1=01111100B _INSTR R0=ADR,R0=&1,R0?1{DATA=R2} ADR=+1 } [WRITE] $AREA?0{ PRINT=E("Only block write supported!") EXIT } $AREA?1{ ;Write EEPROM R0=DATA,R0?0xFF{RETURN} R0=00010001B ;enable Write ee R1=01001100B _INSTR R0=ADR ;1 adr R1=00001100B _INSTR ;Write EEPROM R0=DATA ;2 R1=00101100B _INSTR R0=00000000B ;3 R1=01101011B ;01100100B _INSTR R0=00000000B ;4 R1=01100100B _INSTR R0=00000011B ;5 R1=01101100B _INSTR P=100 LOOP(10000){ SDOUT?1{BREAK} P=1 } ;P=10000 ; 4ms R0=00000011B ;read mode R1=01001100B _INSTR } [WRITEBLOCK] ;for program memory R0=00010000B ;0 Enter Flash Programming code. R1=01001100B _INSTR R6=ADR R7=$BLOCKSIZE,R7=/2 LOOP=(R7){ R0=ADR,R0=/2 ;1 Load Flash Page Buffer R1=00001100B _INSTR R0=DATA ;2 R1=00101100B _INSTR ADR=+1 R0=DATA ;3 R1=00111100B _INSTR ADR=+1 R0=0 ;4 R1=01111101B _INSTR R0=0 ;5 R1=01111100B _INSTR } ADR=R6 R0=ADR,R0=/512 ;Load Flash High Address and Program Page R1=00011100B _INSTR R0=0 R1=01100100B _INSTR R0=0 R1=01101100B _INSTR ;P=5000 ; min 4ms P=100 LOOP(10000){ SDOUT?1{BREAK} P=1 } R0=00000010B ; Flash read code. R1=01001100B _INSTR [WRITEEND] P=20000 ; Read ext fuses - not descripted in datasheet! ["Read Fuses"] R0=00000100B ;1 Lo Fuse R1=01001100B _INSTR R0=0 ;2 R1=01101000B _INSTR R0=0 ;3 R1=01101100B _INSTR R8=R2 R10=0,R11=0,R12=0,R13=0 R10=R8,R10=&0xF ;R10=CKSEL,L R11[0]=R8[4] ;R11=SUT,L,1,2,3,4 R11[1]=R8[5] R12[0]=R8[6] ;R12=CKOUT,L,On,Off R13[0]=R8[7] ;R13=CKDIV8,L,On,Off R0=00000100B ;1 Hi Fuse R1=01001100B _INSTR R0=0 ;2 R1=01111010B _INSTR R0=0 ;3 R1=01111110B _INSTR R8=R2 R14=0,R15=0,R16=0,R17=0,R18=0,R19=0 R14[0]=R8[0] ;R14=BODLEVEL,L7 R14[1]=R8[1] R14[2]=R8[2] R15[0]=R8[3] ;R15=EESAVE R16[0]=R8[4] ;R16=WDTON,C1 R17[0]=R8[5] ;R17=SPIEN R18[0]=R8[6] ;R18=DWEN R19[0]=R8[7] ;R19=Rstdisbl,C1 SCK=0, PB5VPP=0, VPP=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} ;PRINT=("%lX",R11) R10?0{ PRINT=A("This fuse value require Ext. Clock, continue?") RA?0{EXIT} } R18?0{ PRINT=A("This fuse value activate DebugWire, continue?") RA?0{EXIT} } R8=R10,R8=&0xF ;R10=CKSEL,L R8[4]=R11[0] ;R11=SUT,L,1,2,3,4 R8[5]=R11[1] R8[6]=R12[0] ;R12=CKOUT,L,On,Off R8[7]=R13[0] ;R13=CKDIV8,L,On,Off PRINT=S("Write fuse Low %02XH",R8) R0=01000000B ;1 R1=01001100B _INSTR R0=R8 ;2 fuses R1=00101100B _INSTR R0=0 ;3 R1=01100100B _INSTR R0=0 ;4 R1=01101100B _INSTR P=50000 R8=0xFF R8[0]=R14[0] ;R14=BODLEVEL,L7 R8[1]=R14[1] R8[2]=R14[2] R8[3]=R15[0] ;R15=EESAVE R8[4]=R16[0] ;R16=WDTON,C1 R8[5]=R17[0] ;R17=SPIEN R8[6]=R18[0] ;R18=DWEN R8[7]=R19[0] ;R19=Rstdisbl,C1 PRINT=S("Write Fuse High %02XH",R8) R0=01000000B ;1 R1=01001100B _INSTR R0=R8 ;2 fuses R1=00101100B _INSTR R0=0 ;3 R1=01110100B _INSTR R0=0 ;4 R1=01111100B _INSTR P=50000 ;RESET=1,P=20 ;RESET=0,P=20000 ["Read Lock"] R0=00000100B ;1 R1=01001100B _INSTR R0=0 ;2 R1=01111000B _INSTR R0=0 ;3 R1=01111100B _INSTR SCK=0, PB5VPP=0, VPP=0 PRINT=S("Lock Bits=%02XH",R2) R2=&3 ;Error in Datasheet R9=R2 R9?1{PRINT=("Undefined value - 1"),R9=9,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 Error in Datasheet R1=00101100B _INSTR R0=0 ;3 R1=01100100B _INSTR R0=0 ;4 R1=01101100B _INSTR P=20000 _RDLOCK R2=&3 R2?!R9{PRINT=E("Write lock error!")} ["Read Calibration"] ;calibration standard 8.0M R0=00001000B ;1 R1=01001100B _INSTR R0=0 ;2 R1=00001100B _INSTR R0=0 ;3 R1=01111000B _INSTR R0=0 ;3 R1=01111100B _INSTR R1B=R2 ;calibration 6.4 not work? SCK=0, PB5VPP=0, VPP=0 GET=("Read Calibration",R1B) [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, VPP=0 R8?0x1E9108{PRINT=("ID: %06lX - ATTiny25",R8),EXIT} R8?0x1E9206{PRINT=("ID: %06lX - ATTiny45",R8),EXIT} R8?0x1E930B{PRINT=("ID: %06lX - ATTiny85",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