Ir ao conteúdo
  • Cadastre-se

timer0 com pic16f883


Posts recomendados

Boa tarde, estou desenvolvendo um código fonte no MICROC utilizando o microcntrolador PIC 16f883 e utilizando as interrupções do TIMER0 para mudar o estado de um pino a cada 1 segundo,  código esta compilando tudo normal mas ao simular no protheus ele apenas muda o estado uma vez e para.

Fiz também um debbug e vi que o código quando chega no loop infinito o código não sai dali e nunca parte para a interrupção. Segue o código fonte comentado...

 

 

 int contador = 0x00;

 void interrupt ()
 {
    if (T0IF_bit)              // testa se houve estouro do TIMER 0
    {
       contador ++;
       TMR0     = 0x06;        // reinicia contagem do timer
       T0IF_bit = 0x00;        // limpa flag interrupçao
     }

 
 }  // and interrupt
 
 
void main()
{
   OPTION_REG = 0x81;             // Desabilita resistor pullup interno,
   GIE_bit    = 0x01;             // Liga interrupçao geral
   PEIE_bit   = 0x01;             // Habilita interrupçao por perifericos internos
   T0IE_bit   = 0x01;             // Habilita interrupçao pelo estouro do TIMER0

   TMR0       = 0x06;             // Inicializa o Timer 0 em 0
   TRISB.RB4  = 0x00;             // Configura RB4 como saida digital
   RB4_bit    = 0x00;             // inicializa RB4 em 0
   
   while(1)
   {
     if (contador == 1000)
     {
        RB4_bit =  ~ RB4_bit;     // inverte valor do bit
        contador = 0x00;          // zera a contagem
     
     }
   
   
   
   } // and while

   } // and main

Link para o comentário
Compartilhar em outros sites

@Joao Fabri

Depois de um bom tempo lendo o datasheet disso... olhando fuses... tirando partes repetidas da programação que foi provavelmente copiada e colada X)

 

int contador = 0x00;
 void interrupt ()
 {
    if (T0IF_bit)              // testa se houve estouro do TIMER 0
    {
       contador++;
       TMR0     = 0x00;        // reinicia contagem do timer
       T0IF_bit = 0x00;        // limpa flag interrupção

     }

 }  // and interrupt


void main()
{
   OPTION_REG = 0x81;             // Desabilita resistor pullup interno,
   INTCON = 0xA0;
   TMR0       = 0x00;             // Inicializa o Timer 0 em 0
   TRISB.RB4  = 0x00;             // Configura RB4 como saida digital
   RB4_bit    = 0x00;             // inicializa RB4 em 0
   
   while(1)
    {
   if(contador == 1000 )
      {
       RB4_bit =  1;     // inverte valor do bit
       delay_ms(200);
       RB4_bit=0;
                contador =0;
       }
    } // and while
} // and main

Olhei até em fuses...

 

fuses.PNG.2239cf66f5f4e0c41924fc765d2d6df9.PNG

 

E nada! E finalmente... depois de destroçar teu código descobri que essa linha aqui "RB4_bit =  ~ RB4_bit;" não funciona no teu código... ........................................................................................

 

 

Pois é ....................... enfim boa noite e fuizzzzzzz assunto resolvido T_T

adicionado 1 minuto depois

confdoProteus.thumb.PNG.b2c7f7db6e94a3b20882d7cbb98f197f.PNG

 

código melhorado e tirado repetições ai em cima...

adicionado 16 minutos depois

Pior que agora que me toquei que é resolvido com delay... não resolveu o estouro do timer totalmente...

Link para o comentário
Compartilhar em outros sites

Problema resolvido

int estado =0;
int contador = 0x00;
 void interrupt ()
 {
    if (T0IF_bit)              // testa se houve estouro do TIMER 0
    {
       contador++;
       TMR0     = 0;        // reinicia contagem do timer
       T0IF_bit = 0x00;        // limpa flag interrupção

     }

 }  // and interrupt


void main()
{
   OPTION_REG = 0x81;             // Desabilita resistor pullup interno,
   INTCON = 0xA0;
   TMR0       = 0;             // Inicializa o Timer 0 em 0
   TRISB.RB4  = 0x00;             // Configura RB4 como saida digital
   RB4_bit    = 0x00;             // inicializa RB4 em 0
   //ADCON1 = 0x80;
   while(1)
    {
   if(contador == 1000) //1ms
      {

    estado=!estado;
    PORTB.f4 = estado ;
    contador =0;
       }

    } // and while
} // and main

De acordo com você muda o valor do contador você altera o tamanho do pulso... basicamente depende também de outras continhas ... dá 512 no lugar do contador ... mais é mais pesquisa sobre ciclo de clock e tipo de timer0 que você esta colocando nas configurações... Enfim... tá ai.

adicionado 1 minuto depois

Como disse "RB4_bit =  ~ RB4_bit;" não funciona... você tem que usar outra variável para trocar os valores.

Link para o comentário
Compartilhar em outros sites

@Bommu Perneta  caraca cara você salvou meu código !!!! Não foi bem uma cópia kkk eu entendi e compreendi tudo que contem nele... Então você matou a xarada, não era que o timer não estava estourando e sim que bit não estava invertendo.... espero um dia conseguir visualizar os defeitos no código assim tambem... Valeuuu

adicionado 1 minuto depois

@Bommu Perneta so não entendi porque não inverteu, na linguagem C o ~ inverte o valor do bit correto ?

Link para o comentário
Compartilhar em outros sites

Nada que um Proteus e o osciloscópio dele não resolva para identificar a variação ^^ .  Sim, é o "!" é negação... Se é 0 vai para 1 e o inverso também é valido.  Também você poderia colocar o "~", mas eu sou acostumado com a exclamação, mania de programação... 

 

Sim, o negócio deveria inverter, mas tive que colocar uma variável extra para controlar essa inversão ... olhei todo o datasheet do mesmo e não consegui fazer do jeito que você falou funcionar... tem vídeo no youtube usando quase essa mesmo código que você colocou, mas o Proteus dele é mais antigo... Atualizações podem der dado esse problema.

 

Ou seja nessa linha a variável da porta não é mudada como os ciclos. Talvez alguém mais por aqui consiga fazer essa linha funcionar através de alguma configuração de algum registrador ou sei lá... T_T

Link para o comentário
Compartilhar em outros sites

@Bommu Perneta é esse codigo é da WR Kits, na ocasiao ele usa um 16f628a.. como eu adquiri uma placa para desenvolvimento que contem o 16f883 então preciso me familiarizar com ele... ele tem alguuns fusiveis que ainda n entendi mt bem... essa semana vou gerar mais alguns codigos para treino e se der algo errado de novo voce me socorre kkkkk

Link para o comentário
Compartilhar em outros sites

Ok, entendi. Se não der outro pode lhe ajudar também ^^ povo aqui da comunidade tem vários fazem cada coisa aqui que ainda fico ainda abismado, no bom sentido ^^ Acho que sou o mais iniciante.

 

Enfim. Boa noite.

adicionado 0 minutos depois

Eu escrevi no@b mas o corretor automatico me corrigiu lol

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber 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...