; Orange programmer module v3.8 beta ; (c) 2001-2012 CnCLab ; Atmel AVR ;CHIP=ATmega103,128K,atm103.hpl ;AREA=FLASH,128K(256),0 ;AREA=EEPROM,4K ;AREA=FUSE,1 ;CHIP=ATmega103L,128K,atm103.hpl ;AREA=FLASH,128K(256),0 ;AREA=EEPROM,4K ;AREA=FUSE,1 ;VCC=3250 ;OLD MCU - Not recommended in new designs! ; Primary tested ATmega103 ; SPI mapped to port E!!!!! ALLPINS=0 ;=64 INFO="AVR Adapter" OPTIONS=mf, ;FLASH: no modify, skip blank PINO=SCK, 0 ;11 PB1 PINO=MOSI, 2 ;2 PE0 PINO=MISO, 1 ;3 PE1 PINO=RESET,3 ;20 RESET PINI=MISO, 1 ;PINO=GND,255 ;22,53,63 ;PINO=VCC,254 ;21,52,64 Vcc,AVcc ;OSC ;23 XTAL2 BUSO=CFREQ,128 R8=Fuses,B8 R9=Lock,C2,LB2,LB1 R10=SUT,C2,SUT1,SUT0 R11=EESAVE,L,"0 - Save,1 - Clear" CDELAY=10 ; minimum periods for the serial clock (SCK) > 4 XTAL1 clock cycle! [_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=0,P=20000 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 flash 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} } $AREA?2{ ;RD FUSE _DOUT(0x50) _DOUT(0x00) _DOUT(0x00) _DIN R0=&0x0F DATA=R0 RETURN } _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=6000 ; EEPROM min 4ms } $AREA?2{ ;Fuse _DOUT(0xAC) ;Write Fuse Bits R0=DATA,R0=&0x0F,R0=|0xB0 _DOUT _DOUT(0) _DOUT(0) P=20000 } [WRITEBLOCK] R7=ADR ;check empty (0xFF) block LOOP=($BLOCKSIZE){ R0=0x40 ;program memory R1=ADR,R0[3]=R1[0],_DOUT ;Hi/Lo R0=0,_DOUT 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=25000 [WRITEEND] P=10000 RESET=1,P=20 RESET=0,P=20000 ["Read Lock"] _DOUT(0x58) ;Write lock bits _DOUT(0x00) _DOUT(0x00) _DIN R9=0 R9[0]=R0[1] R9[1]=R0[2] GET=("Lock",R9) ["Write Lock"] GET=("Write Lock",R9) R0=0xAC,_DOUT ;Write lock bits R0=0xFF R0[1]=R9[0] R0[2]=R9[1] _DOUT _DOUT(0) _DOUT(0) P=25000 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 R0=|R2 ;R2?0x1E9702{PRINT=("ID: %06lX - ATmega128",R2),EXIT} PRINT=S("ID: %06lX",R0) ["!#~Fuse Editor"] $AREA=2 ;FUSE R10=0,R11=0 ADR=0, R0=DATA ;fuse R10=R0,R10=&0x3 ;R10=SUT R11[0]=R0[3] ;R11=EES GET=("Fuse",R10,R11) R0=0x04 R0[0]=R10[0] ;R10=SUT R0[1]=R10[1] R0[3]=R11[0] ;R11=EES DATA=R0 [Erase] _DOUT(0xAC) ;Chip Erase _DOUT(0x80) _DOUT(0x00) _DOUT(0x00) P=50000 RESET=1,P=20, RESET=0,P=20000 [END] RESET=1 ;EO=1,P=10 ;BB off