; Orange programmer module v4.2 beta ; (c) 2001-2012 CnCLab ; Atmel AVR ; CHIP=ATTINY15 ; FLASH 1K, EEPROM 64 ; High-voltage (12V) Serial programming mode ; Orange3/4/5 ; Tested! SOCKET=0 ; INFO="PIC-AVR Adapter" PINO=SCK, 3,3 ;PB3 ! PINO=SDIN, 2,5 ;PB0 PINO=SIIN, 1,6 ;PB1 PINO=PB5VPP,5,1 ;PB5/RESET [for O4-VPP] PING=SDOUT,0,7 ;PB2 PINO=GND,255,4 PINO=VCC,254,8 R8=Fuses,B8 R9=Lock,L,All,Prog,Off R10=CKSEL,L,"00: 64ms+18CK","01: 64ms+18CK","10: 4ms+18CK","11: 18CK+(BODEN)" R11=RSTDISBL,L,"On (Int.Reset),Off (Ext.Reset)" R12=SPIEN,L,On,Off R13=BODEN,L,On,Off R14=BODLEVEL,L,High,Low R15=Calibration,H2 R16="Store to FLASH",C1 R17="FLASH address",H4 CDELAY=1 ; [_SCKP] ;LOOP=(0,15){SCK=P} ;data is clocked on the 8th rising edge of the 16 external clock pulses SCK=P16 ;needed to generate the internal clock. [_DOUT] R1=0; LOOP=(7,0){SDIN=R0[I],SCK=1,R1[I]=SDOUT,SCK=0} [_DIN] R0=0 LOOP=(7,0){SCK=1,R0[I]=SDOUT,SCK=0} ;tx R0,R1 ;rx R2 [_INSTR] R2=0 SDIN=0,SIIN=0 _SCKP LOOP=(7,0){ R2[I]=SDOUT SDIN=R0[I] SIIN=R1[I] _SCKP } SDIN=0,SIIN=0 _SCKP _SCKP [_ReadID] _INSTR(00001000B,01001100B) ;1 R8=0 ;value R7=0 ;adr LOOP=(0,2){ _INSTR(R7,00001100B) ;2 _INSTR(0,01101000B) ;3 _INSTR(0,01101100B) ;4 R8=*256 R8=|R2 R7=+1 } SCK=0 [_INI] PB5VPP=0,VPP=0 ;VPP=0 SIIN=0 ; $VERSION=/65536 $VERSION?!4{P=120000} SDIN=0 ;PB0=0 P=500 SCK=0 ;PB3=0 P=100 PB5VPP=1,VPP=12000 P=75000 [!#SETUP] R16=0 R17=0x3FF [_READOSCCAL] _INSTR(00001000B,01001100B) ;1 _INSTR(0, 00001100B) ;2 _INSTR(0, 01111000B) ;3 _INSTR(0, 01111100B); 4 [INIT] LOOP(4){ ;try read correct id _INI _ReadID R8=&0xFF0000 R8?0x1E0000{BREAK} PB5VPP=0,VPP=0 ;VPP=0 VCC=0 P=100000 ;PRINT=L("V ") } R8?!0x1E0000{ PRINT=A("ID Read error, continue?") RA?0{EXIT} VCC=1 _INI } [READ] $AREA?0{ ;R9=0x20 ;program memory area ;Read Flash High and Low Address _INSTR(00000010B,01001100B) ;1 R0=ADR,R0=/512 ;2 adr l R1=00011100B _INSTR R0=ADR,R0=/2,R0=&0xFF ;3 adr h R1=00001100B _INSTR ;Read Flash R0=00000000B ;1 R1=ADR,R1=&1,R1=<<4,R1=|01101000B ;Low or High _INSTR R0=00000000B ;2 R1=01101100B _INSTR } $AREA?1{ ;Read EEPROM address lo R0=00000011B ;1 R1=01001100B _INSTR R0=ADR ;2 adr l R1=00001100B _INSTR ;Read R0=00000000B ;1 R1=01101000B ;Low or High _INSTR R0=00000000B ;2 R1=01101100B _INSTR } DATA=R2 [WRITEINIT] $AREA?0{ R16?1{ _READOSCCAL R17=&0x7FF,ADR=R17 DATA=R2 ;store calibr } } [WRITE] $AREA?0{ ;R0=0x40 ;program memory R0=DATA,R0?0xFF{RETURN} ;speed up! ;Write Flash High and Low Address R0=00010000B ;1 R1=01001100B _INSTR R0=ADR,R0=/512 ;2 adr l R1=00011100B _INSTR R0=ADR,R0=/2,R0=&0xFF ;3 adr h R1=00001100B _INSTR ;Write Flash R0=DATA ;1 R1=ADR,R1=&1,R1=<<4,R1=|00101100B ;Low or High _INSTR R0=00000000B ;2 R1=ADR,R1=&1,R1=<<4,R1=|01100100B ;Low or High _INSTR R0=00000000B ;3 R1=ADR,R1=&1,R1=<<4,R1=|01101100B ;Low or High _INSTR P=5000 ; 4ms } $AREA?1{ ;Write EEPROM address low (only Tiny12!) R0=00010001B ;1 R1=01001100B _INSTR R0=ADR ;2 adr l R1=00001100B _INSTR ;Write EEPROM R0=DATA ;1 R1=00101100B _INSTR R0=00000000B ;2 R1=01100100B _INSTR R0=00000000B ;3 R1=01101100B _INSTR P=10000 ; 4ms } [WRITEEND] P=20000 ["Read Fuses"] R0=00000100B ;1 R1=01001100B _INSTR R0=0 ;2 R1=01101000B _INSTR R0=0 ;3 R1=01101100B _INSTR R8=R2 R10=0,R11=0,R12=0,R13=0,R14=0 R10=R8,R10=&0x3 ;R10=CKSEL,L, ; bits 2,3 not used R11[0]=R8[4] ;R11=RSTDISBL,L,On,Off R12[0]=R8[5] ;R12=SPIEN,L,On,Off R13[0]=R8[6] ;R13=BODEN,L,On,Off R14[0]=R8[7] ;R14=BODLEVEL,L,High,Low SCK=0, PB5VPP=0 GET=("Read Fuses",R8,R10,R11,R12,R13,R14) ;GET=("Read Fuses",R10,R11,R12,R13,R14) ["Write Fuses"] GET=("Write Fuses",R10,R11,R12,R13,R14) RA?0{EXIT} R8=0xFF ; unused bits to 1 R8=R10,R8=&0x3 ;R10=CKSEL,L,Ext,Int ; bits 2,3 not used R8[4]=R11[0] ;R11=RSTDISBL,L,On,Off R8[5]=R12[0] ;R12=SPIEN,L,On,Off R8[6]=R13[0] ;R13=BODEN,L,On,Off R8[7]=R14[0] ;R14=BODLEVEL,L,High,Low R5=0 R12?1{R5=1} R11?0{R5=1} R5?1{ PRINT=A("This fuses value disable Low-Voltage Programming, continue?") RA?0{EXIT} } R0=01000000B ;1 R1=01001100B _INSTR R0=R8 ;2 fuses R1=00101100B _INSTR R0=0 ;3 R1=01100100B _INSTR R0=0 ;4 R1=01101100B _INSTR P=20000 ["Read Lock"] _INSTR(00000100B,01001100B) ;1 _INSTR(0,01111000B) ;2 _INSTR(0,01111100B) ;3 SCK=0, PB5VPP=0 R2=/2, R2=&3 ; Error in Datasheet??? R9=R2 R9?1{PRINT=("Undefined value - 1"),EXIT} R2?2{R9=1} R2?3{R9=2} GET=("Lock Bits",R9) ["Write Lock"] R9=0 GET=("Lock Bits",R9) RA?0{EXIT} R9?2{R9=3} R9?1{R9=2} R0=00100000B ;1 R1=01001100B _INSTR R0=R9,R0=*2 ;2 R1=00101100B _INSTR R0=0 ;3 R1=01100100B _INSTR R0=0 ;4 R1=01101100B _INSTR P=20000 ["Calibration"] _READOSCCAL SCK=0, PB5VPP=0 R15=R2 GET=("Read Calibration",R15,R16,R17) [ReadID] _INSTR(00001000B,01001100B) ;1 R8=0 ;value R7=0 ;adr LOOP=(0,2){ _INSTR(R7,00001100B) ;2 _INSTR(0,01101000B) ;3 _INSTR(0,01101100B) ;4 R8=*256 R8=|R2 R7=+1 } SCK=0, PB5VPP=0,VPP=0 R8?0x1E9004{PRINT=("ID: %06lX - ATTiny11",R8),EXIT} R8?0x1E9005{PRINT=("ID: %06lX - ATTiny12",R8),EXIT} R8?0x1E9006{PRINT=("ID: %06lX - ATTiny15",R8),EXIT} PRINT=("ID: %06lX",R8) [Erase] P=50000 R0=10000000B ;1 R1=01001100B _INSTR R0=0 ;2 R1=01100100B _INSTR R0=0 ;3 R1=01101100B _INSTR P=20000 R0=0 ;4 R1=01001100B _INSTR P=20000 [END] SCK=0, PB5VPP=0 VPP=0 P=1000 ;----------------- ; for debug [_TEST] R4=0 R6=0 LOOP(0,0x7fffff){ VCC=1,P=100000 ;SDOUT=1 PB5VPP=0,VPP=0 ;VPP=0 SIIN=0 ; $VERSION=/65536 $VERSION?!4{P=120000} SDIN=0 ;PB0=0 P=500 SCK=0 ;PB3=0 P=100 PB5VPP=1,VPP=12000 P=100000 _ReadID R6=+1 PRINT=S("ID: %06lX [%u:%u]",R8,R6,R4) R0=R8 R0=&0xFF0000 R0?!0x1E0000{ R4=+1 PRINT=L("ID: %06lX ",R8) _ReadID PRINT=L("ID: %06lX\n",R8) P=450000 } PB5VPP=0,VPP=0 ;VPP=0 VCC=0 P=100000 }