помогите с кодом на Си

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
neid
Прорезались зубы
Сообщения: 228
Зарегистрирован: Пн окт 04, 2010 11:55:41

помогите с кодом на Си

Сообщение neid »

Всем доброй ночи! Вообщем че то не спится и вот у меня проблемка возникла, нужно выйти из цикла нажатием на кнопку(PINC.2), а как это реализовать с моим куском кода не знаю((((

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

while(1)      
{
       
      for (P=0; OCR2!=0x00; P++){
	        delay_ms(10);
	        OCR2--;}
      delay_ms(500);
        for (O=0; OCR2!=0xff; O++){
	        delay_ms(10);
	        OCR2++;}
      
      };
}
Реклама
Аватара пользователя
РадиоЛоматель
Мудрый кот
Сообщения: 1733
Зарегистрирован: Чт авг 21, 2008 22:03:30
Откуда: Одесса(Украина)
Контактная информация:

Re: помогите с кодом на Си

Сообщение РадиоЛоматель »

Во первых, это какое-то странное использование цикла for, если тут нужен while.

Тыц:

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

while( (OCR2 <>!= чему-то (Выполняется, пока истинно) )&&(PINC.2!=1(Или нулю, в зависимости от схемы) ))
{
  OCR2++/ --/ +=/ -= и прочая прочая... ;
  _delay_ms(10);
}
Или тыц:

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

while( (OCR2 <>!= чему-то (Выполняется, пока истинно) )
{
  OCR2++/ --/ +=/ -= и прочая прочая... ;

  if(PINC.2==1) <-Кнопка нажата
    break; <-Моментальный выход из цикла

  _delay_ms(10);
}
(*tmp) &= ~( ( (param1 & (1<<PARAM1_BIT6)) || ((param2==PARAM2_TRUE)&&(--param3)) ) ? (param1 & (~param2)) : (Func1() | FUNC1_FLAGS) );
Люблю Си...
Реклама
neid
Прорезались зубы
Сообщения: 228
Зарегистрирован: Пн окт 04, 2010 11:55:41

Re: помогите с кодом на Си

Сообщение neid »

РадиоЛоматель писал(а):Во первых, это какое-то странное использование цикла for, если тут нужен while.
вот дополнил для наглядности код

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

while (1)
  {
  // Place your code here
  if((PINC.0==0)&(OCR2!=0xff))
  {
  delay_ms(10); 
  OCR2+=1;
  }
  if((PINC.1==0)&(OCR2!=0x00)) 
  {
  delay_ms(10); 
  OCR2-=1; 
  };
  if (PINC.2==0) break;
}

while(2)      
{
       
      for (P=0; OCR2!=0x00; P++){
           delay_ms(10);
           OCR2--;}
      delay_ms(500);
        for (O=0; OCR2!=0xff; O++){
           delay_ms(10);
           OCR2++;}
      
      };
}
нужно выйти из while(2) и вернуться в while(1) и обратно из 1 во 2
Аватара пользователя
РадиоЛоматель
Мудрый кот
Сообщения: 1733
Зарегистрирован: Чт авг 21, 2008 22:03:30
Откуда: Одесса(Украина)
Контактная информация:

Re: помогите с кодом на Си

Сообщение РадиоЛоматель »

Ну если сильно надо именно так, то поместить эти два while внутрь еще одного. И прерывать их в нужный момент break-ами. А внешний цикл уже будет перекидывать их как положенно: по очереди из 1 в 2 и из 2 в один.
Но вообще, это все нужно переделать. Я не вникал, но судя по всему, это возможно. Подумайте, как можно это сделать в другом виде. Более не линейном и витиеватом.
(*tmp) &= ~( ( (param1 & (1<<PARAM1_BIT6)) || ((param2==PARAM2_TRUE)&&(--param3)) ) ? (param1 & (~param2)) : (Func1() | FUNC1_FLAGS) );
Люблю Си...
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: помогите с кодом на Си

Сообщение dosikus »

neid , для while в скобках условие , и это отнюдь не порядковый номер цикла... :)))
У обоих результат выражений TRUE , в результате оба бесконечные...
В циклах for в счетчике используется одна и та же переменная , а не куча .
Для начала хотя бы почитайте http://www.helloworld.ru/texts/comp/lang/c/c6/index.htm

