Hola a todos. Hace dos días me puse a diseñar un pequeño programa con un PIC16F88 y quisiera corroborar unas cosas.
El programa realiza la siguiente función: Desde otra plataforma enviaré al PIC una señal para que se produzca una interrupción externa (Por el pin RB0 de éste PIC). Una vez se produzca la interrupción mi idea es que dentro de la rutina de servicio a ésta interrupción se comience a leer el canal 0 del ADC. Luego el valor de ésta lectura se convertirá a voltios y se enviará por puerto serie a un Arduino y el PIC volverá a entrar en SLEEP.
Es uno de mis primeros programas en CCS y quiero verificar cosas para ver si voy por buen camino. Gracias y expongo el código.
El programa realiza la siguiente función: Desde otra plataforma enviaré al PIC una señal para que se produzca una interrupción externa (Por el pin RB0 de éste PIC). Una vez se produzca la interrupción mi idea es que dentro de la rutina de servicio a ésta interrupción se comience a leer el canal 0 del ADC. Luego el valor de ésta lectura se convertirá a voltios y se enviará por puerto serie a un Arduino y el PIC volverá a entrar en SLEEP.
Es uno de mis primeros programas en CCS y quiero verificar cosas para ver si voy por buen camino. Gracias y expongo el código.
Código:
#include <16F88.h>
#fuses HS, NOWDT, NOLVP, NOBROWNOUT, NOPROTECT, PUT
#use delay(clock 8000000) //8MHZ DEL CLOCK DEL PIC
#use rs232(baud=9600, xmit=PIN_B5, rcv=PIN_B2) //CONFIGURO PUERTO SERIE
#device adc=10 //INDICO EL NÚMERO DE BITS DEL ADC
#int_EXT // CREO QUE ÉSTO ME PERMITE INDICAR QUE LO SIGUIENTE SERÁ LA RUTINA DE SERVICIO A LA INT. DEL RB0
void intRBO () {
long valor=0; //DEFINO UNA VARIABLE DE 16BITS PARA GUARDAR EL VALOR DEL ADC
float voltios=0; //DEFINO UN FLOAT PARA EL VALOR DEL VOTAJE DEL ADC
set_adc_channel(0); //SELECCIONO CANAL 0 (PIN A0) DEL ADC PARA A LEER.
delay_us(20);
valor=read_adc();
voltios=(5.0*(valor/1024.0));
puts(voltios);
}
void main(void){
enable_interrupts(GLOBAL); //HABITILRO TODAS LAS INTERRUPCIONES GLOBALES
enable_interrupts(INT_EXT); //HABILITO LA INTERRUPCIÓN DEL PIN RB0
setup_adc_ports(sAN0); //INDICO EL PIN A0 COMO ENTRADA ANALÓGICA
setup_adc(ADC_CLOCK_INTERNAL); //CLOCK INTERNO PARA CONVERSIÓN ADC
SLEEP();
}
Última edición por un moderador: