В чем собственно состоит магия)) ну и вопрос:
МК, программатор, оболочка все проверенное и используется давно без глюков, но при программировании прошивкой (ниже) МК не определяется программатором если не выставлять фузами дополнительное время задержки после аппаратного сброса , а при 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