polona1010
Member level 1
- Joined
- Apr 17, 2013
- Messages
- 40
- Helped
- 0
- Reputation
- 0
- Reaction score
- 0
- Trophy points
- 1,286
- Activity points
- 1,524
Hello
I need example in MikroC for PIC how to read serial number of DS18S20 or DS18B20 using MikroC OneWire library.
Result should be on 2x16 LCD.
PIC18F45K22 is microcontroller.
Thanks Polona
Ow_Reset(&PORTE, 2); // Onewire reset signal
Ow_Write(&PORTE, 2, 0x33); // Read ROM
Delay_us(120);
colona = 17;
for(i = 0; i <= 7; i++)
{
colona = colona - 2;
sernum = Ow_Read(&PORTE, 2);
bytetohex(sernum, sernum_hex);
Lcd_Out(1, colona, sernum_hex);
}
// LCD module connections
sbit LCD_RS at LATB4_bit;
sbit LCD_EN at LATB5_bit;
sbit LCD_D4 at LATB0_bit;
sbit LCD_D5 at LATB1_bit;
sbit LCD_D6 at LATB2_bit;
sbit LCD_D7 at LATB3_bit;
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
// End LCD module connections
// Set TEMP_RESOLUTION to the corresponding resolution of used DS18x20 sensor:
// 18S20: 9 (default setting; can be 9,10,11,or 12)
// 18B20: 12
const unsigned short TEMP_RESOLUTION = 9;
char *text = "000.0000";
unsigned temp;
char sernum;
int i;
int colona;
char *sernum_hex[8];
void Display_Temperature(unsigned int temp2write) {
const unsigned short RES_SHIFT = TEMP_RESOLUTION - 8;
char temp_whole;
unsigned int temp_fraction;
// Check if temperature is negative
if (temp2write & 0x8000) {
text[0] = '-';
temp2write = ~temp2write + 1;
}
// Extract temp_whole
temp_whole = temp2write >> RES_SHIFT ;
// Convert temp_whole to characters
if (temp_whole/100)
text[0] = temp_whole/100 + 48;
else
text[0] = '0';
text[1] = (temp_whole/10)%10 + 48; // Extract tens digit
text[2] = temp_whole%10 + 48; // Extract ones digit
// Extract temp_fraction and convert it to unsigned int
temp_fraction = temp2write << (4-RES_SHIFT);
temp_fraction &= 0x000F;
temp_fraction *= 625;
// Convert temp_fraction to characters
text[4] = temp_fraction/1000 + 48; // Extract thousands digit
text[5] = (temp_fraction/100)%10 + 48; // Extract hundreds digit
text[6] = (temp_fraction/10)%10 + 48; // Extract tens digit
text[7] = temp_fraction%10 + 48; // Extract ones digit
// Print temperature on LCD
Lcd_Out(2, 7, text);
}
void main() {
ANSELE = 0; // Configure PORTE pins as digital
TRISE.B2 = 1; // Configure RE2 pin as input
Lcd_Init(); // Initialize LCD
Lcd_Cmd(_LCD_CLEAR); // Clear LCD
Lcd_Cmd(_LCD_CURSOR_OFF); // Turn cursor off
Lcd_Out(2, 1, "Temp:");
// Print degree character, 'C' for Centigrades
Lcd_Chr(2,15,176); // Different LCD displays have different char code for degree
// If you see greek alpha letter try typing 178 instead of 223
Lcd_Chr(2,16,'C');
// Main loop
do {
// Perform temperature reading
Ow_Reset(&PORTE, 2); // Onewire reset signal
Ow_Write(&PORTE, 2, 0xCC); // Issue command SKIP_ROM
Ow_Write(&PORTE, 2, 0x44); // Issue command CONVERT_T
Delay_us(120);
Ow_Reset(&PORTE, 2);
Ow_Write(&PORTE, 2, 0xCC); // Issue command SKIP_ROM
Ow_Write(&PORTE, 2, 0xBE); // Issue command READ_SCRATCHPAD
temp = Ow_Read(&PORTE, 2);
temp = (Ow_Read(&PORTE, 2) << 8) + temp;
// Format and display result on Lcd
Display_Temperature(temp);
Ow_Reset(&PORTE, 2); // Onewire reset signal
Ow_Write(&PORTE, 2, 0x33); // Read ROM
Delay_us(120);
colona = 17;
for(i = 0; i <= 7; i++)
{
colona = colona - 2;
sernum = Ow_Read(&PORTE, 2);
bytetohex(sernum, sernum_hex);
Lcd_Out(1, colona, sernum_hex);
}
Delay_ms(500);
} while (1);
}
Thank you mr. tpetar.
Can this be used for door entry or other security such as ibutton?
const unsigned short TEMP_RESOLUTION = 9;
const unsigned short TEMP_RESOLUTION = 12;
// LCD module connections
sbit LCD_RS at LATB4_bit;
sbit LCD_EN at LATB5_bit;
sbit LCD_D4 at LATB0_bit;
sbit LCD_D5 at LATB1_bit;
sbit LCD_D6 at LATB2_bit;
sbit LCD_D7 at LATB3_bit;
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
// End LCD module connections
// Set TEMP_RESOLUTION to the corresponding resolution of used DS18x20 sensor:
// 18S20: 9 (default setting; can be 9,10,11,or 12)
// 18B20: 12
const unsigned short TEMP_RES_B = 12;
const unsigned short TEMP_RES_S = 9;
unsigned short TEMP_RESOLUTION;
char family_code;
char family_code_hex[2];
char *text = "000.0000";
unsigned temp;
char sernum;
char sernum_hex[8];
int i;
int colona;
void Resolution()
{
Ow_Reset(&PORTE, 2); // Onewire reset signal
Ow_Write(&PORTE, 2, 0x33); // Issue command Read_ROM
Delay_us(120);
family_code = Ow_Read(&PORTE, 2);
bytetohex(family_code, family_code_hex[2]);
if (family_code_hex[2] == 0x28)
{
Lcd_Out(2, 1, " ");
Lcd_Out(2, 1, "18B20");
TEMP_RESOLUTION = Temp_Res_B;
}
if (family_code_hex[2] == 0x10)
{
Lcd_Out(2, 1, " ");
Lcd_Out(2, 1, "18S20");
TEMP_RESOLUTION = Temp_Res_S;
}
}
void Display_Temperature(unsigned int temp2write)
{
unsigned short RES_SHIFT = TEMP_RESOLUTION - 8;
char temp_whole;
unsigned int temp_fraction;
// Check if temperature is negative
if (temp2write & 0x8000)
{
text[0] = '-';
temp2write = ~temp2write + 1;
}
// Extract temp_whole
temp_whole = temp2write >> RES_SHIFT ;
// Convert temp_whole to characters
if (temp_whole/100)
text[0] = temp_whole/100 + 48;
else
text[0] = '0';
text[1] = (temp_whole/10)%10 + 48; // Extract tens digit
text[2] = temp_whole%10 + 48; // Extract ones digit
// Extract temp_fraction and convert it to unsigned int
temp_fraction = temp2write << (4-RES_SHIFT);
temp_fraction &= 0x000F;
temp_fraction *= 625;
// Convert temp_fraction to characters
text[4] = temp_fraction/1000 + 48; // Extract thousands digit
text[5] = (temp_fraction/100)%10 + 48; // Extract hundreds digit
text[6] = (temp_fraction/10)%10 + 48; // Extract tens digit
text[7] = temp_fraction%10 + 48; // Extract ones digit
// Print temperature on LCD
Lcd_Out(2, 7, text);
}
void main() {
ANSELE = 0; // Configure PORTE pins as digital
TRISE.B2 = 1; // Configure RE2 pin as input
Lcd_Init(); // Initialize LCD
Lcd_Cmd(_LCD_CLEAR); // Clear LCD
Lcd_Cmd(_LCD_CURSOR_OFF); // Turn cursor off
// Print degree character, 'C' for Centigrades
Lcd_Chr(2,15,178); // 176 ASCII for degree symbol
Lcd_Chr(2,16,'C');
// Main loop
do {
Resolution();
//Unique Part Serial Number
Ow_Reset(&PORTE, 2); // Onewire reset signal
Ow_Write(&PORTE, 2, 0x33); // Issue command Read_ROM
Delay_us(120);
colona = 17;
for(i = 0; i <= 7; i++)
{
colona = colona - 2;
sernum = Ow_Read(&PORTE, 2);
bytetohex(sernum, sernum_hex);
Lcd_Out(1, colona, sernum_hex);
}
// Perform temperature reading
Ow_Reset(&PORTE, 2); // Onewire reset signal
Ow_Write(&PORTE, 2, 0xCC); // Issue command SKIP_ROM
Ow_Write(&PORTE, 2, 0x44); // Issue command CONVERT_T
Delay_us(120);
Ow_Reset(&PORTE, 2);
Ow_Write(&PORTE, 2, 0xCC); // Issue command SKIP_ROM
Ow_Write(&PORTE, 2, 0xBE); // Issue command READ_SCRATCHPAD
temp = Ow_Read(&PORTE, 2);
temp = (Ow_Read(&PORTE, 2) << 8) + temp;
// Format and display result on Lcd
Display_Temperature(temp);
Delay_ms(500);
} while (1);
}
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?