collapse

* Links de Robótica

* Posts Recentes

Feira de electricidade e eletrónica por artur36
[Ontem às 23:07]


Power_OK Enermax por almamater
[Ontem às 12:10]


Recomendação de um opamp para um DAC r2r por jm_araujo
[23 de Novembro de 2017, 10:48]


RN42 e TP-Link MR3020 por doiga
[22 de Novembro de 2017, 19:22]


Ajuda Projecto IR / RF por senso
[22 de Novembro de 2017, 13:15]


Ideias para construir um quadrúpede simples por dropes
[21 de Novembro de 2017, 22:43]


Ajuda com TRIAC por senso
[17 de Novembro de 2017, 18:00]


TV LG White Screen por almamater
[15 de Novembro de 2017, 08:37]


Pergunta sobre prototipagem ( Pesquisa ) por luisjustin
[14 de Novembro de 2017, 23:22]


Medir Agua que está no Poço por Njay
[14 de Novembro de 2017, 13:28]

Autor Tópico: Uso do Timer1  (Lida 1300 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline paulogudes

  • Mini Robot
  • *
  • Mensagens: 17
Uso do Timer1
« 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);                       
}

« Última modificação: 04 de Fevereiro de 2012, 17:28 por paulogudes »

Offline Sérgio_Sena

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 1.642
    • Electronic Gear for Musicians
Re: Uso do Timer1
« Responder #1 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.


« Última modificação: 03 de Fevereiro de 2012, 10:20 por TigPT »

Offline paulogudes

  • Mini Robot
  • *
  • Mensagens: 17
Re: Uso do Timer1
« Responder #2 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.

Offline paulogudes

  • Mini Robot
  • *
  • Mensagens: 17
Re: Uso do Timer1
« Responder #3 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.