Usando Conversor A/D do PIC 12F675 Através deste simples circuito, é demonstrada uma das diversas formas de se usar este PIC de apenas 8 pinos para monitorar uma tensão e passar via comunicação serial para o PC, onde um simples aplicativo, recebe os dados. Alerta-se que no circuito, não é usado um MAX232, já que o PIC apenas envia dados, não recebendo do PC, não estando assim submetido aos 12V da porta serial que podem danificar o PIC. Código fonte Esquema Básico do Circuito
// ********************************************* // programa teste de voltimetro com pic 8 pinos // v. 1 // ********************************************* #include <12f675.h> #device ADC=10 #use delay(clock=4000000) #use rs232(baud=2400, bits=8,parity=n,xmit=pin_a1,rcv=pin_a2,invert)
#fuses intrc_io,nowdt,put,nobrownout,nomclr #include #rom 0x3ff = { 0x34b4 } main() { float valor; setup_adc(ADC_CLOCK_INTERNAL); setup_adc_ports(pin_a4); set_adc_channel(3); delay_ms(2000); puts("Voltimetro: "); valor = read_adc(); while(true) { delay_ms(500); valor = (valor * 488)/100000; printf("%f",valor); delay_ms(1000); puts(" Volts "); delay_ms(100); valor = read_adc(); } }
PRÁTICO RELOGIO COM PIC Usando o Timer0 do PIC 16F84, facilmente constrói-se um relógio com relativa precisão, tendo em vista o uso de um oscilador a cristal - 4 MHz. O circuito é relativamente simples, usando apenas 2 chaves NA - para ajuste da hora/minuto, assim como um display LCD 2x16 e o próprio microcontrolador. Código fonte Esquema Básico do Relógio
////////////////////////////////////////////////////////////////////// //// // PROGRAMA RELOGIO COM TIMER0 DO PIC 16F84 // V. 2 ////////////////////////////////////////////////////////////////////// /// #include <16f84.h> #use delay(clock=4000000) #fuses xt,nowdt,put,noprotect #define lcd_enable pin_b3 #define lcd_rs pin_b2 #define lcd_d4 pin_b4 #define lcd_d5 pin_b5 #define lcd_d6 pin_b6 #define lcd_d7 pin_b7 #include signed long int t0_conta; int8 hora=9, minuto=0, segundo, i; #int_timer0 void trata_t0 () {
static boolean led; t0_conta -= 256; // subtrai 256 da contagem if (t0_conta<=0) // se a contagem é igual ou menor que zero { // soma 15625 ao valor da contagem t0_conta += 15625; segundo++; if (segundo == 60) { segundo = 1; minuto++; if (minuto == 60) { minuto = 1; hora++; if (hora == 24) { hora = 0; } } } } } void demora(void) { // funcao de atraso para evitar uso de delay afim de evitar erros no timer0 do PIC for(i==0;i>10000;i++); } void acertar_m() { if (minuto<59) minuto++; else minuto = 0; delay_ms(300); } void acertar_h() { if (hora <23) hora++; else hora = 0; delay_ms(300); } main() { t0_conta = 15625; setup_timer_0 ( RTCC_INTERNAL | RTCC_DIV_64 ); enable_interrupts (global | int_timer0); lcd_init(); delay_ms(500); lcd_putc("\f"); delay_ms(500); lcd_goto_xy(5,1); delay_ms(10); lcd_putc(" - RELOGIO - "); delay_ms(500); while (true) { if (!input(pin_a2)) acertar_h(); demora(); if (!input(pin_a3)) acertar_m(); demora();
printf(lcd_putc,"\n%2u:%2u:%2u",hora,minuto,segundo); demora(); } }
Multiplexando Displays de 7 Segmentos Através deste simples circuito, é apresenta uma das formas de se multiplexar displays de 7 segmentos, usando um microcontrolador PIC para isto. No projeto proposto, são usados 2 displays que são multiplexados através de um PIC 16F84 que ainda conta com 2 transistores para escolha do display que estará acesso. Foi usada no programa feito em C, a interrupção do TIMER0 de uma forma bastante simples, porém fácil de entender. É necessário, caso adicionado um número maior de indicadores, a alteração dos tempos que cada display é comandado. Espera-se que o objetivo de demonstrar de uma forma prática e didática tenha sido alcançado. Código fonte Esquema Básico do Circuito
#include <16f84.h> #use delay(clock=4000000) // fixa frequencia cristal e apos fusiveis #fuses xt,noprotect,nowdt,put // declara tabela de valores byte const tabela[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xe7}; int1 display = 1; // variavel boolean para determinar display acesso int8 numero = 1; int8 dado; /////////////////////////////////////////////////////////// // tratar interrupção timer0 /////////////////////////////////////////////////////////// #int_timer0 void trata_t0 () { if (display) { display = 0; output_low(pin_a1);
output_high(pin_a2); // liga display das dezenas e desliga unidades output_b(tabela[numero / 10]); // joga dezena para display } else { display = 1; output_low(pin_a2); // liga display das unidades e desliga dezenas output_high(pin_a1); output_b(tabela[numero % 10]); // pega resto da divisao e joga para display } } /////////////////////////////////////////////////////////// // funcao principal do programa /////////////////////////////////////////////////////////// main() { delay_ms(500); setup_timer_0 ( RTCC_INTERNAL | RTCC_DIV_64 ); enable_interrupts (global | int_timer0); while(1) { numero++; if(numero==100) { numero = 1; } delay_ms(500); } }