ccs c ile pic programlama etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

PIC PROGRAMLAMA 15--- EPROMLAR


Epromalar bir hafıza elemanıdır.16f877 denetleyicisi içersinde 2 adet eprom hafıza alanı bulunmaktadır.Bunlar;Dahili data eeprom ve Flash program eeprom hafıza alanıdır.Epromlar elektrik kesildiginde hafızasındaki beriyi kaybetmezler.Ancak bu veri programla okunur,yazılır veya silinebilir.Dahili epromlara 8 bit veri yazılır ve okunur.16f877 denetleyicisine 256byte hafızaya sahiptir.Yani 256 tane 8 bit veri saklanabilir.


1)#int_eeprom


Epromlarda yazma işlemi bitince istenirse kesmeye gidilebilir.

2)read_eeprom()


Bu fonksiyon ile eprom adresindeki veriyi okuruz.
Degişken ismi=read_eeprom(adres) şeklindedir.Adres kısmı eeprom hafıza kapasitesine göre 8 bit veya 16 bit olarak degişir.

veri=read_eeprom(42)//42 nolu adres okunur ve veri degişkenine atılır

3)write_eeprom()

Bu fonksiyon ile eprom adresine yazı yazarız.
Degişken ismi=write_eeprom(adres,bilgi) şeklindedir.Adres kısmı 8 yada 16 bit olabilir.Bilgi kısmı 8 bitlik bir tamsayıdır.

write_eeprom(42,veri)//veri degerini 42. adrese yaz

#FUSE CPD=data eeprom korumasını aktif yapar
#FUSE NOCPD=data eeprom korumasını kapatır
#FUSE NOPROTECT=kod hafıza korumasını pasif yapar
#FUSE PROTECT=kod hafıza korumasını aktif yapar
#FUSE WRT=hafıza yazmaya karşı korumalı
#FUSE NOWRT=hafıza yazmaya karşı korumasız



Gelelim uygulamamıza :




