Helt ny på PIC, skulle behöva hjälp med kod för temp-sensor

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
burton666
Inlägg: 52
Blev medlem: 17 augusti 2012, 08:39:45

Helt ny på PIC, skulle behöva hjälp med kod för temp-sensor

Inlägg av burton666 »

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?

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++]);
            }
        }

    }
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43148
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Helt ny på PIC, skulle behöva hjälp med kod för temp-sen

Inlägg av sodjan »

OK, så allt fungerar som det ska med potten?
Och du har bara i princip ersatt den med en LM35?

Jag skulle göra ett betydligt enklare test för att se om/att
det går att läsa LM35'an överhuvudtaget. Kanske bara jämföra
ADC värdet med en fast gräns och tända/släcka en LED.

LM35'an ingår så vitt jag ser inte som standard på kortet.
Hur är den ansluten? Vilka pinnar går vart?

Jag har inte kollat i detalj om det är något speciellt med RC0...
Skriv svar