lamneth
Üye
- Katılım
- 8 Şub 2010
- Mesajlar
- 40
- Puanları
- 1
- Yaş
- 37
Merhaba arkadaşlar,
dünden beri kafayı yemek üzereyim uyku bile uyumadım 2 saat uyudum hala daha uğraşıyorum lütfen yardımcı olabilir misiniz?
pic'e yeni başladım ve Fırat Deveci'nin kitabındaki analog voltaj okuma örneğini Sharp Sensör (10-80 cm)'den aldığım çıkış voltajını mesafeye çevirip, Lcd'ye yazdırmak için biraz değiştirdim. değiştirdiğim kısımda yaptığım sadece sensörden okunan voltaj değerini voltaj_1=(float)((26,78)*mesafe^(-1,15)); fonksiyonunda yerine koyarak mesafe değerini hesaplamak. fakat ne yaparsam yapayım, okunan bu değer LCD'de mantıklı bir değer olarak görünmüyor. garip simgeler çıkıyor. +-.## 2+.-1 falan gibi değerler çıkıyor. Sorunun fonksiyondaki virgüllü ve üstel ifadelerden olduğunu düşünüyorum. nitekim fırat devecinin foknsiyonunda aldığı voltaj değerini ADRESH ve ADRESL registerlerinden integer a çeviriyor ve başka bir fonksiyonla çarpmadan direk LCD'ye yazdırıyor. Ama ben bu fonksiyonla çarpmak istersem saçmalıyor.
Lütfen yardımcı olabilir misiniz? Kod aşağıdadır. İlgilenen herkese şimdiden çok teşekkürler. PIC 16F877 kullanıyorum bu arada.
#include <htc.h>
#include "delay.h" // Gecikme kütüphanesi tanımlanıyor
#include "lcd.h" // LCD kütüphanesi tanımlanıyor
int voltaj_1;
int voltaj_2;
char i=1;
int mesafe;
void main(void) // Ana fonksiyon alanı
{
TRISA=0x03; // Analog giriş için
TRISB=0x00; // LCD için çıkış
TRISC=0x00;
PORTB=0x00;
PORTC=0x00;
PCFG3=0; // AN0 ve AN1 analog
PCFG2=1;
PCFG1=0;
PCFG0=0;
ADFM=1; // Sağa dayalı yazılıyor
ADON=1; // ADC açılıyor
ADIF=0; // ADC bayrağı temizleniyor
ADIE=1; // ADC kesmesi izni veriliyor
PEIE=1; // Genel ve yardımcı kesme izinleri veriliyor
GIE=1;
lcd_init(); // LCD ilk ayarları yapılıyor
lcd_yaz("1.Voltaj=");
lcd_gotoxy(2,1);
lcd_yaz("2.Voltaj=");
for(;
{
CHS2=0; // AN0 seçiliyor
CHS1=0;
CHS0=0;
DelayUs(25);
GO_DONE=1; // Çevrim başlatılıyor
while(!GO_DONE);
mesafe=(int)((ADRESH*256+ADRESL)/2); // Hesaplama yapılıyor
lcd_gotoxy(1,10); // Okunan değer LCD'ye yazılıyor
voltaj_1=(float)((26,78)*mesafe^(-1,15));
veri_yolla(voltaj_1/1000+48);
veri_yolla((voltaj_1%1000)/100+48);
veri_yolla('.');
veri_yolla((voltaj_1%100)/10+48);
veri_yolla(voltaj_1%10+48);
veri_yolla('V');
CHS2=0; // AN1 seçiliyor
CHS1=0;
CHS0=1;
DelayUs(25);
GO_DONE=1; // Çevrim başlatılıyor
while(!GO_DONE);
voltaj_2=(int)((ADRESH*256+ADRESL)/2); // Hesaplama yapılıyor
lcd_gotoxy(2,10); // Okunan değer LCD'ye yazılıyor
veri_yolla(voltaj_2/1000+48);
veri_yolla((voltaj_2%1000)/100+48);
veri_yolla('.');
veri_yolla((voltaj_2%100)/10+48);
veri_yolla(voltaj_2%10+48);
veri_yolla('V');
}
}
static void interrupt
led_yaz_son(void)
{
if(ADIF) // Çevrim bitiş kesmesi bekleniyor
{
GIE=0; // Başka kesme gelmesi engelleniyor
i=!i; // Her kesme de değili alınıyor
RC5=i; // Değer RC5'e aktarılıyor
ADIF=0; // Kesme bayrağı sıfırlanıyor
GIE=1; // Genel kesme alımı açılıyor
}
}
dünden beri kafayı yemek üzereyim uyku bile uyumadım 2 saat uyudum hala daha uğraşıyorum lütfen yardımcı olabilir misiniz?
pic'e yeni başladım ve Fırat Deveci'nin kitabındaki analog voltaj okuma örneğini Sharp Sensör (10-80 cm)'den aldığım çıkış voltajını mesafeye çevirip, Lcd'ye yazdırmak için biraz değiştirdim. değiştirdiğim kısımda yaptığım sadece sensörden okunan voltaj değerini voltaj_1=(float)((26,78)*mesafe^(-1,15)); fonksiyonunda yerine koyarak mesafe değerini hesaplamak. fakat ne yaparsam yapayım, okunan bu değer LCD'de mantıklı bir değer olarak görünmüyor. garip simgeler çıkıyor. +-.## 2+.-1 falan gibi değerler çıkıyor. Sorunun fonksiyondaki virgüllü ve üstel ifadelerden olduğunu düşünüyorum. nitekim fırat devecinin foknsiyonunda aldığı voltaj değerini ADRESH ve ADRESL registerlerinden integer a çeviriyor ve başka bir fonksiyonla çarpmadan direk LCD'ye yazdırıyor. Ama ben bu fonksiyonla çarpmak istersem saçmalıyor.
Lütfen yardımcı olabilir misiniz? Kod aşağıdadır. İlgilenen herkese şimdiden çok teşekkürler. PIC 16F877 kullanıyorum bu arada.
#include <htc.h>
#include "delay.h" // Gecikme kütüphanesi tanımlanıyor
#include "lcd.h" // LCD kütüphanesi tanımlanıyor
int voltaj_1;
int voltaj_2;
char i=1;
int mesafe;
void main(void) // Ana fonksiyon alanı
{
TRISA=0x03; // Analog giriş için
TRISB=0x00; // LCD için çıkış
TRISC=0x00;
PORTB=0x00;
PORTC=0x00;
PCFG3=0; // AN0 ve AN1 analog
PCFG2=1;
PCFG1=0;
PCFG0=0;
ADFM=1; // Sağa dayalı yazılıyor
ADON=1; // ADC açılıyor
ADIF=0; // ADC bayrağı temizleniyor
ADIE=1; // ADC kesmesi izni veriliyor
PEIE=1; // Genel ve yardımcı kesme izinleri veriliyor
GIE=1;
lcd_init(); // LCD ilk ayarları yapılıyor
lcd_yaz("1.Voltaj=");
lcd_gotoxy(2,1);
lcd_yaz("2.Voltaj=");
for(;
{
CHS2=0; // AN0 seçiliyor
CHS1=0;
CHS0=0;
DelayUs(25);
GO_DONE=1; // Çevrim başlatılıyor
while(!GO_DONE);
mesafe=(int)((ADRESH*256+ADRESL)/2); // Hesaplama yapılıyor
lcd_gotoxy(1,10); // Okunan değer LCD'ye yazılıyor
voltaj_1=(float)((26,78)*mesafe^(-1,15));
veri_yolla(voltaj_1/1000+48);
veri_yolla((voltaj_1%1000)/100+48);
veri_yolla('.');
veri_yolla((voltaj_1%100)/10+48);
veri_yolla(voltaj_1%10+48);
veri_yolla('V');
CHS2=0; // AN1 seçiliyor
CHS1=0;
CHS0=1;
DelayUs(25);
GO_DONE=1; // Çevrim başlatılıyor
while(!GO_DONE);
voltaj_2=(int)((ADRESH*256+ADRESL)/2); // Hesaplama yapılıyor
lcd_gotoxy(2,10); // Okunan değer LCD'ye yazılıyor
veri_yolla(voltaj_2/1000+48);
veri_yolla((voltaj_2%1000)/100+48);
veri_yolla('.');
veri_yolla((voltaj_2%100)/10+48);
veri_yolla(voltaj_2%10+48);
veri_yolla('V');
}
}
static void interrupt
led_yaz_son(void)
{
if(ADIF) // Çevrim bitiş kesmesi bekleniyor
{
GIE=0; // Başka kesme gelmesi engelleniyor
i=!i; // Her kesme de değili alınıyor
RC5=i; // Değer RC5'e aktarılıyor
ADIF=0; // Kesme bayrağı sıfırlanıyor
GIE=1; // Genel kesme alımı açılıyor
}
}