jueves, 23 de enero de 2014

Entrada analogica

Ejemplo 1

#include <16F877a.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#use fast_io(B)          
#use fast_io(A)   

#byte portb = 6            //    se definen las direcciones de memoria
#byte porta = 5

int a=0;
void main() {

   set_tris_a(0xff);           // se configura el puerto A como entrada
   set_tris_b(0x00);

   SETUP_ADC(ADC_CLOCK_INTERNAL);      // el a/d funcione con un reloj interno del micro
   SETUP_ADC_PORTS(AN0);                   // aca determianr que el puerto RA0 será analógico
   SET_ADC_CHANNEL(0);                          // el canal con el que trabajas, en este caso 0 por el RA0
while(true){
   a=READ_ADC();                          // lee el canal analogico seleccionado
   output_high(pin_B0) ;
   delay_ms(a);
   output_low(pin_B0);
   delay_ms(a);
}
}

Ejemplo 2
#include <16F877A.h>
 #device adc=10 //resolucion de 1024 valores

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected


#use delay(clock=4000000) //oscilador externo de 4MHz
#include <LCD.C>
float a=0;
void main()
{
   setup_adc_ports(AN0_AN1_AN3);    setup_adc(ADC_CLOCK_DIV_2);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   lcd_init();

   while(true){
   set_adc_channel(0);
   a=read_adc();
   printf(lcd_putc,"\f");
   printf(lcd_putc,"Valor Digital");
   lcd_gotoxy(1,2);
   printf(lcd_putc,"%f",a);
   delay_ms(100);
   }  
}

Ejemplo 3
#include <16F877A.h>
#use delay(clock=4000000)
#fuses NOWDT,NOPUT,NOPROTECT,NOBROWNOUT,NOLVP,NOPROTECT,HS,NOWRT,NODEBUG

#use fast_io(A)
#use fast_io(B)
#use fast_io(C)                     ///   con esta instruccion evitamos que

#byte porta = 5
#byte portb = 6
#byte portc = 7                     /// se definen direcciones de memoria


int canal0=0;
int unidades=0;
int decenas=0;
int centenas=0;

void main ()
{
BYTE data[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

set_tris_b(0b00000000);
set_tris_c(0b00000000);

output_low(pin_c0);
output_low(pin_c1);
output_low(pin_c2);

SETUP_ADC(ADC_CLOCK_INTERNAL);   // declaramos que el reloj del adc sera interno

setup_adc_ports(all_analog);                 // todos los canales analogicos habilitados
SET_ADC_CHANNEL(0);                        // seleccionamos canal 0

DISABLE_INTERRUPTS(global);

while(true)
{

canal0= READ_ADC();                        // retardo para esperar que el adc termine
                                                        // conversion fabricante menciona que al
                                                        // menos 50 microsegundos
delay_ms(1);

centenas=canal0/100;
decenas=(canal0 - (centenas*100))/10;
unidades=(canal0 - (centenas*100) - (decenas*10));

   output_b(data[unidades]);
   output_high(pin_c1);
   output_high(pin_c2);  
   output_low(pin_c0);
   delay_ms(1);
  
   output_b(data[decenas]);
   output_high(pin_c0);
   output_high(pin_c2);  
   output_low(pin_c1);
   delay_ms(1);

   output_b(data[centenas]);
   output_high(pin_c1);
   output_high(pin_c0);  
   output_low(pin_c2);
   delay_ms(1);
}
}

No hay comentarios:

Publicar un comentario