Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 14.09.2007, 04:38  
CERGEI1982
Почётный гражданин KAZUS.RU
 
Аватар для CERGEI1982
 
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
CERGEI1982 на пути к лучшему
По умолчанию

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
Реклама:
CERGEI1982 вне форума  
Непрочитано 14.09.2007, 04:46  
CERGEI1982
Почётный гражданин KAZUS.RU
 
Аватар для CERGEI1982
 
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
CERGEI1982 на пути к лучшему
По умолчанию

[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?
CERGEI1982 вне форума  
Непрочитано 14.09.2007, 05:09  
Drex
Прописка
 
Аватар для Drex
 
Регистрация: 16.04.2004
Сообщений: 201
Сказал спасибо: 337
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
Drex на пути к лучшему
По умолчанию

Сообщение от CERGEI1982
Не понял откуда берется KeyPressed и KeyReactonTimer?
Как откуда? Это же обычные переменные, я их объявил в разделе char.

Естественно, при начальном старте программы все это обнуляется.

KeyPressed - это число стабильных (уже отфильтровааных) нажатий в течении KeyReactTime (см. самый верх листинга). После первого достоверного нажатия запускается KeyReactionTimer (тоже просто переменная счетчик). Если в течении этого времени больше достоверных нажатий не было, то переменная KeyPressed останется 1, если было 2 то 2, если 3 то 3. Таким образом у меня одна кнопка и 3 действия. На нажатия дается 2 секунды. (вторая строка листинга). Если хочешь могу скинуть проектик в MPLAB и для Протеуса. Там и поиграть можно. Правда в MPLAB должен быть встроен CCS PICC.
Drex вне форума  
Непрочитано 14.09.2007, 06:33  
CERGEI1982
Почётный гражданин KAZUS.RU
 
Аватар для CERGEI1982
 
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
CERGEI1982 на пути к лучшему
По умолчанию

Скинь поиграюсь ,сюда выложиш или почтовый ящик дать?
Можно и в протеусе прогнать.
CERGEI1982 вне форума  
Непрочитано 14.09.2007, 07:07  
CERGEI1982
Почётный гражданин KAZUS.RU
 
Аватар для CERGEI1982
 
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
CERGEI1982 на пути к лучшему
По умолчанию

А все сообразил ,но проектик все равно дай погонять

Это защита от дребезга:
Код:
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 потому переспросил про регистры.
CERGEI1982 вне форума  
Непрочитано 14.09.2007, 11:30  
Drex
Прописка
 
Аватар для Drex
 
Регистрация: 16.04.2004
Сообщений: 201
Сказал спасибо: 337
Сказали Спасибо 6 раз(а) в 6 сообщении(ях)
Drex на пути к лучшему
По умолчанию

Сообщение от 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
Drex вне форума  
Непрочитано 14.09.2007, 12:35  
CERGEI1982
Почётный гражданин KAZUS.RU
 
Аватар для CERGEI1982
 
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
CERGEI1982 на пути к лучшему
По умолчанию

Хорошо,посижу на досуге поганяю,будут вопросы спрошу.Посмотрел,чтоб мне так составить прогу надо еще расти и расти
CERGEI1982 вне форума  
Непрочитано 15.09.2007, 14:52  
CERGEI1982
Почётный гражданин KAZUS.RU
 
Аватар для CERGEI1982
 
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
CERGEI1982 на пути к лучшему
По умолчанию

rremix
Поскажи что здесь сделать,счетчик команд pclath старший его биты,взялся написать под твой примерчик програмку,погонять как работает,но не знаю как узнать на каком месте находится моя таблица,ни разу не сталкивался,может сумбурно объяснил.Мне надо узнать под каким адресом будет начало моей таблицы после компиляции,чтоб загрузить в регистр PCLATH нужное число.

-- Прилагается рисунок: --

CERGEI1982 вне форума  
Непрочитано 16.09.2007, 12:59  
urry
Почётный гражданин KAZUS.RU
 
Аватар для urry
 
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
urry на пути к лучшему
По умолчанию

да, действительно интересно, я запустил компилятор, чтобы узнать, как он сохраняет 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 байтах кода и не заморачиваться со всем остальным. ИМХО.
urry вне форума  
Непрочитано 16.09.2007, 16:33  
CERGEI1982
Почётный гражданин KAZUS.RU
 
Аватар для CERGEI1982
 
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
CERGEI1982 на пути к лучшему
По умолчанию

Спасибо urry,то что надо
Код:
org 0x280
С этой командой известна будет где таблица и буду знать что загружать в pclath.На счет того что сказал размещать в первых 256 байтах верно,просто хотел узнать если таблица будет в другом месте.
CERGEI1982 вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
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.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot