Цитата(Stas633 @ Apr 12 2007, 13:44)

Настоятельно рекомендую R2 "разместить" в непосредственной близости от входа МП, и "+5в" "брать" от шины питания МП (от вывода питания МП). Конденсатор или убрать совсем, или емкость снизить с 1мкФ до <1нФ. На мой взгляд, приведенная схема датчика вполне работоспособна, и при условии исправных элементов, "сбоев" давать не должна.
Re..Опубликуйте программу..
R2 датчика и +5в близко к контроллеру,
он mcs51, программа соответственно...
1.Задание расстояния
Код
;--------------------------
;Настройка позиционирования|
;--------------------------
upr:
mov th1,#0
mov tl1,#0
mov kol_post_down,#0
mov kol_post_up,#0
mov addr_length,#0
setb tr0 ;разрешить счёт таймеру
setb et0 ;разрешить прерывания от таймера
upr_set:
jb k_set,upr_menu
upr_set_1:
clr tr0
clr tr1
call time2
call save_pos
setb tr0
setb tr1
upr_menu:
jb k_menu,upr_plus
pr_menu_1:
clr tr0
clr tr1
clr et0
clr et1
call time2
ret
upr_plus:
jb k_plus,upr_minus
upr_plus_1:
call r_up
upr_minus:
jb k_minus,upr_set
upr_minus_1:
call l_down
jmp upr_set
;FUNCTIONS upr_minus
;-------------------------------------------
;Крутит нижний двигатель, увеличивает длину |
;-------------------------------------------
l_down: ;Крутим (L/DOWN) двигатель
clr tr1
clr et0
clr type_count;инкрементирующий счётчик
call on_down
setb et0
setb tr1
down_m1:
jnb k_minus,down_m1
;clr tr0
;call time1
;setb tr0
;jnb k_minus,down_m1
clr tr1
clr tr0
call on_all
setb tr0
ret
;FUNCTIONS upr_plus
;------------------------------------------
;Крутит верхний двигатель, уменьшает длину |
;------------------------------------------
r_up: ;Крутим (R/UP) двигатель
clr tr1
clr et0
mov a,th1
cpl a
mov th1,a
mov a,tl1
cpl a
mov tl1,a
setb type_count;декрементирующий счётчик
call on_up
setb et0
setb tr1
up_m1:
jnb k_plus,up_m1
;clr tr0
;call time1
;setb tr0
;jnb k_plus,up_m1
clr tr1
clr tr0
call on_all
setb tr0
ret
2.Прерывания
Код
;************************
;* ОБРАБОТКА ПРЕРЫВАНИЙ *
;************************
;------------------------------------------------
;Обслуживание прерывания при переполнении таймера|
;------------------------------------------------
t0_overflow:
jb type_count,t0_overflow_1
call inc_counter
reti
t0_overflow_1:
call dec_counter
reti
;FUNCTIONS t0_overflow
;------------------------
;Инкрементирующий счётчик|
;------------------------
inc_counter:
clr tr0 ;запретить счёт таймеру
call inc_bcd
call bin_to_bcd
call display
setb tr0 ;разрешить счёт таймеру
ret
;sub FUNCTIONS inc_counter
;---------------------------------------------
;Предварительная обработка значений для работы|
; счётчика в инкрементирующем режиме |
;---------------------------------------------
inc_bcd:
mov a,th1
mov dph,a
mov a,tl1
mov dpl,a
ret
;FUNCTIONS t0_overflow
;------------------------
;Декрементирующий счётчик|
;------------------------
dec_counter:
clr tr0
call dec_bcd
call bin_to_bcd
call display
setb tr0
ret
;sub FUNCTIONS dec_counter
;---------------------------------------------
;Предварительная обработка значений для работы|
; счётчика/2 в декрементирующем режиме |
;---------------------------------------------
dec_bcd:
mov a,th1
cpl a
mov dph,a
mov a,tl1
cpl a
mov dpl,a
ret
;common sub FUNCTIONS dec_counter & inc_counter
;----------------------------------------------------
;Подготовка значений для отображения функцией DISPLAY|
; во время работы дв. |
;----------------------------------------------------
bin_to_bcd:
mov disp0,#2fh ;устанавливаем
mov disp1,#30h ;начальные
mov disp2,#30h ;значения
bin_to_bcd_go:
inc disp0 ;подсчёт едениц
dec_dptr:
dec dpl ;ументшаем dptr
mov a,dpl ;пока не станет
cjne a,#0ffh,bin_to_bcd_m1 ;равен 0ffh
dec dph
bin_to_bcd_m0:
mov a,disp0
cjne a,#3ah,bin_to_bcd_go ;если переполнение едениц
inc disp1 ;подсчёт десятков
mov disp0,#30h
mov a,disp1
cjne a,#3ah,bin_to_bcd_go ;если переполнение десятков
inc disp2 ;подсчёт сотен
mov disp1,#30h
mov a,disp2
cjne a,#3ah,bin_to_bcd_go ;если переполнение сотен
overload_bcd: ;пишем Е в разряд сотен
mov disp2,#3eh
sjmp bin_to_bcd_exit ;выход, если переполнение сотен
bin_to_bcd_m1:
mov a,dph ;выход, если значения
cjne a,#0ffh,bin_to_bcd_m0 ;подготовлены
bin_to_bcd_exit:
ret
;common sub FUNCTIONS dec_counter & inc_counter
;-------------------------------------------
;Отображение чисел по адресам предварительно|
; записаных в disp0, disp1, disp2 |
;-------------------------------------------
display:
mov r0,disp2
mov p0,@r0
mov p2,#1h
call time1
mov r0,disp1
mov p0,@r0
mov p2,#2h
call time1
mov r0,disp0
mov p0,@r0
mov p2,#4h
call time1
clr p2.2
ret
;-------------------------------------------------
;Обслуживание прерывания при переполнении счётчика|
;-------------------------------------------------
t1_overflow:
clr tr0 ;запретить счёт таймеру
clr tr1 ;запретить счёт счётчику
mov p0,#0
call stop
setb yet
setb tr0 ;разрешить счёт таймеру
setb tr1 ;разрешить счёт счётчику
reti
;FUNCTIONS t1_overflow
;---------------------------
;Паузa перед следующим движением двигателя|
;---------------------------
stop:
call on_all
call pause
clr yet
ret
;sub FUNCTIONS stop
;------------------
;Изменяющаяся пауза|
;------------------
pause:
push 7
push 5
mov r0,pauses
mov a,@r0
mov r3,a
inc r3
t55: mov r4,#05h
t66: mov r5,#0a0h
t77: mov r7,#0ffh
djnz r7,$
djnz r5,t77
djnz r4,t66
djnz r3,t55
pop 5
pop 7
ret
если кто то захочет разбираться, я могу продолжать,
думаю некто не захочет