PIC TRAVANDO

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

PIC TRAVANDO

Mensagempor Pask » 16 Jan 2008 09:38

O que pode ser um PIC travando sem mais nem menos?

O circuito está montado em protoboard, existe o acionamento de carga indutiva algumas vezes, estou usando um resistor de 10k ohms ligado do pino de MCLR para o Vcc e um capacitor poliester de 100nF ligado do pino de MCLR para o GND; mas, antes, o pino de MCLR estava ligado diretamente ao Vcc e o travamento também acontecia. Ontém aconteceu um outro fato estranho: o PIC é alimentado com um regulador 7805. Num dado momento, a tensão de saída deste regulador baixou para algo em torno de 4,78V. Porém, isto não provocou o travamento do PIC. Hoje, a tensão estava em torno de 4,98V e o PIC travou. Para destravá-lo é preciso ressetá-lo desligando a alimentação e voltando a ligá-la.
Existe um botão num de seus pinos. Quando ele trava, este botão fica inativo. Porém, existe uma função para tratar a interrupção do timer0 que não pára de funcionar, ou seja, durante o travamento, a interrupção do timer0 continua ocorrendo normalmente! Mesmo assim, já troquei o cristal de 4MHz para ver no que dá.
Será que este PIC está bichado?
Pask
Word
 
Mensagens: 600
Registrado em: 22 Dez 2006 19:19

Mensagempor fabio_ » 16 Jan 2008 10:13

Pask,

Eu utilizo o PIC a uns 5 anos e nunca vi um deles "bichado". E esse é um dos motivos que continuo utilizando.
voce precisa dar mais informações sobre o hardware que montou ou postar o diagrama para podermos analisar se algum componentes externo pode estar causando o problema, mas pelo que voce falou acredito que o seu problema está no software. Alguma rotina deve estar travando.
Se voce tiver um ICD fica fácil saber onde o programa "trava".
No pino MCLR eu só utilizo um resistor pull-up de 10K ou 1K quando uso o ICD.

até +.
fabio_
Byte
 
Mensagens: 177
Registrado em: 13 Jun 2007 12:08

Mensagempor buiz » 16 Jan 2008 10:30

Olá Pask,

Ja tive um problema parecido com o seu, tinha dois Timer e uma rotina para ler 4 teclas, as vezes congelava tudo menos os timers.

Tentei de tudo, ai descobri que o problema estava no meu programa, fiz a rotina das 4 teclas de outra forma e funcionou legal.

E olha que passei alguns dias sofrendo com o isso, e era só a minha rotina que estava fazendo toda a tranqueira.

Da uma analisada no seu programa, e só mais uma pergunta, por acaso não esta trancando somente quando aciona a carga indutiva, e que tipo de carga é, pode estar faltando algum filtro ai.

Abraços Buiz
Avatar do usuário
buiz
Byte
 
Mensagens: 165
Registrado em: 20 Out 2006 14:59
Localização: Cachoeira do Sul - RS

Mensagempor tcpipchip » 16 Jan 2008 12:02

O pior é quando, depos de um tempo, o botao RESET, uma vez pressionado, nada faz o PIC resetar...só tirando a alimentação!!
Pode isto?
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Mensagempor ze » 16 Jan 2008 12:45

Habilite:
Low power Power-on Reset (POR)
Power-up Timer (PWRT) and Oscillator Start-up Timer (OST)
Brown-out Detect (BOD)
e porque não:
Watchdog Timer (WDT) (reset FORA da INT)

RC no pino reset (1 das recomendações uXip - C=optional, but...)

abrç
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor Pask » 16 Jan 2008 15:56

Amigos, inicialmente obrigado a todos vocês que responderam e tentaram ajudar-me.
Eu já tenho o RC no pino de reset.
As configurações do PIC são:
POWER-UP TIMER ATIVADO
WATCHDOG TIMER ATIVADO
BROWNOUT DETECT DESATIVADO
XT OSCILATOR

