Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Entre para seguir isso  
Joao Fabri

timer0 com pic16f883

Recommended Posts

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ops... corrigindo... noobse minha ^^ pensei que tinha visto um botão ai em cima lol

Editado por Bommu Perneta

Compartilhar este post


Link para o post
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...

Editado por Bommu Perneta

Compartilhar este post


Link para o post
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.

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  • @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 ?

    Compartilhar este post


    Link para o post
    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

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • @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

    Compartilhar este post


    Link para o post
    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

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Crie uma conta ou entre para comentar

    Você precisar ser um membro para fazer um comentário

    Entre para seguir isso  





    Sobre o Clube do Hardware

    No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

    ×