collapse

* Posts Recentes

Amplificador - Rockboard HA 1 In-Ear por almamater
[Ontem às 19:13]


O que é isto ? por KammutierSpule
[26 de Março de 2024, 19:35]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

Autor Tópico: Uso do Timer1  (Lida 2642 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.649
    • 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.