PIC Doidão

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

PIC Doidão

Mensagempor Controladores » 27 Mar 2009 15:04

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.
Controladores
Byte
 
Mensagens: 180
Registrado em: 05 Jan 2007 17:10

Mensagempor fabim » 27 Mar 2009 15:11

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
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor v.vicente » 27 Mar 2009 15:27

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
v.vicente
 
Mensagens: 4
Registrado em: 05 Fev 2009 18:54

Mensagempor Controladores » 27 Mar 2009 15:36

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++;

}
}
Controladores
Byte
 
Mensagens: 180
Registrado em: 05 Jan 2007 17:10

Mensagempor fabim » 27 Mar 2009 15:46

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
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor Controladores » 27 Mar 2009 16:18

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
Controladores
Byte
 
Mensagens: 180
Registrado em: 05 Jan 2007 17:10

Mensagempor Controladores » 27 Mar 2009 16:33

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
Controladores
Byte
 
Mensagens: 180
Registrado em: 05 Jan 2007 17:10

Mensagempor fabim » 27 Mar 2009 16:38

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
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor Controladores » 27 Mar 2009 16:58

Se ligo o wdt nas configurações do processador ele simplismente não funciona.
Controladores
Byte
 
Mensagens: 180
Registrado em: 05 Jan 2007 17:10

Mensagempor fabim » 27 Mar 2009 17:03

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;
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor Controladores » 27 Mar 2009 17:13

Obrigado amigos consegui resolver o problema ele estava na inicialização das portas do pic.Ou seja eu não estava limpando as portas.
Controladores
Byte
 
Mensagens: 180
Registrado em: 05 Jan 2007 17:10


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

cron

x