; Orange programmer module v4.0 beta ; (c) 2002-2012 CnCLab ; Atmel AVR Tiny ;CHIP=ATtiny12 HV,1K,ATTIN12h.hpl ;AREA=FLASH,1K,0 ;AREA=EEPROM,64 ; High-voltage (12V) Serial programming mode ; primary tested SOCKET=0 ; OPTIONS=f, ;FLASH: 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+3.6ms","0001:Ext.Clk","0010:Int.RC+57ms","0011:Int.RC+6ms","0100:Int.RC","0101:Ext.RC+57ms","0110:Ext.RC+6ms","0111:Ext.RC","1000:Ext.LF.Crystal+32K CK","1001:Ext.LF.Crystal+1K CK","1010:Ext.Resonator+57ms+16K CK","1011:Ext.Resonator+3.6ms+16K CK","1100:Ext.Resonator+16K CK","1101:Ext.Resonator+57ms 1K CK","1110:Ext.Resonator+3.6ms+1K CK","1111:Ext.Resonator+1K CK", R11=RSTDISBL,L,"On (Int.Reset),Off (Ext.Reset)" R12=SPIEN,L,On,Off R13=BODEN,L,On,Off R14=BODLEVEL,L,High,Low R15=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 [INIT] SDOUT=1 PB5VPP=0,SDIN=0,P=1000 LOOP=(5){SCK=P} SCK=0 P=100 PB5VPP=1 VPP=12000 P=100000 [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{ ;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 [WRITE] $AREA?0{ ;R0=0x40 ;program memory ;Write Flash High and Low Address R0=00010000B ;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 ;Write Flash R0=DATA ;1 R1=ADR,R1=&1,R1=<<4,R1=|00101100B ;Low or High _INSTR R0=00000000B ;2 R1=ADR,R1=&1,R1=<<4,R1=|01100100B ;Low or High _INSTR R0=00000000B ;3 R1=ADR,R1=&1,R1=<<4,R1=|01101100B ;Low or High _INSTR P=5000 ; min 4ms } $AREA?1{ ;Write EEPROM address low (only Tiny12!) R0=00010001B ;1 R1=01001100B _INSTR R0=ADR ;2 adr l R1=00001100B _INSTR ;Write EEPROM R0=DATA ;1 R1=00101100B _INSTR R0=00000000B ;2 R1=01100100B _INSTR R0=00000000B ;3 R1=01101100B _INSTR P=10000 ; 4ms } [WRITEEND] P=20000 ["Read Fuses"] R0=00000100B ;1 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,R14=0 R10=R8,R10=&0x3 ;R10=CKSEL,L,Ext,Int R11[0]=R8[4] ;R11=RSTDISBL,L,On,Off R12[0]=R8[5] ;R12=SPIEN,L,On,Off R13[0]=R8[6] ;R13=BODEN,L,On,Off R14[0]=R8[7] ;R14=BODLEVEL,L,High,Low SCK=0, PB5VPP=0 GET=("Read Fuses",R8,R10,R11,R12,R13,R14) ;GET=("Read Fuses",R10,R11,R12,R13,R14) ["Write Fuses"] GET=("Write Fuses",R10,R11,R12,R13,R14) RA?0{EXIT} R8=0xFF ; unused bits to 1 R8=R10,R8=&0xF ;R10=CKSEL,L,Ext,Int R8[4]=R11[0] ;R11=RSTDISBL,L,On,Off R8[5]=R12[0] ;R12=SPIEN,L,On,Off R8[6]=R13[0] ;R13=BODEN,L,On,Off R8[7]=R14[0] ;R14=BODLEVEL,L,High,Low R5=0 R12?1{R5=1} R11?0{R5=1} R5?1{ PRINT=A("This fuses value disable Low-Voltage Programming, continue?") RA?0{EXIT} } 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=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 R2=/2, R2=&3 ; Error in Datasheet??? R9=R2 R9?1{PRINT=("Undefined 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 R15=R2 GET=("Read Calibration",R15) [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} 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