CodeVision AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение pyzhman »

При выборе пункта меню взведите флаг, говорящий "Я в таком-то меню". И по этому флагу делайте то, что нужно, в основной порграмме. Туда же кстати было бы красивше перенести и

Код: Выделить всё

lcd_gotoxy(6,0);
lcd_putsf( "LCD_N_");
Docendo discimus
John-RADIST
Открыл глаза
Сообщения: 44
Зарегистрирован: Чт дек 15, 2011 19:04:24

Re: CodeVision AVR в вопросах и ответах

Сообщение John-RADIST »

Посмотрите пожалуйста, фрагмент исходника, будет ли такая конфигурация считаться как ф-ция антидребезга:
unsigned char punkt_menu;
unsigned char temp;
unsigned char i;
interrupt [EXT_INT0] void ExtInt0(void)
{

lcd_clear( );
lcd_gotoxy( 0,0 );

if(++punkt_menu>4) punkt_menu= 0;

temp=PIND;

for (i= 0; i < 8; i++)
{
if (temp&1==0) goto m1;
temp>>=1;
}
m1: switch(punkt_menu)
{

case 1:
lcd_gotoxy(6,0);
lcd_putsf( "LCD0");
break;
case 2:

lcd_gotoxy(6,0);
lcd_putsf( "LCD1");
break;
case 3:

lcd_gotoxy(6,0);
lcd_putsf( "LCD2");
break;
case 4:

lcd_gotoxy(6,0);
lcd_putsf( "LCD3");
break;
default:
В качестве параметра цикла испрльзуется переменная i, цикл выполняется пока значение переменной i <8, в теле цикла происходит проверка бита переменной temp, if (temp&1==0) goto m1; , если он равен нулю кнопка нажата, далее упраление по метке m1 передается на switch. Затем производится логический сдвиг переменной temp, а затем все сначала, то есть за восемь проходов проверяется состояние на восьми выводах порта D.
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Re: CodeVision AVR в вопросах и ответах

Сообщение BerZerK-ku »

Не будет, вы опять просто добавили задержку. Причем изощренно-странную :))
Если подправите на такую конструкцию, то должно заработать для 1 кнопки:

Код: Выделить всё

// Проверка нажатой кнопки
// Если 8 выборок подряд дали "положительный" результат, переходим дальше
// При первой же "отрицательной" выборке, выходим из обработчика
for (char i= 0; i < 8; i++)
{
   temp = PIND;
   if (temp & 1)
      return;
   _delay_us(1000);
}

// Если кнопка нажата, переходим в следующий пункт меню
if(++punkt_menu > 4)
   punkt_menu = 0;
John-RADIST
Открыл глаза
Сообщения: 44
Зарегистрирован: Чт дек 15, 2011 19:04:24

Re: CodeVision AVR в вопросах и ответах

Сообщение John-RADIST »

BerZerK-ku объясните пожалуйста, насколько я понимаю, оператор цикла for в теле цикла i=0 это команда начальной установки, i<8 это условие выполнения т.е. пока результат этого выражения не равен 0, цикл продолжается.
далее состояние порта D записываем в переменную temp, потом проводим temp&1 побитное умножение на 1, как это работае дальше с оператором if (temp & 1) и вот с возвратом return; и задержкой delay_us(1000); несомсем ясно, объясните пожалуйста.
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Re: CodeVision AVR в вопросах и ответах

Сообщение ChipKiller »

delay_us(1000) - антидребезг
if (temp & 1) - опрос PIND.0
... а вопрос то в чем?
John-RADIST
Открыл глаза
Сообщения: 44
Зарегистрирован: Чт дек 15, 2011 19:04:24

Re: CodeVision AVR в вопросах и ответах

Сообщение John-RADIST »

Я правильно понял - порт PIND.2 в моем случае кнопка висит на нем, сначала опрашивается 8 раз с задержкой 1000 мкс, а что возвращает return, объясните пожалуйста????
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Re: CodeVision AVR в вопросах и ответах

Сообщение BerZerK-ku »

return означает выход из обработчика прерывания в случае ложного нажатия
Последний раз редактировалось BerZerK-ku Вс дек 18, 2011 14:47:10, всего редактировалось 1 раз.
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Re: CodeVision AVR в вопросах и ответах

Сообщение ChipKiller »

return ничего не возвращает, а обеспечивает досрочный выход из цикла, если кнопка не нажата (отпущена)
порт PIND.2 в моем случае кнопка висит на нем,
... тогда нужно

Код: Выделить всё

temp = PIND;
   if (temp & 4)
      return;
John-RADIST
Открыл глаза
Сообщения: 44
Зарегистрирован: Чт дек 15, 2011 19:04:24

Re: CodeVision AVR в вопросах и ответах

Сообщение John-RADIST »

А почему 4???????

