Страница 164 из 421
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс дек 18, 2011 09:40:13
pyzhman
При выборе пункта меню взведите флаг, говорящий "Я в таком-то меню". И по этому флагу делайте то, что нужно, в основной порграмме. Туда же кстати было бы красивше перенести и
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс дек 18, 2011 10:53:01
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.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс дек 18, 2011 13:20:05
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;
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс дек 18, 2011 13:58:21
John-RADIST
BerZerK-ku объясните пожалуйста, насколько я понимаю, оператор цикла for в теле цикла i=0 это команда начальной установки, i<8 это условие выполнения т.е. пока результат этого выражения не равен 0, цикл продолжается.
далее состояние порта D записываем в переменную temp, потом проводим temp&1 побитное умножение на 1, как это работае дальше с оператором if (temp & 1) и вот с возвратом return; и задержкой delay_us(1000); несомсем ясно, объясните пожалуйста.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс дек 18, 2011 14:27:27
ChipKiller
delay_us(1000) - антидребезг
if (temp & 1) - опрос PIND.0
... а вопрос то в чем?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс дек 18, 2011 14:34:07
John-RADIST
Я правильно понял - порт PIND.2 в моем случае кнопка висит на нем, сначала опрашивается 8 раз с задержкой 1000 мкс, а что возвращает return, объясните пожалуйста????
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс дек 18, 2011 14:42:48
BerZerK-ku
return означает выход из обработчика прерывания в случае ложного нажатия
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс дек 18, 2011 14:43:46
ChipKiller
return ничего не возвращает, а обеспечивает досрочный выход из цикла, если кнопка не нажата (отпущена)
порт PIND.2 в моем случае кнопка висит на нем,
... тогда нужно
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс дек 18, 2011 14:54:25
John-RADIST
А почему 4???????
temp = PIND;
if (temp & 4)????????????
return;
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс дек 18, 2011 14:58:16
ChipKiller
John-RADIST писал(а):А почему 4???????
.... да уж............
4(DEC)=100(BIN) - т.е. число 4 - маска на бит 2
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс дек 18, 2011 15:05:51
John-RADIST
Ну, ладно, что уж так, если бы я знал я бы не спрашивал. Трудно две строчки напечатать...
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс дек 18, 2011 15:55:38
John-RADIST
pyzhman писал(а):При выборе пункта меню взведите флаг, говорящий "Я в таком-то меню". И по этому флагу делайте то, что нужно, в основной порграмме. Туда же кстати было бы красивше перенести и
Если не затруднит, кинте пожалуйста шаблон как это сделать. Делаю по примерам пока не фурычит. Спасибо!!!
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс дек 18, 2011 18:12:03
pyzhman
Не отлаживалось, все едино проверять.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс дек 18, 2011 19:02:29
John-RADIST
Огромное спасибо за помощь!!!

Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс дек 18, 2011 19:07:13
pyzhman
Погодите с благодарностями, может там еще накосячено. Если что, косяки сюда.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс дек 18, 2011 19:48:49
John-RADIST
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс дек 18, 2011 20:03:02
pyzhman
Спокойной ночи! Кто куда, а мне пора.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср дек 21, 2011 22:41:09
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 ?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср дек 21, 2011 22:54:40
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 тройки.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср дек 21, 2011 22:56:12
FreshMan
спасибо !!!
ща попробую