#use delay(clock=4000000)
#define use_portd_lcd true
#include <lcd.c>
long int oku,tl5,tl10,tl15,tl20,tl25,toplam;
void main()
{
set_tris_a(0xff);//a portu tamamen giriş
set_tris_d(0*00);//d portu tamamen çıkış
lcd_init();//lcd hazırlanıyor
while(true)
{
oku=read_eeprom(5);//5 nolu adresten veri okunuyor
if(oku==255)//epromlar üzerinde oynama yapılmadıgından dolayı en fazla 255 kadar saymaktadır
{
write_eeprom(0,0);//0 adresi degeri 0 yapılır
write_eeprom(1,0);//1 adres degeri 0 yapılır
write_eeprom(2,0);
write_eeprom(3,0);
write_eeprom(4,0);
write_eeprom(5,0);
}
lcd_gotoxy(2,1);//lcd imleci 2.sütün 1.satıra gider
printf(lcd_putc,"TOPLAM MIKTAR");//toplam tutar ekrana yazdırılıyor
tl5=read_eeprom(0);//tl5 degişkenine eprom 0 adresindeki veri aktarılır
tl10=read_eeprom(1);//tl10 degişkenine eprom 1 adresindeki veri aktarılır
tl15=read_eeprom(2);
tl20=read_eeprom(3);
tl25=read_eeprom(4);
toplam=tl5*5+tl10*10+tl15*15+tl20*20+tl25*25;//toplam degişkenine para tutarları aktarılıyor
lcd_gotoxy(6,2);//imleç 6.sütün 2. satıra gider
printf(lcd_putc,"%ld TL",toplam);//toplam degeri ekrana yazdırılır
if(input(pin_a0)==1)//pin_a1 aktif mi ?
{
while(input(pin_a0));//butondan el çekinceye kadar bekle
lcd_init();//lcd hazıla 
tl5++;//tl5 degerini arttır
write_eeprom(0,tl5);//0. adresi tl5 degerini ata
}
else if(input(pin_a0)==1)
{
while(input(pin_a0));
lcd_init();
tl5++;
write_eeprom(0,tl5);
else if(input(pin_a1)==1)
{
while(input(pin_a1));
lcd_init();
tl10++;
write_eeprom(1,tl10);
}
else if(input(pin_a2)==1)
{
while(input(pin_a2));
lcd_init();
tl15++;
write_eeprom(2,tl15);
}
else if(input(pin_a3)==1)
{
while(input(pin_a3));
lcd_init();
tl20++;
write_eeprom(3,tl20);
}
else if(input(pin_a4)==1)
{
while(input(pin_a4));
lcd_init();
tl25++;
write_eeprom(4,tl25);
}
}
}


PİC PROGRAMLAMA -14

Dogada bulunan tüm sistemler analog düzendedir.Bizim kullanıdıgımız entegreler ise dijital düzendedir.Bu analog sistemlerden(ışık,ses,sıcaklık...) veri almak için bunları dijitale dönüştürmek gerekir.Bu işlem için ADC entegreleri kullanılır.Pic 16f877 de adc modulü bulunmaktadır.Şekilde gösterilmiştir.



.n bitlik bir adc en fazla 2^n kadar analog veri örnekleyebilir.Bu örnekleme sayısı adc'nin çözünürlügü olur.Çözünürlük ne kadar yüksekse o kadar iyi bir dönüştürme olur.Adc nin dijital büyüklüge dönüştürülecegi en küçük birime ise adım büyüklügü denir.
Adım büyükügü=(Vref(+)-Vref(-))/(2^n) ile hesaplanır.

ADC KOMUTLARI:

-Setup_adc()=Bu komut ile adc kapatılır,açılır veya frekans degeri belirlernir.
-Setup_adc_ports(x)=Bu komut ile analog giriş komutlarına karar verir.Bu komut  yani x degişkeni kullanılan denetleyiciye göre degişir.
-Set_adc_channel(x)=Bu komut ile okuma yapacagımız kanal seçilir.X degişkeni yerine şunlar yazılır;
0=RA0,1=RA1,2=RA2,3=RA3,4=RA5,5=RE0,6=RE1,7=RE2
örnegin;set_adc_channel(0) gibi
-read_adc()=Bu komut ile analog veri okuması yapılır.Bu komuttan önce üstteki komutlar kesinlikle tanımlanmalıdır.
örnegin; setup_adc(adc_clock_div_32)//adc frekansı osiloskop frekansı/32 degerindedir
                setup_adc_ports(all_analog)//tüm portlar analog giriştedir.
              set_adc_channel(0)//RA0 pininden okuma yapılacak
                veri=read_adc()//RA0 pininde okunan analog sinyal okunur
Not=read_adc(adc_start_and_read) komutu ile read_adc() komutu aynı görevi görür.
Gelelim uygulamamıza;
#use delay(clock=4000000)//pic frekans degeri
#define use_portd_lcd true//lcd'mizin d portuna baglı
#include <lcd.c>//lcd kütüphanesi
long int veri=0;
float sayi;
void main()
{
   set_tris_b(0*00);
   output_b(0*00);
   setup_adc_ports(AN0);//RA0 pini analog giriş yapılacak pin
   setup_adc(adc_clock_div_32);//F_adc=F_pic/32
   set_adc_channel(0);//RA0 pininden okuma yapılacak
   delay_us(20);//Kanal seçiminden sonra muhakkak konmalıdır.
   lcd_init();//lcd hazırlanıyor
   printf(lcd_putc,"\fPOTANSIYOMETRE\nUYGULAMASI");//ekrana yazdırılıyor
   delay_ms(1000);//1 saniye bekleniyor
     while(true)
   {
   veri=read_adc(adc_start_And_read);//kanal 0 daki deger okunur ve veri degişkeninin içine atılır.
   if(veri>240)output_b(0b11111111);//veri degeri 240 tan büyükse B portunun hepsini yak
   else if(veri>210)output_b(0b01111111);//veri degeri 210 dan büyükse B portunun sadece RB7 yanmasın
   else if(veri>180)output_b(0b00111111);//veri degeri 180 den büyükse B portunda RB7 ve RB6 yanmasın
   else if(veri>150)output_b(0b00011111);//RB7,RB6,RB5 yanmasın
   else if(veri>120)output_b(0b00001111);// RB7,RB6,RB5,RB4 yanmasın
   else if(veri>90)output_b(0b00000111); //RB7,RB6,RB5,RB4,RB3 yanmasın
   else if(veri>60)output_b(0b00000011); //RB7,RB6,RB5,RB4,RB3,RB2 yanmasın
   else if(veri>30)output_b(0b00000001); //RB7,RB6,RB5,RB4,RB3,RB2,RB1 yanmasın
   else if(veri>0)output_b(0b00000000);// RB7,RB6,RB5,RB4,RB3,RB2,RB1,RB0 yanmasın
   sayi=veri*0.01953;//veri degerimizin dijital ortamdaki karşılıgını bulduk.Bunu yaparken şu yolu izledik.8 bit üzerinde işlem yaptıgım için; (5-0)/(2^8)=0.01953   .sonra veri degişkeni ile de bu ifadeyi çarptım
   printf(lcd_putc,"\fVoltaj=%f V",sayi);//ekrana yazdırdım
   delay_ms(1000);  //1 sn bekledim
   }
   setup_psp(PSP_DISABLED);//psp devre dışı
   setup_spi(SPI_SS_DISABLED);//spı devre dışı
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);//timer0 devre dışı
   setup_timer_1(T1_DISABLED);//timer1 devre dışı
   setup_timer_2(T2_DISABLED,0,1);//timer2 devre dışı
}


