You are on page 1of 3

#include <p18cxxx.

h>
#include <delays.h>
#include <stdlib.h>
#include "lcd.h"
#pragma config PLLDIV = 5 // (20 MHz crystal)
#pragma config CPUDIV = OSC1_PLL2
#pragma config USBDIV = 2 // Clock source from 96MHz PLL/2
#pragma config FOSC = HSPLL_HS //HSPLL_HS
#pragma config WDT = OFF
#pragma config MCLRE = ON
#pragma config LVP = OFF

unsigned int Vin, Vdec, Vfrac, FLAG, adc_read(unsigned char ch);


unsigned char ch1, ch2, tick=0, min=0, seg=0, TICK1_CH = 0, TICK2_CH = 0, TICK3_CH
= 0;
unsigned long volts, TICK1, TICK2, TICK3;
int I=0 , LED = 7, CONT = 0 ; //variables de la subrutina
unsigned short NUMERO; //para encender los leds

CHAR lcd[16] , lcd2[16] , lcd3[16];


CHAR msg[]="mV= ";
CHAR msg2[]="Ciclos = ";
unsigned int adc_read(unsigned char ch);
void InterruptHandlerHigh (void);
//----------------------------------------------------------------------------
// High priority interrupt vector
#pragma code InterruptVectorHigh = 0x08
void InterruptVectorHigh (void)
{
_asm
goto InterruptHandlerHigh //jump to interrupt routine
_endasm
}
//----------------------------------------------------------------------------
// High priority interrupt routine
#pragma code
#pragma interrupt InterruptHandlerHigh
void InterruptHandlerHigh ()
{
if (INTCONbits.INT0IF == 1) /*Notar que en la
instruccion, luego del 'INT0'
dice 'IF'. Esta
instruccion aciva la interrupcion
en todo el
programa, de manera que cualquier
cambio en el
PIN=RB0 lo identificara como un
un indicativo que
se debe acivar la interrupcion*/

{
INTCONbits.INT0IF = 0;
tick++;
if(tick==TICK1)
{
tick=0;
seg++;
}
if(seg==60)
{
seg=0;
min++;
}
if(min==60) min=0;
}

void main() {

TRISA=TRISB=TRISC=TRISD = 0x00; // set direction to be output


PORTD=0x0;
ADCON1 = 0x0F;
INTCON2 &= ~0x80;
lcd_init();
TRISAbits.TRISA0 = 1; //AN0
TRISBbits.RB0=1;
INTCONbits.GIE = 1;
INTCONbits.PEIE = 1;
INTCONbits.INT0IE = 1; /*se inicia la interrupcion.. Sin
esta linea,
no importa cuantas veces
cambie el voltaje en
RB0, la interrupcion
nunca se activara.*/
for(;;){

lcd_clear();
Vin = adc_read(0); // Read from channel 0 (AN0)
lcd_display(1,1,msg); // Display "mV = "
lcd_display(2,1,msg2); // Display "Ciclos = "
volts=Vin;
volts = 488*volts; // Scale up the result
Vdec = volts / 100; // Decimal part
Vfrac = volts % 100; // Fractional part
itoa(Vdec,lcd); // Convert Vdec to string in "lcd"

//Formula para calcular la demora de encendido y apagado


//de los leds --> TICK1 = (Vin*102)/1023 ; asiganmos Vin a una variable
de tipo long
volts = Vin;
TICK1 = volts*102/1023 ;
itoa(TICK1,lcd2); //cadena de caracteres resultantes de Vin

// Display result on LCD

lcd_display(1,6,lcd); // Output to LCD


lcd_char('.'); // Display "."
ch1 = Vfrac / 10; // Calculate fractional part
ch2 = Vfrac % 10; // Calculate fractional part
lcd_char(48+ch1); // Display fractional part
lcd_char(48+ch2); // Display fractional part

lcd_display(2,10,lcd2); //Numero de ciclos de la demora

TICK2 = TICK1*60 / 120;


TICK3 = TICK2;
do{ /*ON-OFF de
izquierda a derecha*/

do{
PORTD = (1<<LED);
}while(seg < 1);
seg=0;
tick =0;
do{
PORTD = 0;
}while(seg < 1);
LED--;
seg=0;
tick =0;

}while(LED !=0);

do{ /*ON-OFF de
derecha a izquierda*/

do{
PORTD = (1<<LED);
}while(seg < 1);
seg=0;
tick =0;
do{
PORTD = 0;
}while(seg < 1);
seg=0;
tick =0;
LED++;
}while(LED !=7);
}
}

unsigned int adc_read(unsigned char ch)


{
unsigned int result;
ADCON0 = (ch & 0x0F) << 2;
ADCON1 = 0x0B; //RA0-RA3 Analog inputs.
ADCON2 = 0x96; // right justify,TACQ=4*TAD, TAD=1/(FOSC/64)
ADCON0bits.ADON = 1; // ADC on
ADCON0bits.GO_DONE = 1; // start
while (ADCON0bits.GO_DONE == 1);
result = ((unsigned int)(ADRESH) << 8) + ADRESL;
ADCON0bits.ADON = 0; // ADC Off
return result;
}

You might also like