; Orange programmer module v3.9 beta ; (c) 2001-2007 CnCLab ; Atmel AVR ; CHIP=ATTINY12,2K ; FLASH+EEPROM ; Primary tested SOCKET=1 ; I2C (Orange3,4,SE) PINO=SCK, 2 PINO=MOSI, 1 PINO=MISO, 0 PINO=RESET,3 PINO=XTAL1,4 PINO=XTAL2,5 PINI=MISO, 0 R8=Fuses,B8 R9=Lock,L,All,Prog,Off R10=CKSEL,L,"Ext Clk,Ext Clk 4ms,Int.RC 60ms,Int.RC 4ms,Int.RC,Ext.RC 60ms,Ext.RC 4ms,Ext.RC,LowCrystal+32K,LowCrystal+1K,Ext.Crystal 60ms+16K,Ext.Crystal 3.6ms+16K,Ext.Crystal,Ext.Crystal,Ext.Crystal,Ext.Crystal" R11=RSTDISBL,L,"On (Int.Reset),Off (Ext.Reset)" R12=SPIEN,L,On,Off R13=BODEN,L,On,Off R14=BODLEVEL,L,High,Low CDELAY=1 ; minimum periods for the serial clock (SCK) > 4 XTAL1 clock cycle! [_XTALO] XTAL1=1,XTAL1=0,XTAL1=1,XTAL1=0 [_SCKP] SCK=1,_XTALO,SCK=0,_XTALO [_DOUT] R1=0; LOOP=(7,0){MOSI=R0[I],SCK=1,_XTALO,R1[I]=MISO,SCK=0,_XTALO} [_DIN] R0=0 LOOP=(7,0){SCK=1,_XTALO,R0[I]=MISO,SCK=0,_XTALO} [INIT] ;EO=0,P=10 ;BB on XTAL2=1 SCK=0 MISO=Z,_XTALO RESET=1,P=20,_XTALO,_XTALO RESET=0,P=20000,_XTALO,_XTALO,_XTALO LOOP=(0,31){ ; 32 attempts R0=0xAC,_DOUT ;Programming Enable R0=0x53,_DOUT R0=0x00,_DOUT R3=R1 R0=0x00,_DOUT R3?0x53{BREAK} SCK=1,_XTALO,SCK=0,_XTALO } R3?!0x53{PRINT=("ANSWER ERROR: %02lX",R1),EXIT} P=10 [READ] $AREA?0{ R0=0x20 ;program memory area R1=ADR,R0[3]=R1[0] ;Hi/Lo _DOUT LOOP=(16,9){MOSI=ADR[I],_SCKP} LOOP=(8,1){MOSI=ADR[I],_SCKP} } $AREA?1{ R0=0xA0 ;eeprom area _DOUT LOOP=(15,8){MOSI=ADR[I],_SCKP} LOOP=(7,0){MOSI=ADR[I],_SCKP} } _DIN ;common DATA=R0 [WRITE] $AREA?0{ R0=0x40 ;program memory R1=ADR,R0[3]=R1[0] ;Hi/Lo _DOUT LOOP=(16,9){MOSI=ADR[I],_SCKP} LOOP=(8,1){MOSI=ADR[I],_SCKP} R0=DATA,_DOUT P=4000 ; 4ms } $AREA?1{ R0=0xC0 ;eeprom memory area _DOUT LOOP=(15,8){MOSI=ADR[I],_SCKP} LOOP=(7,0){MOSI=ADR[I],_SCKP} R0=DATA,_DOUT P=4000 ; 4ms } [WRITEEND] P=10000 RESET=1,P=20, RESET=0,P=20000 [ReadID] R0=0x30,_DOUT R0=0x00,_DOUT R0=0x00,_DOUT _DIN R2=R0,R2=<<8 R0=0x30,_DOUT R0=0x00,_DOUT R0=0x01,_DOUT _DIN R2=|R0,R2=<<8 R0=0x30,_DOUT R0=0x00,_DOUT R0=0x02,_DOUT _DIN R2=|R0 R2?0x1E9004{PRINT=("ID: %06lX - ATTiny11",R2),EXIT} R2?0x1E9005{PRINT=("ID: %06lX - ATTiny12",R2),EXIT} R2?0x1E9006{PRINT=("ID: %06lX - ATTiny15",R2),EXIT} R2?0x1E9007{PRINT=("ID: %06lX - ATTiny13",R2),EXIT} PRINT=("ID: %06lX",R2) ["Read OSCCAL"] R0=0x38,_DOUT R0=0x00,_DOUT R0=0x00,_DOUT _DIN R2=R0 PRINT=A("Cal.Byte = %02lXH.\nSet to location 0x3FF?",R2) RA?0{EXIT} $AREA=0 ADR=0x3FF DATA=R2 MARK=1 ["Read Fuses"] R0=0x50,_DOUT R0=0x00,_DOUT R0=0x00,_DOUT _DIN R8=R0 R10=0,R11=0,R12=0,R13=0,R14=0 R10=R8,R10=&0xF ;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 PRINT=S("Fuses = %02lXH",R8) GET=("Read Fuses",R10,R11,R12,R13,R14) ;GET=("Read Fuses",R10,R11,R12,R13,R14) ["Write Fuses"] GET=("Write Fuses",R10,R11,R12,R13,R14) R8=0 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} } _DOUT(0xAC) _DOUT(0xA0) _DOUT(0x00) R0=R8,_DOUT P=10000 RESET=1,P=20,_XTALO RESET=0,P=20000,_XTALO ["Read Lock"] _DOUT(0x58) _DOUT(0x00) _DOUT(0x00) _DIN R0=/2 R0=&3 R9=R0 PRINT=S("Lock Bits %02lXH",R9) R9?1{PRINT=("Undefined lock value 1"),EXIT} R9?2{R9=1} R9?3{R9=2} GET=("Lock Bits",R9) ["Write Lock"] R9=0 GET=("Write Lock Bits",R9) RA?0{EXIT} R0=0xAC,_DOUT ;Write lock bits R0=0xE0 R9?0{R0=0xE0} ;All,Prog,Off R9?1{R0=0xE4} R9?2{R0=0xE6} _DOUT R0=0x00,_DOUT R0=0x00,_DOUT P=10000 RESET=1,P=20,_XTALO RESET=0,P=20000,_XTALO [Erase] R0=0xAC,_DOUT ;Chip Erase R0=0x80,_DOUT R0=0x00,_DOUT R0=0x00,_DOUT P=20000,_SCKP RESET=1,P=20,_SCKP,_SCKP RESET=0,P=20000,_SCKP,_SCKP,_SCKP [END] XTAL1=0,RESET=1