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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
demonchik
Встал на лапы
Сообщения: 94
Зарегистрирован: Вт апр 07, 2009 13:39:13
Откуда: одесса
Контактная информация:

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

Сообщение demonchik »

ARV или у кого есть время! помогите, пожалуйста.
пишу подпрограаму обработки кнопок. возвращает код нажатой кнопки.

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

#define Right PIND.4
#define Left  PIND.5
#define Ok    PIND.6

#define key_right 1
#define key_left  2
#define key_ok    3

#define ok
#define left
#define right

unsigned char keys()
{
    if((Right==0) & (Left!=0)  & (Ok!=0)  ) {return key_right;}
    if((Left==0)  & (Right!=0) & (Ok!=0)  ) {return key_left; }
    if((Ok==0)    & (Right!=0) & (Left!=0)) {return key_ok;   }
    return 0;
}

char read_keys(void)
{

char but,but1;
 
    but=keys();
    delay_ms(25);
    but1=keys();
   
if (but==but1)
 switch (but) {
                    case 1: {return right; break;}
                    case 2: {return left; break;}
                    case 3: {return ok; break;}
                }



теперь вопрос: как мне передать значения right, left, ok в другую подпрограмму -

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

unsigned char menu(void)
{
char txt[]="вправо ";
char txt1[]="влево ";
char txt2[]="окей ";

if("вправо") печатаем строку на lcd "Вправо"
и т.д..
 }

необходимо передавать не номеча целочисленные кнопок а именно слова right, left, ok и передавать их в другие подпрограммы
радиоэлектроника - жизнь моя...
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

во-первых, передавать слова - это неразумно.
во-вторых, (ох уж мне эти CVAVR-овские POIND.2 и т.п. штучки!) объявлять макросами надо ЧИСЛА, а не сущности, присущие только CVAVR и не имеющие разумного толкования. вот очень грубые наброски того, что вам надо сделать:

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

#define KEY_RIGHT 1
#define KEY_LEFT 2
#define KEY_UP 4
// и т.д.
#define KEY_ANY (KEY_LEFT | KEY_RIGHT | KEY_UP)

// получаем код нажатых кнопок
unsigned char get_key(void){
   unsigned char tmp;
   tmp = ~PIND & KEY_ANY;
   dely_ms(10);
   if(tmp == (~PIND & KEY_ANY))
      return tmp;
   else
      return 0;
}

// где-то в нужном месте делаем так:
   unsigned char key = get_key();
   switch(key){
   case KEY_UP: // обработка кнопки ВВЕРХ
                       break;
   case KEY_LEFT: // обработка кнопки ВЛЕВО
                       break;
   // и так далее
   }

если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
demonchik
Встал на лапы
Сообщения: 94
Зарегистрирован: Вт апр 07, 2009 13:39:13
Откуда: одесса
Контактная информация:

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

Сообщение demonchik »

написал так:

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

#define Right PIND.4
#define Left  PIND.5
#define Ok    PIND.6

#define KEY_RIGHT 1
#define KEY_LEFT  2
#define KEY_OK    3

#define KEY_ANY (KEY_LEFT | KEY_RIGHT | KEY_OK)

//int led=50;


unsigned char keys()
{
    if((Right==0) & (Left!=0)  & (Ok!=0)  ) {return KEY_RIGHT;}
    if((Left==0)  & (Right!=0) & (Ok!=0)  ) {return KEY_LEFT; }
    if((Ok==0)    & (Right!=0) & (Left!=0)) {return KEY_OK;   }
    return 0;
}


unsigned char getkey(void)
{
unsigned char tmp,tmp1,kn;
   
    kn =keys();

    tmp=~kn & KEY_ANY;
   
        delay_ms(10);
   
    kn =keys();
   
    tmp1=~kn & KEY_ANY;
     if (tmp==tmp1)
         return tmp;
     else
         return 0;
}

int pechat(void)
{
char text[]="OK ";
char text1[]="Vlevo ";
unsigned char key = getkey();
   switch(key)
   {
   case KEY_OK:   { putstr(text);    break;}
                   
   case KEY_LEFT: { putstr(text1);   break;}
   
   }

}


interrupt [EXT_INT0] void ext_int0_isr(void)
{
keys();
}



void main(void)
{
//char text[]="podsvetka = ";

char txt[10];
//char txt1[20];
int iled;
 
    GICR|=0x40;
    MCUCR=0x02;
    GIFR=0x40;
    TIMSK=0x00;
    ACSR=0x80;
    SFIOR=0x00;
   
PORTD=0x70;
DDRD=0x00;

lcd_init();
lcd_clear();
LcdClear();

//putstr(text);


#asm("sei")
     
while(1)
{
           
    //iled=podsvetka();
    //itoa(iled,txt);
    //putstr(txt);
    pechat();   
    LcdUpdate();
    LcdClear();
   
}
}

работает как то странно. даже если ничего не нажал выводится - ок
радиоэлектроника - жизнь моя...
Аватара пользователя
demonchik
Встал на лапы
Сообщения: 94
Зарегистрирован: Вт апр 07, 2009 13:39:13
Откуда: одесса
Контактная информация:

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

Сообщение demonchik »

ARV, сделал по вашему примеру - работает одинаково.
радиоэлектроника - жизнь моя...
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

demonchik писал(а):ARV, сделал по вашему примеру - работает одинаково.
одинаково - это как? ;)
во-первых, я показал не все, а только часть - могут быть проблемы в других местах программы
во-вторых, кнопки должны подключаться на землю, а пины - настраиваться на ввод с подтяжками
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

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