Antes, o pino de reset estava diretamente ligado ao Vcc. Depois que eu inclui o circuito RC, ele ainda não travou. Já fiz vários minutos de teste agora a tarde e ficou tudo bem. Vamos ver se continua.

Alguém disse que tinha o mesmo problema com o PIC e que a causa era mesmo o código. Após a alteração no código o problema foi resolvido. Você poderia me passar mais detalhes de quais modificações você fez para acionar as 4 teclas? Obrigado.
Pask
Word
 
Mensagens: 600
Registrado em: 22 Dez 2006 19:19

Mensagempor Pask » 16 Jan 2008 16:00

ESPECIALMENTE PARA O BUIZ:

Vc me fez uma pergunta e eu esqueci de responder: já coloquei vários capacitores eletrolíticos e poliester em pontos estratégicos do circuito e conferir a pureza do sinal com o osciloscópio. Não há ruidos fortes o bastante para causar este problema.
Pask
Word
 
Mensagens: 600
Registrado em: 22 Dez 2006 19:19

Mensagempor Pask » 16 Jan 2008 16:00

ESPECIALMENTE PARA O BUIZ:

Vc me fez uma pergunta e eu esqueci de responder: já coloquei vários capacitores eletrolíticos e poliester em pontos estratégicos do circuito e conferi a pureza do sinal com o osciloscópio. Não há ruidos fortes o bastante para causar este problema.
Pask
Word
 
Mensagens: 600
Registrado em: 22 Dez 2006 19:19

Mensagempor fabim » 16 Jan 2008 16:00

1 questãos...

1. Na int do tmr0, voce esta limpando o flag de interrupção antes de vazar da int ?

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 Pask » 16 Jan 2008 16:04

Estou usando o compilador C da CCS. O próprio compilador se encarrega de ressetar o flag da interrupção.
Pask
Word
 
Mensagens: 600
Registrado em: 22 Dez 2006 19:19

Mensagempor fabim » 16 Jan 2008 16:11

é.. intão reseta manualmente e faz um teste..
quando entrar na int, desliga a chave de int do TMR0 e limpa o flag dele
quando for sair da int liga novamente a chave do tmr0.

num custa tentar
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 buiz » 16 Jan 2008 17:56

Olha, faz tanto tempo que não me lembro, mas na época eu tinha utilizado 01 timer para ativar 4 displays de LED, varrer 4 teclas, comparar variaveis e acionar 8 relés conforme programação.

Achei que estava meio lotado e dividi em 2 timers as tarefas, coloquei no timer 0 os displays de LED e os relés, e no Timer1 a varredura de teclas e as comparações lógicas, beleza, funciona até hoje perfeitamente.

Este equipamento acionava 8 motores de 24Vcc através de relés, para cada motor eu tive que utilizar um capacitor eletrolitico de 2200uF ligado em paralelo com cada motor, pois antes disso tambem, quase sempre que um motor era desligado causava reset no circuito.

Se for acinar uma carga indutiva AC, não esqueça de colocar uma Filtro em paralelo com a alimentação, para evitar encomodações.

Bom, continua testando, deixa ligado direto, não é normal congelar.

Você esta utilizando displays, comunicação, ou coisa deste tipo? Será que o problema não esta em outro lugar?

Como esta os contatos da sua protoboard, os contatos ja não estão meio gastos, mau contato em Proto tambem é um problemão.

Eu ja fiz um circuito com um DS1307 que passva congelando na Proto, mas como eu sabia que tudo estava certo, ao passar para a placa definitiva, beleza tudo numa boa, acabou a minha dor de cabeça.

As proto as vezes acabam servindo de antena para os mais diverso tipos de interferencias, as vezes até uma lampada fluorescente que tem na sala proximo ao circuito pode ser causa de varios fantasmas pertubadores.

Bom, acabei falando demais, mas é bom trocar uma ideia, as vezes numa destas, pode surgir a solução para algum problema.

