Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
23.12.2011, 08:43
|
|
Гражданин KAZUS.RU
Регистрация: 25.11.2008
Адрес: Волгоград
Сообщений: 507
Сказал спасибо: 42
Сказали Спасибо 49 раз(а) в 46 сообщении(ях)
|
Re: Помогите начинающему по ATmega8515
Сообщение от E_C_C
|
Доброго времени, ТС не будет против если задам вопрос тут ?, не создавая новую тему .
Насколько точен внутренний генератор 8 меги ?. Включил внутренний тактовый на 8Мгц, предделитель на 256 , получаю на входе таймера 31,25 Кгц. В интервал 100гц должен попасть 312-й тик таймера (прерывание по совпадению), вместо этого уже на 250 - 260 тике выхожу за предел 100гц интервала. Неужто настолько высокая погрешность ?
|
Так в даташите вроде все расписано про генератор...
|
|
|
|
23.12.2011, 13:53
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.10.2007
Сообщений: 2,760
Сказал спасибо: 1,105
Сказали Спасибо 1,037 раз(а) в 569 сообщении(ях)
|
Re: Помогите начинающему по ATmega8515
Про дребезг.
Почему надо обрабатывать дребезг - потому что нужно различать событие "нажатие" от события "отпускание". И в первом и во втором случае вы имеете ряд импульсов разной длительности с паузами разной длительности. (Процесс хорошо наблюдается в осциллографе).
Те, кто хочет побыстрее и попроще, ставят задержку. Измеряется уровень сигнала через 50 мс после прихода первого фронта. Надеются, что к этому времени переходной процесс закончился, "а если что не так, заменим кнопку". Если фронт создаётся помехой, задержка отрабатывает и с большой вероятностью второй опрос следующую помеху не ловит. От микрика с щелкающей латунной пружиной дребезг длится 5-15мс. Видел переходные процессы от резиновых (новых) кнопок длительностью больше 200 мс. Кто не верит - пусть посмотрит в пульте от телевизора. Сколько нажатий отработает такая кнопка через задержки - неведомо. Особенно весело, когда такие ухари запрограммировали кнопки установки таймеров, у меня такое на микроволновке, попробуй добавить 1 минуту - ага, щас! при нажатии проскочит цифер 5 и при отпускании ещё что-нибудь. Кстати, делать задержку длиннее 100 мс уже чревато тем, что кнопка не среагирует на быстрое нажатие, клавиатура становится "тупой", хотя где-то это и не вредно.
Те, кто не прочь вникнуть и не хотят менять кнопки ( особенно, если девайс за 300-500 км), делают интегратор. Принцип: если кнопка нажата, прибавим 1. Если отжата - вычтем 1. Если досчитали до N, считаем, что кнопку нажали. Досчитали до 0 - кнопку отпустили. В этом случае, сколько бы не длился дребезг, задержка срабатывания не превысит N * период опроса + дребезг. На одну кнопку здесь тратится 1 байт памяти, в нём помещается счётчик интегратора и флаги состояний кнопки. Опрос раз в 10-20 мс.
Вот функция опроса кнопки. Перед вызовом адрес счётчика загружается в Yh:Yl, состояние пинов порта с кнопками - в регистр tmp2, маска пина - в регистр tmp3. Задаётся количество шагов интегратора (THRESHOLD).
Функция имитирует работу кнопки со щелчком. Нормальное состояние счётчика - ==THRESHOLD, например, 16. При нажатии кнопки счётчик уменьшается до 8, возникает событие DOWN и переход в состояние ON и счётчик обнуляется - аналогия прыжку пружины. Когда кнопку отпустили, интегратор опять должен отсчитать 8 шагов от 0 до 8, возникает событие UP и переход в состояние OFF. Никакие одиночные, двойные и прочие импульсы числом до THRESHOLD/2 ложных событий не вызывают. Флаги UP, DOWN, ON хранятся в младших битах интегратора и доступны другим функциям. Флаги UP и DOWN сбрасываются следующим опросом кнопки и суть флаги событий "нажатие" и "отпускание".
Код:
|
insen: //- input sensor Y -› counter, ; _______ -------
//- tmp2 - pin status, tmp3 - bit mask ; 0 1 2 3 4 5 6 7 8 9 a b c d e f
//- ‹2›, ‹3› not change ; thr/2 thresh
//- ret ctr[76432],[210]‹1› BON (status) BDOWN BUP (events) ; ‹- 9,8,7,6,5:DOWN 1,1,1:ON
//- Counter: lo nibble status (BON,..‹‹4) ; -› 1,2,3,4,5:UP a,a,a:!ON
//- hi nibble counter .
//- use reg: no!
#ifndef BUTTON_STATUSBITS
.equ BDOWN = 0 ; button events flags see insen
.equ BUP = 1
.equ BON = 2 ; button status flag 1 down / 0 up
#endif
#ifndef BUTTON_THRESHOLDS
.equ THRSTEP = $08 ; btn.cntr ++/-- (limited) THRSTEP each call
.equ BUTTON_THRESHOLD = 16*THRSTEP ; Button threshold: step*2 even! ‹31!
#endif
push tmp2
inqqq: ld tmp1,Y cbr tmp1,(1‹‹BUP)|(1‹‹BON)|(1‹‹BDOWN)
and tmp2,tmp3 breq inb1 ; pin & mask = 0 нажато ---›
cpi tmp1,BUTTON_THRESHOLD brsh PC+2 /// boff (port=hi) -›
addi tmp1,THRSTEP
cpi tmp1,BUTTON_THRESHOLD/2 brne innec
addi tmp1,BUTTON_THRESHOLD/2-THRSTEP
sbr tmp1,(1‹‹BUP) rjmp inexr ; 5: ctr=9, UP
inb1: cpi tmp1,THRSTEP breq PC+2 /// bon: ‹-
subi tmp1,THRSTEP
cpi tmp1,BUTTON_THRESHOLD/2 brne innec
cbr tmp1,$f8 sbr tmp1,THRSTEP|(1‹‹BDOWN) ; cbr,sbr not masks the cpi.brsh
innec: brsh inexr
inbdo: sbr tmp1,(1‹‹BON)
inexr: st Y,tmp1 cbr tmp1,$f8 ; filter flags
inexx: adiw Y,1 pop tmp2
ret |
Практически, при размещении счётчиков кнопок в памяти последовательно, обработка кнопок такая:
1. адрес первого счётчика в Y
2. Порт кнопок.pin в tmp2
3. Маска кнопки в tmp3
4. вызов функции опроса
5. анализ результата (tmp1)
шаги 3,4,5 повторяются для следующих кнопок.
Последний раз редактировалось makakus; 23.12.2011 в 14:04.
|
|
|
|
23.12.2011, 18:31
|
|
Гражданин KAZUS.RU
Регистрация: 04.04.2007
Сообщений: 941
Сказал спасибо: 571
Сказали Спасибо 113 раз(а) в 85 сообщении(ях)
|
Re: Помогите начинающему по ATmega8515
Сообщение от DAVE_ELEKTRIK
|
У меня реагирование идет не нажатие, а на отпускание!
|
Так вот оно это самое и есть хреново - визуально - поясняю - нажал кнопку , держу , а ничего блин не произошло - смотрится как ничего не сработало ,вдавливаю посильнее (вдруг кнопка не срабатывает-типа истерта) - опять ничего , потом ,матюкнувшись ,отпускаю наконец кнопку - а там вуаля - ну наконец-то сработало .После такого срабатывания от кнопки сразу хочется запулить устройство сразу в мусорное ведро .Вот на какую корявость Вам указывали .
P.S. А представьте себе что например и на клаве компа так по идиотски сделано - реагирование на отпускание - на такой клаве набор любого текста со смачным матом при этом вслух точняк гарантирован
Так что учитесь сразу нормально все делать ,пусть даже и понемногу - но нормально , по человечески , а не просто наскоро прогу косячить .
__________________
Короче асма кода нет !
Последний раз редактировалось pinco; 23.12.2011 в 18:51.
|
|
|
|
23.12.2011, 19:15
|
|
Гражданин KAZUS.RU
Регистрация: 04.04.2007
Сообщений: 941
Сказал спасибо: 571
Сказали Спасибо 113 раз(а) в 85 сообщении(ях)
|
Re: Помогите начинающему по ATmega8515
Сообщение от ut1wpr
|
....В свое время были разработаны как минимум два алгоритма. Срабатывание по нажатию и срабатывание по отпусканию.Первый намного сложнее в реализации. Второй имеет недостаток с отсутствием визуальной обратной связи с оператором. Посему многие драйвера кнопок (клавиатур) обслуживаются либо отдельными прерываниями по таймеру, либо встраиваются в обработчики, наиболее подходящие по временным характеристикам и непрерывности....
|
Что-то это подпадает под понятие "немного чуши" , как мне кажется . Пусть автор этого поста не обижается , но на самом деле все эти методы уже давно появились, и были , - с момента появления еще первых калькуляторов , а это уже аж с прошлого века считай известно было ,да с годков так 70-ых ,а возможно и еще раньше, а не "...в свое время было разработано...".Про обработку - да в общем все равно как и где будет у Вас находиться обработка кнопок по отношению к всей основной программе - хоть в прерываниях , хоть без прерываний через флаги с уходом на макрокуски проги или например на отдельные подпрограммы - ,лишь бы была сама обработка правильна и надежна, вариантов масса , а само время не подыскивается где-бы расположить кусок в программе ,чтобы обработка подошла по длительности - оно точно задается на месте, или может быть задана в любом другом месте например в отдельной подпрограмме выдержки 20-50 мс времени .Про сложность обработки метода на замыкание - миф - всего-то максимум с десяток другой ассемблерных строк ... и все .На С возможно выглядит даже и еще короче ,сами надеюсь там подправите у себя , для практики , хотя на С не так наглядно видно что там с кнопками и как именно в битах происходит их обработка как на асме .
__________________
Короче асма кода нет !
Последний раз редактировалось pinco; 23.12.2011 в 19:36.
|
|
|
|
27.12.2011, 20:45
|
|
Гражданин KAZUS.RU
Регистрация: 25.11.2008
Адрес: Волгоград
Сообщений: 507
Сказал спасибо: 42
Сказали Спасибо 49 раз(а) в 46 сообщении(ях)
|
Re: Помогите начинающему по ATmega8515
Подскажите пожалуйста! Я в подключаемой к main одной из функций типа void изменяю какую-ту переменную, задаваемую в той же функции, а можно ли сделать так, чтобы я мог значение этой переменной просмотреть(проверить) и в главной main функции, объявить ее глобальной? А если можно то как? Я где не пробовал назначать переменную АВРСтудия ругается, объявляю в main - в подключаемой функции пишет, что первый раз ее видит, если объявляю в подключаемой, пишет, что в main первое появление. Или надо делать возврат значения этой переменной из функции где она изменяется?
Последний раз редактировалось roma9112; 27.12.2011 в 20:48.
|
|
|
|
27.12.2011, 21:52
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: Помогите начинающему по ATmega8515
Сообщение от pinco
|
Что-то это подпадает под понятие "немного чуши" , как мне кажется . Пусть автор этого поста не обижается , но на самом деле все эти методы уже давно появились, и были , - с момента появления еще первых калькуляторов , а это уже аж с прошлого века считай известно было ,да с годков так 70-ых ,а возможно и еще раньше, а не "...в свое время было разработано...".Про обработку - да в общем все равно как и где будет у Вас находиться обработка кнопок по отношению к всей основной программе - хоть в прерываниях , хоть без прерываний через флаги с уходом на макрокуски проги или например на отдельные подпрограммы - ,лишь бы была сама обработка правильна и надежна, вариантов масса , а само время не подыскивается где-бы расположить кусок в программе ,чтобы обработка подошла по длительности - оно точно задается на месте, или может быть задана в любом другом месте например в отдельной подпрограмме выдержки 20-50 мс времени .Про сложность обработки метода на замыкание - миф - всего-то максимум с десяток другой ассемблерных строк ... и все .На С возможно выглядит даже и еще короче ,сами надеюсь там подправите у себя , для практики , хотя на С не так наглядно видно что там с кнопками и как именно в битах происходит их обработка как на асме .
|
Честное слово, не въехал в суть комментария. Тугодум. Как говорят "многабукофф", а суть за ними спряталась. Претензии к исторической хронологии? Чем отличается "давно" и "в свое время"? Именно в те годы, которые вы упоминаете, мне приходилось работать с упомянутыми алгоритмами. И какая разница, указал я поточнее годы или не указал? Для меня в них (алгоритмах) нет ничего непонятного.
Опять-таки насчет мифа о сложности. "Гораздо сложнее" и "сложность обработки" всего лишь вопрос терминологии. Вам не понравилась превосходная степень? Но это же не меняет соотношения "проще - сложнее". Ведь отрицать, что сложнее вы не станете. А уж степень сложности я специально не затрагивал, это зависит от уровня и квалификации прогера.
На практике мне подправлять ровным счетом ничего не надо. Повторяю, у меня проблем с кнопками нет.
Тем не менее, благодарю за комментарий. Я вас уважаю, как давнего (чуть не написал "вечного") апологета АСМ-а, хотя на мой взгляд и слегка воинствующего. Но это право вы вполне заслужили.
__________________
С уважением,
Vic / ut1wpr
|
|
|
|
28.12.2011, 05:10
|
|
Прописка
Регистрация: 18.10.2010
Адрес: Planet Earth )
Сообщений: 120
Сказал спасибо: 14
Сказали Спасибо 11 раз(а) в 11 сообщении(ях)
|
Re: Помогите начинающему по ATmega8515
Сообщение от pinco
|
P.S. А представьте себе что например и на клаве компа так по идиотски сделано - реагирование на отпускание - на такой клаве набор любого текста со смачным матом при этом вслух точняк гарантирован
|
Я не спорю, я с вами вполне согласен.
Но иногда требуется на отжатие, а иногда и то и другое.
Цитата:
|
Так что учитесь сразу нормально все делать ,пусть даже и понемногу - но нормально , по человечески
|
Так вот по человечески не выходит!
Разбирался с аппаратными прерываниями (INT0 прицепил кнопку) разбирался - разбирался, ничего не вкурил.
В книжке высмотрел прогу, та же программа счетчик только с прерываниями по входу INT0 и таймеру (рассматриваю пока только на ассемблере, до С позже доберусь). Алгоритм вроде такой же, как без прерываний(прогу выкладывал ранее). Залил в AVRStudio, в пошаговом режиме показало, что с второго нажатия (при отжатии) результат счета выводится на порт
Алгоритм программы не понятен, народ может подскажете? Мне сейчас трудно быстро понять, так что сильно не ругайте!
__________________
Мозги кипят, ядрить твою валентность!!! Пойду закладывать остальные ингредиенты...
|
|
|
|
28.12.2011, 08:53
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.10.2007
Сообщений: 2,760
Сказал спасибо: 1,105
Сказали Спасибо 1,037 раз(а) в 569 сообщении(ях)
|
Re: Помогите начинающему по ATmega8515
Сообщение от roma9112
|
Подскажите пожалуйста! Я в подключаемой к main одной из функций типа void изменяю какую-ту переменную, задаваемую в той же функции, а можно ли сделать так, чтобы я мог значение этой переменной просмотреть(проверить) и в главной main функции, объявить ее глобальной? А если можно то как? Я где не пробовал
|
Понимаете, в чём дело. Кроме форумов ещё существуют такие книжки - учебники. Керниган и Ричи выпустили книгу «Язык программирования Си» в 1978 году, где всё прекрасно описано. Книга настолько популярна, что заслужила народное название "K&R", прочитана миллионами человек и актуальна до сих пор. Гугль на запрос "учебник по си скачать" даёт более полумиллиона ссылок. Странно, что вам не пришло в голову пойти таким путём; поверьте, он единственно правильный.
|
|
|
|
28.12.2011, 10:05
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.05.2011
Адрес: Харьков
Сообщений: 5,049
Сказал спасибо: 592
Сказали Спасибо 3,968 раз(а) в 1,826 сообщении(ях)
|
Re: Помогите начинающему по ATmega8515
Сообщение от pinco
|
P.S. А представьте себе что например и на клаве компа так по идиотски сделано - реагирование на отпускание - на такой клаве набор любого текста со смачным матом при этом вслух точняк гарантирован
Так что учитесь сразу нормально все делать ,пусть даже и понемногу - но нормально , по человечески , а не просто наскоро прогу косячить .
|
А кнопки мыши то работают по отпусканию.
Так что DAVE_ELEKTRIK прав
Цитата:
|
Но иногда требуется на отжатие, а иногда и то и другое.
|
|
|
|
|
28.12.2011, 11:07
|
|
Гражданин KAZUS.RU
Регистрация: 25.11.2008
Адрес: Волгоград
Сообщений: 507
Сказал спасибо: 42
Сказали Спасибо 49 раз(а) в 46 сообщении(ях)
|
Re: Помогите начинающему по ATmega8515
Сообщение от makakus
|
Понимаете, в чём дело. Кроме форумов ещё существуют такие книжки - учебники. Керниган и Ричи выпустили книгу «Язык программирования Си» в 1978 году, где всё прекрасно описано. Книга настолько популярна, что заслужила народное название "K&R", прочитана миллионами человек и актуальна до сих пор. Гугль на запрос "учебник по си скачать" даёт более полумиллиона ссылок. Странно, что вам не пришло в голову пойти таким путём; поверьте, он единственно правильный.
|
Ну почему же, пришло, только я сейчас на Подбельском с Фоминым сижу.
Просто мне иногда проще на конкретном примере глянуть, и провести аналогию со своим вариантом.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 08:58.
|
|