Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
14.09.2007, 04:38
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
rremix
Ничего не скажеш хороший код,понравилось как убирается дребез,какая кнопка нажата и отжата и с таблица тож умно придумано.Появилось пара вопросиков:
1)не понял для чего регистры ZumCnt(сколько опрос если не изменилось) и HoldTimer(удержание кнопки) ведь при декриминировании этих регистров они внновь загружаются новыми значениями
Код:
|
goto SK.CopyNewZ
decfsz ZumCnt,F
return
movlw ZumInit
movwf ZumCnt |
Код:
|
decfsz HoldTime,F
return
movfw HoldInit
movwf HoldTime |
2)регистр KbdO служит для того чтоб обозначивать какая кнопка была отжата и нажата,но после двух нажатий в регистре будет две единицы и как после этого выполнится это условие?
Код:
|
SK.Stable ;состояние кнопок не изменилось,сравниваем со старым
movfw KbdN ; сюда попали, только если состояние стабильно (без дребезга)
xorwf KbdO,W ; и сравнили со старым значением
btfsc Zero |
|
|
|
|
14.09.2007, 04:46
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
[quote="Drex"]Вот исходник для ПИКа, но на С, думаю разберешься.
Код:
|
#define Key INPUT_B(),1 //Порт RB1, вход с кнопочки
#define KeyReactTime 40 //Время реакции после нажатия кнопки (x*50мс)
short //1-bit
StoreSpeed, //Признак необходимости отработать нажатие кнопки
char //8-bit
IntTMR0Count, //Счетчик количества прерываний по таймеру
KeyTimer, //Число циклов TMR0, в течении которых кнопка была нажата
KeyPressed, //Число достоверных нажатий кнопки (одинарное - тройное)
KeyReactonTimer, //Таймер от начала первого нажатия кнопки
#int_timer0
//Прерывание для отсчета реального времени 1 раз в 50 мсек
void TMR0_Interrupt ()
{
set_timer0 (60); //Это чтобы следующее прерывание произошло через 50 мсек
IntTMR0Count++; //Считаем, циклы таймера
//Считаем число циклов с момента нажатия кнопочки
//если не нажата или дребезг, то обнуляем таймер
if (!bit_test (Key)) KeyTimer++; else KeyTimer=0;
//Если нажата в течении 150 мсек то значит точно нажата
//увеличим число достоверных нажатий, но не более 3-х
if (KeyTimer == 3) {if (KeyPressed ‹ 3) KeyPressed++;}
//Теперь если произошло хоть одно нажатие и таймер реакции стоит, пускаем его
if ((KeyPressed › 0)&(KeyReactonTimer == KeyReactTime)) KeyReactonTimer = 0;
if (KeyReactonTimer ‹ KeyReactTime) KeyReactonTimer++;
if (KeyReactonTimer == KeyReactTime - 1) {StoreSpeed = 1;}
} |
Не понял откуда берется KeyPressed и KeyReactonTimer?
|
|
|
|
14.09.2007, 05:09
|
|
Прописка
Регистрация: 16.04.2004
Сообщений: 201
Сказал спасибо: 337
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Сообщение от CERGEI1982
|
Не понял откуда берется KeyPressed и KeyReactonTimer?
|
Как откуда? Это же обычные переменные, я их объявил в разделе char.
Естественно, при начальном старте программы все это обнуляется.
KeyPressed - это число стабильных (уже отфильтровааных) нажатий в течении KeyReactTime (см. самый верх листинга). После первого достоверного нажатия запускается KeyReactionTimer (тоже просто переменная счетчик). Если в течении этого времени больше достоверных нажатий не было, то переменная KeyPressed останется 1, если было 2 то 2, если 3 то 3. Таким образом у меня одна кнопка и 3 действия. На нажатия дается 2 секунды. (вторая строка листинга). Если хочешь могу скинуть проектик в MPLAB и для Протеуса. Там и поиграть можно. Правда в MPLAB должен быть встроен CCS PICC.
|
|
|
|
14.09.2007, 06:33
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Скинь поиграюсь ![Валяюсь от смеха](images/smilies/icon_biggrin.gif) ,сюда выложиш или почтовый ящик дать?
Можно и в протеусе прогнать.
|
|
|
|
14.09.2007, 07:07
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
А все сообразил ![Валяюсь от смеха](images/smilies/icon_biggrin.gif) ,но проектик все равно дай погонять
Это защита от дребезга:
Код:
|
if (!bit_test (Key)) KeyTimer++; else KeyTimer=0; |
Это какая кнопка была нажата(то есть как долго мы держали кнопку),а если еще KeyPressed передавать главной программе тогда будет понятно какая по счету нажатие,,тока непонятно где она потом обнуляется.
Код:
|
if (KeyTimer == 3) {if (KeyPressed ‹ 3) KeyPressed++;} |
А это типа задержи и выдачи флага StoreSpeed в основную программу.
Код:
|
if ((KeyPressed › 0)&(KeyReactonTimer == KeyReactTime)) KeyReactonTimer = 0;
if (KeyReactonTimer ‹ KeyReactTime) KeyReactonTimer++;
if (KeyReactonTimer == KeyReactTime - 1) {StoreSpeed = 1;} |
Просто не посмотрел сразу на эту строчку #define KeyReactTime 40 потому переспросил про регистры.
|
|
|
|
14.09.2007, 11:30
|
|
Прописка
Регистрация: 16.04.2004
Сообщений: 201
Сказал спасибо: 337
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
|
Сообщение от CERGEI1982
|
А все сообразил ,но проектик все равно дай погонять
Это защита от дребезга:
Код:
|
if (!bit_test (Key)) KeyTimer++; else KeyTimer=0; |
|
Да именно так, KeyTimer будет прыгать пока дребезг не устаканится и кнопка не выдаст стабильный 0 (у меня 0 активный) в течении 3-х циклов.
Сообщение от CERGEI1982
|
Это какая кнопка была нажата(то есть как долго мы держали кнопку),а если еще KeyPressed передавать главной программе тогда будет понятно какая по счету нажатие,,тока непонятно где она потом обнуляется.
Код:
|
if (KeyTimer == 3) {if (KeyPressed ‹ 3) KeyPressed++;} |
|
Кнопка одна, а KeyPressed - это число ее нажатий. Обнуляется в основной программе, когда совершатся необходимые действия.
Сообщение от CERGEI1982
|
А это типа задержи и выдачи флага StoreSpeed в основную программу.
Код:
|
if ((KeyPressed › 0)&(KeyReactonTimer == KeyReactTime)) KeyReactonTimer = 0;
if (KeyReactonTimer ‹ KeyReactTime) KeyReactonTimer++;
if (KeyReactonTimer == KeyReactTime - 1) {StoreSpeed = 1;} |
|
Да, но!! StoreSpeed это флаг начала обработки кнопки. Задержка нужна для того, что бы была возможность нажать кнопку 2-й и 3-й раз, и после установки в 1 StoreSpeed, переменная KeyPressed будет содержать число нажатий кнопки.
Проектик выкладываю тут одним архивом. Немного опишу его. Устройство считает импульсы со входа датчика скорости автомобиля за 1 сек. Потом в зависимости от значения зажигает зеленый желтый или красный светодиод. При зажигании зеленого звука нет, при зажигании желтого один звук, красного двойной. Кнопка нужна, чтобы на ходу устанавливать точки отсечки. Одинарное надатие - запоминает во флешке первый порог (зеленый), двойное - 2й, тройное - 3й. Реакция на нажатие кнопки подтверждается звуками. Сколько раз нажал, столько раз оно и пикнет. После того как устройство 1 раз пикнет на втором пределе, нужно понизить частоту импульсов на несколько единиц, чтобы разрешить повторно пикать на этом пороге. Это сделано для того, чтобы при колебании скорости 59-61 км/час оно постоянно не пищало. Аналогично сделано и для третьего порога скорости. Ну вот вроде все. Я пропадаю на неделю, уеду в Москву, так что не теряйте меня.
Прикрепленный файл: 840916.rar
|
|
|
|
14.09.2007, 12:35
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Хорошо,посижу на досуге поганяю,будут вопросы спрошу.Посмотрел,чтоб мне так составить прогу надо еще расти и расти
|
|
|
|
15.09.2007, 14:52
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
rremix
Поскажи что здесь сделать,счетчик команд pclath старший его биты,взялся написать под твой примерчик програмку,погонять как работает,но не знаю как узнать на каком месте находится моя таблица,ни разу не сталкивался,может сумбурно объяснил.Мне надо узнать под каким адресом будет начало моей таблицы после компиляции,чтоб загрузить в регистр PCLATH нужное число.
-- Прилагается рисунок: --
|
|
|
|
16.09.2007, 12:59
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
|
да, действительно интересно, я запустил компилятор, чтобы узнать, как он сохраняет pclath . Так вот, он его не сохраняет, а беззастенчиво портит, прописывая туда адрес начала таблицы и затем не восстанавливает...
пример
Код:
|
const unsigned char mas[3]={1,2,3};
main()
{
unsigned char t;
t=mas[1]; |
что имеем после дизассемблирования
Код:
|
14 00D 0782 ADDWF 0x2, F
15 00E 3401 RETLW 0x1
16 00F 3402 RETLW 0x2
17 010 3403 RETLW 0x3 |
Это наша таблица - выборка производится сложением индекса с началом таблицы
Код:
|
906 389 3000 MOVLW 0
907 38A 008A MOVWF 0xa
таблица находится на 0 странице кода, поэтому обнуляется pclath
908 38B 3001 MOVLW 0x1
задаем индекс для таблицы
909 38C 200D CALL 0xd
получаем в аккумуляторе результат, но дальше pclath
не трогается !!! |
Кто-то может объяснить, почему оно вообще работает ?
Сергей, в Вашем случае должно быть что-то вроде такого
Допустим, таблица расположена с 280н -
Код:
|
temp_pc
org 0x280
table
addwf PCL,1
retlw 1
retlw 2
retlw 3
И вызов - 1 элемента таблицы, считая с 0
movf pclath
movwf temp_pc
movlw 2 //начало таблицы в pclath
movwf PCLATH
movlw 1 // индекс
call table
здесь что-то делаем с результатом
movf temp_pc
movwf pclath // возвращаем старое значение |
Если таблица маленькая (как в Вашем случае) - то и ее, и процедуру вызова оставить в первых 256 байтах кода и не заморачиваться со всем остальным. ИМХО.
|
|
|
|
16.09.2007, 16:33
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Спасибо urry,то что надо
С этой командой известна будет где таблица и буду знать что загружать в pclath.На счет того что сказал размещать в первых 256 байтах верно,просто хотел узнать если таблица будет в другом месте.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
Задержка нажатой кнопки
|
yostaf |
Электроника - это просто |
31 |
15.04.2008 13:37 |
Опрос кнопки
|
Electric111 |
Микроконтроллеры, АЦП, память и т.д |
15 |
18.12.2007 22:48 |
Снова кнопки....
|
dosikus |
Микроконтроллеры, АЦП, память и т.д |
34 |
10.08.2007 20:46 |
Часовой пояс GMT +4, время: 13:22.
|
|