////////////////////////////////////////////////////////////////////////////////
//
//
//
// Ubicación: C:\Archivos de programa\PICC\Projects\
//
//
// Software: CS PCM Version 4.073
//
// Propósito:
//
//
// Técnica Empleada:
//
//
//
////////////////////////////////////////////////////////////////////////////////
#include <18f4550.h> // Definiciones del PIC 16F877A
#device adc=10 // Resolución 10 BITS
#device ICD=TRUE // Habilitamos el modo IDC
#fuses HSPLL,PLL5,CPUDIV1,USBDIV,MCLR,NOPBADEN,NOVREGEN
#fuses NOWDT,NOPROTECT,BROWNOUT,PUT,NOLVP,DEBUG
#use delay(clock=48000000) // Oscilador a 48 Mhz
//##############################################################################
// El compilador realiza las funciones de IO sin programar el registro dirección
// ocupa menos memoria de programa en el PIC.
//##############################################################################
#use standard_io(b)
#use rs232(baud=115200, xmit=PIN_C6, rcv=PIN_C7,ERRORS)
// parity=N (no paridad), parity=E(Paridad par), parity=O (paridad impar)
// RS232 Estándar xmit salida de datos, rcv entrada de datos
////////////////////////////////////////////////////////////////////////////////
// VARIABLES EN RAM //
////////////////////////////////////////////////////////////////////////////////
float Canal0=0x00;
float Canal1=0x00;
float Canal2=0x00;
int canal=0;
char Keypress=' ';
////////////////////////////////////////////////////////////////////////////////
// DECLARACIÓN DE FUNCIONES //
////////////////////////////////////////////////////////////////////////////////
void toma_adc_y_transmite(void); // pilla el valor de ADC y lo envia por RS232
//##############################################################################
//#
//# Interrupción recepcición serie USART
//#
//##############################################################################
#int_rda
void rda_isr() {
Keypress=0x00;
if(kbhit()){
Keypress=getc();
}
}
//##############################################################################
//#
//# Interrupción encargada del conversor AD
//#
//##############################################################################
# INT_AD
void AD_isr()
{
if (canal==0){
// set_adc_channel(canal);
// delay_ms(1);
Canal0=Read_ADC(ADC_READ_ONLY);
delay_ms(1);
Read_ADC(ADC_START_ONLY); //inicia nueva conversion.
// ++canal;
}
if (canal==1){
// set_adc_channel(canal);
// delay_ms(1);
Canal1=Read_ADC(ADC_READ_ONLY);
delay_ms(1);
Read_ADC(ADC_START_ONLY); //inicia nueva conversion.
++canal;
}
if (canal==2){
// set_adc_channel(canal);
// delay_ms(1);
Canal2=Read_ADC(ADC_READ_ONLY);
delay_ms(1);
Read_ADC(ADC_START_ONLY); //inicia nueva conversion.
// ++canal;
}
// if (canal>2) {
// canal=0;
// }
// canal++;
}
////////////////////////////////////////////////////////////////////////////////
// DESARROLO DE FUNCIONES //
////////////////////////////////////////////////////////////////////////////////
void toma_adc_y_transmite(void){
disable_interrupts(int_ad);
printf(" Canal0= %Lf Canal1= %Lf Canal2= %Lf\r\n",Canal0,Canal1,Canal2);
enable_interrupts(int_AD);
// Read_ADC(ADC_START_ONLY);
}
////////////////////////////////////////////////////////////////////////////////
// PROGRAMA PRINCIPAL VOID MAIN() //
////////////////////////////////////////////////////////////////////////////////
void main() {
setup_adc_ports( AN0_TO_AN2 || VSS_VDD ); // configuración del CAD
setup_adc( ADC_CLOCK_DIV_64 );
output_low(PIN_B5);
enable_interrupts(int_rda);
enable_interrupts(int_ad);
enable_interrupts(global);
canal=0;
Read_ADC(ADC_START_ONLY);
printf("\n\ AD - LM35a - Monitor\n\n");
do {
if(Keypress!=0x00){
switch(Keypress){
case 't': toma_adc_y_transmite();
break;
case '0': output_low(PIN_B5);
printf(" 0 - Calentador OFF\n");
break;
case '1': output_high(PIN_B5);
printf(" 1 - Calentador ON\n");
break;
}
Keypress=0x00;
}
delay_ms(10);
canal=0;
set_adc_channel(canal);
delay_ms(10);
canal=1;
set_adc_channel(canal);
delay_ms(10);
canal=2;
set_adc_channel(canal);
delay_ms(10);
} while (TRUE);
}