1. Projete o circuito e o programa (compilador CCS) de um sistema baseado no microcontrolador PIC16F877A que faça a leitura da entrada analógica PIN_A0, via conversor AD configurado em 8 bits. O sistema deve apresentar 7 níveis de alerta através de um dispositivo de 3 segmentos (figura 1).
RESOLUÇÃO FEITA EM CCS C Compiler:
#include <16F877A.h>
#device adc = 8
#use delay(clock = 20M)
#fuses XT, NOWDT, NOPROTECT, NOBROWNOUT, NOLVP, NOCPD, NOWRT, NODEBUG
#include <lcd.c>
unsigned int8 analog ;
#INT_TIMER0
void TIMER0_isr(void){
if (analog >= 127 && analog < 142){ // N1
output_low(PIN_B5);
output_low(PIN_B6);
output_toggle(PIN_B7);
}
if (analog >= 175 && analog < 191) { // N4
output_toggle(PIN_B5);
output_low(PIN_B6);
output_low(PIN_B7);
}
if (analog >= 159 && analog < 175) { // N3
output_low(PIN_B5);
output_toggle(PIN_B6);
output_toggle(PIN_B7);
}
if (analog >= 191 && analog < 207) { // N5
output_toggle(PIN_B5);
output_low(PIN_B6);
output_toggle(PIN_B7);
}
if (analog >= 143 && analog < 159) { // N2
output_low(PIN_B5);
output_toggle(PIN_B6);
output_low(PIN_B7);
}
if (analog >= 207 && analog < 223) { // N6
output_toggle(PIN_B5);
output_toggle(PIN_B6);
output_low(PIN_B7);
}
if (analog >= 223 && analog < 239) { // N7
output_toggle(PIN_B5);
output_toggle(PIN_B6);
output_toggle(PIN_B7);
}
}
void main(){
// Configuração do LCD
lcd_init();
// Configuração do ADC
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_DIV_8);
set_adc_channel(0);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL | RTCC_DIV_2); // overflow 51,2 u
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
enable_interrupts(INT_TIMER0);
enable_interrupts(GLOBAL);
while (1){
analog = read_adc();
printf(lcd_putc, "\fLeitura: %u", analog);
delay_ms(1000);
}
}
Saída gerada |
2. Faça o circuito e o programa (compilador CCS) que liga um LED 1 e desliga o LED 2 quando um botão (Bot1) estiver apertado e desligar LED1 e liga o LED 2 se o botão (Bot1) estiver solvo. Os LED 3, 4 e 5 devem ficar piscando com frequências de 1.3, 2 e 3.5 vezes n Hz. Onde n é igual a soma do último e penúltimo número da sua matrícula.
RESOLUÇÃO FEITA EM CCS C Compiler :
#include <16F877A.h>
#use delay(clock = 20MHz)
// Configuração do microcontrolador
#fuses XT, NOWDT, NOPROTECT, NOBROWNOUT, NOLVP, NOCPD, NOWRT, NODEBUG
#include <lcd.c>
// Variáveis globais
int flag1 = 0, flag2 = 0;
unsigned int16 cont1 = 0, cont2 = 0, cont3 = 0;
#int_TIMER0
void TIMER0_isr(){
if(flag1 == 0 && flag2 == 1 && ++cont1 >= 85){
cont1 = 0; output_toggle(PIN_B5); // 114 Hz
}
if(flag1 == 0 && flag2 == 1 && ++cont2 >= 55){
cont2 = 0; output_toggle(PIN_B6); // 176 HZ
}
if(flag1 == 0 && flag2 == 1 && ++cont3 >= 32){
cont3 = 0; output_toggle(PIN_B7); // 308 Hz
}
}
// Função de tratamento da interrupção do TIMER1
#int_timer1
void timer1InterruptHandler(){
if (input(PIN_B0) == 1){
flag1 = 1;
flag2 = 0;
output_high(PIN_B3);
output_low(PIN_B4);
}
if(input(PIN_B1) == 1){
flag1 = 0;
flag2 = 1;
output_low(PIN_B3);
output_high(PIN_B4);
}
// Limpa a flag de interrupção do TIMER1
clear_interrupt(INT_TIMER1);
}
void main(){
// Configuração do TIMER1
setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
// Configuração das interrupções
enable_interrupts(INT_TIMER1); // Habilita a interrupção do TIMER1
enable_interrupts(GLOBAL); // Habilita todas as interrupções globais
setup_timer_0(RTCC_INTERNAL | RTCC_DIV_1); // overflow 51,2 us
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
enable_interrupts(INT_TIMER0);
lcd_init();
while (1){
printf(lcd_putc,"\f%d : %d",flag1, flag2);
delay_ms(50);
}
}
Saída gerada |
Nenhum comentário:
Postar um comentário