; Orange programmer module v4.4 ; (c) 2005-2012 CnCLab ; Atmel AVR ; ; ATmega88,88A,88PA ; ATmega168,168A,168PA ; для ATmega48 другой модуль! ; для ATmega328 другой модуль - отличаются fuse! ;CHIP=ATmega88,8K,atm88.hpl ;AREA=FLASH,8K(64),0,0,m ;AREA=EEPROM,512 ;CHIP=ATmega168,16K,atm88.hpl ;AREA=FLASH,16K(128),0,0,m ;AREA=EEPROM,512 ; Primary tested Atmega88, Atmega168PA ALLPINS=28 INFO="AVR Adapter" OPTIONS=mf, PINO=SCK, 0,19 PINO=MOSI, 2,17 PINO=MISO, 1,18 PINO=RESET,3,1 PINI=MISO, 1,18 PING=GND,255,8 PINO=VCC,254,7 BUSO=CFREQ,128 R8=Fuses,B8 ; for 88 R9=Lock,C6,BLB12,BLB11,BLB02,BLB01,LB2,LB1 R10=CKSEL,L,"0000: Ext Clk,0001: Reserved,0010: IntRC 8MHz,0011: IntRC 128kHz,0100: Low Fr.Crystal,0101: Low Fr.Crystal,0110: Full Crystal,0111: Full Crystal,1000: Ceramic,1001: Ceramic,1010: Low Pwr Crystal 0.9-3.0M,1011: Low Pwr Crystal 0.9-3.0M,1100: Low Pwr Crystal 3-8M,1101: Low Pwr Crystal 3-8M,1110: Low Pwr Crystal 8-16M,1111: Low Pwr Crystal 8-16M" R11=SUT,C2,SUT1,SUT0 R12=CKOUT,L,"0 - On,1 - Off" R13=CKDIV8,L,"0 - On,1 - Off" R14=BODLEVEL,L,"000: reserved,001: reserved,010: reserved,011: reserved,100: 4.3V,101: 2.7V,110: 1.8V,111: Disabled" R15=EESAVE,L,"0 - Save,1 - Clear" R16=WDTON,L,"0 - On,1 - Off" R17=SPIEN,L,"0 - Enable,1 - Disable" R18=DWEN,L,"0 - On,1 - Off" R19=RSTDISBL,L,"0 - PC6:IO,1 - PC6:RESET" R1A=BOOTRST,L,"0 - Boot Loader","1 - Application" ;for mega88/168 R1B=BOOTSZ,L,"00: 32 pages,01: 16 pages,10: 8 pages,11: 4 pages" CDELAY=10 ; minimum periods for the serial clock (SCK) > 4 XTAL1 clock cycle! [_DOUTIN] R1=0 LOOP=(7,0){MOSI=R0[I],SCK=1,R1[I]=MISO,SCK=0} [_DOUT] ;LOOP=(7,0){MOSI=R0[I],SCK=P} ; fast out MOSI=R0[7],SCK=P MOSI=R0[6],SCK=P MOSI=R0[5],SCK=P MOSI=R0[4],SCK=P MOSI=R0[3],SCK=P MOSI=R0[2],SCK=P MOSI=R0[1],SCK=P MOSI=R0[0],SCK=P [_DIN] R0=0 ;LOOP=(7,0){SCK=1,R0[I]=MISO,SCK=0} ; fast in SCK=1,R0[7]=MISO,SCK=0 SCK=1,R0[6]=MISO,SCK=0 SCK=1,R0[5]=MISO,SCK=0 SCK=1,R0[4]=MISO,SCK=0 SCK=1,R0[3]=MISO,SCK=0 SCK=1,R0[2]=MISO,SCK=0 SCK=1,R0[1]=MISO,SCK=0 SCK=1,R0[0]=MISO,SCK=0 ;return R0 [_RDLOCK] _DOUT(0x58) ;rd lock bits _DOUT(0x00) _DOUT(0x00) _DIN [INIT] SCK=0 MISO=Z CFREQ=2000000 RESET=0,P=1000 LOOP=(32){ ; 32 attempts RESET=1,P=500 RESET=0,P=15000 _DOUT(0xAC) ;Programming Enable _DOUT(0x53) _DOUTIN(0x00) R3=R1 _DOUT(0) R3?0x53{BREAK} ;PRINT=("ANSWER: %02lX",R1) } R3?!0x53{PRINT=("ANSWER ERROR: %02lX",R3),EXIT} P=10 RE?<4{ _RDLOCK R0=&3,R0?0{PRINT=S("#MCU memory locked!")} } [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{ R0=0xA0 ;eeprom area _DOUT LOOP=(15,8){MOSI=ADR[I],SCK=P} LOOP=(7,0){MOSI=ADR[I],SCK=P} } _DIN ;common DATA=R0 [WRITE] $AREA?0{ PRINT=("Only Page Write Supported!") EXIT } $AREA?1{ _DOUT(0xC0) ;eeprom memory area LOOP=(15,8){MOSI=ADR[I],SCK=P} LOOP=(7,0){MOSI=ADR[I],SCK=P} R0=DATA,_DOUT P=9000 ; 4ms } [WRITEBLOCK] R7=ADR ;check empty (0xFF) block ;LOOP=($BLOCKSIZE){ ;R1=DATA ;R1?!0xFF{BREAK} ;ADR=+1 ;} ;R1?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=5 ADR=+1 } ;Write Program memory Page: ADR=R7 _DOUT(0x4C) 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 [WRITEEND] P=10000 RESET=1,P=50 RESET=0,P=20000 ["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 R14=0,R15=0,R16=0,R17=0,R18=0,R19=0 R14[0]=R8[0] ;R14=BODLEVEL R14[1]=R8[1] ;R14=BODLEVEL R14[2]=R8[2] ;R14=BODLEVEL R15[0]=R8[3] ; R16[0]=R8[4] ; R17[0]=R8[5] ; R18[0]=R8[6] ; R19[0]=R8[7] ; _DOUT(0x50) ;Read Fuse ext Bits _DOUT(0x08) _DOUT(0x00) _DIN R1A=R0,R1A=&1 R1B=R0,R1B=/2,R1B=&3 RESET=1,P=10 VCC=0 GET=("Read Fuses",R10,R11,R12,R13,R14,R15,R16,R17,R18,R19,R1A,R1B) ;GET=("Read Fuses",R10,R11,R12,R13,R14) ["Write Fuses"] GET=("Write Fuses",R10,R11,R12,R13,R14,R15,R16,R17,R18,R19,R1A,R1B) RA?0{EXIT} ;PRINT=("%lX",R11) R10?0{ PRINT=A("This fuses value require Ext. Clock, continue?") RA?0{EXIT} } R19?0{ PRINT=A("This fuses value disable serial prog., 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 R0=0xAC,_DOUT R0=0xA0,_DOUT R0=0x00,_DOUT R0=R8,_DOUT P=15000 R8=0xFF R8[0]=R14[0] ;R14=BODLEVEL R8[1]=R14[1] ;R14=BODLEVEL R8[2]=R14[2] ;R14=BODLEVEL R8[3]=R15[0] ; R8[4]=R16[0] ; R8[5]=R17[0] ; R8[6]=R18[0] ; R8[7]=R19[0] ; R0=0xAC,_DOUT ;Write High Fuse R0=0xA8,_DOUT R0=0x00,_DOUT R0=R8,_DOUT P=15000 R8=0xFF R8[0]=R1A[0] R8[1]=R1B[0] R8[2]=R1B[1] R0=0xAC,_DOUT ;Write Ext Fuse R0=0xA4,_DOUT R0=0x00,_DOUT R0=R8,_DOUT P=15000 RESET=1,P=20 RESET=0,P=20000 [ReadLock] _RDLOCK R9=R0 ;PRINT=("R9: %04lX",R9) GET=("Lock",R9) [WriteLock] GET=("Write Lock",R9) RA?0{EXIT} _DOUT(0xAC) ;Write lock bits _DOUT(0xE0) _DOUT(0x00) R0=R9,R0=|0xC0 ;PRINT=("R9: %04lX",R9) _DOUT P=50000 RESET=1,P=20, RESET=0,P=10000 [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 R0=|R2 ;R0?0x1E9205{PRINT=("ID: %06lX - ATmega48",R2),EXIT} ;R0?0x1E920A{PRINT=("ID: %06lX - ATmega48PA",R2),EXIT} ;R0?0x1E930A{PRINT=("ID: %06lX - ATmega88",R2),EXIT} ;R0?0x1E930F{PRINT=("ID: %06lX - ATmega88PA",R2),EXIT} ;R0?0x1E9406{PRINT=("ID: %06lX - ATmega168",R2),EXIT} ;R0?0x1E940B{PRINT=("ID: %06lX - ATmega168PA",R2),EXIT} ;R0?0x1E9514{PRINT=("ID: %06lX - ATmega328",R2),EXIT} ;R0?0x1E950F{PRINT=("ID: %06lX - ATmega328PA",R2),EXIT} PRINT=S("ID: %06lX",R0) [Erase] _DOUT(0xAC) ;Chip Erase _DOUT(0x80) _DOUT(0x00) _DOUT(0x00) P=100000 ; Check _DOUT(0x20) ;program memory area _DOUT(0x00) ;ADR 0 _DOUT(0x00) _DIN ;common R0?!0xFF{PRINT=E("Erase error")} R0?0xFF{PRINT=S("Erase finished")} RESET=1,P=2000, RESET=0,P=500000 [END] RESET=1 ;EO=1,P=10 ;BB off