Страница 1 из 1

Не выключается PORTB при переходе от while k while

Добавлено: Пт окт 07, 2016 09:52:16
DDimka
Всем привет. Подскажите пожалуйста почему при переходе от while(i==1) к while(i==2) на PORTB.2 так и остаётся лог.1 и цикл прокручивается до конца а не сразу переходит. пишу в CodeVisionAVR
while (i==1)
{ if(m==3){PORTB.2=1;}
else{PORTB.2=0;}
break;
};

while (i==2)
{
if(s==6){PORTB.3=1;}
else{PORTB.3=0;}
break;
};

Re: Не выключается PORTB при переходе от while k while

Добавлено: Пт окт 07, 2016 10:02:58
alex38779
Желательно бы глянуть весь код программы.

Re: Не выключается PORTB при переходе от while k while

Добавлено: Пт окт 07, 2016 10:12:18
DDimka
alex38779 писал(а):Желательно бы глянуть весь код программы.

int i = 0;
int m = 0;
int s = 0;

interrupt [PC_INT0] void pin_change_isr(void)
{
if(!PINB.0){i++;}
if(i==5){i=0;}
if(!PINB.1){i--;}
if(i==0){i=0;}




}



interrupt [EXT_INT0] void ext_int0_isr(void)
{

}


interrupt [TIM0_COMPA] void timer0_compa_isr(void)
{
m++;
if(m>3){m=0;}

s++;
if(s>6){s=0;}



TCNT0=0x00;
}



void main(void)
{

#pragma optsize-
CLKPR=0x80;
CLKPR=0x05;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

PORTB=0x03;
DDRB=0x3C;

TCCR0A=0x00;
TCCR0B=0x05;
TCNT0=0x00;
OCR0A=0x92;
OCR0B=0x00;


GIMSK=0x60;
MCUCR=0x00;
PCMSK=0x03;
GIFR=0x60;


TIMSK0=0x04;




#asm("sei")
while (1){



while (i==1)
{ if(m==3){PORTB.2=1;}
else{PORTB.2=0;}
break;
};

while (i==2)
{
if(s==6){PORTB.3=1;}
else{PORTB.3=0;}
break;
};

};
как то так

Re: Не выключается PORTB при переходе от while k while

Добавлено: Пт окт 07, 2016 11:12:26
ARV
если бы вы хотя бы структурно форматировали свой код, то поняли бы, в чем проблема... может, так станет понятнее:

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

while (i==1) {
   if(m==3){
      PORTB.2=1;
   } else {
      PORTB.2=0;
   }
   break;
}

while (i==2) { 
   if(s==6){
      PORTB.3=1;
   } else {
      PORTB.3=0;
   }
   break;
}

Re: Не выключается PORTB при переходе от while k while

Добавлено: Пт окт 07, 2016 17:06:38
DDimka
[quote="ARV"]если бы вы хотя бы структурно форматировали свой код, то поняли бы, в чем проблема... может, так станет понятнее:

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

 если честно понятнее не стало

Re: Не выключается PORTB при переходе от while k while

Добавлено: Пт окт 07, 2016 18:20:49
ARV
разве вы не видите, что while у вас оба не работают? благодаря break внутри каждого они оба выполняются не до тех пор, пока верно условие, а пролетают только 1 раз?

Добавлено after 1 minute 4 seconds:
кроме того у вас в самом первом сообщении написаны одни условия, а потом в "коде" совсем другие - где-то явно лажа закралась.

Re: Не выключается PORTB при переходе от while k while

Добавлено: Пт окт 07, 2016 19:47:19
DDimka
ARV писал(а):разве вы не видите, что while у вас оба не работают? благодаря break внутри каждого они оба выполняются не до тех пор, пока верно условие, а пролетают только 1 раз?

Добавлено after 1 minute 4 seconds:
кроме того у вас в самом первом сообщении написаны одни условия, а потом в "коде" совсем другие - где-то явно лажа закралась.

почему не работают? в протеусе работает, только только криво, цикл до конца крутится. Крутяться постоянно пока не выйдешь из условия, что в первом сообщении что в коде условия одинаковы, пните в нужное направление как надо сделать, я только начинаю изучать мк, суть в том что по нажатию кнопки(внешнее прерывание) выполняем какое то действие раз в 3 секунды, при повторном нажатии уже раз в 6 секунд

Re: Не выключается PORTB при переходе от while k while

Добавлено: Пт окт 07, 2016 21:18:22
mas123
DDimka писал(а):почему не работают? в протеусе работает, только только криво
Так "работает" или же "криво"?
Или вообще не работает - и остаётся лог. "1"? :))
DDimka писал(а):цикл до конца крутится.
Оператор "break" осуществляет выход из цикла "while".
DDimka писал(а):нажатию кнопки(внешнее прерывание)
Имей в виду, вот такой обработчик прерывания от кнопки - работать не будет! Ибо дребезг контактов кнопки!
DDimka писал(а):как надо сделать
В данном случае, имхо, было бы полезно переменные "i", "m" и "s" объявить как "volatile"