; Orange programmer module v4.2 beta ; (c) 2001-2005 CnCLab ; Atmel AVR ; ATTINY24: ; FLASH 2K(32), EEPROM 128 ; ATTINY44: ; FLASH 4K(64), EEPROM 256 ; ATTINY84: ; FLASH 8K(64), EEPROM 512 ; Primary tested! ; XTAL generation SOCKET=0 ALLPINS=14 OPTIONS=fm, INFO="Special AVR Adapter" PINO=SCK, 0,9 PING=MISO, 1,8 PINO=MOSI, 2,7 PINO=RESET,3,4 ; special pins: PINO=GND,255,14 PINO=VCC,254,1 PINO=XTAL1,12,2 PINO=XTAL2,12,3 BUSO=CFREQ,128 R8=Fuses,B8 R9=Lock,L,All,Prog,Off R10=CKSEL,L,"0000: Ext Clk,0001: PLL,0010: IntRC 8M,0011: Reserved,0100: Watchdog 128kHz,0101: Reserved,0110: Ext lo OSC,0111: reserved,1000: Crystal 0.4-0.9M,1001: Crystal 0.4-0.9M,1010: Crystal 0.9-3.0M,1011: Crystal 0.9-3.0M,1100: Crystal 3.0-8.0M,1101: Crystal 3.0-8.0M,1110: Crystal >8.0M,1111: Crystal >8.0M"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 - PB3:IO,1 - PB3:RST" R1A=SELPROGEN,L,"0 - On","1 - Off" R1B=Calibraton,H2 CDELAY=20 ; minimum periods for the serial clock (SCK) > 4 XTAL1 clock cycle! [_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} [INIT] SCK=0 MISO=Z CFREQ=2000000 RESET=1,P=20 RESET=0,P=20000 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=P } R3?!0x53{PRINT=("ANSWER ERROR: %02lX",R1),EXIT} P=10 RE?<3{ ;READ or VERIFY _DOUT(0x58) _DOUT(0x00) _DOUT(0x00) _DIN R0=&2 R0?0{PRINT=A("Lock bit programmed\nContinue?"),RA?0{EXIT}} } [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],_SCKP} LOOP=(7,0){MOSI=ADR[I],_SCKP} R0=DATA,_DOUT P=4000 ; 4ms } ; FLASH [WRITEBLOCK] R7=ADR ; check empty block R0=0xFF LOOP=($BLOCKSIZE){ R0=DATA R0?!0xFF{BREAK} ADR=+1 } R0?0xFF{RETURN} ADR=R7 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=R7 _DOUT(0x4C) LOOP=(16,9){MOSI=ADR[I],SCK=P} LOOP=(8,5){MOSI=ADR[I],SCK=P} LOOP=(3,0){MOSI=0,SCK=P} _DOUT(0) ;dummy data P=5000 [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?0x1E9108{PRINT=("ID: %06lX - ATTiny25",R2),EXIT} R2?0x1E910B{PRINT=("ID: %06lX - ATTiny24",R2),EXIT} R2?0x1E9206{PRINT=("ID: %06lX - ATTiny45",R2),EXIT} R2?0x1E9207{PRINT=("ID: %06lX - ATTiny44",R2),EXIT} R2?0x1E930B{PRINT=("ID: %06lX - ATTiny85",R2),EXIT} R2?0x1E930C{PRINT=("ID: %06lX - ATTiny84",R2),EXIT} PRINT=("ID: %06lX",R2) ["Read Fuses"] _DOUT(0x50) ;Read Fuse bits _DOUT(0x00) _DOUT(0x00) _DIN R8=R0 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 _DOUT(0x58) ;Read Fuse High Bits _DOUT(0x08) _DOUT(0x00) _DIN R8=R0 ;GET=("Read Fuses",R8) 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 _DOUT(0x50) ;Read ext Fuse bits _DOUT(0x08) _DOUT(0x00) _DIN R1A=R0,R1A=&1 RESET=1,P=10 VCC=0 GET=("Read Fuses",R10,R11,R12,R13,R14,R15,R16,R17,R18,R19,R1A) ;GET=("Read Fuses",R10,R11,R12,R13,R14) ["Write Fuses"] GET=("Write Fuses",R10,R11,R12,R13,R14,R15,R16,R17,R18,R19,R1A) RA?0{EXIT} ;PRINT=("%lX",R11) R10?0{ PRINT=A("This fuse value require Ext. Clock, continue?") RA?0{EXIT} } R0=R17,R0=|R19 R0?0{ PRINT=A("This fuse value deactivate SPI programming, continue?") RA?0{EXIT} } R18?0{ PRINT=A("This fuse value activate DebugWire, continue?") RA?0{EXIT} } R8=0 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 _DOUT(0xAC) _DOUT(0xA0) _DOUT(0x00) _DOUT(R8) P=20000 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 _DOUT(0xAC) ;Write High Fuse _DOUT(0xA8) _DOUT(0x00) _DOUT(R8) P=20000 _DOUT(0xAC) ;Write ext Fuse _DOUT(0xA4) _DOUT(0x00) _DOUT(R1A) P=20000 RESET=1,P=20 RESET=0,P=20000 ["Read Lock"] _DOUT(0x58) _DOUT(0x00) _DOUT(0x00) _DIN ;PRINT=("Lock Bits %02lX",R0) R0=&3 R9=R0 R9?1{PRINT=("Undefined value - 1"),EXIT} R0?2{R9=1} R0?3{R9=2} GET=("Lock Bits",R9) ["Write Lock"] R9=0 GET=("Lock Bits",R9) _DOUT(0xAC) ;Write lock bits _DOUT(0xE0); _DOUT(0) R0=R9 R9?1{R0=2} R9?2{R0=3} _DOUT P=20000 RESET=1,P=20 RESET=0,P=20000 ["Read Calibration"] R0=0x38,_DOUT R0=0x00,_DOUT R0=0x00,_DOUT _DIN R1B=R0 GET=("Read Calibration",R1B) [Erase] R0=0xAC,_DOUT ;Chip Erase R0=0x80,_DOUT R0=0x00,_DOUT R0=0x00,_DOUT P=10000,_SCKP RESET=1,P=20,_SCKP,_SCKP RESET=0,P=20000,_SCKP,_SCKP,_SCKP [END] RESET=1