Дребезг кнопки (а может и нет) ATmega8a

Обсуждаем контроллеры компании Atmel.
Ответить
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Вт дек 30, 2014 21:35:51

Сообщение sashavir »

Хоть плачь, не могу понять, то ли в программе неправильно что-то делаю, то ли дребезг виноват, помогите, пожалуйста! Люди добрые! В отладчике все работает идеально...

Сам код
Спойлер

Код: Выделить всё

;Переключение светодиодов

.include "D:\Atmel\include\m8adef.inc"

.def temp=r17
.def time=r18

;частота 4 МГц


;= Start macro.inc ==============


;= End macro.inc ================


; RAM =========
                  .DSEG          


; FLASH =======
                  .CSEG                
         .ORG 0              
RJMP Reset                   ; (RESET)
         .ORG INT0addr
RJMP Button                 ; (INT0) External Interrupt Request 0
         .ORG INT1addr
         RETI                       ; (INT1) External Interrupt Request 1
         .ORG OC2addr
         RETI		    ; (TIMER2 COMP) Timer/Counter2 Compare Match
         .ORG OVF2addr
         RETI                       ; (TIMER2 OVF) Timer/Counter2 Overflow
         .ORG ICP1addr
         RETI		    ; (TIMER1 CAPT) Timer/Counter1 Capture Event
         .ORG OC1Aaddr
         RETI                       ; (TIMER1 COMPA) Timer/Counter1 Compare Match A
         .ORG OC1Baddr
         RETI                       ; (TIMER1 COMPB) Timer/Counter1 Compare Match B
         .ORG OVF1addr
         RETI                       ; (TIMER1 OVF) Timer/Counter1 Overflow
         .ORG OVF0addr
RJMP Timer                   ; (TIMER0 OVF) Timer/Counter0 Overflow
         .ORG SPIaddr
         RETI                       ; (SPI,STC) Serial Transfer Complete
         .ORG URXCaddr
         RETI                       ; (USART,RXC) USART, Rx Complete
         .ORG UDREaddr
         RETI                       ; (USART,UDRE) USART Data Register Empty
         .ORG UTXCaddr
         RETI                       ; (USART,TXC) USART, Tx Complete
         .ORG ADCCaddr
         RETI		    ; (ADC) ADC Conversion Complete
         .ORG ERDYaddr
         RETI                        ; (EE_RDY) EEPROM Ready
         .ORG ACIaddr
         RETI                        ; (ANA_COMP) Analog Comparator
         .ORG TWIaddr
         RETI                        ; (TWI) 2-wire Serial Interface
         .ORG SPMRaddr
         RETI                        ; (SPM_RDY) Store Program Memory Ready

;==========программа===========
Reset:
                 LDI  temp,Low(RAMEND)     ;инициализация стека
	         OUT  SPL,temp
 
	         LDI  temp,High(RAMEND)
	         OUT  SPH,temp

		 LDI  temp,$FF                 ;порт B на выход
		 OUT  DDRB,temp

		 LDI  temp,$01                  ;зажигаю первый светодиод
		 OUT  PortB,temp

		 LDI  temp,$04                 ;подтягивающий резистр на INT0
		 OUT  PortD,temp

		 LDI  temp,(1<<TOIE0)      ;разрешаю прерывания по переполнению Timer0
		 OUT  TIMSK,temp
		 
		 LDI  temp,(1<<ISC01)      ;прерывание по спаду INT0
		 OUT  MCUCR,temp

		 LDI  temp,(1<<INT0)       ;разрешить прерывание INT0
		 OUT  GICR,temp

		 SEI

prog:         RJMP prog                                          ;бесконечный цикл, будь он неладен...

Button:  
                 LDI  time,128             ;время задержки таймера 0.5 с

                 LDI  temp,$00             ;запрет прерывания INT0
		 OUT  GICR,temp

		 LDI  temp,$03             ;запуск таймера 1:64
		 OUT  TCCR0,temp

		 RETI
Timer:  
                 DEC  time
		 BREQ Stop_timer

		 RETI

Stop_timer:
                 LDI  temp,$00             ;остановка таймера 1:64
		 OUT  TCCR0,temp

		 IN   temp,PortB           ;чтение PortB
		 CPI  temp,$80             ;если зажен последний диод, то зажечь первый
		 BREQ Restart
		 LSL  temp                    ;иначе логический сдвиг влево
		 OUT  PortB,temp           ;зажечь следующий

		 LDI  temp,(1<<INT0)       ;разрешить прерывание INT0
		 OUT  GICR,temp

		 RETI

Restart:
                 LDI  temp,$01
		 OUT  PortB,temp

		 LDI  temp,(1<<INT0)       ;разрешить прерывание INT0
		 OUT  GICR,temp

		 RETI
		  
; EEPROM ======
                  .ESEG                ;EEPROM

