Página 1 de 1

PIC Doidão

MensagemEnviado: 27 Mar 2009 15:04
por Controladores
Boa Tarde Caros

Estou utilizando o compilador mikroc, meu programa usa 4 entradas digitatais para fazer uma rotina de acionamentos de reles, gravo o PIC e tudo funciona normalmente depois desligo e ligo o circuito ele volta a funcionar mas com algumas entradas não obedecendo os comandos, apos isso se eu desligar e ligar novamente a mesma coisa acontece, depois seu eu gravar outro programa no Pic, e gravar o dos reles novamente ele volta a funcionar.Estou perdido não consigo entender o que esta acontecendo.

Utilizo o PIC 16F877A.

MensagemEnviado: 27 Mar 2009 15:11
por fabim
Pode acontecer o seguinte.
Muitas vezes, dependendo da lógica inicial para o main.
O programa faz testes de valor de variaveis para decisão, se partir de zero tudas as variaveis zero, o seu programa ja estava esperando isto, exatamente por isso ele funciona logo após a gravação do pic, pois não sei o porque, o pic quando gravado zera todas as posições de ram.
Na proxima vez que ligar o pic, não é possivel prever no momendo de alimenteção, se estas variaveis vão realmente estar a zero, somente se você fizer a inserção de valores na mão.

Caso não seja este o problema, pode ser o seu hardware, cristal, ou algo parecido.

De mais detalhes, como um pedaço inicial do main de seu fonte.
O esquema eletrico.

Para que possa ser ajudado, sua pergunta tem que ter consistência, e algum exemplo a ser estudado.

Abraços

fabim

MensagemEnviado: 27 Mar 2009 15:27
por v.vicente
Talvez possa ajudar se ativar o POWER UP TIME na gravação.

Quando ele é ativado e faz com que o uC só comece a funcionar cerca de 72ms depois que a fonte de alimentação for ligada, com a finalidade de garantir que o circuito oscilador atinja a estabilidade. Também costumo usar o WDT para garantir a estabilidade na inicialização do sistema evitando travamentos.

Mas como disse o fabim também pode ser problemas de inicialização da RAM, dai basta vc fazer um rotina de inicialização da RAM, se não me engano o C18 já faz isso. Sem contar os problemas de hardware.


Abrcs,

Vinicius

MensagemEnviado: 27 Mar 2009 15:36
por Controladores
Esta é minha main sobre o wdt como faço para usa-lo?


Obrigado

void main () {
// declaração de variaveis
short rele=1,estado=1,x=1,msg=1;
char txt[5];//variavel que recebe o texto para exibir no display
char txt2[5];//variavel que recebe o texto para exibir no display

Usart_Init(19200);
inicializa () ;
ADCON1 = 0b01000100; // configura o registrador ADCON1
OPTION_REG = 0b11000100; // configura o prescale
INTCON = 0xA0; // habilita a interrupção
Lcd_Config(&PORTD,4,5,7,3,2,1,0);
Lcd_Init(&PORTD);// RS, EN, WR, D7 .. D4
TRISB = 0; //coloca a porta B como saida
TRISC.F0 = 1; //coloca a porta C0 como entrada
TRISC.F2 = 0;
PORTC.F2 = 0;
TRISE.F0 = 1;
TRISE.F1 = 1;
TRISA.F5 = 1;
TRISA.F3 = 1;
TRISA.F4 = 0;
TRISA.F2 = 0;
TRISC.F3 = 1;
TRISC.F4 = 1;
TRISE.F2 = 1;
TRISD.F6 = 0;
TRISC.F5 = 0;
PORTB = 0;
TRISC.F1 = 0;

Lcd_Cmd (LCD_CURSOR_OFF);
inicializa () ;
i=0;
while (1) {
com_recebe();
f_fila();
bate_manga();
trata_tela(msg);

if (TECLA_S==0) {

Lcd_Cmd(Lcd_Clear);
debounce();
msg++;
}
if (msg>5)
msg=1;
if (canal>8)
canal = 1;
// analogica[canal] = mux_analogica(canal); // le dados multiplexados
if (canal==5)
jdsu=200;
else{
jdsu=400; // variavel que serve linearizar temperatura e pressão
b[canal] = linear (222,1023,0,jdsu,analogica[canal]) ; // Lineariza dados analogicos
}
if(valv_conta>20)
valv_conta=1;
canal++;

}
}

MensagemEnviado: 27 Mar 2009 15:46
por fabim
Amigo, porque você esta inicializando o display duas vezes ?


///////////////////////// rs ,en , rw , b7, b6, b5 , b4
Lcd_Config(&PORTD, 0 , 2 , 1 , 7 , 6 , 5 , 4);
delay_ms(10);
Lcd_Out(1, 1, "basta apenas isto");
// Este é um de seus erros sobre o display.

No mais, pela salada de frutas, não estou achando nada que seja uma entrada condicional, que esteja causando algum erro de lógica.

Fabim

MensagemEnviado: 27 Mar 2009 16:18
por Controladores
v.vicente escreveu:Talvez possa ajudar se ativar o POWER UP TIME na gravação.

Quando ele é ativado e faz com que o uC só comece a funcionar cerca de 72ms depois que a fonte de alimentação for ligada, com a finalidade de garantir que o circuito oscilador atinja a estabilidade. Também costumo usar o WDT para garantir a estabilidade na inicialização do sistema evitando travamentos.

Mas como disse o fabim também pode ser problemas de inicialização da RAM, dai basta vc fazer um rotina de inicialização da RAM, se não me engano o C18 já faz isso. Sem contar os problemas de hardware.


Abrcs,

Vinicius


Como faço pra utilizar o WDT

MensagemEnviado: 27 Mar 2009 16:33
por Controladores
Tenho varias entradas condicionais em outras funções, como faço para que não aconteça o probelma que vc disse sobre a RAM.

Obrigado

MensagemEnviado: 27 Mar 2009 16:38
por fabim
quando criar a variavel.
exemplo.
_u int a,b,c;

Faça assim.
_u int a=0, b=0, c=0;

Ou coloque o valor para inicializar com sua lógica.

Quando você chamar a função, antes de qualquer execução o compilador monta assim.
a = 0;
b = 0;
c = 0;
Execução daqui pra baixo!!

Olha sobre o wdt, não sei qual compilador esta utlizando, mais na maioria define ele ligado nos defines iniciais do projeto, ou se for tipo o mikroC, la na configuração de processador, basta apenas selecionar o wdt e não esquecer de configurar para o tempo de estouro, e ainda mais limpar ele em locais criticos.

Mais se você nem sabe como ligar ele, então por enquanto não se meta com isso..

fabim

MensagemEnviado: 27 Mar 2009 16:58
por Controladores
Se ligo o wdt nas configurações do processador ele simplismente não funciona.

MensagemEnviado: 27 Mar 2009 17:03
por fabim
claro que não, tem algumas coisas pra configurar, e dentro do tempo de estouro de em defalt +/- 18mS, você tem que executar o comando.
CLRWDT;

MensagemEnviado: 27 Mar 2009 17:13
por Controladores
Obrigado amigos consegui resolver o problema ele estava na inicialização das portas do pic.Ou seja eu não estava limpando as portas.