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

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

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

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

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

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

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

 
Опции темы
Непрочитано 29.11.2006, 08:10  
svorog1
Прохожий
 
Регистрация: 29.11.2006
Сообщений: 7
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
svorog1 на пути к лучшему
По умолчанию Avr+key

Здравствуйте all
помогите кто может похоже я просто зацыклился
есть задача опроса кнопок 0 или 1
подскажите пожалуйсто как это лучше сделать желательно с примерами по ICC видел примеры под другой помпилятор и там есть модуль io вот его бы прикрутить
помагите кто может
Реклама:
svorog1 вне форума  
Непрочитано 29.11.2006, 10:34  
AndryG
Вид на жительство
 
Регистрация: 22.06.2006
Адрес: Украина
Сообщений: 308
Сказал спасибо: 19
Сказали Спасибо 32 раз(а) в 24 сообщении(ях)
AndryG на пути к лучшему
По умолчанию

Может Вам подобное решение подойдет?
https://kazus.ru/forum/topics/f_22516.html#22516

Если нет, то сформулируйте подробно вопрос ... можно маааленькой задачкой
AndryG вне форума  
Непрочитано 29.11.2006, 11:12  
Zemlyanov
Гражданин KAZUS.RU
 
Регистрация: 17.09.2006
Сообщений: 633
Сказал спасибо: 78
Сказали Спасибо 69 раз(а) в 57 сообщении(ях)
Zemlyanov на пути к лучшему
По умолчанию

Ничего не понял. Как подключены кнопки? Сколько их?
Zemlyanov вне форума  
Непрочитано 29.11.2006, 11:38  
svorog1
Прохожий
 
Регистрация: 29.11.2006
Сообщений: 7
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
svorog1 на пути к лучшему
По умолчанию

Вобщемто примерно то только что то неработает
вобщем надо сделать следущее на атмеге 8 или тини 13
на порту B подцеплено следущее
порт 0 светик
порт 1 задействован под внешнее прерывание если на тини
порт 2 кнопка
порт 3 светодиод
порт 4 кнопка

требуется следущее у меня си icc вещи типа PINB.4==0
неработают

вобщем вот
инициализация порта
void port_init(void)
{
PORTB = 0x16;
DDRB = 0x09;
}

void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
timer1_init();

MCUCR = 0x02;
GICR = 0x40;
TIMSK = 0x04; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
инициализация девайсов выше


нужно сделать следущее
при срабатывании прирывания т.е нажатия на кноку нужно чтобы проверялась кнопка на порту pb4 если она нажата то входим на метку програмирования и считываем число нажатий на кнопку которая на порту pb2 процесс происходит то тех пор пока непришло следущее внешнее прерывание
svorog1 вне форума  
Непрочитано 29.11.2006, 12:28  
AndryG
Вид на жительство
 
Регистрация: 22.06.2006
Адрес: Украина
Сообщений: 308
Сказал спасибо: 19
Сказали Спасибо 32 раз(а) в 24 сообщении(ях)
AndryG на пути к лучшему
По умолчанию

А если и второй раз кнопка режима будет нажата вместе с кнопокй PB2 (подсчет) ... то мы куда идем? Выходим с программирования или засчитываем кнопке PB2 +1 ?
Цитата:
Код:
 PINB.4==0
Код:
 !(PINB & 1) //аналог
AndryG вне форума  
Непрочитано 29.11.2006, 12:56  
svorog1
Прохожий
 
Регистрация: 29.11.2006
Сообщений: 7
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
svorog1 на пути к лучшему
По умолчанию

да выходим из программирования
и сохраняем в переменной число нажатий на pb2
svorog1 вне форума  
Непрочитано 29.11.2006, 13:59  
AndryG
Вид на жительство
 
Регистрация: 22.06.2006
Адрес: Украина
Сообщений: 308
Сказал спасибо: 19
Сказали Спасибо 32 раз(а) в 24 сообщении(ях)
AndryG на пути к лучшему
По умолчанию

не в обиду сказано... я вашу задачку не совсем понял ... термины кнопки/прерывания пересекаются интересно ... вот додумал по своему ... думаю идею объяснил.

