Merhaba, sorun şu ki;
bu proje simülasyon da çalışmıyor. Önemli olan nerede hata yaptığım, projemin tamamı farklı ama bu kısım hiçbir şekilde çalışmıyor. Olmadı breadboard üzerinde deneyeceğim, belki gerçekte çalışır, aklıma başka çözüm gelmiyor. Çünkü denemediğim örnek kalmadı. Bu en son basitleşmiş hali. Her şey İnternet'te bulduğum örnekler ile neredeyse aynı. indirdiğim örnekler çalışıyor ama benim ki çalışmıyor. Değerli yorumlarınızı ve yardımınızı bekliyorum, şimdiden teşekkürler.
// LCD module connections
sbit LCD_RS at LATD4_bit;
sbit LCD_EN at LATD5_bit;
sbit LCD_D4 at LATD0_bit;
sbit LCD_D5 at LATD1_bit;
sbit LCD_D6 at LATD2_bit;
sbit LCD_D7 at LATD3_bit;
sbit LCD_RS_Direction at TRISD4_bit;
sbit LCD_EN_Direction at TRISD5_bit;
sbit LCD_D4_Direction at TRISD0_bit;
sbit LCD_D5_Direction at TRISD1_bit;
sbit LCD_D6_Direction at TRISD2_bit;
sbit LCD_D7_Direction at TRISD3_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;
}
if (family_code_hex[2] == 0xFF)
{
Lcd_Out(2, 1, "NoID ");
TEMP_RESOLUTION = 0;
}
}
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(100);
} while (1);
}
(https://s13.postimg.cc/g1cnlkodv/dfdfd.png) (https://postimg.cc/image/g1cnlkodv/)