dselec
Advanced Member level 1
- Joined
- Jan 19, 2012
- Messages
- 451
- Helped
- 47
- Reputation
- 94
- Reaction score
- 47
- Trophy points
- 1,308
- Activity points
- 3,734
Hex file for 16F72 UPS (16MHZ crystal) F.2.0
Hex file is in attachment,please share code
DC Voltmeter up to 30V with PIC16F676.
You can easily modify code and adjust to other voltage range.
Compiler is MPLAB XC8 Compiler.
You have circuit, source file, hex file, PCB files, photos, description,...
View attachment 88571 View attachment 88569
View attachment 88568 View attachment 88570
View attachment 88572 View attachment 88573 View attachment 88574
change as(30*Num)
i'm doing right ?(60*Num)
#include <htc.h>
__CONFIG (FOSC_INTRCIO & MCLRE_OFF & BOREN_ON & CP_OFF & CPD_OFF & WDTE_OFF & PWRTE_ON );
#define SPORT PORTA
#define DPORT PORTC
const char SegCode[11] = {0x40,0x57,0x22,0x06,0x15,0x0C,0x08,0x56,0x00,0x04,0xFF};
// 0 1 2 3 4 5 6 7 8 9
const char Column[3] = {0x02,0x01,0x04};
static char Segment[3] = {0x7f,0x7f,0x7f};
static unsigned char ColCount=0x00;
void CPU_SETUP(void);
void Display(void);
void HTO7S(unsigned int Num);
void delayMs(int x);
unsigned int result;
unsigned int readAdc(void);
void interrupt timer1_isr(void)
{
if(PIR1bits.TMR1IF==1)
{
PIR1bits.TMR1IF = 0;
TMR1H=0xDF;
Display();
}
}
void main()
{
unsigned char i;
CPU_SETUP();
while(1)
{
result=0;
for (i=0;i<3;i++)
{
delayMs(1);
result=result+readAdc();
}
HTO7S(result/3);
delayMs(200);
}
}
void CPU_SETUP()
{
CMCON =0x07; //Turn off comparator module
ANSEL =0x8; //AN3 as analog input
ADCON1 =0x60; //clock/64
ADCON0 = 0x8D;
TRISA=0b00011000;
PORTA=0x27;
TRISC=0b00000000;
PORTC=0x37;
T1CON= 0x00;
TMR1H=0xDF;
INTCONbits.GIE =1;
INTCONbits.PEIE=1;
PIE1bits.TMR1IE =1;
T1CONbits.TMR1ON=1;
}
unsigned int readAdc()
{
unsigned int res;
ADCON0bits.GO_DONE =1;
while(ADCON0bits.GO_DONE ==1);
res=ADRESL+(ADRESH*0x100);
return(res);
}
//-------------------------------------
// Display routine
//-------------------------------------
void Display()
{
PORTA = 0b00100111; // off all digits column and Segment G
PORTC = 0b00111111; // off segment a-f
if (ColCount>=3)
ColCount=0;
DPORT = Segment[ColCount];
SPORT = ((Segment[ColCount] & 0b01000000)>>1) | (Column[ColCount]^0x07);
ColCount++;
}
//--------------------------------------
// Convet HEX 2 byte to 7-Segment code
//--------------------------------------
void HTO7S(unsigned int adcstep)
{
unsigned int res;
// First digit (X)X,X
res = adcstep * (unsigned long)9900 / 1023;
Segment[0]=SegCode[res/1000]; // max Vin 99V. Result is ADV voltage (0-5V).
// Example: Vin 25,3V result is 2,53 and takes 2
if (Segment[0]==0x40) // If first digit is 0 then
Segment[0]=0xFF; // do not show nothing.
// Second digit X(X),X
res = adcstep * (unsigned long)9900 / 1023;
Segment[1]=SegCode[(res/100)%10]; // The same as first digit, but %10 takes 5
// Third digit XX,(X)
res = adcstep * (unsigned long)9900 / 1023;
Segment[2]=SegCode[(res/10)%10];
}
void delayMs(int x)
{
int i;
for (x ;x>0;x--)
{
for (i=0;i<=110;i++);
}
}
#include <htc.h>
__CONFIG (FOSC_INTRCIO & MCLRE_OFF & BOREN_ON & CP_OFF & CPD_OFF & WDTE_OFF & PWRTE_ON );
#define SPORT PORTA
#define DPORT PORTC
const char SegCode[11] = {0x40,0x57,0x22,0x06,0x15,0x0C,0x08,0x56,0x00,0x04,0xFF};
// 0 1 2 3 4 5 6 7 8 9
const char Column[3] = {0x02,0x01,0x04};
static char Segment[3] = {0x7f,0x7f,0x7f};
static unsigned char ColCount=0x00;
void CPU_SETUP(void);
void Display(void);
void HTO7S(unsigned int Num);
void delayMs(int x);
unsigned int result;
unsigned int readAdc(void);
void interrupt timer1_isr(void)
{
if(PIR1bits.TMR1IF==1)
{
PIR1bits.TMR1IF = 0;
TMR1H=0xDF;
Display();
}
}
void main()
{
unsigned char i;
CPU_SETUP();
while(1)
{
result=0;
for (i=0;i<3;i++)
{
delayMs(1);
result=result+readAdc();
}
HTO7S(result/3);
delayMs(200);
}
}
void CPU_SETUP()
{
CMCON =0x07; //Turn off comparator module
ANSEL =0x8; //AN3 as analog input
ADCON1 =0x60; //clock/64
ADCON0 = 0x8D;
TRISA=0b00011000;
PORTA=0x27;
TRISC=0b00000000;
PORTC=0x37;
T1CON= 0x00;
TMR1H=0xDF;
INTCONbits.GIE =1;
INTCONbits.PEIE=1;
PIE1bits.TMR1IE =1;
T1CONbits.TMR1ON=1;
}
unsigned int readAdc()
{
unsigned int res;
ADCON0bits.GO_DONE =1;
while(ADCON0bits.GO_DONE ==1);
res=ADRESL+(ADRESH*0x100);
return(res);
}
//-------------------------------------
// Display routine
//-------------------------------------
void Display()
{
PORTA = 0b00100111; // off all digits column and Segment G
PORTC = 0b00111111; // off segment a-f
if (ColCount>=3)
ColCount=0;
DPORT = Segment[ColCount];
SPORT = ((Segment[ColCount] & 0b01000000)>>1) | (Column[ColCount]^0x07);
ColCount++;
}
//--------------------------------------
// Convet HEX 2 byte to 7-Segment code
//--------------------------------------
void HTO7S(unsigned int voltage)
{
unsigned int res;
// for 10bit ADC, using Vref=5000mV, result in mV
res = ((voltage * (unsigned long)5000 / 1023)) / 5;
res = res * 9;
// First digit (X),XX
Segment[0]=SegCode[res/1000];
// Second digit X,(X)X
Segment[1]=SegCode[(res/100)%10];
// Third digit X,X(X)
Segment[2]=SegCode[(res/10)%10];
}
void delayMs(int x)
{
int i;
for (x ;x>0;x--)
{
for (i=0;i<=110;i++);
}
}
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?