Цитата:
Задача:
Две кнопки:
"режим" - верхняя PB0 - продублирована выключателем
"считалка" - основная кнопка
При нажатии на СЧИТАЛКУ при нажатой РЕЖИМ устройство переходит в режим подсчета.
В режиме подсчета каждое нажатие СЧИТАЛКИ увеличивает счетчик +1
В режиме подсчета нажатие на РЕЖИМ сбрасывает счетчик
Возникновение внешнего прерывания(int0) выключает режим подсчета.
Код:
unsigned char state;            //Флаги программы
 #define  st_mode       0x01    //"Режим подсчета включен"
unsigned char count;            //К-во нажатий
unsigned char p;                //Прошлое состояние кнопок

#define bt_mode         0x01    //Вес бита кнопки "режим"
#define bt_cnt          0x02    //Вес бита кнопки "считалка"
#define ld_mode         0x04    //Вес бита светодиода "Режим подсчета"

#define led_off         PORTB &= ~ld_mode //светодиод ВКЛ
#define led_on          PORTB |= ld_mode  //светодиод ОТКЛ

//Внешнее прерывание - при его возникновении отключается режим подсчета
interrupt [EXT_INT0] void ext_int0_isr(void)
{
 state &= ~st_mode;             //Выключаем режим подсчета
}

//Прерывание таймера - каждый 50 мс опрос клавиатуры
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{ 
unsigned char n,v;      
 TCNT0=0xCF;
 n = PINB & (bt_mode|bt_cnt);   //Считываем тек. состояние кнопок
 v = n ^ p;                     //Находим ИЗМЕНИВШИЕСЯ КНОПКИ
 
 if (v & n & bt_cnt)            //Если нажали считалку ...
  {
   if (state & st_mode)         // (1)... и включен режим подсчета
    {
     count++;                   // Значит будем считать
     putchar(count);
    }
   if (n & bt_mode)             // (2)... и "РЕЖИМ" уже нажат
     state |= st_mode;          //Значит включим режим подсчета
  }

 if (v & n & bt_mode && state & st_mode)//Если нажали "Режим" в режиме,
  {
   count = 0;                   // то обнулим счетчик
   putchar(0);
  }
  
 p = n;                         //Запоминаем состояние кнопок

//Управляем светодиодом - показываем тек. режим
 if(state & st_mode)
   led_on;
  else
   led_off;         
}
Это самый интересный кусок кода. Полный архив: схема, Proteus, проект в CodeVision
www.andryg.ho.com.ua/bt_2.txt - это RAR архив ... расширение поменяйте.
Proteus покажет работу и отладку и без компилятора - там все файлы есть. Изюминок компилятора не использовал - легко портировать куда угодно.
Цитата:
да выходим из программирования
и сохраняем в переменной число нажатий на pb2
тогда (2) нужно заменить на state ^= st_mode;
И потом смотреть на режим ... если 0, значит пере этим был 1, значит сохранить результат... иначе же только включили режим - инициализировать счетчик не помешает.

-- Прилагается рисунок: --
AndryG вне форума  
Непрочитано 30.11.2006, 05:49  
svorog1
Прохожий
 
Регистрация: 29.11.2006
Сообщений: 7
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
svorog1 на пути к лучшему
По умолчанию

вощем что то сделал
но есть вопрпос как сделать если кнопки неподряд у меня есть необходимость на порту pb0 иметь светодиод
pb1 кнопка pb2 кнопка режима pb4 тоже кнопка
pb3 светик

n = (PINB & 0x70) ››4;
v = p ^ n;
v = v & p;
p = n;
v = v & 0x0F;
PORTB ^= v;

вопрос откуда берется (PINB & 0x70) ››4; чтобы кнопки были 4-6 как высчитывать и как выделить именно те кнопки что я описал
подскажите


#include ‹iom8v.h›
#include ‹macros.h›
unsigned char p,n,v;
void port_init(void)
{
PORTB = 0x70;
DDRB = 0x07;
PORTC = 0x00; //m103 output only
DDRC = 0x00;
PORTD = 0x04;
DDRD = 0x00;
}

