PROBLEMAS NO MIKRO C

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

PROBLEMAS NO MIKRO C

Mensagempor Pask » 18 Abr 2010 20:50

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.
Pask
Word
 
Mensagens: 600
Registrado em: 22 Dez 2006 19:19

Mensagempor tcpipchip » 18 Abr 2010 21:33

Mas chega a rodar alguma coisa ? Tentou pelo menos acender um led antes ? Nao é problema nos FUSES ?
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Mensagempor Pask » 19 Abr 2010 08:12

A única explicação que encontro seriam problemas com os fuses realmente. Não há nada mais que possa estar causando este erro de funcionamento no circuito.

O problema de programar em assembly é o grande trabalho em escrever o código. Mas, é uma linguagem bem mais confiável mesmo!

Uma pergunta: no Mikro C existe algum comando específico para alterar os fuses que possa ser escrito dentro do código fonte?
Pask
Word
 
Mensagens: 600
Registrado em: 22 Dez 2006 19:19

Mensagempor Pask » 21 Abr 2010 11:47

Problema resolvido!

Não havia nada de errado com o meu código e nem com o MikroC. Bastou apenas acrescentar uma instrução "delay_ms(5)" como no exemplo abaixo indicado e tudo funcionou sem nenhum problema a mais.

case 9:
com8=0;
DELAY_MS(5); //instrução acrescentada em todos os CASES
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;

Obrigado a todos que tentaram me ajudar.
Pask
Word
 
Mensagens: 600
Registrado em: 22 Dez 2006 19:19


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Google [Bot] e 1 visitante

x