Hey guys!
I've an assignment that requires me to connect 2 sensors on the same PORT A. So I was thinking of using bit0 and bit1 for the ADC conversion. I looked through all the sample codes and my school's textbook, however, can't find a way to configure 2 pins at the same time. Currently I am using Mplabv8.63 compiler.
So far, I have only managed to get my temperature sensor(Lm35) working and to display the output reading. However, I can't seem to integrate another sensor onto the same codes. This codes were taken from http://forum.allaboutcircuits.com/threads/lm35-temperature-sensor.59885/
Can somebody please advise me on how to configure another pin so I can add another sensor on the same port.(If it's even possible)
Thankyou!
I've an assignment that requires me to connect 2 sensors on the same PORT A. So I was thinking of using bit0 and bit1 for the ADC conversion. I looked through all the sample codes and my school's textbook, however, can't find a way to configure 2 pins at the same time. Currently I am using Mplabv8.63 compiler.
So far, I have only managed to get my temperature sensor(Lm35) working and to display the output reading. However, I can't seem to integrate another sensor onto the same codes. This codes were taken from http://forum.allaboutcircuits.com/threads/lm35-temperature-sensor.59885/
- //Temperature Sensor - Convert the Analog signal to Digital and Display it to the LCD Display Board
- #include <p18F4550.h>
- #include <delays.h>
- #include "lcd.h"
- // ************** ErnieM Addition Start ****************
- #include <stdlib.h> // added to get itoa() function to convert t into a string
- // ************** ErnieM Addition End ****************
- // Include this when using Bootloader Program ================================
- #pragma udata
- extern void _startup (void); // See c018i.c in your C18 compiler dir
- #pragma code _RESET_INTERRUPT_VECTOR = 0x000800
- void _reset (void)
- {
- _asm goto _startup _endasm
- }
- #pragma code
- #pragma code _HIGH_INTERRUPT_VECTOR = 0x000808
- void _high_ISR (void)
- {
- ;
- }
- #pragma code _LOW_INTERRUPT_VECTOR = 0x000818
- void _low_ISR (void)
- {
- ;
- }
- #pragma code
- #pragma code
- // additional codes ends here ===============================================================
- // Your program declarations start here:====
- #define LCD_RS PORTDbits.RD6 // Register Select on LCD
- #define LCD_EN PORTDbits.RD4 // Enable on LCD controller
- #define LCD_WR PORTDbits.RD5 // Write on LCD controller
- //--- Function for writing a command byte to the LCD in 4 bit mode -------------
- void lcd_write_cmd(signed char cmd)
- {
- unsigned char temp2;
- LCD_RS = 0; // Select LCD for command mode
- Delay10TCYx(4); // 40us delay for LCD to settle down
- temp2 = cmd;
- temp2 = temp2 >> 4; // Output upper 4 bits, by shifting out lower 4 bits
- PORTD = temp2 & 0x0F; // Output to PORTD which is connected to LCD
- Delay1KTCYx(10); // 10ms - Delay at least 1 ms before strobing
- lcd_strobe();
- Delay1KTCYx(10); // 10ms - Delay at least 1 ms after strobing
- temp2 = cmd; // Re-initialise temp2
- PORTD = temp2 & 0x0F; // Mask out upper 4 bits
- Delay1KTCYx(10); // 10ms - Delay at least 1 ms before strobing
- lcd_strobe();
- Delay1KTCYx(10); // 10ms - Delay at least 1 ms before strobing
- }
- //---- Function to write a character data to the LCD ---------------------------
- void lcd_write_data(char data)
- {
- char temp1;
- LCD_RS = 1; // Select LCD for data mode
- Delay10TCYx(4); // 40us delay for LCD to settle down
- temp1 = data;
- temp1 = temp1 >> 4;
- PORTD = temp1 & 0x0F;
- Delay1KTCYx(10);
- LCD_RS = 1;
- Delay1KTCYx(10); //_-_ strobe data in
- lcd_strobe();
- Delay1KTCYx(10);
- temp1 = data;
- PORTD = temp1 & 0x0F;
- Delay1KTCYx(10);
- LCD_RS = 1;
- Delay1KTCYx(10); //_-_ strobe data in
- lcd_strobe();
- Delay1KTCYx(10);
- }
- //-- Function to generate the strobe signal for command and character----------
- void lcd_strobe(void) // Generate the E pulse
- {
- LCD_EN = 1; // E = 0
- Delay1KTCYx(100); // 10ms delay for LCD_EN to settle
- LCD_EN = 0; // E = 1
- Delay1KTCYx(100); // 10ms delay for LCD_EN to settle
- }
- //---- Function to initialise LCD module ----------------------------------------
- void lcd_init(void)
- {
- TRISD = 0x00;
- PORTD = 0x00; // PORTD is connected to LCD data pin
- LCD_EN = 0;
- LCD_RS = 0; // Select LCD for command mode
- LCD_WR = 0; // Select LCD for write mode
- Delay10KTCYx(250); // Delay a total of 1 s for LCD module to
- Delay10KTCYx(250); //
- Delay10KTCYx(250); //
- Delay10KTCYx(250); // finish its own internal initialisation
- /* The data sheets warn that the LCD module may fail to initialise properly when
- power is first applied. This is particularly likely if the Vdd
- supply does not rise to its correct operating voltage quickly enough.
- It is recommended that after power is applied, a command sequence of
- 3 bytes of 30h be sent to the module. This will ensure that the module is in
- 8-bit mode and is properly initialised. Following this, the LCD module can be
- switched to 4-bit mode.
- */
- lcd_write_cmd(0x33);
- lcd_write_cmd(0x32);
- lcd_write_cmd(0x28); // 001010xx Function Set instruction
- // DL=0 :4-bit interface,N=1 :2 lines,F=0 :5x7 dots
- lcd_write_cmd(0x0E); // 00001110 Display On/Off Control instruction
- // D=1
isplay on,C=1 :Cursor on,B=0 :Cursor Blink on
- lcd_write_cmd(0x06); // 00000110 Entry Mode Set instruction
- // I/D=1 :Increment Cursor position
- // S=0 : No display shift
- lcd_write_cmd(0x01); // 00000001 Clear Display instruction
- Delay1KTCYx(20); // 20 ms delay
- }
- void main(void)
- {
- // ************** ErnieM Addition Start ****************
- // add these variables
- char Buffer[10]; // buffer to hold your temperature character string
- unsigned int i; // index variable
- // moved your "t" variable up here, C18 wants to see variables defined at the
- // very start of a block. Other compilers let you make a definition anywhere,
- // this C28 compiler seems to want them up top like this
- unsigned int t; // variable for temperature
- // ************** ErnieM Addition End ****************
- // Do not remove these as well=============
- ADCON1 = 0x0F; // Configure PORTA to be digital I/O
- CMCON = 0x07;
- // ========================================
- // Your MAIN program Starts here: =========
- lcd_init(); // Initialise LCD module
- LCD_RS = 1; // Select LCD for character data mode
- Delay1KTCYx(1); // 1 ms delay
- /* Initialise analog to digital conversion setting */
- ADCON0 = 0b00000001; // bit5-2 0000 select channel 0 conversion
- // bit1 A/D conversion status bit
- // 1- GO to starts the conversion
- // 0 - DONE when A/D is completed
- // bit0 Set to 1 to power up A/D
- ADCON1 = 0b00001100; // bit5 reference is VSS
- // bit4 reference is VDD
- // bit3-0 AN2 to AN0 Analog, the rest Digital
- ADCON2 = 0b10010110; // bit7 : A/D Result Format. 0 Left, 1 Right justified ( Set it to 1, Right Justified)
- // bit5-3 : 010 acquisition time = 4 TAD
- // bit2-0 : 110 conversion clock = Tosc / 16
- // ************** ErnieM Addition Start ****************
- // I'm going to change your loops so it measures the temperature every second
- // then displays it.
- // for(;
- // {
- // ************** ErnieM Addition End ****************
- // ************** ErnieM Addition Start ****************
- // this code moved down below into the once a second loop
- // ADCON0bits.GO = 1; // This is bit2 of ADCON0, START CONVERSION NOW
- // while(ADCON0bits.GO == 1); // Waiting for DONE
- // t = (ADRES * 500) / 255; //Convert to Degree Celcius - ADRES (16bit) is the output of ADC
- // ************** ErnieM Addition End ****************
- // ************** ErnieM Addition Start ****************
- // removed this loop
- // while(1)
- // {
- // ************** ErnieM Addition End ****************
- lcd_write_cmd(0x80); // Move cursor to line 1 position 1
- lcd_write_data('T');
- lcd_write_data('E');
- lcd_write_data('M');
- lcd_write_data('P');
- lcd_write_data('E');
- lcd_write_data('R');
- lcd_write_data('A');
- lcd_write_data('T');
- lcd_write_data('U');
- lcd_write_data('R');
- lcd_write_data('E');
- lcd_write_data(':');
- // ************** ErnieM Addition Start ****************
- // HERE is where we'll loop
- while(1)
- {
- // measure temperature
- ADCON0bits.GO = 1; // This is bit2 of ADCON0, START CONVERSION NOW
- while(ADCON0bits.GO == 1); // Waiting for DONE
- t = (ADRES * 500) / 255; //Convert to Degree Celcius - ADRES (16bit) is the output of ADC
- lcd_write_cmd(0xC0); // Move cursor to line 2 position 1
- // lcd_write_data(t); // Display the temperature
- // we can't just drint the integer, need to first convert the number into a character string
- // convert t to a string
- itoa(t,Buffer);
- // print that string!
- i = 0;
- while (Buffer != 0) lcd_write_data(Buffer[i++]);
[*]
[*]
[*] lcd_write_data(0xDF);
[*] lcd_write_data('C');
[*]
[*] Delay10KTCYx(250); // Delay a total of 1 s
[*] Delay10KTCYx(250); //
[*] Delay10KTCYx(250); //
[*] Delay10KTCYx(250); // so the screen doesn't "flash" too much on updates
[*]// for the future: Save the old value of t, and only update the screen
[*]// when a new temperature is measured. That way you don't need that 1 sec delay
[*]
[*]
[*] }
[*]// ************** ErnieM Addition End ****************
[*]
[*]
[*]
[*]
[*]// ************** ErnieM Addition Start ****************
[*]// removed infinite "stop here" loop
[*]// while(1); //stop here for now
[*]
[*]
[*]// }
[*]// }
[*]
[*]// ************** ErnieM Addition End ****************
[*]} // end of main()
Can somebody please advise me on how to configure another pin so I can add another sensor on the same port.(If it's even possible)
Thankyou!