Ir ao conteúdo
  • Cadastre-se

Tmr0


mister nintendo

Posts recomendados

Olá pessoal. estou fazendo um trabalho de escola e estou usando o tmr0. o projeto esta perfeito tirando o fato do microcontrolador dar um pau que eu desconheço. programei ele pra fazer uma contagem de 15 minutos e ir mostrando num display de 7 segmentos os minutos e os segundos, ele mostra, conta o tempo com precisão, e faz tudo certinho só que em certos momentos é como se ele travasse e não conseguisse voltar da interrupção ou para a contagem da onde ela esta ou some tudo.

queria saber se tem como ele ser interropido no meio de um goto ou em alguma instrução que quando voltasse se perdesse e não conseguisse mais executar nada pois parece que é o que esta acontecendo.

eis o codigo



void main();
void interrupt();

bit oldstate1;
bit oldstate2;
int contagem;
signed short segundos, minutos, seg;


char txt1[5];
char txt2[5];
char txt3[5];

void interrupt()
{
tmr0=6;
contagem++;
intcon.tmr0if=0;
if(contagem>=625)
{
segundos--;
seg--;
contagem=0;
}
return;
}

void main()
{
intcon=0b11100000;
option_reg=0b11000100;
cmcon=0x07;
trisa=0xff;
trisb=0x01;
trisc=0xff;
trisd=0xc0;
trise=0x07;
tmr0=6;
minutos=15;
seg=24;
contagem=0;
segundos=0;


while(1)
{
if(segundos<0)
{
minutos--;
segundos=59;
}
if(seg<0)
{
seg=24;
}
shorttostr(segundos, txt1);
shorttostr(minutos, txt2);
shorttostr(seg, txt3);
switch(txt1[2])
{
case ' ':portb=0b01111110; break;
case '0':portb=0b01111110; break;
case '1':portb=0b00001100; break;
case '2':portb=0b10110110; break;
case '3':portb=0b10011110; break;
case '4':portb=0b11001100; break;
case '5':portb=0b11011010; break;
case '6':portb=0b11111010; break;
case '7':portb=0b00001110; break;
case '8':portb=0b11111110; break;
case '9':portb=0b11011110; break;
}
portd=0b00000001;
delay_ms(2);
portb=0x00;
portd=0x00;
switch(txt1[3])
{
case ' ':portb=0b01111110; break;
case '0':portb=0b01111110; break;
case '1':portb=0b00001100; break;
case '2':portb=0b10110110; break;
case '3':portb=0b10011110; break;
case '4':portb=0b11001100; break;
case '5':portb=0b11011010; break;
case '6':portb=0b11111010; break;
case '7':portb=0b00001110; break;
case '8':portb=0b11111110; break;
case '9':portb=0b11011110; break;
}
portd=0b00000010;
delay_ms(2);
portb=0x00;
portd=0x00;
switch(txt2[2])
{
case ' ':portb=0b01111110; break;
case '0':portb=0b01111110; break;
case '1':portb=0b00001100; break;
case '2':portb=0b10110110; break;
case '3':portb=0b10011110; break;
case '4':portb=0b11001100; break;
case '5':portb=0b11011010; break;
case '6':portb=0b11111010; break;
case '7':portb=0b00001110; break;
case '8':portb=0b11111110; break;
case '9':portb=0b11011110; break;
}
portd=0b00000100;
delay_ms(2);
portb=0x00;
portd=0x00;
switch(txt2[3])
{
case ' ':portb=0b01111110; break;
case '0':portb=0b01111110; break;
case '1':portb=0b00001100; break;
case '2':portb=0b10110110; break;
case '3':portb=0b10011110; break;
case '4':portb=0b11001100; break;
case '5':portb=0b11011010; break;
case '6':portb=0b11111010; break;
case '7':portb=0b00001110; break;
case '8':portb=0b11111110; break;
case '9':portb=0b11011110; break;
}
portd=0b00001000;
delay_ms(2);
portb=0x00;
portd=0x00;
switch(txt3[2])
{
case ' ':portb=0b01111110; break;
case '0':portb=0b01111110; break;
case '1':portb=0b00001100; break;
case '2':portb=0b10110110; break;
case '3':portb=0b10011110; break;
case '4':portb=0b11001100; break;
case '5':portb=0b11011010; break;
case '6':portb=0b11111010; break;
case '7':portb=0b00001110; break;
case '8':portb=0b11111110; break;
case '9':portb=0b11011110; break;
}
portd=0b00100000;
delay_ms(2);
portb=0x00;
portd=0x00;
switch(txt3[3])
{
case ' ':portb=0b01111110; break;
case '0':portb=0b01111110; break;
case '1':portb=0b00001100; break;
case '2':portb=0b10110110; break;
case '3':portb=0b10011110; break;
case '4':portb=0b11001100; break;
case '5':portb=0b11011010; break;
case '6':portb=0b11111010; break;
case '7':portb=0b00001110; break;
case '8':portb=0b11111110; break;
case '9':portb=0b11011110; break;
}
portd=0b00010000;
delay_ms(2);
portb=0x00;
portd=0x00;
}
}

Link para o comentário
Compartilhar em outros sites

o WDT esta desabilitado, a fonte é de computador, o cristal é de 20 Mhz

acho que não pode ser tais coisas ou coisas do hardware por testei o timer sem a interrupção apenas incrementando uma variavel a partir da quantidade de vezes que ela executava o fluxograma e não deu pau é so habilitar a interrupção que acontece isto. realmente não consigo imaginar o que é

jaja posto o hardware. obrigado

Link para o comentário
Compartilhar em outros sites

intcon.tmr0if=0;

if(intcon.tmr0if==1) intcon.tmr0if=0;

assim voce zera a flag intcon.tmr0if, testa se ela tá mesmo em zero, caso nao você zera novamente ela...

ahh e outra coisa errada.. você colocou assim...

intcon=0b11100000;

option_reg=0b11000100;

o certo é assim..

intcon=0b10100000;

option_reg=0b11000100;

agora com certeza funciona....

Link para o comentário
Compartilhar em outros sites

obrigado

o que falou pra mim corrigir, é daquele jeito que esta mesmo, se eu colocar igual a 0 o 6° bit que foi a mudança que fez ele desabilitara todas as interrupçôes de perifericos e o tmr0 é um periferico logo tem que ficar do jeito que esta essas config's

muito obrigado

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!