; Orange programmer module v3.9 ; (c) 2001-2015 CnCLab ; Atmel AVR ATTINY15 ;CHIP=ATtiny15,1K,ATTINY15.hpl ;AREA=FLASH,1K,0 ;AREA=EEPROM,64 ;AREA=FUSES,1 ;AREA=LOCK,1 ; tested ; no need XTAL generation! SOCKET=1 ;use I2C (Orange-3,4,5) OPTIONS=f, 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,"00: 64ms+18CK","01: 64ms+18CK","10: 4ms+18CK","11: 18CK+(BODEN)" 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=10 ; minimum periods for the serial clock (SCK) > 4 XTAL1 clock cycle (int 1.6MHz) [_SCKP] SCK=P [_DOUT] R1=0; LOOP=(7,0){MOSI=R0[I],SCK=1,R1[I]=MISO,SCK=0} [_DIN] R0=0 LOOP=(7,0){SCK=1,R0[I]=MISO,SCK=0} ;Return R0) [_RDLOCK] _DOUT(0x58) _DOUT(0x00) _DOUT(0x00) _DIN R0=&0110B [INIT] SCK=0 MISO=Z RESET=1,P=50 RESET=0,P=20000 LOOP=(32){ ; 32 attempts R0=0xAC,_DOUT ;Programming Enable R0=0x53,_DOUT R0=0x00,_DOUT R3=R1 R0=0x00,_DOUT R3?0x53{BREAK} SCK=P } R3?!0x53{PRINT=("ANSWER ERROR: %02lX",R1),EXIT} P=10 RE?<4{ $AREA?<2{ _RDLOCK R0?0{PRINT=S("#MCU memory locked!")} } } [READ] $AREA?0{ ;FLASH 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{ ;EEPROM area R0=0xA0 _DOUT LOOP=(15,8){MOSI=ADR[I],_SCKP} LOOP=(7,0){MOSI=ADR[I],_SCKP} } $AREA?2{ ;FUSE _DOUT(0x50) _DOUT(0x00) _DOUT(0x00) } $AREA?3{ ;LOCK _DOUT(0x58) _DOUT(0x00) _DOUT(0x00) } _DIN ;common $AREA?2{R0=|00001100B} ;Fuse unused bits 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 ; min 3ms } $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=6000 ; min 6 ms } $AREA?2{ ;FUSE R0=DATA R5=0 R0[4]?0{R5=1} ;RSTDISBL On? R0[5]?1{R5=1} ;SPIEN Off? R5?1{ PRINT=A("This fuses value disable Low-Voltage Programming, continue?") RA?0{EXIT} } _DOUT(0xAC) _DOUT(0xA0) _DOUT(0x00) R0=DATA,_DOUT P=20000 } $AREA?3{ ;LOCK _DOUT(0xAC) ;Write lock bits R0=DATA _DOUT _DOUT(0) _DOUT(0) P=20000 } [WRITEEND] P=10000 RESET=1,P=20 RESET=0,P=20000 [ReadID] _DOUT(0x30) _DOUT(0x00) _DOUT(0x00) _DIN R2=R0,R2=<<8 _DOUT(0x30) _DOUT(0x00) _DOUT(0x01) _DIN R2=|R0,R2=<<8 _DOUT(0x30) _DOUT(0x00) _DOUT(0x02) _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} PRINT=("ID: %06lX",R2) ["!#~Fuse Editor"] $AREA=2 ;FUSE R8=DATA 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 GET=("Read Fuses",R10,R11,R12,R13,R14) RA?0{EXIT} R8=0xFF ; unused bits to 1 R8[0]=R10[0] ;R10=CKSEL,L,Ext,Int R8[1]=R10[1] ;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 R11?0{R5=1} ;RSTDISBL On? R12?1{R5=1} ;SPIEN Off? R5?1{ PRINT=A("This fuses value disable Low-Voltage Programming, continue?") RA?0{EXIT} } DATA=R8 ["!#~Lock Editor"] $AREA=3 ;Lock R0=DATA R0=/2 R0=&3 R0?1{PRINT=E("Undefined LOCK value - 1"),EXIT} R9=R0 R0?2{R9=1} R0?3{R9=2} GET=("Lock Bits",R9) RA?0{EXIT} ;Mode LB1 LB2 ; 1 1 1 No memory lock features enabled. ; 2 0 1 Further programming of the Flash and EEPROM is disabled. ; 3 0 0 Same as mode 2, but verify is also disabled. ;Word: xxxx x21x R9?0{R0=11111001B} ;All,Prog,Off R9?1{R0=11111101B} R9?2{R0=11111111B} DATA=R0 [Erase] _DOUT(0xAC) ;Chip Erase _DOUT(0x80) _DOUT(0x00) _DOUT(0x00) P=20000 RESET=1,P=20 RESET=0,P=20000 PRINT=S("FLASH erase finished.") P=500000 [END] RESET=1