Helt ny på PIC, skulle behöva hjälp med kod för temp-sensor
Postat: 18 maj 2017, 09:44:36
Jag har köpt ett Microship Curiosity http://www.microchip.com/Developmenttoo ... O=DM164137 som använder sig av en PIC16F1619 http://ww1.microchip.com/downloads/en/D ... 01770C.pdf. Jag har "typ" lyckats få ut ett värde som ändrar sig när jag vrider på den inbyggda potentiometern (RC0) som visas på en LCD med koden nedan. Jag tänkte nu försöka att få temperaturen från en LM35 temp-sensor http://www.ti.com/lit/ds/symlink/lm35.pdf att visas på displayen.
Jag har provat att ändra denna delen:
TRISCbits.TRISC0 = 1; //Potentiometer is connected to RC0...set as input
ANSELCbits.ANSC0 = 1; //analog
ADCON0 = 0b00010001; //select RC0 as source of ADC and enable the module (AN4)
till:
TRISCbits.TRISC3 = 1; //Sensor is connected to RC3...set as input
ANSELCbits.ANSC3 = 1; //analog
ADCON0 = 0b00011101; //select RC3 as source of ADC and enable the module (AN7)
Men jag misstänker att jag har gjort en massa fel i koden. Kan någon ge förslag på vad som behövs modifieras?
Jag har provat att ändra denna delen:
TRISCbits.TRISC0 = 1; //Potentiometer is connected to RC0...set as input
ANSELCbits.ANSC0 = 1; //analog
ADCON0 = 0b00010001; //select RC0 as source of ADC and enable the module (AN4)
till:
TRISCbits.TRISC3 = 1; //Sensor is connected to RC3...set as input
ANSELCbits.ANSC3 = 1; //analog
ADCON0 = 0b00011101; //select RC3 as source of ADC and enable the module (AN7)
Men jag misstänker att jag har gjort en massa fel i koden. Kan någon ge förslag på vad som behövs modifieras?
Kod: Markera allt
#include <stdio.h>
#include <stdlib.h>
#include <htc.h>
#define _XTAL_FREQ 500000
#define E_bit PORTAbits.RA0
#define RS_bit PORTAbits.RA2
#define CLEAR 0x01
#define ADDRESS 0x80
void init (void);
void init_display(void);
void print_char(char data);
void print_instr(char instr);
void print_text(const char *data);
void EE(void);
void E(void);
void main(void)
{
unsigned char digits[5];
unsigned int adcval;
init();
print_instr(CLEAR);
TRISCbits.TRISC0 = 1; //Potentiometer is connected to RC0...set as input
ANSELCbits.ANSC0 = 1; //analog
ADCON0 = 0b00010001; //select RC0 as source of ADC and enable the module (AN4)
ADCON1 = 0b00010000; //left justified - FOSC/8 speed - Vref is Vdd
for(;;)
{
adcval = adc(); //grab the top 8 MSbs
__delay_ms(5); //delay for AT LEAST 5ms
digits[0] = adcval / 1000 + 48;
digits[1] = (adcval / 100) % 10 + 48;
digits[2] = (adcval / 10) % 10 + 48;
digits[3] = adcval % 10 + 48;
digits[4] = '\0';
print_text(digits);
}
}
unsigned int adc(void) {
__delay_us(5); //wait for ADC charging cap to settle
GO = 1;
while (GO) continue; //wait for conversion to be finished
return (ADRESH << 8) | ADRESL;
}
void init (void)
{
LATA=0;
LATB=0;
PORTA=0;
PORTB=0;
ANSELA=0;
ANSELB=0;
TRISA=0;
TRISB=0;
init_display();
}
void init_display(void)
{
// See the datasheet flow chart for the procedure below
// This part initiates the LCD in 4-bit mode...
__delay_ms(25);
PORTB=0x30;
EE();
PORTB=0x30;
EE();
PORTB=0x30;
EE();
PORTB=0x20;
EE();
// Set LCD properties...
print_instr(0x28); // 2: Dual line (even though it is single line)
print_instr(0x0C); // 3: Display on, cursor, blink
print_instr(CLEAR); // 4: Clear
print_instr(0x06); // 5: Entry mode set
// LCD is now initialized...
}
/*******************************************/
// Print chars to LCD with 4-bit method
/*******************************************/
void print_char(char data)
{
//PORTC = (data >> 4) & 0x0F;
PORTB = data & 0xF0;
RS_bit=1; // RS
E();
//PORTC = data & 0x0F;
PORTB = (data << 4) & 0xF0;
RS_bit=1; // RS
E();
PORTB=0;
PORTA=0;
}
/*******************************************/
// Print instruction to LCD with 4-bit method
/*******************************************/
void print_instr(char instr)
{
//PORTC = (instr >> 4) & 0x0F;
PORTB = instr & 0xF0;
E();
//PORTC = instr & 0x0F;
PORTB = (instr << 4) & 0xF0;
E();
PORTB=0;
PORTA=0;
}
/*******************************************/
// Toggle E to execute command/instruction
// With a litle bit longer delay than std.
/*******************************************/
void EE(void)
{
__delay_ms(5);
E_bit=0;
__delay_ms(5);
E_bit=1;
__delay_ms(5);
E_bit=0;
__delay_ms(5);
}
/*******************************************/
// Toggle E to execute command/instruction
/*******************************************/
void E(void)
{
__delay_us(25);
E_bit=0;
__delay_us(25);
E_bit=1;
__delay_us(25);
E_bit=0;
__delay_us(25);
}
void print_text(const char *data)
{
char i=0;
while(data[i])
{
print_char(data[i++]);
}
print_instr(ADDRESS+0x60);
i=0;
while(data[i]&&(i<8))
{
print_char(data[i++]);
}
if (i==8)
{
print_instr(ADDRESS+0x40);
while(data[i])
{
print_char(data[i++]);
}
}
}