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

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

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

Сообщение 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]
sashavir
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Вт дек 30, 2014 21:35:51

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

Сообщение sashavir »

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

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

Сообщение zhu4er »

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

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

Сообщение sashavir »

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

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

Сообщение Lavad »

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

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

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

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

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

Сообщение dgrett »

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

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

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

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

Сообщение 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ю и стану профессором.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

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

Сообщение dosikus »

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

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

Сообщение dgrett »

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

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

Сообщение akl »

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

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

Сообщение dgrett »

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

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

Сообщение akl »

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

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

Сообщение Repytw »

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

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

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

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

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

Сообщение Repytw »

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

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

Сообщение Jack_A »

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

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

Сообщение 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ю и стану профессором.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15553
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

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

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

Сообщение dgrett »

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

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