Ao apertar um botão uma das fileiras dos LEDS permanece acesa e é ligada a ventoinha, e a velocidade rpm é exibida no painel LCD, o processo funciona por 30 segundos e desliga.Bom eu consegui fazer funcionar a fileira de led e a ventoinha....ai mostra a rpm na tela mas n to conseguindo adicionar um botão para inicializar tudo e nem um tempo de 30 segundos para finalizar o programa, alguém pode me ajudar? PFV
PIC18F4520
CRISTAL: 8Mhz
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// vARIAVEIS GLOBAIS
unsigned char ucTexto[10]; // Matriz para armazenamento de texto.
unsigned char ucPorcentagem; // Armazena a porcentagem do PWM.
unsigned int iLeituraAD = 0; // Define variável para armazenamento da leitura AD.
unsigned int iReg_timer1; // Armazena o RPM.
// CONFIGURAÇÃO DOS PINOS DO LCD.
sbit LCD_RS at RE2_bit;
sbit LCD_EN at RE1_bit;
sbit LCD_D7 at RD7_bit;
sbit LCD_D6 at RD6_bit;
sbit LCD_D5 at RD5_bit;
sbit LCD_D4 at RD4_bit;
// DIREÇÃO DOS PINOS.
sbit LCD_RS_Direction at TRISE2_bit;
sbit LCD_EN_Direction at TRISE1_bit;
sbit LCD_D7_Direction at TRISD7_bit;
sbit LCD_D6_Direction at TRISD6_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D4_Direction at TRISD4_bit;
void interrupt(){
if (INTCON.TMR0IF == 1){ // Se o flag de estouro do TIMER0 for igual a 1, então
PORTB.RB0 = ~PORTB.RB0; // Inverte o estado do PORTB.RB0.
TMR0L = 0XCB; // Carrega valores de contagem
TMR0H = 0XF3; // Carrega valores de contagem
INTCON.TMR0IF = 0; // Seta T0IE, apaga flag de entouro do TIMER0
iReg_timer1 = TMR1L*(600/7); // Pega valor lido do timer1 e multiplica por 600 para saber rotação por minuto.
// e divide por 7 pois a ventoinha para dar uma volta completa realiza 7 pulsos.
TMR1L = 0; // Limpa contador.
}
}
void main(){
TRISB = 0; // Define PORTB como saida.
TRISD = 0; // Define PORTD como saida.
TRISC.RC0 = 1; // Define PORTC.RC0 como entrada.
TRISC.RC2 = 0; // Define PORTC.RC2 como saida.
TRISE = 0; // Define PORTE como saida.
PORTB = 0; // Limpa PORTB.
// Configuração das interrupções
INTCON.GIEH = 1; // Habilita as interrupções e a interrupção de alta prioridade.
INTCON.GIEL = 1; // Habilita as interrupções e a interrupção de baixa prioridade
RCON.IPEN = 1; // Configura 2 niveis de interrupção.
// Timer 0
INTCON.TMR0IF = 0;
INTCON2.TMR0IP = 1;
INTCON.TMR0IE = 1;
//temporização de 100 milisegundos
T0CON = 0B10000101; // Configura timer modo 16 bits, com prescaler 64
TMR0L = 0XCB; // Carrega valores de contagem
TMR0H = 0XF3; // Carrega valores de contagem
INTCON.TMR0IF = 0; // Apaga flag de estouro do TIMER0
// Timer 1 para modo contador de pulsos externos
T1CON = 0B10000011; // Liga TIMER1 como Contador em RC0, prescaler 1:1, modo 16bits.
TMR1L = 0; // Carrega valor de contagem baixa do TIMER1
TMR1H = 0; // Carrega valor de contagem alta do TIMER1
PIR1.TMR1IF = 0; // Apaga flag de estouro do TIMER1
ADCON0 = 0b00000001; // Configura conversor A/D Canal 0, conversão desligada, A/D ligado.
ADCON1 = 0b00001110; // Configura todos canais como Digital menos AN0 e REF Interna.
ADCON2 = 0b10111110; // Configura conversor A/D para resultado justificado a direita, clock de 20 TAD, clock de Fosc/64.
// Config. LCD no modo 4 bits
Lcd_Init(); // Inicializa LCD.
Lcd_Cmd(_LCD_CLEAR); // Apaga display.
Lcd_Cmd(_LCD_CURSOR_OFF); // Desliga cursor.
Lcd_Out(1, 1,"velo :"); // Escreve mensagem no LCD
PWM1_Init(5000); // Inicializa módulo PWM com 5Khz
PWM1_Set_Duty(255); // Seta o Duty-cycle do PWM em 100%.
PWM1_Start(); // Inicia PWM.
while(1){ // Aqui Definimos Uma Condição Sempre Verdadeira Como Parametro, Portanto Todo O Bloco Será Repetido Indefinidamente.
iLeituraAD= ADC_Read(0); // Lê Canal AD 0
iLeituraAD=(iLeituraAD*0.24); // Converte valor para o duty cycle [255/(1023 pontos do A/D)]
PWM1_Set_Duty(iLeituraAD); // Envia o valor lido de "iLeituraAD" para o módulo CCP1 PWM
iLeituraAD=(iLeituraAD*0.41); // Converte valor para o duty cycle em %
WordToStr(iLeituraAD, ucTexto); // Converte o valor lido no A/D em string
Lcd_Out(1,11,ucTexto); // Imprime no LCD o valor do Duty Cycle.
PORTD=0;
PORTB=0;
PORTD=255;
PORTB=255;
WordToStr(iReg_timer1, ucTexto); // Converte o valor lido no iReg_timer1 em string
Lcd_Out(2,1,ucTexto); // Imprime no LCD o valor da RPM.
Lcd_Out_CP(" RPM"); // Unidade "RPM".
Delay_10us;
}
}
<>