Предотвращение дребезга

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
kras
Опытный кот
Сообщения: 782
Зарегистрирован: Вт апр 26, 2011 18:37:06

Предотвращение дребезга

Сообщение 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                     ; конец программы
Подскажите про оптимизацию и как убрать дребезг. Блин, только условие при друх ногах не доделал, но сейчас нет времени.
На практике можно не успеть сделать того, что можно хорошо обосновать в теории. Но без практики теория может отдаляться от нее, и когда они встретятся снова - не узнает даже неприкосновенное шампанское профессора в лаборатории. Моя практика: robofeya.ru
Реклама
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: Предотвращение дребезга

Сообщение pyzhman »

ТИ выполняются инверсией порта через определенные промежутки времени. Эти временные промежутки можно задать либо программной задержкой (nop'ы), либо использованием таймера. От дребезга уходят опросом порта, к которому присоединена кнопка, через порядка нескольких десятков мсек. Если два последовательных опроса дали один и тот же результат, то принимается решение о нажатии/отпускании кнопки. Дребезг т.о. устраняется, при этом очень удобно вылавливать момент именно нажатия/отпускания, что иногда очень нужно.
мутишь такты
Их не мутишь, а сепарируешь, если можно так выразиться! Простите, не сдержался.
Docendo discimus
Реклама
kras
Опытный кот
Сообщения: 782
Зарегистрирован: Вт апр 26, 2011 18:37:06

Re: Предотвращение дребезга

Сообщение kras »

ТИ выполняются инверсией порта через определенные промежутки времени
Не знаю, как в моем случае это поможет, даже на низкой тактовой частоте будет неудобно все время следить по секундомеру, как долго я подаю на вход данных 0 или 1.
На практике можно не успеть сделать того, что можно хорошо обосновать в теории. Но без практики теория может отдаляться от нее, и когда они встретятся снова - не узнает даже неприкосновенное шампанское профессора в лаборатории. Моя практика: robofeya.ru
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: Предотвращение дребезга

Сообщение pyzhman »

kras писал(а):как в моем случае это поможет
Что-то я не понимаю, вы чего хотите-то?
Docendo discimus
Реклама
Эиком - электронные компоненты и радиодетали
kras
Опытный кот
Сообщения: 782
Зарегистрирован: Вт апр 26, 2011 18:37:06

Re: Предотвращение дребезга

Сообщение 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 символа передал. Вот так хочу, вроде же все правильно логически?
На практике можно не успеть сделать того, что можно хорошо обосновать в теории. Но без практики теория может отдаляться от нее, и когда они встретятся снова - не узнает даже неприкосновенное шампанское профессора в лаборатории. Моя практика: robofeya.ru
Реклама
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: Предотвращение дребезга

Сообщение 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
Реклама
kras
Опытный кот
Сообщения: 782
Зарегистрирован: Вт апр 26, 2011 18:37:06

Re: Предотвращение дребезга

Сообщение kras »

Там есть раздел "Неименованные константы", в котором пишут, что прямая адресация является дурным тоном и нужно использовать косвенную:) Ну а в общем да, оформленный по традициям код поудобнее читать. Прочитал вместо Корабельникова.
На практике можно не успеть сделать того, что можно хорошо обосновать в теории. Но без практики теория может отдаляться от нее, и когда они встретятся снова - не узнает даже неприкосновенное шампанское профессора в лаборатории. Моя практика: robofeya.ru
Аватара пользователя
testerplus
Встал на лапы
Сообщения: 130
Зарегистрирован: Пн авг 24, 2009 10:41:16
Откуда: SPb
Контактная информация:

Re: Предотвращение дребезга

Сообщение testerplus »

kras писал(а):Там есть раздел "Неименованные константы", в котором пишут, что прямая адресация является дурным тоном и нужно использовать косвенную:)
Это где такое написано? Там дурным тоном названо "использование неименованных констант в оперативной части кода". К адресации не имеет отношения (и уж тем более там нет ничего о подмене прямой адресации косвенной)
kras
Опытный кот
Сообщения: 782
Зарегистрирован: Вт апр 26, 2011 18:37:06

Re: Предотвращение дребезга

Сообщение kras »

В любом случае при косвенной адресации в квадратные скобки заключается регистр, а при прямой - цифра. Там не написано, но логически предполагается идея об оформлении косвенной адресации. Иначе как-то странно, что при адресации переменную можно не инициализировать, а при других операциях она вдруг оказалась такой важной.
На практике можно не успеть сделать того, что можно хорошо обосновать в теории. Но без практики теория может отдаляться от нее, и когда они встретятся снова - не узнает даже неприкосновенное шампанское профессора в лаборатории. Моя практика: robofeya.ru
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3384
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: Предотвращение дребезга

Сообщение Мурик »

kras писал(а):Суть в том, что параллельно к моей теме о ручном программировании надо бы сделать генератор ТИ и просто сигнала, чтобы при нажатии на одну кнопку на первый выход поступала 1, а при нажатии на другую - на второй. Пока я так понял: мутишь такты и в каждый такт либо подаешь на канал данных сигнал, либо нет.
А не лучше ли в таком случае, программирование микроконтроллера возложить на другой микроконтроллер?
А прошивка будет во внешней памяти, например, типа 24Cxx.
Заливать ее можно с помощью компа, через COM порт, подключившись к микроконтроллеру-программатору.
Это будет куда быстрее и надежнее, чем ручное программирование!
Аватара пользователя
testerplus
Встал на лапы
Сообщения: 130
Зарегистрирован: Пн авг 24, 2009 10:41:16
Откуда: SPb
Контактная информация:

Re: Предотвращение дребезга

Сообщение testerplus »

kras писал(а):В любом случае при косвенной адресации в квадратные скобки заключается регистр, а при прямой - цифра.
Что?? В тексте MPASM_formatting.pdf ни слова о квадратных скобках.
Там не написано, но логически предполагается идея об оформлении косвенной адресации.
Я автор этого текста, и ничего такого там логически не предполагается.
Иначе как-то странно, что при адресации переменную можно не инициализировать, а при других операциях она вдруг оказалась такой важной.
Формулируйте четче. Ничего не понял в этом предложении.
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»