Я понимаю , что AVR расслабляет до не хочу , но нельзя же так .
Не читая , лезьте сломя голову...
Реклама
neid
Прорезались зубы
Сообщения: 228
Зарегистрирован: Пн окт 04, 2010 11:55:41

Re: помогите с кодом на Си

Сообщение neid »

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

while(1){

while (PINC.2==1){ // в ручную регулируем яркость

if((PINC.0==0)&(OCR2!=0xff)) // óâåëè÷èâàòü ïîêà íå äîñòèãëî ìàêñèóìà
  {
  delay_ms(10); // çàäåðæêà 10 ìñ.
  OCR2+=1; //óâåëè÷èâàåì çàïîëíåíèå
  }
if((PINC.1==0)&(OCR2!=0x00)) // óìåíüøàòü ïîêà íå äîñòèãëî ìèíèóìà
  {
  delay_ms(10); // çàäåðæêà 10 ìñ.
  OCR2-=1; //óìåíüøàåì çàïîëíåíèå
  };
}

while(PINC.2==1) // плавно рагорается и тухнет
{
 for (P=0; ((OCR2!=0x00))&&((PINC.2==1)); P+=20){
        delay_ms(10);
        OCR2--;};
          
 for (O=0; ((OCR2!=0xff))&&((PINC.2==1)); O+=20){
        delay_ms(10);
        OCR2++;};
        
};   
}
добился все же переключения, из одного цикла в другой, право не с первого нажатия вылазиет из второго цикла(((... покритикуйте... ну или направьте у нужном направлении....

dosikus в курсе что условия, АВР для меня не расслабон а начало познания МК... читали и много вопросов возникает
Реклама
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Re: помогите с кодом на Си

Сообщение ChipKiller »

neid писал(а):... покритикуйте... ну или направьте у нужном направлении...
... ИМХО лучше "на словах" подробно описать, что именно хотите получить - тогда уже можно подумать над алгоритмом, а не гадать, что бы это значило ....
neid
Прорезались зубы
Сообщения: 228
Зарегистрирован: Пн окт 04, 2010 11:55:41

Re: помогите с кодом на Си

Сообщение neid »

ChipKiller писал(а): ИМХО лучше "на словах" подробно описать, что именно хотите получить - тогда уже можно подумать над алгоритмом, а не гадать, что бы это значило ....
Управлять светодиодом, 2 режима работы с помощью трех кнопок: + яркость, - яркость, и смена режимов. Первый режим: просто в ручную меняем яркость диода, второй: неприрывно сам плавно гаснет и разгорается снова. Еще на ум третий режим просто Ярко горит постоянно. Режимы меняются поочередно нажимая на кнопку 3, и так по кругу 1-2-3, 1-2-3.
neid
Прорезались зубы
Сообщения: 228
Зарегистрирован: Пн окт 04, 2010 11:55:41

Re: помогите с кодом на Си

Сообщение neid »

ну что реально ни кто больше не может помочь?
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Re: помогите с кодом на Си

Сообщение ChipKiller »

neid писал(а):ну что реально ни кто больше не может помочь?
определитесь в своих желаниях
neid писал(а):Еще на ум третий режим просто Ярко горит постоянно. Режимы меняются поочередно нажимая на кнопку 3, и так по кругу 1-2-3, 1-2-3.
... неплохо бы знать сколько градаций хватит, скорость переключения и т.д. А делать это все лучше с помощью прерываний ИМХО...
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18673
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: помогите с кодом на Си

Сообщение ARV »

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

typedef unsigned char u8;

#define KEY_UP 1
#define KEY_DN 2
#define KEY_NEXT 4
#define KEY_NONE 0

// функция, которая опрашивает кнопки и возвращает код нажатой
u8 get_key(void){
   u8 temp = ~(PINC & (KEY_UP | KEY_DN | KEY_NEXT));
   delay_ms(15);
   if(temp != (~(PINC & (KEY_UP | KEY_DN | KEY_NEXT))))
      return KEY_NONE;
   else
      return temp;
}

static void mode1(void){
   u8 key;
   while(1){
      key = get_key();
      switch(key){
      case KEY_UP: if(OCR2 < 255) OCR2++;
         break;
      case KEY_DN: if(OCR2) OCR2--;
         break;
      case KEY_NEXT:
         return;
      }
   }
}

static void mode2(void){
   u8 key;
   static signed char reverse;
   while(1){
      key = get_key();
      if(key == KEY_NEXT) return;
      if(OCR2 == 255) reverse = -1;
      if(OCR2 == 0) reverse = 1;
      OCR2 += reverce;
      delay_ms(100);
   }
}

static void mode3(void){
   while(get_key() != KEY_NEXT);
}

int main(void){
   // все настройки делаете сами

   while(1){
      mode1();
      mode2();
      mode3();
   }
}
так вас устроит?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
neid
Прорезались зубы
Сообщения: 228
Зарегистрирован: Пн окт 04, 2010 11:55:41

Re: помогите с кодом на Си

Сообщение neid »

ARV буду разбираться с вашим кодом, а там пойдет думаю...

Все кто отзвались большое приспасибо, т.к. я не ради "напишите мне код и все" а на чем то уже готовом посмотреть разобраться и делать правильно, а не что бы получилось - "Не читая , лезьте сломя голову..." сказали ваше читающие.
Аватара пользователя
zhu4er
Вымогатель припоя
Сообщения: 544
Зарегистрирован: Пт июн 04, 2010 17:40:13
Откуда: Непокорный город-герой Севастополь

Re: помогите с кодом на Си

Сообщение zhu4er »

ARV прав! Каждый режим запихнуть в процедуру, а потом с помощью оператора CASE переключать эти процедурки как душе угодно.
Даже у стен есть уши...
neid
Прорезались зубы
Сообщения: 228
Зарегистрирован: Пн окт 04, 2010 11:55:41

Re: помогите с кодом на Си

Сообщение neid »

Вообщем воспользовался кодом выше предложенныем AVR и решил попробовать сначало на кнопках его проверить, бедет ли работать в Протусе. к портам PORTD 1,2 подключил светодиоды. Чето ничего не выходит, разжуте что к каким пинам соответсвует KEY_UP 1 и т.д. и что делает блок:
// функция, которая опрашивает кнопки и возвращает код нажатой
u8 get_key(void){
u8 temp = ~(PINC & (KEY_UP | KEY_DN | KEY_NEXT));
delay_ms(15);
if(temp != (~(PINC & (KEY_UP | KEY_DN | KEY_NEXT))))
return KEY_NONE;
else
return temp;
}

Вот сам код:

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

#include <mega8.h>
#include <delay.h>


#define KEY_UP 1
#define KEY_DN 2
#define KEY_NEXT 3
#define KEY_NONE 0


typedef unsigned char u8;

// функция, которая опрашивает кнопки и возвращает код нажатой
u8 get_key(void){
   u8 temp = ~(PINC & (KEY_UP | KEY_DN | KEY_NEXT));
   delay_ms(15);
   if(temp != (~(PINC & (KEY_UP | KEY_DN | KEY_NEXT))))
      return KEY_NONE;
   else
      return temp;
}

static void mode1(void){
   u8 key;
   while(1){
      key = get_key();
      switch(key){
      case KEY_UP: PORTD.0=1;
      break;
      case KEY_DN: PORTD.1=1;
      break;
      case KEY_NEXT:
         return;
      }
   }
}


void main(void)
{

PORTC=0xff;
DDRC=0x00;


PORTD=0x00;
DDRD=0xFF;


while (1)
      {
mode1();
        };
}
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»