Страница 1 из 1
Предотвращение дребезга
Добавлено: Ср май 04, 2011 03:13:18
kras
Пацаны, нубский вопрос, конечно, но я читаю литературу, просто пока не могу сообразить. Может подскажите хоть, где это есть? Суть в том, что параллельно к моей теме о ручном программировании надо бы сделать генератор ТИ и просто сигнала, чтобы при нажатии на одну кнопку на первый выход поступала 1, а при нажатии на другую - на второй. Пока я так понял: мутишь такты и в каждый такт либо подаешь на канал данных сигнал, либо нет. Ну то есть скорость не важна (PIC), жмешь на данные 1, а затем прогоняешь такт (фронт нужен?) Хотелось бы сегодня прошить девайс- генератор до 5 часов (ограничение в связи с тем, что в это время могу воспользоваться программатором у знакомого), так что хэлп. Я пока соображаю только, как собрать программу, единожды проверяющую входной регистр. Но тогда будет дребезг. Может я в корне хочу использовать неправильный метод, кстати, и есть что-нибудь проще? Ну, вроде бы, дребезг надо устранить, если он будет в тактах, то я подам лишний символ. Вот начальный код, от которого я исхожу:
Код: Выделить всё
LIST P=PIC16F84A
__CONFIG H'3FF2'
STATUS EQU H'0003'
TRISA EQU H'0005'
PORTA EQU H'0005'
TRISB EQU H'0006'
PORTB EQU H'0006'
org 0 ; начало программы
; подготовительные моменты
bsf STATUS,5 ; переход в Банк 1
movlw b'00011111'
movwf TRISA
clrf TRISB
bcf STATUS,5 ; переход назад в Банк 0
clrf PORTB ; очистка порта
; отслеживание нажатия кнопки
m1 clrf PORTB
m2 btfsc PORTA,1 ; проверка ножки RA1
goto ma
goto m4 ; нету одного сигнала, проверяем второй
ma movlw b'10000000'
movwf PORTB
m3 btfsc PORTA,2
goto mb
goto m2 ; нету второго сигнала - к началу без стирания
mb movlw b'11000000' ; если 2 сигнала
movwf PORTB
goto m2
m4 btfsc PORTA,2
goto mc
goto m1 ; вообще ничего не было
mc movlw b'01000000' ; нету первого сигнала, но есть второй, нужно включить только второй
movwf PORTB
goto m2
end ; конец программы
Подскажите про оптимизацию и как убрать дребезг. Блин, только условие при друх ногах не доделал, но сейчас нет времени.
Re: Предотвращение дребезга
Добавлено: Ср май 04, 2011 06:40:25
pyzhman
ТИ выполняются инверсией порта через определенные промежутки времени. Эти временные промежутки можно задать либо программной задержкой (nop'ы), либо использованием таймера. От дребезга уходят опросом порта, к которому присоединена кнопка, через порядка нескольких десятков мсек. Если два последовательных опроса дали один и тот же результат, то принимается решение о нажатии/отпускании кнопки. Дребезг т.о. устраняется, при этом очень удобно вылавливать момент именно нажатия/отпускания, что иногда очень нужно.
мутишь такты
Их не мутишь, а сепарируешь, если можно так выразиться! Простите, не сдержался.
Re: Предотвращение дребезга
Добавлено: Ср май 04, 2011 06:59:59
kras
ТИ выполняются инверсией порта через определенные промежутки времени
Не знаю, как в моем случае это поможет, даже на низкой тактовой частоте будет неудобно все время следить по секундомеру, как долго я подаю на вход данных 0 или 1.
Re: Предотвращение дребезга
Добавлено: Ср май 04, 2011 07:22:20
pyzhman
kras писал(а):как в моем случае это поможет
Что-то я не понимаю, вы чего хотите-то?
Re: Предотвращение дребезга
Добавлено: Ср май 04, 2011 08:38:28
kras
Вот вариант для программирования, но устранение дребезка мне кажется совсем не оптимальным. Ну можно еще проверки добавить, но все же. Говорите, не стесняйтесь, что можно проще сделать. А то как-то перегружаем мы МК, нельзя так относиться к нашему товарищу-микросхеме!:)
Код: Выделить всё
LIST P=PIC16F84A
__CONFIG H'3FF2'
STATUS EQU H'0003'
TRISA EQU H'0005'
PORTA EQU H'0005'
TRISB EQU H'0006'
PORTB EQU H'0006'
org 0 ; начало программы
; подготовительные моменты
bsf STATUS,5 ; переход в Банк 1
movlw b'00011111'
movwf TRISA
clrf TRISB
bcf STATUS,5 ; переход назад в Банк 0
clrf PORTB ; очистка порта
; отслеживание нажатия кнопки
m1 clrf PORTB
m2 btfsc PORTA,1 ; проверка ножки RA1
goto ma
goto m4 ; нету одного сигнала, проверяем второй
ma btfsc PORTA,1 ; борьба с дребезгом
goto ma1
goto m4
ma1 movlw b'10000000'
movwf PORTB
m3 btfsc PORTA,2
goto mb
goto m2 ; нету второго сигнала - к началу без стирания
mb btfsc PORTA,2
goto mb1
goto m2
mb1 movlw b'11000000' ; если 2 сигнала
movwf PORTB
btfsc PORTA,1
goto m1a
goto m2
m1a btfsc PORTA,2
goto mb ; не очень оптимизировано, но если сигнал не пропал, остается в миницикле
goto m2
m4 btfsc PORTA,2
goto mc
goto m1 ; вообще ничего не было
mc btfsc PORTA,2
goto mc1
goto m1
mc1 movlw b'01000000' ; нету первого сигнала, но есть второй, нужно включить только второй
movwf PORTB
goto m2
end ; конец программы
Хочу программировать так. Выделим два канала: данных и тактовых импульсов. Каждый символ из бинарника нужно передавать за 1 такт. У меня ручной ввод, хочу именно жать на кнопку. Следовательно, если в начале кода стоит, например, "010", то можно сделать так: жму кнопку такта и отпускаю, кнопку данных не трогаю, тогда с выхода моего устройства для программирования выйдет один такт и в мк поступит "0". Теперь зажал единицу на входе данных и снова делаю такт (нажал и отпустил кнопку такта). Последний ноль - еще раз жму такт и отпускаю. 3 символа передал. Вот так хочу, вроде же все правильно логически?
Re: Предотвращение дребезга
Добавлено: Ср май 04, 2011 12:15:47
urry
ну ... вот статья тестера, почитайте вместо Карабельникова, потому что код - ...
http://www.pic24.ru/doku.php/osa/articl ... formatting
Я бы как-то так сделал, код не проверял, разбирайся
Код: Выделить всё
list p=16f84
include <p16f84.inc>
__CONFIG (_HS_OSC & _WDT_OFF & _CP_OFF)
radix dec
ERRORLEVEL -302
F_OSC equ .4000000 ; Тактовая частота (Гц)
; Параметры TMR0
;-------------------------------------------------------------------------------
;входная частота на таймер
TMR0_FREQ equ F_OSC/256 ; тактовая на 4 и пределитель на 64
TMR0_PRS_CONST equ 0x05 ; пределитель на 64
TMR0_FREQ_OUT equ .100 ; 10 mc 100 Hrz
TMR0_CONST equ TMR0_FREQ/TMR0_FREQ_OUT
; Проверка, что получили константу, соответствующую разрядности TMR8 (не более 8 бит)
#if TMR0_CONST >= 256
error Неправильно выбрана константа TMR0_PRS_CONTS! Следует увеличить ее значение!
#endif
TMR0_REAL equ 256 - TMR0_CONST
;-------------------------------------------------------------------------------
#define BUTTON_DATA 0 ;ножка порт а, 0
#define BUTTON_CLOCK 1 ;ножка порт а, 1
#define TEST_BUTTON_CLOCK btfsc PORTA,BUTTON_CLOCK
;--------------------------------------------------
#define OUT 0 ;ножка порт b, 0 выход
#define OUT_1 bsf PORTB,OUT
#define OUT_0 bcf PORTB,OUT
;--------------------------------------------------
CBLOCK 0x0C
cData
ENDC
;--------------------------------------------------
org 0
goto start
start:
call Initial
main:
TEST_BUTTON_CLOCK
goto main
call Delay10Ms
TEST_BUTTON_CLOCK
goto main ; игнорируем дребезг
reply:
movf PORTA,w ;нажата по-взрослому клок, анализ данных
andlw (1<<BUTTON_DATA)
movwf cData
call Delay10Ms
movf PORTA,w
andlw (1<<BUTTON_DATA)
;сравниваем с предыдущим значением
xorwf cData,w
btfss STATUS,Z ; если значения равны
goto reply ; повторять, пока не сравняются
btfss cData,BUTTON_DATA
goto OutInvers
OUT_1
free:
movf PORTA,w; ждем отпускания клавиши клок
andlw (1<<BUTTON_CLOCK)
btfsc STATUS,Z ;
goto free ; повторять, пока не отпустит
call Delay10Ms
movf PORTA,w; повтор для уверенности
andlw (1<<BUTTON_CLOCK)
btfsc STATUS,Z ;
goto free ; назад
goto main
;----------------------------------------------------
OutInvers:
OUT_0
goto free
;----------------------------------------------------
Delay10Ms:
banksel TMR0
movlw TMR0_REAL
movwf TMR0
bcf INTCON, T0IF
LoopDelay
btfss INTCON, T0IF
goto LoopDelay
return
;-------------------------
Initial:
banksel TRISA
movlw 0xff
movwf TRISA
banksel OPTION_REG
movlw TMR0_PRS_CONST
movwf OPTION_REG
movlw 0
movwf TRISB
banksel PORTB
movwf PORTB
return
;--------------------------
end
Re: Предотвращение дребезга
Добавлено: Ср май 04, 2011 15:24:45
kras
Там есть раздел "Неименованные константы", в котором пишут, что прямая адресация является дурным тоном и нужно использовать косвенную:) Ну а в общем да, оформленный по традициям код поудобнее читать. Прочитал вместо Корабельникова.
Re: Предотвращение дребезга
Добавлено: Ср май 04, 2011 16:15:09
testerplus
kras писал(а):Там есть раздел "Неименованные константы", в котором пишут, что прямая адресация является дурным тоном и нужно использовать косвенную:)
Это где такое написано? Там дурным тоном названо
"использование неименованных констант в оперативной части кода". К адресации не имеет отношения (и уж тем более там нет ничего о подмене
прямой адресации
косвенной)
Re: Предотвращение дребезга
Добавлено: Чт май 05, 2011 18:53:11
kras
В любом случае при косвенной адресации в квадратные скобки заключается регистр, а при прямой - цифра. Там не написано, но логически предполагается идея об оформлении косвенной адресации. Иначе как-то странно, что при адресации переменную можно не инициализировать, а при других операциях она вдруг оказалась такой важной.
Re: Предотвращение дребезга
Добавлено: Чт май 05, 2011 20:16:50
Мурик
kras писал(а):Суть в том, что параллельно к моей теме о ручном программировании надо бы сделать генератор ТИ и просто сигнала, чтобы при нажатии на одну кнопку на первый выход поступала 1, а при нажатии на другую - на второй. Пока я так понял: мутишь такты и в каждый такт либо подаешь на канал данных сигнал, либо нет.
А не лучше ли в таком случае, программирование микроконтроллера возложить на другой микроконтроллер?
А прошивка будет во внешней памяти, например, типа 24Cxx.
Заливать ее можно с помощью компа, через COM порт, подключившись к микроконтроллеру-программатору.
Это будет куда быстрее и надежнее, чем ручное программирование!
Re: Предотвращение дребезга
Добавлено: Чт май 05, 2011 21:22:44
testerplus
kras писал(а):В любом случае при косвенной адресации в квадратные скобки заключается регистр, а при прямой - цифра.
Что?? В тексте MPASM_formatting.pdf ни слова о квадратных скобках.
Там не написано, но логически предполагается идея об оформлении косвенной адресации.
Я автор этого текста, и ничего такого там логически не предполагается.
Иначе как-то странно, что при адресации переменную можно не инициализировать, а при других операциях она вдруг оказалась такой важной.
Формулируйте четче. Ничего не понял в этом предложении.