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

Обсуждаем контроллеры компании Atmel.
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

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

Сообщение pokk »

ругается на LastState
как будто CVAVR не знает такой команды

Так это же переменная

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

<mega16a.h>
<alcd.h>
<stdio.h>
<delay.h>

char  LastState;
Аватара пользователя
unalex
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

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

Сообщение unalex »

конечно будет ругаться - это переменная и ее надо объявить

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

to Alex
критику своего говнокода воспринимаю адекватно(я ж не профи, а только учусь), но фразы "неудачный код" без предоставления удачного кода звучат несколько некорректно, и почему бы не привести пример правильного кода, чтобы я смог увидеть как надо делать правильно
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Аватара пользователя
unalex
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

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

Сообщение unalex »

вот пример менее абстрактный и немного перекрученный(не знаю может ли это решить проблемы, которые озвучил Alex)

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

// для случая если в порте 0 при ненажатых кнопках
unsigned char laststate = 0;

while(1)
{
   
   
   if(PINA ! = 0)           //если любая кнопка нажата
   {
      if(laststate == PINA)  //сравниваем с прошлым состоянием
      ;                          //если без изменений ничего не делаем
      else
      {
         laststate = PINA;  //иначе сохраняем новое состояние
         dosomething(laststate); //и делаем что нам нужно
      }
   }
   else laststate = 0;
}


как видите кодогенератор во мне работаяет не переставая, но хочется увидеть правильный вариант более опытных коллег, экспериментировать можно бесконечно, но не вижу смысла изобретать велосипед
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Vov123
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

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

Сообщение Vov123 »

Этот парень,который про кнопки спрашивал,надеялся на готовый код,упакованный,на блюдечке с голубой коёмкой,а Вы ему "пикассо" устареваете.
p.s. вместо if(PINA ! = 0),можно проще if(PINA),но правда не так красиво без восклицательного знака.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

unalex писал(а):критику своего говнокода воспринимаю адекватно(я ж не профи, а только учусь), но фразы "неудачный код" без предоставления удачного кода звучат несколько некорректно, и почему бы не привести пример правильного кода, чтобы я смог увидеть как надо делать правильно
Ну во первых, говнокодом Ваш код никто не называл, а во вторых, фразу "неудачный код" я прикрепил указанием его недостатков. Если Вы так и не поняли суть моих постов, то мне жаль моё потраченное время на это. Если чем-то Вас огорчил - прошу прощения.
Аватара пользователя
Valiullin.Amir
Родился
Сообщения: 5
Зарегистрирован: Ср мар 13, 2013 08:41:58

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

Сообщение Valiullin.Amir »

вроде сделал но работает только одна кнопка из 4х void menu или которая находится сверху в main
как это исправить или весь опрос кнопок запихнуть в одну функцию
если убираю while(1==1) во всех функциях то кнопки работают но на удержание цикл не останавливается
код ниже
Спойлер

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

void menu(void)
{
while(1==1)
{
// if( (PINA & (1<<PINA0) ) == 0 )
if( PINA.0 == 0 )
   {
      if(laststate == PINA.0);
      else
      {
         laststate = PINA.0;
         menu_p=0;
         menu1();
      }
   }
   else laststate = 1;
}
 };   

void next(void)
{
while(1==1)

if(PINA.1 == 0 )
   {
      if(laststate == PINA.1);
      else
      {
         laststate = PINA.1;
         menu_p=menu_p+1;
         menu1();
      }
   }
   else laststate = 1;
   }
 };
   
void prev(void)
{
while(1==1)

if( PINA.2 == 0 )
   {
      if(laststate == PINA.2);
      else
      {
         laststate = PINA.2;
         menu_p=menu_p-1;
         menu1();
      }
   }
   else laststate = 1;
}
 };
void entr(void)
{
while(1==1)
{
if( PINA.3 == 0 )
   {
      if(laststate == PINA.3);
      else
      {
         laststate = PINA.3;
         menu_p=0;
         menu_paint("enter");
      }
   }
   else laststate = 1;
}
};
 
void main(void)
{
DDRA=0x00;
lcd_init(16);
loadm();
while(1)
{
menu();
next();
prev();
entr();

}
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

Блин вы бы хотя бы про переменные и циклы для начала почитали, а потом уже код делали, только недавно был деятель, который так же код составлял.
Уберите все while (1=1) это бесконечный цикл, который всегда крутится в одном месте, чтобы программа не остановилась выполнив один раз все команды.

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

тело программы должно выглядеть так

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

 void main (void)
{
 // тут объявление переменных
while(1==1)
{
 
 
//тут ваша программа без while(1==1)

}//конец while(1==1)
}//конец main      
Аватара пользователя
unalex
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

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

Сообщение unalex »

Аlex писал(а):Ну во первых, говнокодом Ваш код никто не называл

да эт я просто слишком самокритичен :)

Аlex писал(а):Если Вы так и не поняли суть моих постов, то мне жаль моё потраченное время на это

суть то ясна, но хотелось бы увидеть как нужно делать правильно

Аlex писал(а):Если чем-то Вас огорчил - прошу прощения.

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

я нормально отношусь к критике, и если я делаю что то не так, мне хочется знать как делать правильно, но мои просьбы почему-то игнорируют и обходятся лишь абстракными фразами - " поищите...", "посмотрите в соседних темах..."

................
Valiullin.Amir изучайте основы, простое копирование кода без понимания того что в нем происходит вам ничего не даст
ЗЫ. я бы посоветовал начать с более простых проектов
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