Схема, только там указанно 5 светодиодов, на самом деле их 8, просто схематично показано подключение
СпойлерИзображение
видео
Спойлер[youtube]http://www.youtube.com/watch?v=X0zZ2KgWvX4&feature=youtu.be[/youtube]
Реклама
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Вт дек 30, 2014 21:35:51

Сообщение sashavir »

вопрос отпадает, на другом форуме посоветовали конденсатор поставить, действительно, воткнул перед кнопкой конденсатор, дребезжание пропало...
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 544
Зарегистрирован: Пт июн 04, 2010 17:40:13
Откуда: Непокорный город-герой Севастополь

Сообщение zhu4er »

я так понял Вы кнопку на внешнее прерывание посадили? А зачем? Для обычной тактовой кнопки лучше обычное сканирование ножки порта. Тогда можно после опроса кнопки сделать задержку в четверть секунды, для удаления дребезга.
Даже у стен есть уши...
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Вт дек 30, 2014 21:35:51

Сообщение sashavir »

Да тут конкретной цели не преследую, просто учусь использовать прерывания, в том числе и INT0, я еще много чего не умею...
Реклама
Эиком - электронные компоненты и радиодетали
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 33
Зарегистрирован: Сб апр 20, 2013 22:56:52

Сообщение Lavad »

[uquote="sashavir",url="/forum/viewtopic.php?p=2262382#p2262382"]... конденсатор ... перед кнопкой...[/uquote]
Подключили к точке соединения с R6? Какой емкости?
О человеке говорят не потоки изрыгаемых слов, а его дела и поступки.
Реклама
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

[uquote="sashavir",url="/forum/viewtopic.php?p=2262382#p2262382"]на другом форуме посоветовали конденсатор поставить[/uquote]Плохой совет.
При нажатии на кнопку, через неё будет разряжаться конденсатор. Чем чревато это, надеюсь не нужно объяснять...
Реклама
Вымогатель припоя
Сообщения: 615
Зарегистрирован: Вс дек 28, 2014 21:54:05

Сообщение dgrett »

IN temp,PortB ;чтение PortB. ?

Надо бы так, я думаю:
IN temp,PINB ;чтение PortB

После
OUT GICR,temp
добавьте
OUT GIFR,temp, этим очистите флаг прерывания
Я всё-всё узнAю и стану профессором.
Вымогатель припоя
Сообщения: 615
Зарегистрирован: Вс дек 28, 2014 21:54:05

Сообщение dgrett »

Здравствуйте, господа:) Прошу разъяснить мне тупому по войне с дребезгом. У меня 6 концевиков + 2 оптопары на просвет, посему взял алгоритм с использованием вертикального счётчика. В паутине нашёл вот это:
http://embedders.org/blog/gdi/debouncing.html
Там на Сях, но мой проект на асме. По этому алгоритму сделал на асме, но никак не вкурю, по какому признаку из этого алгоритма можно узнать, что дребезг отсеян и состояние входов изменилось и данные можно забрать. Не хочется каждый проход сравнивать прошлое и настоящее состояние. Может, как-то из уже имеющихся данных можно определить, что уже пора идти за данными?
Алгоритм понравился, сразу 8 входов за 2.75uS на итерацию при 8 MHz.
C:
Спойлер

Код: Выделить всё

    unsigned char debounce(unsigned char sample, unsigned char *toggle)
{
    static unsigned char state, cnt0, cnt1;
    unsigned char delta;
 
    delta = sample ^ state;
    cnt1 = (cnt1 ^ cnt0) & delta;
    cnt0 = ~cnt0 & delta;
 
    *toggle = delta & ~(cnt0 | cnt1);
    state ^= *toggle;
 
    return state;
}
 */
asm:
Спойлер

Код: Выделить всё

Debounce:
	ldi	r30,timConst
	out	tcnt0,r30          ;start over TC0
	in	sample,pinb
	mov	delta,sample
	eor	delta,state
	mov	temp,cnt1
	eor	temp,cnt0
	and	temp,delta
	mov	cnt1,temp
	com	cnt0
	and	cnt0,delta
	mov	temp,cnt0
	or	temp,cnt1
	com	temp
	mov	toggle,delta
	and	toggle,temp
	eor	state,toggle
        reti
Я всё-всё узнAю и стану профессором.
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

Когда они отличные от нуля. Вы читать-то хоть пытались?
И какой дребезг может быть у оптопар?
Вымогатель припоя
Сообщения: 615
Зарегистрирован: Вс дек 28, 2014 21:54:05

Сообщение dgrett »