temp = PIND;
if (temp & 4)????????????
return;
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Re: CodeVision AVR в вопросах и ответах

Сообщение ChipKiller »

John-RADIST писал(а):А почему 4???????
.... да уж............
4(DEC)=100(BIN) - т.е. число 4 - маска на бит 2
John-RADIST
Открыл глаза
Сообщения: 44
Зарегистрирован: Чт дек 15, 2011 19:04:24

Re: CodeVision AVR в вопросах и ответах

Сообщение John-RADIST »

Ну, ладно, что уж так, если бы я знал я бы не спрашивал. Трудно две строчки напечатать...
John-RADIST
Открыл глаза
Сообщения: 44
Зарегистрирован: Чт дек 15, 2011 19:04:24

Re: CodeVision AVR в вопросах и ответах

Сообщение John-RADIST »

pyzhman писал(а):При выборе пункта меню взведите флаг, говорящий "Я в таком-то меню". И по этому флагу делайте то, что нужно, в основной порграмме. Туда же кстати было бы красивше перенести и

Код: Выделить всё

lcd_gotoxy(6,0);
lcd_putsf( "LCD_N_");


Если не затруднит, кинте пожалуйста шаблон как это сделать. Делаю по примерам пока не фурычит. Спасибо!!!
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение pyzhman »

Не отлаживалось, все едино проверять.
Вложения
John-RADIST.rar
(1.4 КБ) 144 скачивания
Docendo discimus
John-RADIST
Открыл глаза
Сообщения: 44
Зарегистрирован: Чт дек 15, 2011 19:04:24

Re: CodeVision AVR в вопросах и ответах

Сообщение John-RADIST »

Огромное спасибо за помощь!!! :beer:
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение pyzhman »

Погодите с благодарностями, может там еще накосячено. Если что, косяки сюда.
Docendo discimus
John-RADIST
Открыл глаза
Сообщения: 44
Зарегистрирован: Чт дек 15, 2011 19:04:24

Re: CodeVision AVR в вопросах и ответах

Сообщение John-RADIST »

Собрал в одну кучу...Проверил...Все работает...Прогнал в Протеусе... Так что огромное спасибо, буду разбираться дальше :beer: :beer: :beer:
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение pyzhman »

Спокойной ночи! Кто куда, а мне пора.
Docendo discimus
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Re: CodeVision AVR в вопросах и ответах

Сообщение FreshMan »

Код: Выделить всё

#include <mega8.h>
#include <delay.h> // подключаем библиотеку задержки


void main (void)
{
  DDRD=0b11111111; // Data Direction Register   Все пины порта С сконфигурированы на выход
  DDRB=0b11111111;
 
  n=0
  while(n<3)
 {
 PORTD=0b00000001;
 delay_ms(500);
 PORTD=0b00000010;
 delay_ms(500);
 PORTD=0b00000100;
 delay_ms(500);
 PORTD=0b00001000;
 delay_ms(500);
 PORTD=0b00010000;
 delay_ms(500);
 PORTD=0b00100000;
 delay_ms(500);
 PORTD=0b01000000;
 delay_ms(500);
 PORTD=0b10000000;
 delay_ms(500);
 n=n+1
 
 }
 
}


как правильно обявить переменную n ?
Tell Me The Truth
Аватара пользователя
Apparatchik
Держит паяльник хвостом
Сообщения: 908
Зарегистрирован: Вс май 23, 2010 13:55:42
Откуда: Украина, Александрия

Re: CodeVision AVR в вопросах и ответах

Сообщение Apparatchik »

FreshMan писал(а):

Код: Выделить всё

#include <mega8.h>
#include <delay.h> // подключаем библиотеку задержки


void main (void)
{
  DDRD=0b11111111; // Data Direction Register   Все пины порта С сконфигурированы на выход
  DDRB=0b11111111;
 
  n=0
  while(n<3)
 {
 PORTD=0b00000001;
 delay_ms(500);
 PORTD=0b00000010;
 delay_ms(500);
 PORTD=0b00000100;
 delay_ms(500);
 PORTD=0b00001000;
 delay_ms(500);
 PORTD=0b00010000;
 delay_ms(500);
 PORTD=0b00100000;
 delay_ms(500);
 PORTD=0b01000000;
 delay_ms(500);
 PORTD=0b10000000;
 delay_ms(500);
 n=n+1
 
 }
 
}


как правильно обявить переменную n ?

ну например char n;
после n=n+1 нужно ставить точку с запятой.
в коментариях Вы говорите про порт С, а присваиваете порту D.
Ваша программа "остановится" при достижении n тройки.
«И всё-таки она вертится!»
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Re: CodeVision AVR в вопросах и ответах

Сообщение FreshMan »

спасибо !!!
ща попробую
Tell Me The Truth
Ответить

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