В чем собственно состоит магия)) ну и вопрос:
МК, программатор, оболочка все проверенное и используется давно без глюков, но при программировании прошивкой (ниже) МК не определяется программатором если не выставлять фузами дополнительное время задержки после аппаратного сброса , а при 4.1мс или 65мс все нормально (определяется).
Перепробовал разные скорости "залития", купил пару новых не юзаных МК, все перепроверил несколько раз.
Может быть кто сталкивался с подобным, подскажите пожалуйста.
Спасибо.
- Код: Выделить всё • Развернуть
- .include "tn2313def.inc"
 .EQU CPU_SPEED=10000000
 .def delaydelay1=r20
 .def delaydelay2=r21
 .def delaydelay3=r22
 .equ pSCL = 6
 .equ pSDA = 5
 ;---------------------------------------------------------
 .def DATA = r17
 .def ClkA = r18
 .def cnt = r23
 .def AddrL = r24 ;àäðåñà EEPROM
 .def AddrH = r25
 .MACRO delay_ms
 
 .set CPU_PERIOD=1000000000000/CPU_SPEED
 .set Delay_C=(@0*100000000/CPU_PERIOD)-21
 .set Delay_D3=Delay_C/197122+1
 .set Delay_D2=(Delay_C-(Delay_D3-1)*197122)/770+1
 .set Delay_D1=(Delay_C-(Delay_D3-1)*197122-(Delay_D2-1)*770)/3-1
 PUSH delaydelay1
 PUSH delaydelay2
 PUSH delaydelay3
 ldi delaydelay1,Delay_D1
 ldi delaydelay2,Delay_D2
 ldi delaydelay3,Delay_D3
 rcall delaydelayloop
 POP delaydelay3
 POP delaydelay2
 POP delaydelay1
 .ENDMACRO
 .MACRO outi
 LDI R18,@1
 OUT @0,R18
 .ENDMACRO
 .macro i2c_w
 cli
 ldi ClkA,@0 ; i2c_w
 ldi data,@1
 rcall write_i2c
 .endm
 .macro i2c_r
 ldi ClkA,@0
 rcall read_i2c
 .endm
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 .org 0
 rjmp reset
 reset:
 sbi ddrb, 7
 sbi portb, 7
 ldi r16, ramend ;
 out spl, r16
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
 delay_ms 0.2
 rcall reset_cam
 i2c_w 3, 0
 i2c_w 4, 0b10001111
 i2c_w 1, 0b01111000 ;
 i2c_w 2, 0b11000000
 i2c_w 3, 0b00100110
 i2c_w 3, 0
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 cikle: rjmp cikle
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 reset_cam:
 cbi portb, 7
 delay_ms 0.2
 sbi portb, 7
 delay_ms 3
 ret
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;----------------------- çàïèñü RTC --------------------------
 write_i2c:
 cbi PORTB,pSDA
 cbi PORTB,pSCL
 ldi cnt,120 ;120 ïîïûòîê ïðîïèñàòü
 loop120:
 push DATA
 rcall start
 ldi DATA,0b01111000 ;addr device,r/w=0
 rcall write
 brcs rt_write ;C=1 ERROR
 mov DATA,ClkA ;set HI address
 rcall write
 brcs rt_write ;C=1 ERROR
 pop DATA ;set data to DATA
 rcall write
 brcs rt_ ;C=1 ERROR
 rcall stop
 brcs rt_ ;C=1 ERROR
 ret
 ;----------------------- RTC --------------------------
 read_i2c:
 cbi PORTB,pSDA
 cbi PORTB,pSCL
 ldi cnt,120
 loop_read_:
 rcall start
 ldi DATA,0b11010000 ;addr device,r/w=0
 rcall write
 brcs rt__ ;C=1 ERROR
 mov DATA,ClkA ;set HI address
 rcall write
 brcs rt__ ;C=1 ERROR
 rcall start
 ldi DATA,0b11010001 ;addr device,r/w=1
 rcall write
 brcs rt__ ;C=1 ERROR
 clt ; no put ACK
 rcall read
 rcall stop
 brcs rt__ ;C=1 ERROR
 ret
 rt__:
 dec cnt
 brne loop_read_
 ret
 rt_write:
 pop DATA
 rt_:
 brcc Ok_wr_
 dec cnt
 brne loop120
 Ok_wr_:
 ret
 write:
 push DATA
 push cnt
 ldi cnt,8
 x42:
 rol DATA
 brcs se1
 sbi DDRB,pSDA
 rjmp del_wr
 se1:
 cbi DDRB,pSDA
 del_wr:
 cbi DDRB,pSCL
 rcall delay
 sbi DDRB,pSCL
 rcall delay
 dec cnt
 brne x42 ;ñëåäóþùèé áèò
 cbi DDRB,pSDA ; îñâîáîäèòü pSDA äëÿ ACK
 rcall delay
 cbi DDRB,pSCL
 rcall delay
 clc
 sbic PINB,pSDA ;÷èòàåì â áèò Ñ ñîñòîÿíèå ACK
 sec ;ACK íå ïðèøåë
 sbi DDRB,pSCL
 rcall delay
 pop cnt
 pop DATA
 ret
 read: ;÷òåíèå â DATA, áèò t=1 -> îòâåòèòü ACK, t=0 íå îòâå÷àòü ACK
 ldi DATA,1
 loop_read:
 sbi DDRB,pSCL ;SCL=0
 cbi DDRB,pSDA ;SDA=1
 rcall delay
 cbi DDRB,pSCL ;SCL=1
 rcall delay
 clc
 sbic PINB,pSDA ;÷èòàòü SDA â áèò C
 sec
 rol DATA
 brcc loop_read
 ;îòñûëàåì ACK ()
 sbi DDRB,pSCL ;SCL=0
 rcall delay
 brts se0
 cbi DDRB,pSDA ;íå îòâå÷àòü ACK (t) , SDA=1
 rjmp rd_
 se0:
 sbi DDRB,pSDA ;îòâå÷àòü ACK (t) , SDA=0
 rd_:
 clc
 rcall delay
 cbi DDRB,pSCL ;SCL=1
 rcall delay
 ret
 start:
 cbi DDRB,pSDA
 cbi DDRB,pSCL
 rcall delay
 sbis PINB,pSDA
 rjmp start
 sbis PINB,pSCL
 rjmp start
 sbi DDRB,pSDA ;0=SDA
 rcall delay
 sbi DDRB,pSCL ;0=SCL
 rcall delay
 ret
 stop:
 sbi DDRB,pSDA
 sbi DDRB,pSCL
 rcall delay
 cbi DDRB,pSCL ;1=SCL
 rcall delay
 cbi DDRB,pSDA ;1=SDA
 rcall delay
 clc
 sbic PINB,pSDA
 ret
 sbic PINB,pSCL
 ret
 sec
 ret
 delay: ;~5mks (êâàðö 4MHz)
 push cnt
 ldi cnt,24
 cyk_delay: dec cnt
 brne cyk_delay
 pop cnt
 ret
 delaydelayloop:
 dec delaydelay1
 brne delaydelayloop
 dec delaydelay2
 brne delaydelayloop
 dec delaydelay3
 brne delaydelayloop
 ret


 
 