unalex, всё очень просто. Что бы не нарваться на изменение уровня на ПИНе между его опросом и сохранением и не пропустить изменение, нужно его сначала сохранить в временную переменную/флаг и с ней дальше работать.

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

char cur_pin=0, prev_pin=0;

........
........

cur_pin = PORT & (1<<PIN);      // Читаем текущее значение ПИНа

if(cur_pin && !prev_pin){       // Состояние уровня изменилось с 0 на 1
...
}
if(!cur_pin && prev_pin){       // Состояние уровня изменилось с 1 на 0
...
}
if(cur_pin != prev_pin){        // Было любое изменение уровня на ПИНе
...
}

prev_pin=cur_pin;               // Сохраняем текущее значение
Аватара пользователя
unalex
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

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

Сообщение unalex »

Аlex писал(а):нужно его сначала сохранить в временную переменную


премного благодарен :beer:

кстати я так часто делаю(ввожу переменную и в ней храню состояние чтоб код нагляднее был и лишний раз порт не читать), правда не думал что это еще и спасает от ошибок
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
epemka
Родился
Сообщения: 3
Зарегистрирован: Сб фев 09, 2013 14:15:46
Откуда: Москва

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

Сообщение epemka »

Подскажите, пожалуйста! Грубо говоря нужно заставить лампочку мигнуть 3 раза и погаснуть. Можно ли обойтись как нить без delay_ms?
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

Можно.
Встречный вопрос. Чем не угодил delay_ms ?
epemka
Родился
Сообщения: 3
Зарегистрирован: Сб фев 09, 2013 14:15:46
Откуда: Москва

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

Сообщение epemka »

Хочется узнать другие варианты, не хочу останавливаться на достигнутом.через for :( не получается. Если ,Вам, не трудно напишите пожалуйста.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

Мне не трудно. Но что бы это сделать, мне нужно знать чем Вас не устроил один вариант.
epemka
Родился
Сообщения: 3
Зарегистрирован: Сб фев 09, 2013 14:15:46
Откуда: Москва

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

Сообщение epemka »

delay_ms слишком просто. Очень хочется освоить циклы, но не совсем их понимаю=(

for (a=1;a=3;a++)
{
a=a+1; PORTB.7=1;
delay_ms(200);
PORTB.7=0;

};
Бред написал, да?
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

Немного не понятно, причём тут циклы и delay_ms.
Задержки можно ещё таймерами реализовывать. Почитайте про них. А про циклы найдёте в любом букваре по Си.
Аватара пользователя
unalex
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

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

Сообщение unalex »

epemka писал(а):Бред написал, да?


1 приучите себя к тому что в С счет идет от 0 до MAX-1
2 в for второе выражение - условие, при котором цикл БУДЕТ работать
3 переменную внутри инкрементировать не надо, это делает третье выражение в for
4 после того как лампочка погасла, надо дать ей время побыть погашенной, иначе мигания не увидите

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

for (a = 0; a < 3; a++)
{
   PORTB.7=1;
   delay_ms(200);
   PORTB.7=0;
   delay_ms(200);
};
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Аватара пользователя
ELcat
Друг Кота
Сообщения: 3258
Зарегистрирован: Вт май 19, 2009 09:27:30
Откуда: Украина

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

Сообщение ELcat »

Ещё как вариант:

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

a = 0;
while (a < 3)
{
   PORTB.7=1;
   delay_ms(200);
   PORTB.7=0;
   delay_ms(200);
   a++;
};


unalex писал(а):1 приучите себя к тому что в С счет идет от 0 до MAX-1
Чуть-чуть уточню. Это касается не только языка Си, но так же и всех других языков программирования, и позиционных систем исчисления. Для лучшего понимания как это работает, представьте, допустим, 8-битное двоичное число. Количество всевозможных значений этого числа численно равно основанию системы счисления возведённому в степень количества разрядов или 2^8=256. Теперь представим, что каждому значению мы присваиваем по одной бумажной карточке. Всего берём 256 карточек, на первой записываем наименьшее возможное значение - "0" и у нас остаётся 255 карточек для записи "1", "2", "3", ... "254" и "255".
Последний раз редактировалось ELcat Сб мар 16, 2013 09:57:33, всего редактировалось 1 раз.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

Ещё как вариант:
Вариантов полно :)

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

a=3;
do{

........

}while(--a);
svr007
Родился
Сообщения: 15
Зарегистрирован: Пт ноя 12, 2010 11:58:37

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

Сообщение svr007 »

Добрый День. Подскажите в чем загвоздка.Вот кусок кода написанный в CodeVision AVR.

int AB;
int C = 0x1C2; // 450

прерывание по захвату
interrupt [TIM1_CAPT] void timer1_capt_isr(void)
{
ICP = ICR1L; // записываем значение регистра захвата
ICP |= (unsigned int)ICR1H<<8;
TCNT1H=0x00; // обнуляем счетный таймер
TCNT1L=0x00;
AB=(31250/ICP)*30; // подсчет импульсов


в рабочем цикле есть такой цикл
while (AB > C)
{
PORTB.0=1; // код выполнения(написал просто для примера)
};
PORTB.0=0; // вышли из цикла выключили порт, С обнуляется в другом месте

В Протеусе симуляция работает как надо, в самой Атмеге32 нифига, порт горит даже когда нет импульсов регистра по захвату,но если вместо переменной С написать число(AB > 0x1C2) все работает как и должно.Может кто подскажет в чем касяк? Сильно не пинайте,я учусь.
Ответить

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