LusoRobótica - Robótica em Português
Sistemas específicos => PIC => Tópico iniciado 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.
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);
}
-
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 ::
/************************************************************************
/ 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.
-
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.
-
Senhores, obrigado pelas sugestões. Mas fiz um outro código usando o que havia visto num curso anterior e consegui o resultado desejado.