; Orange programmer module v4.0 beta ; (c) 2001-2005 CnCLab ; Atmel AVR ; CHIP=ATtiny13,1K(32),ATTINY13.hpl ; AREA=FLASH,1K(32),0,0 ; AREA=EEPROM,64,0,0 ; primary tested SOCKET=1 ;use I2C (Orange-3) INFO="ATTiny for I2C Socket" PINO=SCK, 2 PINO=MOSI, 1 PINO=MISO, 0 PINO=RESET,3 PINO=XTAL1,4 ;PINO=XTAL2,5 PINI=MISO, 0 BUSO=CFREQ,128 R8=Fuses,B8 R9=Lock,C2,LB2,LB1 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" CDELAY=5 ; 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] SCK=0 MISO=Z,_XTALO CFREQ=2000000 RESET=1,P=20,_XTALO,_XTALO RESET=0,P=20000,_XTALO,_XTALO,_XTALO LOOP=(0,31){ ; 32 attempts RESET=1,P=150 RESET=0,P=20000 R0=0xAC,_DOUT ;Programming Enable R0=0x53,_DOUT R0=0x00,_DOUT R3=R1 R0=0x00,_DOUT R3?0x53{BREAK} ;PRINT=("ANSWER: %02lX",R1) _XTALO,_XTALO } R3?!0x53{PRINT=("ANSWER ERROR: %02lX",R3),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{ PRINT=("Only Page Write Supported!") EXIT } $AREA?1{ R0=0xC0 ;eeprom memory area _DOUT LOOP=(15,8){MOSI=ADR[I],SCK=P} LOOP=(7,0){MOSI=ADR[I],SCK=P} R0=DATA,_DOUT P=9000 ; 4ms } [WRITEBLOCK] R6=ADR LOOP=($BLOCKSIZE){ R0=0x40 ;program memory R1=ADR,R0[3]=R1[0],_DOUT ;Hi/Lo _DOUT(0) LOOP=(8,1){MOSI=ADR[I],SCK=P} R0=DATA,_DOUT P=10 ADR=+1 } ;Write Program memory Page: ADR=R6 ;restore adr _DOUT(0x4C) ;byte1 LOOP=(16,9){MOSI=ADR[I],SCK=P} ;byte2 LOOP=(8,5){MOSI=ADR[I],SCK=P} ;byte3 LOOP=(4,1){MOSI=0,SCK=P} _DOUT(0) ;byte4 dummy data P=5000 [WRITEEND] P=10000 RESET=1,P=20, RESET=0,P=20000 ["Read Fuses"] R0=0x50,_DOUT ;Read Fuse bits R0=0x00,_DOUT R0=0x00,_DOUT _DIN R8=R0 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. R0=0x58,_DOUT ;Read Fuse High Bits R0=0x08,_DOUT R0=0x00,_DOUT _DIN R8=R0 RESET=1,P=10 VCC=0 ;GET=("Read Fuses",R8) 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" GET=("Read Fuses",R10,R11,R12,R13,R14,R16,R17,R18,R19) ;GET=("Read Fuses",R10,R11,R12,R13,R14) ["Write Fuses"] GET=("Write Fuses",R10,R11,R12,R13,R14,R16,R17,R18,R19) RA?0{EXIT} ;PRINT=("%lX",R11) R16?0{ ;RSTDSBL PRINT=A("This fuses disable Serial programming, continue?") RA?0{EXIT} } R8=0x80 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 SPIEN Fuse is not accessible in SPI Programming mode. R0=0xAC,_DOUT R0=0xA0,_DOUT R0=0x00,_DOUT R0=R8,_DOUT P=20000 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" R0=0xAC,_DOUT ;Write High Fuse R0=0xA8,_DOUT R0=0x00,_DOUT R0=R8,_DOUT P=20000 RESET=1,P=20 RESET=0,P=20000 [ReadLock] R0=0x58,_DOUT ;Write lock bits R0=0x00,_DOUT R0=0x00,_DOUT _DIN R9=R0 GET=("Lock",R9) [WriteLock] GET=("Write Lock",R9) RA?0{EXIT} R0=0xAC,_DOUT ;Write lock bits R0=0xE0,_DOUT R0=0x00,_DOUT R0=R9,R0=|0xC0,_DOUT 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?0x1E9007{PRINT=("ID: %06lX - ATTiny13",R2),EXIT} PRINT=("ID: %06lX",R2) [Erase] R0=0xAC,_DOUT ;Chip Erase R0=0x80,_DOUT R0=0x00,_DOUT R0=0x00,_DOUT P=50000 RESET=1,P=20, RESET=0,P=20000 [END] RESET=1 ;EO=1,P=10 ;BB off