CCS C LM35 7Segment Display

ercanatnr

Üye
Katılım
19 Ara 2010
Mesajlar
290
Puanları
1
Merhaba,
PIC 16f88 ve LM35 ile sıcaklık ölçmek ve ölçtüğüm bu sıcaklığı 7 Segment Display de göstermek istiyorum. Aşağıdaki gibi kodlar yazdım ancak CCS C programı derlemiyor 2 tane hata veriyor ilk hata setup_adc_ports(AN0); satırındaki AN0 ı gösteriyor. Diğer hata birler basamğını bulmak için yaptığım kalanlı bölme işleminde yardımlarınızı bekliyorum.
Kod:
#include <16F88.h>
#device ADC=10

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES NOMCLR                   //Master Clear pin used for I/O
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O

#use delay(internal=4000000)

#use fast_io(a)
#use fast_io(b)

#define display_1 pin_a3
#define display_2 pin_a4

const int digit[10]={192,249,164,176,153,146,130,248,128,144}; //Anot Display
//                  [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ]

int16 dijital;
float voltaj,sicaklik;
char birler,onlar;

void main()
{
set_tris_a(0x01);
set_tris_b(0x00);
output_a(0x00);
output_b(0x00);

setup_adc(adc_clock_div_32);

setup_adc_ports(AN0);                   //İlk hata burada

set_adc_channel(0);
delay_us(20);

output_low(display_1);
output_low(display_2);
  
   while(TRUE)
   {        
       
    
         dijital=read_adc;
    
         voltaj=(0.0048828125*dijital)*1000;
    
         sicaklik=(voltaj/10)+2;
    
         birler=sicaklik%10;                        //ikinci hata burada
    
         onlar=sicaklik/10;
    
         output_high(display_2);  // 2. display aktif durumda
         output_b(digit[birler]); // displaye bilgi gönderiliyor
         delay_ms(5);             // gecikme veriliyor
         output_low(display_2);   // 2. display pasif durumda
         output_high(display_1);  // 1. display aktif durumda
         output_b(digit[onlar]);  // displaye bilgi gönderiliyor
         delay_ms(5);             // gecikme veriliyor
         output_low(display_1);   // 1. display pasif durumda
       
   }

}
 
16f88.h dosyasını açıp adc kısmında An0 tanımlı mı bak. ALL_ANALOG Diye ara hemen altında filandır. AN0 yerine Başka birşey kullanılmış olabilir

sAN0 oluyo bazen
 
Dijital değişkenini unsigned long int olarak tanimlayip dene. Birde osilator seçimini yap
 
Voltaj ve sicaklığı unsigned int16 yap

Voltaj =4.888 * dijital olsun
 
Şu şekilde hata almıyorum ama doğru bir işlem mi bilmiyorum. Bu şekilde derleyip ISIS te simule ettiğimde PIC ne tarama yapıyor nede displaye bilgi gönderiyor.
Kod:
#include <16F88.h>
#device ADC=10

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES NOMCLR                   //Master Clear pin used for I/O
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O

#use delay(internal=4000000)

#use fast_io(a)
#use fast_io(b)

#define display_1 pin_a3
#define display_2 pin_a4

const int digit[10]={192,249,164,176,153,146,130,248,128,144}; //Anot Display
//                  [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ]

unsigned long int dijital;
float voltaj,sicaklik;
char birler,onlar;

void main()
{
set_tris_a(0x01);
set_tris_b(0x00);
output_b(0x00);

setup_adc(adc_clock_div_32);
setup_adc_ports(sAN0);

set_adc_channel(0);
delay_us(20);

output_low(display_1);
output_low(display_2);

   while(TRUE)
   {      
          dijital= read_adc();
    
          voltaj=(0.0048828125*dijital)*1000;
   
    
         sicaklik=(voltaj/10)+2;
    
  
         birler=(int)sicaklik%10;
  
         onlar=(int)sicaklik/10;
  
         output_high(display_2);  // 2. display aktif durumda
         output_b(digit[birler]); // displaye bilgi gönderiliyor
         delay_ms(5);             // gecikme veriliyor
         output_low(display_2);   // 2. display pasif durumda
         output_high(display_1);  // 1. display aktif durumda
         output_b(digit[onlar]);  // displaye bilgi gönderiliyor
         delay_ms(5);             // gecikme veriliyor
         output_low(display_1);   // 1. display pasif durumda
     
   }

}
 

Ekli dosyalar

  • CCS C.rar
    777 bayt · Görüntüleme: 32
  • ISIS Devresi.rar
    13 KB · Görüntüleme: 39
Fast_io satırlarını sil

Bu kadar basitmiydi Peki bu kod ne işe yarıyor bazı uygulamalarda kullanılıyor bazılarında kullanılmıyor. Bu kodun amacı nedir. Birde Sıcaklık ölçümünde sıcaklık değerine +2 ekleme nedenimiz nedir. Isıste LM35 in gösterdiği değerin 2 fazlasını gösteriyor.
 
Fast_io bazen sorun çıkarıyor. Compiler hatası. Kullanmamakta fayda var. 2 fazla çıkıyorsa hesaplarda çarparken gelen küsürat hatası. Sonuçtan 2 çıkarırsın ya da katsayılara ince ayar yaparsın. Zaten gerçek uygulamada toleranslardan dolayı illa bu ayar gerekecek
 
Bu siteyi kullanmak için çerezler gereklidir. Siteyi kullanmaya devam etmek için onları kabul etmelisiniz. Daha fazla bilgi edin…