PIC TRAVANDO

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Mensagempor ze » 17 Jan 2008 06:35

veja este artigo sobre reentrancia (que nome...).
quem sabe pode iluminar-lhe.

http://www2.eletronica.org/artigos/elet ... eentrancia
abrç
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor buiz » 17 Jan 2008 09:01

Sabe onde pode estar o seu problema, nos delays com variavies X e Y dentro do timer, ainda mais se tiver utilizando CCS 3.2, faz um teste, coloca valores fixos no lugar de X e Y, tive varios problemas com variaveis em delays no CCS, na versão 4, parece estar corrigido, mas não tenho confiança mais, acontecia exatamente assim, X podia assumir qualquer valor que fosse e parecia não fazer diferença, pois o tempo sempre era o mesmo, e dependendo do valor trancava na função Delay, ai tinha que reiniciar.

Sempre que preciso de tempos diferentes dentro de uma timer, utilizo recursos paralelos para fazer.

Fiz uma sugestão, testa ai.

Código: Selecionar todos

// Variaveis a incluir no inicio do programa
int verifica=0;
int16 conta=0;

//----------------------------------------------------------------------------------

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()

{
conta++;

Switch (verifica)
{
Case 0:
if (conta>=y) {output_high(w1);
                       conta=0;
                    verifica=1;}
break;

case 1:
if (conta>=x) {output_low(w1);
                      conta=0;
                   verifica=2;}
break;

case 2:
if (conta>=y) {output_high(w2);
                       conta=0;
                    verifica=3;}
break;

case 3:
if (conta>=x) {output_low(w2);
                      conta=0;
                   verifica=0;}
break;
}
}




Testei aqui na proto e funcionou legal.

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

Mensagempor leoabubauru » 17 Jan 2008 09:19

Você usa a diretiva #use com reset do WDT?

#use delay(clock=4000000,restart_wdt)

Isso faz com que a cada chamada de delay o WDT seja zerado. Você pode, também, aumentar o tempo do WDT ou desabilita-lo apenas para testar se é ele mesmo que está resetando o PIC.


Laercio
Tento, tento e tento...
Me arrebento!
Também bato!
Ô negocim bunitim essa tal eletrônica de barco!
leoabubauru
Byte
 
Mensagens: 227
Registrado em: 21 Nov 2006 19:08
Localização: São Paulo

Mensagempor LeandroPIC » 17 Jan 2008 11:32

Ichii... é CCS, com CCS tudo é possivel.

Tente outro compilador!
Avatar do usuário
LeandroPIC
Byte
 
Mensagens: 163
Registrado em: 06 Jul 2007 12:19

Mensagempor Bardelli » 18 Jan 2008 08:10

Cara, eu já tive 1000 e 1 problemas com isso, comprei até um osciloscópio para entender, e no final entendi oque acontecia , e o problema éra a minha inexperiencia.

Faz o Seguinte:

no #fuse
coloque NOLVP, NOBROWNOUT, NOWDT (Desligar o Low voltage programmer, o brownout e o Watch Dog timer).

No pino MCLR utilize um resistor de 1K em vez de 10K

Essa variação de tensão que vc falou é suspeitissima, por isso coloca um capacitor de 100 uF a 220 uF nos pinos VDD e VSS do PIC, isso é MANDATÓRIO.

Eu trabalho com PIC dentro de um ambiente industrial onde ocorre de tudo, depois que eu comecei a tomar esses cuidados, nunca mais vi um PIC travar ou Resetar. Essa é a minha receita de bolo.
Bardelli
Byte
 
Mensagens: 126
Registrado em: 20 Out 2006 12:42

Mensagempor Pask » 18 Jan 2008 09:09

Meus amigos, fiquei um pouco ausente porque estava queimando a cuca para tentar descobrir o problema e já descobri. O que aconteceu?
Não foi nenhum erro de "#fuses" ou falta de algum componente no circuito. Todos os cuidados contra ruídos já haviam sido tomados. Obrigado pela sugestão de todos.
O que realmente aconteceu foi o seguinte (guardem essa): na segunda parte do meu código eu utilizo a interrupção do timer0 e no circuito também existe um botão para ligar e desligar tudo. Pois bem, este botão é temporizado, ou seja, para desligar, é preciso pressioná-lo por mais de 2 segundos. O que eu descobri foi que, quando eu pressionava o botão por menos de 2 segundos e o soltava, o circuito continuava funcionando como tinha que ser mas travava! O destravamento acabava acontecendo uns 70 segundos depois automaticamente! Por quê? Porque havia, no final da função de controle do botão, uma instrução "delay_ms(1000);" para temporizar 1 segundo após a liberação do botão. No entanto, a interrupção de timer0 acontecia a cada 80ms e os tempos do delay e da interrupção eram multiplicados totalizando: 1000 x 0,08 = 80 segundos!
Quando eu alterei o delay para "delay_ms(15)", o travamento deixou de acontecer, pois a multiplicação dos tempos foi enormemente reduzida!
Agora, é só alegria! Obrigado a todos.
Pask
Word
 
Mensagens: 600
Registrado em: 22 Dez 2006 19:19

Anterior

Voltar para PIC

Quem está online

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

x