Abraços indio velho, qualquer coisa é só prender o grito.

Buiz.
Avatar do usuário
buiz
Byte
 
Mensagens: 165
Registrado em: 20 Out 2006 14:59
Localização: Cachoeira do Sul - RS

Mensagempor buiz » 16 Jan 2008 18:04

Só mais uma:

Como esta a sua alimentação do PIC, você falou que estava variando a tensão de saida do 7805, bota um capacitor eletrolitico de 1000uF na entrada e um capacitor poliester 100nF. Ja na saida coloca um de 47uF eletrolitico, 01 de 100nF poliester e 01 resistor de 1K em paralelo com o 5V e GND.

Esta é apenas uma sugestão, pois uso em todos os meus circuitos e funciona beleza.

Ok

Abraços
Avatar do usuário
buiz
Byte
 
Mensagens: 165
Registrado em: 20 Out 2006 14:59
Localização: Cachoeira do Sul - RS

Mensagempor Pask » 16 Jan 2008 18:27

Falou Buiz.
Mas, eu acredito que já descobri o que está acontecendo. O meu programa é dividido em duas partes distintas. A primeira, não utiliza nenhuma interrupção e, quando o programa está rodando esta parte, não ocorre nenhum travamento; a segunda parte faz uso da interrupção do timer0 e é aqui que acontecem os travamentos esporádicos. Por que eles acontecem?
Na segunda parte do programa a interrupção de timer0 é usada para acionar dois pinos de saída do PIC alternadamente em função de intervalo de tempos entre eles. Existe uma função específica somente para alterar ou fazer variar esses intervalos de tempo em função das necessidades do circuito externo utilizando duas variáveis de 16 bits que eu chamei de x e y. Depois, a interrupção de timer0 utiliza o valor armazenado nessas variáveis para executar suas próprias instruções internas. Então, segue abaixo o bloco que representa essas funções:

void varia(void){ //função que controla x e y

if(valor < 501){
x=x+167;
y=y-167; }
if(valor > 522){
x=x-167;
y=y+167; }
restart_wdt();
}

//----------------------------------------------------------------------------------
#int_timer0 //interrupção de timer0
void alternating(){
output_high(w1);
delay_us(x);
output_low(w1);
delay_us(y);
output_high(w2);
delay_us(x);
output_low(w2);
delay_us(y);
set_timer0(0); }
//-----------------------------------------------------------------------------------

Continuando, veja que no final da seq. do tratamento da rotina de interrupção, eu coloquei a instrução para zerar o timer0 fazendo ele recomeçar uma nova contagem. O que está fazendo o programa travar, na minha opinião, é que, em função do tempo de execução da função "varia", o timer0 volta a estourar muito precocemente e a coisa fica presa nesse looping entre executar a função "varia" e atender a interrupção do timer0, e acaba por não executar nenhuma das outras funções ligadas à esta segunda parte do programa! A interrupção do timer0 e a função "varia" ocupam o tempo de execução da segunda parte do programa e as demais funções ficam ignoradas. Mas isto somente acontece dependendo dos valores assumidos por x e y. Na maior parte das vezes não acontece o travamento.

Sendo assim, eu gostaria de uma ajuda de vocês no sentido de resolver exatamente este problema. Como fazer para impedir que o programa fique travado no tratamento dessas duas funções?
Eu já pensei no seguinte: não seria conveniente colocar a função "varia" dentro da própria rotina da int. de timer0?
Aguardo vocês e um forte abraço a todos!
Pask
Word
 
Mensagens: 600
Registrado em: 22 Dez 2006 19:19

Mensagempor Sergio38br » 16 Jan 2008 22:16

boa noite, Pask

Qual PIC voce esta utilizando?


Abraços

Sergio
Avatar do usuário
Sergio38br
Word
 
Mensagens: 759
Registrado em: 22 Nov 2007 13:39
Localização: São Paulo - SP

Próximo

Voltar para PIC

Quem está online

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

cron

x