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

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Аватара пользователя
Сообщения: 4
Зарегистрирован: Пт окт 07, 2016 07:15:37

Сообщение 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;
};
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 386
Зарегистрирован: Чт окт 31, 2013 10:54:32

Сообщение alex38779 »

Желательно бы глянуть весь код программы.
Контактная информация:
Реклама
Родился
Аватара пользователя
Сообщения: 4
Зарегистрирован: Пт окт 07, 2016 07:15:37

Сообщение 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;
};

};
как то так
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение 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;
}
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Родился
Аватара пользователя
Сообщения: 4
Зарегистрирован: Пт окт 07, 2016 07:15:37

Сообщение DDimka »

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

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

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

Сообщение ARV »

разве вы не видите, что while у вас оба не работают? благодаря break внутри каждого они оба выполняются не до тех пор, пока верно условие, а пролетают только 1 раз?

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

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Родился
Аватара пользователя
Сообщения: 4
Зарегистрирован: Пт окт 07, 2016 07:15:37

Сообщение DDimka »

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

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

почему не работают? в протеусе работает, только только криво, цикл до конца крутится. Крутяться постоянно пока не выйдешь из условия, что в первом сообщении что в коде условия одинаковы, пните в нужное направление как надо сделать, я только начинаю изучать мк, суть в том что по нажатию кнопки(внешнее прерывание) выполняем какое то действие раз в 3 секунды, при повторном нажатии уже раз в 6 секунд
Потрогал лапой паяльник
Сообщения: 312
Зарегистрирован: Вс июл 29, 2012 16:25:39

Сообщение mas123 »

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

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