Сообщение Apparatchik »

Для установки года в часах (в даном случае инкремент) написал примерно такой код. Переменная year в двоичнодесятичном представлении так, как используется ds1307.

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

tmp=bcd2bin (year);
while (kn_2==0)
        {
          tmp++;
          if (tmp>99) tmp=0;
          year=bin2bcd (tmp);
          delay_ms (smena_cifri);
         }

Почему year доходит только до 79, а дальше вместо 80 идёт 00 01 02 и т.д. вместо девятки тоже ноль, а еденицы щолкает. Когда "переходит через 99" то начинает с нуля нормально и опять до 79. Если бы были проблемы в динамической индикации, то остальное тоже бы непрвильно выводилось. В справке написано что аргумент функций bcd2bin и bin2bcd может быть от нуля до 99.
«И всё-таки она вертится!»
Аватара пользователя
AlexFisher
Мучитель микросхем
Сообщения: 493
Зарегистрирован: Вт апр 21, 2009 13:31:27
Откуда: Санкт-Петербург
Контактная информация:

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

Сообщение AlexFisher »

Такое впечатление, что year объявлена как signed char
[i]Да здравствует всё то, благодаря чему мы не смотря ни на что![/i]
Аватара пользователя
ValBag
Потрогал лапой паяльник
Сообщения: 326
Зарегистрирован: Сб сен 06, 2008 12:56:13

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

Сообщение ValBag »

Apparatchik писал(а):Почему year доходит только до 79
Если year выводите в порт для дальнейшей индикации, то не хватает старшего разряда в десятках BCD. Или обрыв, или разряд порта неисправен.

P.S. В свете дальнейшего, ниже, получилось, что не хватает разряда, ввиду signed.
Последний раз редактировалось ValBag Чт ноя 25, 2010 17:39:40, всего редактировалось 1 раз.
Аватара пользователя
Apparatchik
Держит паяльник хвостом
Сообщения: 908
Зарегистрирован: Вс май 23, 2010 13:55:42
Откуда: Украина, Александрия

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

Сообщение Apparatchik »

AlexFisher писал(а):Такое впечатление, что year объявлена как signed char

Спасибо устранил! Как то обявил автоматически :oops: .
«И всё-таки она вертится!»
Аватара пользователя
Сериг
Это не хвост, это антенна
Сообщения: 1451
Зарегистрирован: Пт фев 19, 2010 19:39:28
Откуда: Москва

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

Сообщение Сериг »

Сериг писал(а):Ребята ,подскажите плз кто нибудь ,а то я стану пьющим... :)) вообщем так мега 48,тини 2313(2шт),прошиваю фьюзы,все норм работает светики моргают препрошиваю мк наверно раз 50,и все мк лочится,че такое?????????? :shock: :shock: :shock: :shock: :shock: причем 2ь тиньки так загубил их прошивал около 15 раз мега 48 50 раз и здохла,не видится он нетъ его! :shock: помогите пожалуйста очень надо!Благодарю за помощь!!!!! :?

ответте пожалуйста :?
Аватара пользователя
odesasha
Прорезались зубы
Сообщения: 237
Зарегистрирован: Пт фев 12, 2010 14:02:22
Откуда: Одесса

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

Сообщение odesasha »