//TIMER0 initialize - prescale:1024
// desired value: 1KHz
// actual value: 1,302KHz (23,2%)
void timer0_init(void)
{
TCCR0 = 0x00; //stop
TCNT0 = 0xFD; //set count
TCCR0 = 0x05; //start timer
}

#pragma interrupt_handler timer0_ovf_isr:10
void timer0_ovf_isr(void)
{
TCNT0 = 0xFD; //reload counter value
n = (PINB & 0x70) ››4;
v = p ^ n;
v = v & p;
p = n;
v = v & 0x0F;
PORTB ^= v;
}

#pragma interrupt_handler int0_isr:2
void int0_isr(void)
{
//external interupt on INT0
}

//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
timer0_init();

MCUCR = 0x03;
GICR = 0x40;
TIMSK = 0x01; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}

void main(void)
{
p=n=v=0;
init_devices();
while (1);
}
svorog1 вне форума  
Непрочитано 30.11.2006, 10:46  
AndryG
Вид на жительство
 
Регистрация: 22.06.2006
Адрес: Украина
Сообщений: 308
Сказал спасибо: 19
Сказали Спасибо 32 раз(а) в 24 сообщении(ях)
AndryG на пути к лучшему
По умолчанию

Код:
 (PINB & 0x70) ››4;
Кнопки висят в старшей тетраде ... светодиоды в младшей. Я здесь просто сразу кнопки "подвинул" на места светодиодов ... дабы потом ими управлять.

Если у вас кнопки разбросаны по порту с другой переферией, то просто работайте только с битами кнопок... остальные не трогайте. Это хорошо видно в примере выше:
здесь я описал веса битов своих кнопок (bt_*) и свтодиода (ld_*)
Код:
#define bt_mode         0x01    //Вес бита кнопки "режим"
#define bt_cnt          0x02    //Вес бита кнопки "считалка"
#define ld_mode         0x04    //Вес бита светодиода "Режим подсчета"
А дальше идет чситывание состояния кнопок - читаем только биты кнопок:
Код:
n = PINB & (bt_mode|bt_cnt);
И точно так же через веса битов и маски проверяются и изменяются остальные биты.
Код:
if (v & n & bt_cnt)
Эту строку можно прочесть: если бит кнопки и в V и N поднят (изменена и сейчас нажата), значит ее нажали только сейчас.

Если Кнопки передернуть на другие биты, то достаточно в DEFINE изменить вес бита... а на другую переферию этого порта можно не обращать внимания.
--------
Цитата:
pb1(0x02) кнопка pb2(0x04) кнопка режима pb4(0x10) тоже кнопка
Код:
  n = PINB & 0x16; или PINB & (0x02 | 0x04 | 0x10)
  v = p ^ n
  if (v & n & 0x02) // Если нажали кнопку pb1,
   PORTB &= ~ 0x08  //то зажгли светодиод на pb3

  if (v & p & 0x04) // Если отпустили кнопку pb2
   bomba_on; // :-)

  if (!(v & 0x10) -- Если состояние кнопки pb4 НЕ изменилось
AndryG вне форума  
Непрочитано 30.11.2006, 11:48  
svorog1
Прохожий
 
Регистрация: 29.11.2006
Сообщений: 7
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
svorog1 на пути к лучшему
По умолчанию

Извините можно поподробнее как вес бита вычислять
мне нужно чтобы кнопики были на P1
P2 и P4

Вот что я пытался пустить

#define bt_mode 0x01
#define bt_cnt 0x02
#define ld_mode 0x04


n = PINB & (bt_mode|bt_cnt);


v = p ^ n;
v = v & p;
p = n;
v = v & 0x0F;

if (v & n & bt_cnt)
{
PORTB ^= BIT(3);
}

тока бли неработат
svorog1 вне форума  
 

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

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Собираем глюки и "подводные камни" AVR и AVR Studi Don_Ambrosio Коллекция глюков 27 14.11.2010 12:24


Часовой пояс GMT +4, время: 20:27.


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