Amigos, fiz um programa no MikroC e no CCS. No MikroC o circuito não funcionou e no CCS funcionou. O projeto foi feito para o PIC 16F877A.
Por que o mesmo código compilado no MikroC não funcionou e no CCS funcionou?
O meu programa funciona assim: eu aciono 18 reles ligados aos ports A,B e C do PIC. Quando cada relé está acionado os demais tem que ficar desativados. Então, a cada momento, eu tenho 1 relé ligado e 17 desligados.
O problema está ocorrendo na diretiva SWITCH/CASE. Quando o programa chega em "CASE 3", ele seta dois pinos do PIC simultaneamente, acionando dois relés ao mesmo tempo o que não pode acontecer.
Mas, o detalhe mais interessante é que, na simulação dentro do MikroC, o circuito funcionou perfeitamente bem!
Segue o código completo abaixo para vocês verem:
//==============================================
static bit x; //variáveis tipo flag de 1 bit
static char contador; //variável inteira de 8 bits sem sinal
//Definições de alguns pinos
//Pinos de entrada definidos pela função interna BUTTON
#define com1 porta.ra2
#define com2 porta.ra3
#define com3 portc.rc6
#define com4 porta.ra5
#define com5 portb.rb0
#define com6 portb.rb1
#define com7 portb.rb2
#define com8 portb.rb3
#define com9 portb.rb4
#define com10 portb.rb5
#define com11 portb.rb6
#define com12 portb.rb7
#define com13 portc.rc0
#define com14 portc.rc1
#define com15 portc.rc2
#define com16 portc.rc3
#define com17 portc.rc4
#define com18 portc.rc5 //aciona relés de 1 a 18 dos comandos de seleção de taps
#define key1 porte.re0 //aciona display 1
#define key2 porte.re1 //aciona display 2
#define key3 porte.re2 //aciona display 3
char tabela[]={0,238,40,205,109,43,103,231,44,239,111,199,129,4,1,64};
void zero_start(){
if(contador==0){
com1=0;
key1=1;
key2=1;
key3=1; //aciona todos os digitos simultaneamente
portd=tabela[1]; //mostra "0" nos displays
delay_ms(2);
}
}
void comand(){
if(button(&porta,0,200,0) && (contador<18)){ //comandos para incrementar saídas
contador=contador+1;
x=1; }
if(button(&porta,1,200,0) && (contador>0)){ //comando para decrementar saídas
contador=contador-1;
x=1; }
}
void stepper_displays(){
switch(contador)
{
case 1:
com2=0;
delay_ms(10);
com1=1; //aciona rele 1
key1=1;
portd=tabela[0]; //apaga display 1
delay_ms(2);
key1=0;
key2=1;
portd=tabela[6]; //mostra "5" no display 2
delay_ms(2);
key2=0;
key3=1;
portd=tabela[1]; //mostra "0" no display 3
delay_ms(2);
key3=0;
break;
case 2:
com1=0;
com3=0;
delay_ms(10);
com2=1; //aciona rele 2
key1=1;
portd=tabela[0]; //apaga display 1
delay_ms(2);
key1=0;
key2=1;
portd=tabela[7]; //mostra "6" no display 2
delay_ms(2);
key2=0;
key3=1;
portd=tabela[6]; //mostra "5" no display 3
delay_ms(2);
key3=0;
break;
case 3:
com2=0;
com4=0;
delay_ms(10);
com3=1; //aciona rele 3
key1=1;
portd=tabela[0]; //apaga display 1
delay_ms(2);
key1=0;
key2=1;
portd=tabela[9]; //mostra "8" no display 2
delay_ms(2);
key2=0;
key3=1;
portd=tabela[1]; //mostra "0" no display 3
delay_ms(2);
key3=0;
break;
case 4:
com3=0;
com5=0;
delay_ms(10);
com4=1; //aciona rele 4
key1=1;
portd=tabela[0]; //apaga display 1
delay_ms(2);
key1=0;
key2=1;
portd=tabela[10]; //mostra "9" no display 2
delay_ms(2);
key2=0;
key3=1;
portd=tabela[6]; //mostra "5" no display 3
delay_ms(2);
key3=0;
break;
case 5:
com4=0;
com6=0;
delay_ms(10);
com5=1; //aciona rele 5
key1=1;
portd=tabela[2]; //mostra "1" no display 1
delay_ms(2);
key1=0;
key2=1;
portd=tabela[2]; //mostra "1" no display 2
delay_ms(2);
key2=0;
key3=1;
portd=tabela[1]; //mostra "0" no display 3
delay_ms(2);
key3=0;
break;
case 6:
com5=0;
com7=0;
delay_ms(10);
com6=1; //aciona rele 6
key1=1;
portd=tabela[2]; //mostra "1" no display 1
delay_ms(2);
key1=0;
key2=1;
portd=tabela[3]; //mostra "2" no display 2
delay_ms(2);
key2=0;
key3=1;
portd=tabela[6]; //mostra "5" no display 3
delay_ms(2);
key3=0;
break;
case 7:
com6=0;
com8=0;
delay_ms(10);
com7=1; //aciona rele 7
key1=1;
portd=tabela[2]; //mostra "1" no display 1
delay_ms(2);
key1=0;
key2=1;
portd=tabela[5]; //mostra "4" no display 2
delay_ms(2);
key2=0;
key3=1;
portd=tabela[1]; //mostra "0" no display 3
delay_ms(2);
key3=0;
break;
case 8:
com7=0;
com9=0;
delay_ms(10);
com8=1; //aciona rele 8
key1=1;
portd=tabela[2]; //mostra "1" no display 1
delay_ms(2);
key1=0;
key2=1;
portd=tabela[6]; //mostra "5" no display 2
delay_ms(2);
key2=0;
key3=1;
portd=tabela[6]; //mostra "5" no display 3
delay_ms(2);
key3=0;
break;
case 9:
com8=0;
com10=0;
delay_ms(10);
com9=1; //aciona rele 9
key1=1;
portd=tabela[2]; //mostra "1" no display 1
delay_ms(2);
key1=0;
key2=1;
portd=tabela[8]; //mostra "7" no display 2
delay_ms(2);
key2=0;
key3=1;
portd=tabela[1]; //mostra "0" no display 3
delay_ms(2);
key3=0;
break;
case 10:
com9=0;
com11=0;
delay_ms(10);
com10=1; //aciona rele 10
key1=1;
portd=tabela[2]; //mostra "1" no display 1
delay_ms(2);
key1=0;
key2=1;
portd=tabela[9]; //mostra "8" no display 2
delay_ms(2);
key2=0;
key3=1;
portd=tabela[6]; //mostra "5" no display 3
delay_ms(2);
key3=0;
break;
case 11:
com10=0;
com12=0;
delay_ms(10);
com11=1; //aciona rele 11
key1=1;
portd=tabela[3]; //mostra "2" no display 1
delay_ms(2);
key1=0;
key2=1;
portd=tabela[1]; //mostra "0" no display 2
delay_ms(2);
key2=0;
key3=1;
portd=tabela[1]; //mostra "0" no display 3
delay_ms(2);
key3=0;
break;
case 12:
com11=0;
com13=0;
delay_ms(10);
com12=1; //aciona rele 12
key1=1;
portd=tabela[3]; //mostra "2" no display 1
delay_ms(2);
key1=0;
key2=1;
portd=tabela[2]; //mostra "1" no display 2
delay_ms(2);
key2=0;
key3=1;
portd=tabela[6]; //mostra "5" no display 3
delay_ms(2);
key3=0;
break;
case 13:
com12=0;
com14=0;
delay_ms(10);
com13=1; //aciona rele 13
key1=1;
portd=tabela[3]; //mostra "2" no display 1
delay_ms(2);
key1=0;
key2=1;
portd=tabela[4]; //mostra "3" no display 2
delay_ms(2);
key2=0;
key3=1;
portd=tabela[1]; //mostra "0" no display 3
delay_ms(2);
key3=0;
break;
case 14:
com13=0;
com15=0;
delay_ms(10);
com14=1; //aciona rele 14
key1=1;
portd=tabela[3]; //mostra "2" no display 1
delay_ms(2);
key1=0;
key2=1;
portd=tabela[5]; //mostra "4" no display 2
delay_ms(2);
key2=0;
key3=1;
portd=tabela[6]; //mostra "5" no display 3
delay_ms(2);
key3=0;
break;
case 15:
com14=0;
com16=0;
delay_ms(10);
com15=1; //aciona rele 15
key1=1;
portd=tabela[3]; //mostra "2" no display 1
delay_ms(2);
key1=0;
key2=1;
portd=tabela[7]; //mostra "6" no display 2
delay_ms(2);
key2=0;
key3=1;
portd=tabela[1]; //mostra "0" no display 3
delay_ms(2);
key3=0;
break;
case 16:
com15=0;
com17=0;
delay_ms(10);
com16=1; //aciona rele 16
key1=1;
portd=tabela[3]; //mostra "2" no display 1
delay_ms(2);
key1=0;
key2=1;
portd=tabela[8]; //mostra "7" no display 2
delay_ms(2);
key2=0;
key3=1;
portd=tabela[6]; //mostra "5" no display 3
delay_ms(2);
key3=0;
break;
case 17:
com16=0;
com18=0;
delay_ms(10);
com17=1; //aciona rele 17
key1=1;
portd=tabela[3]; //mostra "2" no display 1
delay_ms(2);
key1=0;
key2=1;
portd=tabela[10]; //mostra "9" no display 2
delay_ms(2);
key2=0;
key3=1;
portd=tabela[1]; //mostra "0" no display 3
delay_ms(2);
key3=0;
break;
case 18:
com17=0;
delay_ms(10);
com18=1; //aciona rele 18
key1=1;
portd=tabela[4]; //mostra "3" no display 1
delay_ms(2);
key1=0;
key2=1;
portd=tabela[1]; //mostra "0" no display 2
delay_ms(2);
key2=0;
key3=1;
portd=tabela[6]; //mostra "5" no display 3
delay_ms(2);
key3=0;
break;
}
}
void main(void){
porta=0;
portb=0;
portc=0;
portd=0;
porte=0;
trisa=3;
trisb=0;
trisc=0;
trisc=0;
trise=0;
option_reg=0x88;
intcon=0x00;
adcon0=0x00;
adcon1=0x07;
cmcon=0x07;
start_test();
delay_ms(400);
while(1){
zero_start();
comand();
stepper_displays();
}
}
//Fim do Programa.