Кто скажет почему так и как лучше?
Объявлял себе переменные char по мере написания кода группами по 2-6 шт ., дописывая слово char r,t,g,v=8,g,t; потом int t,f,y,sa;опять char f,xc,m,n;в заголовке.
Компиилировал и довел код до 96% памяти , отладил и закончил проект .
Перед сдачей решил написать красиво и свел все в кучу под один char - все, что были в разных группках .
После этого код вырос аж на 3 % почему?
Вернул в группки - опять стал меньше .
Где тут оптимум или закономерность или какое объяснение , может Вы знаете?
Аватара пользователя
AlexFisher
Мучитель микросхем
Сообщения: 493
Зарегистрирован: Вт апр 21, 2009 13:31:27
Откуда: Санкт-Петербург
Контактная информация:

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

Сообщение AlexFisher »

Мне кажется, что часть переменных "по мере надобности" была объявлена внутри функций и являлись временными, а потом Вы вынесли их в "глобальные" и компилятор стал СРАЗУ выделять под них память. Если в регистровой памяти все не поместилось, то, возможно, выросли накладные расходы на обращение к некоторым из них. Посмотрите распределение памяти именно для переменных - до и после.
[i]Да здравствует всё то, благодаря чему мы не смотря ни на что![/i]
Аватара пользователя
odesasha
Прорезались зубы
Сообщения: 237
Зарегистрирован: Пт фев 12, 2010 14:02:22
Откуда: Одесса

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

Сообщение odesasha »

В том то и дело , что эти были все глобальные .
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

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

Сообщение avreal »

Возможно, CodeVision умеет видеть, что в куске кода используются рядом лежащие в памяти переменные и не обращаться к ним по одной (LDS/STS), а загружать указатель на младший адрес группы и обращаться к ним со смещением относительно указателя Y или Z, что уже на нескольких обращениях экономит код. А при перемешивании переменных, используемых в разных местах, перестаёт это видеть.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Uselock
Открыл глаза
Сообщения: 64
Зарегистрирован: Пт янв 16, 2009 23:27:49

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

Сообщение Uselock »

Здравствуйте!
Осваиваю потихоньку микроконтроллеры и вот возник вопрос по прерываниям.
Пишу программу под счетчик витков. Сигнал с оптопары подаю на вход внешнего прерывания. Прерывание настроено на падение уровня. Контроллер работает на частоте 8 МГц.
Так вот он считает больше чем нужно. Почему? Не может быть такое, что пока уровень падает, контроллер обрабатывает это 2 раза?
Спасибо

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

// External Interrupt 1 service routine
interrupt [EXT_INT1] void ext_int1_isr(void)
{
x++;
}

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

// External Interrupt(s) initialization
// INT0: Off
// INT1: On
// INT1 Mode: Falling Edge
GICR|=0x80;
MCUCR=0x08;
GIFR=0x80;
Аватара пользователя
Сериг
Это не хвост, это антенна
Сообщения: 1451
Зарегистрирован: Пт фев 19, 2010 19:39:28
Откуда: Москва

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

Сообщение Сериг »

почему меня игнорируют? :cry: :cry: :cry:
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

Сериг писал(а):почему меня игнорируют? :cry: :cry: :cry:

анекдот писал(а):Доктор: на что жалуетесь?
Пациент: доктор, на меня никто не обращает внимания!
Доктор: кто там следующий по очереди? заходите!

видимо, решение вашей проблемы никому не известно, потому и молчат все.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
O-LED
Мудрый кот
Сообщения: 1800
Зарегистрирован: Вт окт 05, 2010 01:08:57
Контактная информация:

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

Сообщение O-LED »

читаю книгу "CodeVisionAVR Пособие для начинающих" М.Б.Лебедев и вычитал такую вещь. локальные переменные если их не инициализировать содержат "всякий мусор". Это так?? Спрашиваю потому что переменные в функциях и обработчиках прерываний никогда специально не инициализировал, при этом никогда не имел никаких проблем.
Так ли это, или у автора в голове "мусор" ????
KIT
Аватара пользователя
ValBag
Потрогал лапой паяльник
Сообщения: 326
Зарегистрирован: Сб сен 06, 2008 12:56:13

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

Сообщение ValBag »

O-LED писал(а):локальные переменные если их не инициализировать содержат "всякий мусор". Это так?
Книга написана автором, очевидно, на основе перевода официального датшита CVAVR (можно выборочно сравнить) и претензии к нему бессмысленны. Я оставляю как-есть глобальные и, на всякий случай, инициализирую локальные.
Аватара пользователя
aam
Собутыльник Кота
Сообщения: 2994
Зарегистрирован: Сб фев 20, 2010 14:00:12
Откуда: Москва

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

Сообщение aam »

В соответствии с правилами Си глобальные переменные инициализируются нулями, а локальные ничем не инициализируются и содержат "мусор". Я ХЗ как там CodeVision, но кодить надо по правилам Си.
Ответить

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