PIC PROGRAMLAMA 13
Merhaba arkadaşlar.Bugün grafik lcd uygulamamızı yapacagız.Öncelikle biraz grafik lcd lerden bahsedelim.Grafik lcd ler lcd're ait bütün özelliklere sahiptir.Ayrıca resim çiziminide gösterebilir.Bu lcdler piyasada genellikle KS0108 entegreleri ile uyumlu olarak bulunur. Aşşagıdaki tabloda KS0108 entegreli HDM64GS12 grafik lcd pin açıklamaları mevcuttur.

CCS C GRAFİK LCD KÜTÜPHANE DOSYALARI
GLDC.c dosyası;
HDM64GS12 grafik lcd ile ilgili komutlardır.128*64 lcd ile uyumludur.
HDM64GS12.c dosyası;
KS0108 lcd kontrolüne sahip HDM64GS12 grafik lcd ile ilgili komutları içerir.128*64 lcd ile uyumludr.
GRAPHICS.c dosyası;


Lcd ekranımıza çizgi,daire,dikdörtgen vb şekiller çizmemize yarayan kütüphanedir.


KS0108.c dosyası;KS0108 lcd kontrolcüsü komutlarını içerir
GLDC.c dosyası komutları;

-glcd_init(mode)=lcd ekranımızı hazırlamamızı ve silmemizi saglar.Mode kısmına 'on'(lcd aç işelvini görür) ve 'of'(lcd kapa işlevinin görür) komutları yazılır.

-glcd_pixel(x,y,color)=x,y kordinatlarını pasif etmeye yarar.Color kısmına 'on'(siyah) ve 'of'(beyaz) komutları yazılır

-glcd_line(x1,y1,x2,y2,color)=x1,y1 ile x2,y2 arasında çizgi çizer.Color ilede çizgi rengi belirlenir

-glcd_rect(x1,y1,x2,y2,fill,color)=x1,y1 ile x2,y2 arasında dörtgen çizer.Fill komutu "yes" ise içi boyalı,"no" ise boyasız.Color ilede çubuk rengi belirlenır.

-glcd_bar(x1,y1,x2,y2,width,color)=x1,y1 ile x2,y2 arsında bar(çizgi) çizer.Width komutu ile bar kalınlıgı belirlenir.Color ile de çizgi rengi belirlenir.

-glcd_circle(x,y,radius,fill,color)=x,y kordinatlarında çember çizer.Radius ise çemberin yarıçapını belirtir.Fill ile çemberin içinin boyalı olup olmaması durumu kontrol edilir.Color ile de çizgi rengi belirlenir.

-glcd_text57(x,y,textptr,size,color)=x,y kordinatlarına ,textptr yerine girilen yazıyı yazar.Size yazının genişligindedir.5 piksel genişliginde ve 7 piksel yüksekligindedir.


Şekildeki gibi devremizi oluşturup kod kısmına geçiş yapalım;

#include<HDM64GS12.c>//HDM64GS12.c kütüphanemiz
#include<graphics.c>//graphics.c ile şekil çizmemize yara
char yazi1[]="Eren";
char yazi2[]="UZBAY";
int i,x1,y1,x2,y2;
void main()
{setup_psp(psp_disabled);
setup_timer_1(t1_disabled);
setup_timer_2(t2_disabled,0,1);
setup_adc_ports(no_analogs);
setup_adc(adc_off);
setup_ccp1(ccp_off);
setup_ccp2(ccp_off);
glcd_init(on);//lcd ekranımızı hazırladık ve sildik
while(TRUE)
{glcd_init(on);//lcd ekranımızı sildik
glcd_text57(40,15,yazi1,2,on);
glcd_text57(5,30,yazi2,3,on);
delay_ms(2000);
glcd_init(ON);
for(i=0;i<=25;i=i+5)
{glcd_circle(50,25,i,no,on);
delay_ms(1000);
}
glcd_init(on);
x1=5;y1=5;x2=120;y2=60;
for(i=0;i<6;i++)
{glcd_rect(x1,y1,x2,y2,no,on);
y1=x1+=5;
x2-=10;
y2-=5;
delay_ms(1000);
}

}

}
ELEKTRO BLOGGER A HOŞGELDINIZ

ARAMA YAP

EN COK OKUNANLAR

- Copyright © ELEKTRO-BLOGGER Blogger