; Orange programmer module v3.4 beta ; (c) 2001-2014 CnCLab ; Atmel AVR Tiny ; CHIP=ATtiny261,2K,attiny861.hpl ; AREA=FLASH,2K(32) ; AREA=EEPROM,128 ; AREA=FUSES,3 ; AREA=LOCK,1 ; CHIP=ATtiny461,4K,attiny861.hpl ; AREA=FLASH,4K(64) ; AREA=EEPROM,256 ; AREA=FUSES,3 ; AREA=LOCK,1 ; CHIP=ATtiny861,8K,attiny861.hpl ; AREA=FLASH,8K(64) ; AREA=EEPROM,512 ; AREA=FUSES,3 ; AREA=LOCK,1 ; Primary tested ATtiny261 ;Based on ATTiny26.HPL ALLPINS=20 INFO="Socket: Tiny26" OPTIONS=mf, PINO=SCK, 0,3 PINO=MOSI, 2,1 PINO=MISO, 1,2 PINO=RESET,3,10 PINI=MISO, 1,2 PINO=XTAL1,12,7 PINO=GND,255,6 PINO=GND2,255,16 PINO=VCC,254,5 PINO=AVCC,254,15 BUSO=CFREQ,128 R8=Fuses,B8 R9=Lock,C2,LB2,LB1 ;Lo R10=CKSEL,L,"0000: Ext Clk,0001: IntRC 1MHz,0010: IntRC 2MHz,0011: IntRC 4MHz,0100: IntRC 8MHz,0101: ExtRC 0.9MHz,0110: ExtRC 0.9-3.0M,0111: ExtRC 3.0-8.0M,1000: ExtRC 8.0-12.0M,1001: LowFreq Crystal,1010: Crystal/Ceramic,1011: Crystal/Ceramic,1100: Crystal 0.9-3.0,1101: Crystal 0.9-3.0,1110: Crystal 3.0-8.0,1111: Crystal 3.0-8.0" R11=SUT,L,"00: 0 (BOD rec.),01: 4.1ms,10: 65ms,11:Reserved" ;default 10 R12=CKOUT,L,"0 - On,1 - Off" R13=CKDIV8,L,"0 - On,1 - Off" ;Hi R14=BODLEVEL,L,"000:2.5V,001:2.6V,010:2.7V,011:3.8V,100:3.9V,101:4.0V,110:4.1V,111:BOD DISABLE" R15=EESAVE,L,"0 - Save,1 - Clear" R16=WDTON,L,"0 - On,1 - Off" ;R17=SPIEN,L,"0 - Enable,1 - Disable" R17=DWEN,L,"0 - On,1 - Off" ;DWEN must be unprogrammed when Lock Bit security is required. R18=RSTDISBL,L,"0: Int.Reset,1: Ext.Reset" ;Ext R19=SELFPRG,L,"0 - On,1 - Off" R1A=Calibration,H2 CDELAY=10 ; minimum periods for the serial clock (SCK) > 4 XTAL1 clock cycle! ;im/out [_DOUT] R1=0; LOOP=(7,0){MOSI=R0[I],SCK=1,R1[I]=MISO,SCK=0} [_DOUT16] LOOP=(15,0){MOSI=R0[I],SCK=P} [_DIN] R0=0 LOOP=(7,0){SCK=1,R0[I]=MISO,SCK=0} [_RDLOCKO] _DOUT(0x58) ;rd lock bits _DOUT(0x00) _DOUT(0x00) [_RDLOCK] _DOUT(0x58) ;rd lock bits _DOUT(0x00) _DOUT(0x00) _DIN [_WRLOCK] _DOUT(0xAC) ;Write lock bits _DOUT(0xE0) _DOUT(0x00) R0=DATA R0=|0xC0,_DOUT P=10000 [_RDFUSE] R7=ADR R7?0{ _DOUT(0x50) ;Read Fuse LOW _DOUT(0x00) } R7?1{ _DOUT(0x58) ;Read Fuse High _DOUT(0x08) } R7?2{ _DOUT(0x50) ;Read Fuse ext _DOUT(0x08) } _DOUT(0x00) ;_DIN ;read [_WRFUSE] R7=ADR R7?0{ _DOUT(0xAC) ;Fuse LOW _DOUT(0xA0) } R7?1{ _DOUT(0xAC) ;Fuse High _DOUT(0xA8) } R7?2{ _DOUT(0xAC) ;Fuse Ext _DOUT(0xA4) } _DOUT(0x00) R0=DATA _DOUT P=10000 [INIT] SCK=0 MISO=Z CFREQ=2000000 P=50 ;RESET=1,P=100 RESET=0,P=200 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) } 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],SCK=P} LOOP=(8,1){MOSI=ADR[I],SCK=P} } $AREA?1{ ;eeprom area _DOUT(0xA0) LOOP=(15,8){MOSI=ADR[I],SCK=P} LOOP=(7,0){MOSI=ADR[I],SCK=P} } $AREA?2{ ;fuse _RDFUSE } $AREA?3{ ;LOCK _RDLOCKO } _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 } $AREA?2{ _WRFUSE } $AREA?3{ _WRLOCK } [WRITEBLOCK] R7=ADR ;check empty (0xFF) block LOOP=($BLOCKSIZE){ R0=0x40 ;program memory R1=ADR,R0[3]=R1[0],_DOUT ;Hi/Lo 48/40 _DOUT(0) LOOP=(8,1){MOSI=ADR[I],SCK=P} ;R0=ADR,R0=&0x1F,LOOP=(8,1){MOSI=R0[I],SCK=P} R0=DATA,_DOUT ADR=+1 } ;Write Program memory Page: ADR=R7 _DOUT(0x4C) R0=ADR,R0=/2,_DOUT16 ;LOOP=(16,9){MOSI=ADR[I],SCK=P} ;LOOP=(8,6){MOSI=ADR[I],SCK=P} ;LOOP=(5,1){MOSI=0,SCK=P} _DOUT(0) ;dummy data ;P=5000 ;specific Poll RDY/BSY LOOP(1000){ _DOUT(0xF0) _DOUT(0x00) _DOUT(0x00) _DIN R0=&1 R0?0{BREAK} P=10 } [WRITEEND] P=10000 RESET=1,P=20, RESET=0,P=20000 ["!#~Fuse Editor"] $AREA=2 ;FUSE R10=0,R11=0,R12=0,R13=0 R14=0,R15=0,R16=0,R17=0 R18=0,R19=0 ADR=0, R0=DATA ;Low fuse R10=R0,R10=&0xF ;R10=CKSEL,L R11[0]=R0[4] ;R11=SUT R11[1]=R0[5] R12[0]=R0[6] ;R12=CKOUT R13[0]=R0[7] ;R13=CKDIV8 ADR=1,R0=DATA ;Hi fuse R14[0]=R0[0] ;R14=BODLEVEL R14[1]=R0[1] ;R14=BODLEVEL R14[2]=R0[2] ;R14=BODLEVEL R15[0]=R0[3] ;R15=EESAVE R16[0]=R0[4] ;R16=WDTON R17[0]=R0[6] ;R17=DWEN R18[0]=R0[7] ;R18=RSTDISBL ADR=2,R0=DATA ;EXT R19[0]=R0[0] ;SELFPRGEN GET=("Fuses",R10,R11,R12,R13,R14,R15,R16,R17,R18,R19) RA?0{EXIT} R10?0{ ;CKSEL PRINT=A("This fuses value require Ext. Clock, continue?") RA?0{EXIT} } ADR=0 ;Low fuse R0=R10,R0=&0xF ;R10=CKSEL,L R0[4]=R11[0] ;R11=SUT,L,1,2,3,4 R0[5]=R11[1] R0[6]=R12[0] ;R12=CKOUT R0[7]=R13[0] ;R13=CKDIV8 DATA=R0 ADR=1 ;Hi fuse R0=0xFF R0[0]=R14[0] ;R14=BODLEVEL R0[1]=R14[1] ;R14=BODLEVEL R0[2]=R14[2] ;R14=BODLEVEL R0[3]=R15[0] ;R15=EESAVE R0[4]=R16[0] ;R16=WDTON R0[5]=0 ;SPIEN error in datasheet 8197C-AVR-05/11! R0[6]=R17[0] ;R17=DWEN R0[7]=R18[0] ;R18=RSTDISBL DATA=R0 ADR=2 R0=0xFF ;EXT ;EXT R0[0]=R19[0] ;SELFPRGEN DATA=R0 ["!#~Lock Editor"] $AREA=3 ;Lock R9=DATA GET=("Lock",R9) RA?0{EXIT} R9=|0xC0 DATA=R9 ["Read Calibration"] R0=0x38,_DOUT R0=0x00,_DOUT R0=0x00,_DOUT _DIN R1A=R0 GET=("Read Calibration",R1A) [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 PRINT=S("ID: %06lX",R2) R0=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