phil
Üye
- Katılım
- 19 Şub 2014
- Mesajlar
- 14
- Puanları
- 1
Arkadaşlar merhaba.
Oldukça önemli bir projem var.
PIC 16F877 DS 18B20 lcd dijital termometre Buradaki hex kodu, isis'te pic'e atınca çalışıyor. Ama yine buradaki c kodunu kendim derlemek istediğimde, (sebebi de şu: rc0'ın farklı değerde çıkış vermesini istiyorum, onu ayarladım) derlemiyor. dev'de de, microc'de de denedim. olmadı.
internetten araştırdım. şu iki satırı, şu şekilde düzelttim:
Lcd_Init(&PORTB);
Lcd_Cmd(Lcd_CURSOR_OFF);
----
Lcd_Init();
Lcd_Cmd(_Lcd_CURSOR_OFF);
Bunu yapınca, mikroc'de önceden error verirken derleme işleminde, şimdi hata verip derliyor. Ama derleme sonucunda hex dosyası oluşmuyor? Bu neden kaynaklanıyor, deneme sürümü mü kullanıyorum da 2kb'ın üzerinde mi hex dosyası ondan oluşmuyor acaba? Yoksa hatalardan dolayı mı oluşmuyor?
Cidden çok uğraştım ve çözümü bulamadım. Sizden ricam, aşağıda yer alan c kodunun hatasını bulmanız ve derlenip hex dosyası oluşmasını sağlamanız. Çok teşekkür ederim şimdiden.
Kod:
Bold'ladığım kısımdaki kodları yukarıda belirttiğim gibi düzelttikten sonra, paylaştığım resimdeki sorun ortaya çıktı. Bu haliyle error veriyordu.
// Set TEMP_RESOLUTION to the corresponding resolution of your DS18x20 sensor:
// 18S20: 9
// 18B20: 12 (default setting; can be 9,10,11,or 12)
const unsigned short TEMP_RESOLUTION = 12;
const int RES_FACTOR_1[4] = {5000, 2500, 1250, 625};
const unsigned int RES_FACTOR_2[4] = {0x0001, 0x0003, 0x0007, 0x000F};
const unsigned int RES_FACTOR_3[4] = {0x8000, 0xC000, 0xE000, 0xF000};
float alarma;
unsigned temp,temp2,new_temp;
unsigned short j, RES_SHIFT,j2;
void Display_Temperature(unsigned int temp) {
const unsigned short RES_SHIFT = TEMP_RESOLUTION - 8;
unsigned int temp_whole, temp_fraction;
unsigned short i;
char text[8];
// Isolate the fraction and make it a 4-digit decimal integer (for display)
temp_fraction = temp & RES_FACTOR_2[RES_SHIFT - 1];
temp_fraction = temp_fraction * RES_FACTOR_1[RES_SHIFT - 1];
//portc = temp_fraction;
// Handle the whole part of temperature value
temp_whole = temp;
// Is temperature negative?
if ((temp_whole & 0x8000) != 0u) i = 1; // Yes, i = 1
else i = 0; // No, i = 0
// PORTC = i;
// Remove the fractional part
temp_whole >>= RES_SHIFT;
// Correct the sign if necessary
if (i) temp_whole |= RES_FACTOR_3[RES_SHIFT - 1];
//portd = temp_whole;
IntToStr(temp_whole, text); // Convert whole part to string
Lcd_Out(2, 6, text); // Print whole part on Lcd
Lcd_Chr_Cp('.'); // Print dot to separate fractional part
IntToStr(temp_fraction, text); // Convert fractional part to string
// Add leading zeroes (we display 4 digits fractional part)
if (temp_fraction < 1000u) Lcd_Chr_Cp('0');
if (temp_fraction < 100u) Lcd_Chr_Cp('0');
if (temp_fraction < 10u) Lcd_Chr_Cp('0');
Lcd_Out_Cp(text); // Print fractional part on LCD
Lcd_Chr_Cp(223); // Print degree character
Lcd_Chr_Cp('C'); // Print 'C' for Centigrades
}//~
void main() {
ADCON1 = 0xFF; // Configure RA5 pin as digital I/O
PORTE = 0xFF;
TRISE = 0x0F; // PORTE is input
PORTB = 0;
TRISB = 0; // PORTB is output
TRISD=0;
PORTD=0;
TRISC=0;
PORTC=0;
// Initialize LCD on PORTB and prepare for output
Lcd_Init(&PORTB);
Lcd_Cmd(Lcd_CURSOR_OFF);
Lcd_Out(1, 1, "Sicaklik: ");
do { // main loop
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
Delay_ms(400);
j = Ow_Read(&PORTE,2); // Get temperature LSB
j2=j;
temp = Ow_Read(&PORTE,2); // Get temperature MSB
temp2=temp;
temp <<= 8; temp += j; // Form the result
temp2<<=5;
j2>>=3;
new_temp=temp2^j2;
portd=new_temp;
// alarma=39;
alarma=((new_temp*127.5)/255);
if(((alarma>=22.5))) { //YESİL LED AKTIF
PORTC.F0=1;
}
else {
portc.f0=0;}
Display_Temperature(temp); // Format and display result on LCD
Delay_ms(500);
} while (1);
}//~!
Oldukça önemli bir projem var.
PIC 16F877 DS 18B20 lcd dijital termometre Buradaki hex kodu, isis'te pic'e atınca çalışıyor. Ama yine buradaki c kodunu kendim derlemek istediğimde, (sebebi de şu: rc0'ın farklı değerde çıkış vermesini istiyorum, onu ayarladım) derlemiyor. dev'de de, microc'de de denedim. olmadı.
internetten araştırdım. şu iki satırı, şu şekilde düzelttim:
Lcd_Init(&PORTB);
Lcd_Cmd(Lcd_CURSOR_OFF);
----
Lcd_Init();
Lcd_Cmd(_Lcd_CURSOR_OFF);
Bunu yapınca, mikroc'de önceden error verirken derleme işleminde, şimdi hata verip derliyor. Ama derleme sonucunda hex dosyası oluşmuyor? Bu neden kaynaklanıyor, deneme sürümü mü kullanıyorum da 2kb'ın üzerinde mi hex dosyası ondan oluşmuyor acaba? Yoksa hatalardan dolayı mı oluşmuyor?
Cidden çok uğraştım ve çözümü bulamadım. Sizden ricam, aşağıda yer alan c kodunun hatasını bulmanız ve derlenip hex dosyası oluşmasını sağlamanız. Çok teşekkür ederim şimdiden.
Kod:
Bold'ladığım kısımdaki kodları yukarıda belirttiğim gibi düzelttikten sonra, paylaştığım resimdeki sorun ortaya çıktı. Bu haliyle error veriyordu.
// Set TEMP_RESOLUTION to the corresponding resolution of your DS18x20 sensor:
// 18S20: 9
// 18B20: 12 (default setting; can be 9,10,11,or 12)
const unsigned short TEMP_RESOLUTION = 12;
const int RES_FACTOR_1[4] = {5000, 2500, 1250, 625};
const unsigned int RES_FACTOR_2[4] = {0x0001, 0x0003, 0x0007, 0x000F};
const unsigned int RES_FACTOR_3[4] = {0x8000, 0xC000, 0xE000, 0xF000};
float alarma;
unsigned temp,temp2,new_temp;
unsigned short j, RES_SHIFT,j2;
void Display_Temperature(unsigned int temp) {
const unsigned short RES_SHIFT = TEMP_RESOLUTION - 8;
unsigned int temp_whole, temp_fraction;
unsigned short i;
char text[8];
// Isolate the fraction and make it a 4-digit decimal integer (for display)
temp_fraction = temp & RES_FACTOR_2[RES_SHIFT - 1];
temp_fraction = temp_fraction * RES_FACTOR_1[RES_SHIFT - 1];
//portc = temp_fraction;
// Handle the whole part of temperature value
temp_whole = temp;
// Is temperature negative?
if ((temp_whole & 0x8000) != 0u) i = 1; // Yes, i = 1
else i = 0; // No, i = 0
// PORTC = i;
// Remove the fractional part
temp_whole >>= RES_SHIFT;
// Correct the sign if necessary
if (i) temp_whole |= RES_FACTOR_3[RES_SHIFT - 1];
//portd = temp_whole;
IntToStr(temp_whole, text); // Convert whole part to string
Lcd_Out(2, 6, text); // Print whole part on Lcd
Lcd_Chr_Cp('.'); // Print dot to separate fractional part
IntToStr(temp_fraction, text); // Convert fractional part to string
// Add leading zeroes (we display 4 digits fractional part)
if (temp_fraction < 1000u) Lcd_Chr_Cp('0');
if (temp_fraction < 100u) Lcd_Chr_Cp('0');
if (temp_fraction < 10u) Lcd_Chr_Cp('0');
Lcd_Out_Cp(text); // Print fractional part on LCD
Lcd_Chr_Cp(223); // Print degree character
Lcd_Chr_Cp('C'); // Print 'C' for Centigrades
}//~
void main() {
ADCON1 = 0xFF; // Configure RA5 pin as digital I/O
PORTE = 0xFF;
TRISE = 0x0F; // PORTE is input
PORTB = 0;
TRISB = 0; // PORTB is output
TRISD=0;
PORTD=0;
TRISC=0;
PORTC=0;
// Initialize LCD on PORTB and prepare for output
Lcd_Init(&PORTB);
Lcd_Cmd(Lcd_CURSOR_OFF);
Lcd_Out(1, 1, "Sicaklik: ");
do { // main loop
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
Delay_ms(400);
j = Ow_Read(&PORTE,2); // Get temperature LSB
j2=j;
temp = Ow_Read(&PORTE,2); // Get temperature MSB
temp2=temp;
temp <<= 8; temp += j; // Form the result
temp2<<=5;
j2>>=3;
new_temp=temp2^j2;
portd=new_temp;
// alarma=39;
alarma=((new_temp*127.5)/255);
if(((alarma>=22.5))) { //YESİL LED AKTIF
PORTC.F0=1;
}
else {
portc.f0=0;}
Display_Temperature(temp); // Format and display result on LCD
Delay_ms(500);
} while (1);
}//~!