LusoRobótica - Robótica em Português

Sistemas específicos => PIC => Tópico iniciado por: paulogudes em 02 de Fevereiro de 2012, 12:15

Título: Uso do Timer1
Enviado por: paulogudes em 02 de Fevereiro de 2012, 12:15
Bom dia Senhores. Estou com dúvidas referentes a uma aplicação do Timer1. Quero acender SEQUENCIALMENTE a cada 6 pulso aplicados ao PIN_C0 os leds conectados a D4, D5 e D6 e com mais 6 pulsos apagá-los. Já apliquei algumas idéias mas sem sucesso real. Alguém pode me ajudar? Desde já agradeço. Segue abaixo o que já fiz.

Código: [Seleccione]
include<16F877A.h>   
#use delay (clock=8000000)                                           
#fuses HS, NOWDT, PUT,BROWNOUT, NOLVP
#use fast_io(D)                 
                             
int led=0;         

#INT_TIMER1           
void trata_t1(void)           
 {                     
                     led++;
                     if(input(PIN_D0)==1)
                      {
                           output_toggle(PIN_D1);
                           SET_TIMER1(65530);
                               
                                led++;
                                if(input(PIN_D1)==1)
                                {
                                    output_toggle(PIN_D2);
                                    SET_TIMER1(65530);
                                     
                                     led++;
                                     if(input(PIN_D2)==1)
                                     {
                                        output_toggle(PIN_D3);
                                        SET_TIMER1(65530);
                                         
                                         led++;
                                         if(input(PIN_D3)==1)
                                          {
                                            output_low(PIN_D0);
                                            output_low(PIN_D1);
                                            output_low(PIN_D2);
                                            output_low(PIN_D3);
                                            SET_TIMER1(65530);
                                          }
                               
                                     }
                                 }
                                     } 
}}
void main()               
{
set_tris_d(0b00000000);     
output_D(0b00000000);         

/*Ajusta o Timer 1 para contagem através do sinal externo e com prescaler de 1:1*/
SETUP_TIMER_1(T1_EXTERNAL|T1_DIV_BY_1);   

SET_TIMER1(65530);               

enable_interrupts(GLOBAL);             
enable_interrupts(INT_TIMER1);     


while(true);                       
}

Título: Re: Uso do Timer1
Enviado por: Sérgio_Sena em 02 de Fevereiro de 2012, 23:46
Que grande salganhada! :) Se não tivesses dito que queres acender sequencialmente, pelo código vejo que queres fazer outra coisa.

Presumo que estejas a usar o compilador CCS e a abusar das macros do mesmo.
O uso das macros faz com que não saibamos realmente o que está ser feito.
Nesta fase de aprendizagem aconselho a configurar os registos um-a-um, "manualmente". Só indo desbravando a arquitectura pelo datasheet é que se vai aprendendo realmente.

Pelo que tens feito, tens a certeza que o PIC está a ir à interrupção no fim de haver 6 pulsos externos?


Vê se este exemplo de código para RTC te ajuda ::
Código: [Seleccione]
/************************************************************************
/ Funcao de tratamento de Interrupcoes de baixa prioridade
/************************************************************************/
void interrupt low_priority InterrupcaoBAIXA (void)
{
//*************************************************************
// TMR1 para Real Time Clock
//*************************************************************
if ((TMR1IF == 1) && (TMR1IE == 1))
{
TMR1 = 0x8000; //activa o bit 15, para fazer apenas 1s de overflow
TMR1IF = 0; //flag de interrupcao de TMR1

segundos++; //incrementa os segundos

if (segundos == 60) //testa se passaram 60seg
{
segundos = 0; //limpa segundos
minutos++; //incrementa os minutos

if (minutos == 60) //testa se passaram 60min
{
minutos = 0; //limpa minutos
horas++; //incrementa as horas

if (horas == 24) //testa se passaram 24horas
{
horas = 0; //limpa as horas
}//horas

}//minutos

}//segundos

}//if ((TMR1IF == 1) && (TMR1IE == 1))

}

//Configura TMR1
TMR1 = 0x8000; //inicializa o contador, periodo de 1 seg
T1CON = 0b10001111; //16-bit, clock de cristal 32k externo, 1:1, liga oscilador driver, clock do pino RC0, liga TMR1
TMR1IP = 0; //baixa prioridade de interrupcao
TMR1IF = 0; //Limpa Flag Overflow
TMR1IE = 1; //Liga Interrupcoes TMR1



Neste forum, na secção de Microcontroladores, há um post sticky sobre um Curso de Microcontroladores PIC.
Uma leitura atenta, vai fazer avançar mais rapidamente e tirar umas quantas dúvidas.


Título: Re: Uso do Timer1
Enviado por: paulogudes em 03 de Fevereiro de 2012, 01:02
Sim pois a idéia do exercício é que os leds acendam sequencialmente a cada estouro de contagem no time1, ou seja, uma vez que esta chegue a 65536, um dos mesmo acenderá e reiniciará acontagem em 65530 que mais uma vez estourando na contagem, acenderá o outro e assim por diante. Achei muito interessante o exemplo que me deu e agradeço o interesse, embora eu deva reconhecer que ainda tenho muito a aprender sobre o assunto.
Título: Re: Uso do Timer1
Enviado por: paulogudes em 04 de Fevereiro de 2012, 17:26
Senhores, obrigado pelas sugestões. Mas fiz um outro código usando o que havia visto num curso anterior e consegui o resultado desejado.