[uquote="dosikus",url="/forum/viewtopic.php?p=3495300#p3495300"]Когда они отличные от нуля. Вы читать-то хоть пытались?
И какой дребезг может быть у оптопар?[/uquote]
Да читал, читал.
Отличные от нуля - кто? счётчики? Так это не так, Toggle? Опять не то..
А у оптопары, у которых прорези ползут еле-еле, а назад очень быстро (расчёска такая), которая может быть и в масле и в чём ещё хочешь, считаю, дребезг очень даже может быть. Не такой, как у механических контактов, но... нам его не надо.
Я всё-всё узнAю и стану профессором.
akl
Друг Кота
Сообщения: 4462
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

[uquote="dgrett",url="/forum/viewtopic.php?p=3495213#p3495213"]... по какому признаку из этого алгоритма можно узнать, что дребезг отсеян и состояние входов изменилось и данные можно забрать...[/uquote]Интересный алгоритм. Написал тестовую программку отсекающую все изменения на время 32мсек. Данные о состоянии входов забираются из R0 в любой момент, а вот изменение оного с периодом 32мсек.
TEST_Debounce.zip
(1.17 КБ) 229 скачиваний
Вымогатель припоя
Сообщения: 615
Зарегистрирован: Вс дек 28, 2014 21:54:05

Сообщение dgrett »

Т.е. каждые 32,768 мс просыпаемся и прокручиваем Debounce. Но если во время отсеивания появится сигнал на другом входе(дребезг, помеха), результат в R0 будет неверным. Следует прежде проверить счётчики на 0. Если не 0 - данные не берём. Хотя.. Исполнительные механизмы - гидравлика в моём случае - штука тормозная и пока среагирует, отсеится и этот новый дребезг
Я всё-всё узнAю и стану профессором.
akl
Друг Кота
Сообщения: 4462
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Каждые 8,192мс просыпаемся, вызываем Debounce и если есть дребезг, счетчик сбрасывается и так до тех пор, пока 4 раза не подтвердится состояние, т.е. будет в R0 записано новое значение. Значение может оказаться и прежним.
Открыл глаза
Аватара пользователя
Сообщения: 54
Зарегистрирован: Вс апр 15, 2012 23:29:00
Откуда: Воронеж

Сообщение Repytw »

Alex писал(а): Плохой совет.
При нажатии на кнопку, через неё будет разряжаться конденсатор. Чем чревато это, надеюсь не нужно объяснять...
Я случайно наткнулся на запись.
Установка конденсатора вроде всегда было самым распространенным способом борьбы с дребезгом контактов. Токи будут не значительные благодаря подтягивающим резисторам и при нажатии на кнопку конденсатор будет РАЗряжаться, судя по схеме.
Ваша реплика мне неясна.
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Repytw писал(а):конденсатор будет РАЗряжаться
А я что написал ? :)
Открыл глаза
Аватара пользователя
Сообщения: 54
Зарегистрирован: Вс апр 15, 2012 23:29:00
Откуда: Воронеж

Сообщение Repytw »

А, блин, проступил. Вы за кнопку переживаете, а не за вывод порта. Тогда ясно.
Друг Кота
Аватара пользователя
Сообщения: 6336
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

100Ом в разрядную цепь - и проблемы нет. Азбука схемотехники.
Изображение
Вымогатель припоя
Сообщения: 615
Зарегистрирован: Вс дек 28, 2014 21:54:05

Сообщение dgrett »

[uquote="akl",url="/forum/viewtopic.php?p=3495745#p3495745"]Каждые 8,192мс просыпаемся, вызываем Debounce и если есть дребезг, счетчик сбрасывается и так до тех пор, пока 4 раза не подтвердится состояние, т.е. будет в R0 записано новое значение. Значение может оказаться и прежним.[/uquote]
Опять вопрос. У меня софтовый таймер тикает каждую 1 мс. Если таймер от дребезга сбрасывается, то зачем ждать ещё 30-40мс после окончания дребезга? Ну считаем 4 раза(4мс) установившееся значение и всё, зафиксировали. Зачем ждать ещё? Неясно сказал, наверно.
Нажали кнопку, дребезжит. Пока дребезжит, state не меняется. Дребезг прошел,4 раза считали sample, не поменялось- фиксируем. Итого после окончания дребезга 4 мс. Какова вероятность, что во время дребезга поймаем 4 одинаковых sample?
Я всё-всё узнAю и стану профессором.
Друг Кота
Аватара пользователя
Сообщения: 15674
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Зачем столько раз?
при начальном скане обнаруживаем какое-то отличие от "полного покоя"
дублируем содержимое ЛВК в буфер и ждем следующего скана
ежли содержимое совпало - отработка исполнения, ежли нет - перезапись буфера вновь обнаруженным и повтор с самого начала.
:roll:
Вымогатель припоя
Сообщения: 615
Зарегистрирован: Вс дек 28, 2014 21:54:05

Сообщение dgrett »

ЛВК - это что, простите? :roll:
Следующий скан через 1 мс.
Я всё-всё узнAю и стану профессором.
Ответить

Вернуться в «AVR»