pic18f4550-examples/c/adc/main.c

190 lines
3.5 KiB
C

#include <pic18fregs.h>
#include <delay.h>
#include <stdint.h>
#include <adc.h>
/* FUSES START */
#pragma config XINST = OFF
#pragma config FOSC = HS
#pragma config WDT = OFF
#pragma config LVP = OFF
#pragma config MCLRE = OFF
#define NDIGITS 4
#define RATE 230
uint8_t digit[NDIGITS] = { 0 };
uint8_t dsp_en = 0;
void isr(void) __interrupt (1);
void tmr_isr(void);
uint8_t number_to_7seg(uint8_t);
void display(uint16_t);
void cleardisp(void);
void count1k(void);
void count1kbak(void);
void start_adc(void);
void setup(void);
int main(void);
void isr(void) __interrupt (1) {
if (INTCONbits.TMR0IF){
tmr_isr();
TMR0 = RATE;
}
INTCONbits.TMR0IF = 0;
}
void tmr_isr(void){
LATA = LATE = 0;
LATD = number_to_7seg(digit[dsp_en]);
switch (dsp_en) {
case 0:
LATA = 0;
LATE = 0x4;
break;
case 1:
LATE = 0x2;
break;
case 2:
LATE = 0x1;
break;
case 3:
LATE = 0;
LATA = 0x10;
break;
}
dsp_en++;
if (dsp_en > 3) dsp_en = 0;
}
uint8_t number_to_7seg(uint8_t number) {
switch (number) {
case 0:
return 0x3F;
case 1:
return 0x06;
case 2:
return 0x5B;
case 3:
return 0x4F;
case 4:
return 0x66;
case 5:
return 0x6D;
case 6:
return 0x7D;
case 7:
return 0x07;
case 8:
return 0x7F;
case 9:
return 0x6F;
case 0xa:
return 0x77;
case 0xb:
return 0x7c;
case 0xC:
return 0x39;
case 0xd:
return 0x5e;
case 0xe:
return 0x79;
case 0xf:
return 0x71;
default:
return 0;
}
}
void display(uint16_t num){
uint8_t i = 0;
if (num > 9999) return;
while(num) {
digit[i] = num%10;
num = num/10;
i++;
}
}
void cleardisp(void) {
digit[0] = 0;
digit[1] = 0;
digit[2] = 0;
digit[3] = 0;
}
void count1k(void) {
for(int i = 0; i < 9999; i++) {
display(i);
delay100ktcy(5);
}
}
void count1kbak(void) {
for(int i = 9999; i >= 0; i--) {
display(i);
delay100ktcy(5);
}
}
void start_adc(void) {
ADCON0bits.CHS = 0;
ADCON1bits.PCFG = 0xE;
ADCON2bits.ADFM = 1;
ADCON2bits.ACQT = 0x5;
ADCON2bits.ADCS = 0x1;
ADCON0bits.ADON = 1;
}
void setup(void){
/* Port setup */
LATD = 0;
TRISD = 0;
TRISB = 0xff;
LATB = 0x00;
// ADCON1 = 0xf;
TRISE = 0;
LATE = 0;
TRISA = 0x1;
LATA = 0;
/* Interrupt setup */
INTCONbits.GIE = 1;
INTCONbits.PEIE = 1;
INTCONbits.RBIE = 0;
INTCON2bits.RBPU = 0;
INTCON2bits.RBIP = 1;
RCONbits.IPEN = 1;
/* timer interrupt setup */
INTCONbits.TMR0IE = 1;
INTCON2bits.TMR0IP = 1;
T0CONbits.T08BIT = 1;
T0CONbits.T0CS = 0; // Source internal oscilator
T0CONbits.PSA = 0;
//T0CONbits.T0PS0 = 1;
//T0CONbits.T0PS1 = 1;
//T0CONbits.T0PS2 = 1;
T0CONbits.T0PS = 0x7;
T0CONbits.TMR0ON = 1;
}
int main(void) {
uint16_t cuenta = 0;
setup();
start_adc();
ADCON0bits.ADON = 1;
for (;;) {
//count1kbak();
ADCON0bits.GO = 1;
delay1ktcy(100);
while (ADCON0bits.GO);
cuenta = adc_read();
cleardisp();
display(cuenta);
}
return 0;
}