Timer1 do 12F629 não funciona

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Timer1 do 12F629 não funciona

Mensagempor lpagano » 30 Mar 2008 10:31

Tenho um programa no 12F629 que utiliza o timer1 e funciona da seguinte maneira: se eu apertar um botão durante mais de 2 segundos ativa um led em uma saída do PIC. Só que parece que o timer não está sendo ativado. O cristal que uso é de 32,768kHz.

Vejam abaixo o meu código feito no MikroC:

Código: Selecionar todos
void main ( ) {

            char cont;

            CMCON  = 7;              // comparadores desligados
            TRISIO = 0x03;           // GPIO 0 e 1 como entradas e, 2 e 3 como saídas


            do {
               if (button(&GPIO,0,30,1))       // se botão de minutos (ATIVA O SETUP)
               {
                    while (GPIO.F0 == 1)
                    {
                           if (cont == 0)
                          {
                             T1CON.TMR1GE = 0;
                             T1CON.T1CKPS1 = 1;
                             T1CON.T1CKPS0 = 1;
                             T1CON.T1OSCEN = 1;
                             T1CON.TMR1CS = 0;
                             T1CON.TMR1ON = 1;
                             TMR1H = 0XBF;        //carrega valores de contagem H
                             TMR1L = 0X68;        //carrega valores de contagem L
                             PIR1.TMR1IF = 0;     //zera o flag IF
                             
                             cont = 1;
                        }

                          if (PIR1.TMR1IF == 1)
                        {
                            T1CON.TMR1ON = 0;           // pára o timer1
                            PIR1.TMR1IF = 0;               // flag do timer1 = 0
                            GPIO.F2 = 1;                     // liga o led na GPIO2

                        }
                    }

                }

            } while (1);

        }


Poderiam dar uma ajuda para que o timer1 desse código funcione?

Valeu!
lpagano
Byte
 
Mensagens: 393
Registrado em: 06 Nov 2006 14:23

Mensagempor Sergio38br » 31 Mar 2008 08:48

Esta com pull-up ou pull-down GPI0???


Carregue os valores do timer1 antes de dispara-lo


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

Mensagempor ze » 31 Mar 2008 09:04

não li direito seu cod. (Pode estar pelos menos didaticamente correto. Mas na prática a teoria é outra). Li apenas a proposta de 2 seg.
veja se o código pode lhe ser útil. Aparentemente atende seus dados de entrada: (hitech c)

Código: Selecionar todos
#define _tmr1h 0xfb //100hz @ 4MHz - modifique pra 32K
#define _tmr1l 0x1d
unsigned char tmp;
//******************************************************
static void interrupt
timer1_int(void)
{
TMR1H=_tmr1h;TMR1L=_tmr1l; // 100Hz
TMR1IF=0;
tmp++;
}
//******************************************************
main()
{
//...
//...
//...
OPTION&=0b01111111; //liga pullup
TRISIO=0b000011;
T1CON=0b00110001; //veja a função de cada bit.
TMR1H=_tmr1h;TMR1L=_tmr1l; //100Hz @ 4MHz
PIE1=PEIE=1; //hab. int. timer1
GPIO5=GIE=0; //led em GPIO5
//--------------------------------------------
   for (;;)
   {
   if (!GPIO0)   { //push botom no gnd
               GIE=1;
               if (tmp>200) GPIO5=1; //2 seg liga
               }
   else GIE=tmp=0;   
   if (!GPIO1) GPIO5=0; //de quebra, GPIO1 desliga
   }
//--------------------------------------------
}
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor lpagano » 31 Mar 2008 10:29

Sergio38br,

Não habilitei os pull-ups, mas estava vendo isso no datasheet.
Ele tem a chave geral dos pull-ups (OPTION_REG) e configuração individual de cada GPIO (WUP), só que numa tentativa de compilar, esse último não permite declarar bit a bit, tipo WUP.WUP0 = 0, WUP.WUP1 = 1, etc. O MikroC só permitiu a configuração desse registro no modo WUP = 0x03 (exemplo), a não ser que não entendi direito o datasheet.

Valeu!
lpagano
Byte
 
Mensagens: 393
Registrado em: 06 Nov 2006 14:23

Mensagempor Sergio38br » 31 Mar 2008 10:56

Código: Selecionar todos

WUP.F0 = 1 // ativa WUP pino 0



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

Mensagempor Sergio38br » 31 Mar 2008 11:00

Claro o mais importante que eu infelizmente esqueci

Código: Selecionar todos
GPIO.F0 = 1;
GPIO.F1 = 1;


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

Mensagempor Sergio38br » 31 Mar 2008 11:40

Na função Button vc espera que o nivel de ativação seja 1, então vc deve ter um pull-down no pino para o terra e colocar uma tensão no pino GPIO.0, para tornar o if verdadeiro. É assim que esta seu hard?
Avatar do usuário
Sergio38br
Word
 
Mensagens: 759
Registrado em: 22 Nov 2007 13:39
Localização: São Paulo - SP

Mensagempor lpagano » 01 Abr 2008 13:49

Sergio,

Eu acabei declarando o WUP como 255, assim todos os pinos estão com pull-ups ativados. Assim funcionou legal. Obrigado!!!

No meu hardware no momento estou somente com esses pull-ups. A ativação do GPIO do PIC está sendo feita pressionando o botão, o qual vai para ground. Aí fica assim: ground = ativado / 5V = desativado.

Valeu!
lpagano
Byte
 
Mensagens: 393
Registrado em: 06 Nov 2006 14:23


Voltar para PIC

Quem está online

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

x