Pika4u писал(а):Теперь у меня возникла ещё проблема-в ниже перечисленном коде, если сделать задержку(не которая опрос кнопок, а между управлением состояния портов) меньше 170000 тактов(частота тактирования МК составляет 4 МГц), то появляется баг - если, например, в верхнем ряду зажжен 1 светодиод, а в нижнем-2, то иногда на секунду-две погасает то верхний(1) светодиод, то нижний (2). И так при любой комбинации, кроме верхний-1, нижний-1.
А как по вашему мнению должно быть? мы же не знаем какая логика задумана в вашем мозге
Pika4u писал(а):while(1)
{
old= __save_interrupt();|
__disable_interrupt(); |
if(PIND_Bit6==0) |
{ |
__delay_cycles(20000); |
if(PIND_Bit6==0) |Я бы заменил эту часть на switch
fiveminute++; |
} |
if(PIND_Bit5==0) |
{ |
__delay_cycles(20000);|
if(PIND_Bit5==0) |
hours++; |
}
PORTA_Bit1=1;
PORTA_Bit0=0;
PORTB=timeb[fiveminute];
PORTD=timed[fiveminute];
__restore_interrupt(old);
__delay_cycles(170000);
old= __save_interrupt();
__disable_interrupt();
PORTA_Bit0=1;
PORTB=0;
PORTD=0;
__restore_interrupt(old);
__delay_cycles(170000);
old= __save_interrupt();
__disable_interrupt();
PORTA_Bit1=0;
PORTD=timed[hours];
PORTB=timeb[hours];
__restore_interrupt(old);
__delay_cycles(170000);
old= __save_interrupt();
__disable_interrupt();
PORTA_Bit1=1;
PORTB=0;
PORTD=0;
__restore_interrupt(old);
__delay_cycles(170000);
}
}
old= __save_interrupt();|
__disable_interrupt(); |
in_pins=~(pind$BUTTONS_MASK);
switch(in_pins){
case:(1<<Bit6){ваши действия;break;}
case:(1<<Bit5){ваши действия;break;}
default :break;
}
Правкаили так:
old= __save_interrupt();|
__disable_interrupt(); |
in_pins=get_pins();
switch(in_pins){
case:(1<<Bit6){ваши действия;break;}
case:(1<<Bit5){ваши действия;break;}
default :break;
}
int get_pins(void){
old_pins=~(pind&BUTTONS_MASK);
__delay_cycles(20000);
if (old_pins==(~(pind&BUTTONS_MASK))){
return old_pins;
break;
}
else return 0;}
В поисках истины человек развивается.