18F2550 VE LCD

Başlatan pax, 16 Mart 2012, 18:43:36

pax

18F2550 'ye bir LCD bağlayıp Analog girişten gelen bilgiyi ekrana yazdırmak istiyorum. ekrana herhangi bir mesaj yazdığım zaman , örneğin "merhaba" ,yazdırabiliyorum herhangi bir sorun çıkmıyor. sorun herhangi bir tam sayı değişkenin içeriğini yazdıramıyorum. Yani Analog girişten aldığım değeri ekrana yazdıramıyorum. Forum içersinde bir araştırma yaptım ve çeşitli lcd dosyalarını denedim ancak başarılı olamadım.

#use delay(clock=48000000)
#include <flex_lcd.c>

unsigned int16 i;
int kanal ;
void main()
{

    setup_adc_ports(AN0|VSS_VDD);
   setup_adc(ADC_CLOCK_INTERNAL);
   setup_spi(SPI_SS_DISABLED);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
//Setup_Oscillator parameter not selected from Intr Oscillotar Config tab
lcd_init();
   // TODO: USER CODE!!
printf(lcd_putc,"MERHABA");



delay_ms(1000);
   kanal=0;
while(1)
{
set_adc_channel(kanal);
   delay_us(20);
   i= read_adc();
   printf(lcd_putc,"\fanalog=%d",i);
   delay_ms(500);
}
}


bu programı yazdım .Ekrana önce "MERHABA" yazısı geliyor . daha sonra "analog=105" yazıyor. analog girişi bir potonsiyometre ile ayarlıyorum. fakat değişen birşey olmuyor. lcd yerine motor sürücüsü kullanıp potansiyometre ile hız kontrolünü yapabildim. ancak dediğim gibi girişteki analog değeri ekrana yazdıramadım. yardımcı olursanız sevinirim.

skara1214

unsigned int16  %d olarak  değil %lu olarak tanımlanır
Herkes ölür ama herkes gerçekten yaşamaz

pax

teşekkür ederim gözden kaçmış :) şimdi oldu ben %ld olarak yaptım .

birşey daha sormak istiyorum farklı konu açmak istemedim pic 18f2550 için timer kesmeleri hakkında nerden bilgi edinebilirim. bu konuda pek bilgi bulamadım özellikle ccs c ile ilgili bilgi veya örnek arıyorum. örneğin 3 ms'de bir bir işlem yaptırmak istiyorum. bunu nasıl yapabilirim.

skara1214

serdar çiçeğin kitabını al ccs ile alakalı en güzel türkçe kaynaktır.3 ms de bir bir timer interruptı oluşturup işlem yapabilirsin
Herkes ölür ama herkes gerçekten yaşamaz

Murat Mert

Alıntı yapılan: skara1214 - 18 Mart 2012, 17:33:47
serdar çiçeğin kitabını al ccs ile alakalı en güzel türkçe kaynaktır.3 ms de bir bir timer interruptı oluşturup işlem yapabilirsin

yeni arkadaşlar için ccs c ye başlamak için olmazssa olmazlardan. Bende o kitap ile ccs c yi öğrenmeye başlamıştım takılınca bakıyorum.
mert07

pax

cevaplarınız için teşekkür ederim arkadaşlar . ben bahsettiğiniz kitabı 2 sene önce almıştım. bugüne kadar da bu kitap sayesinde birçok uygulamayı başarı ile yaptım. benim sıkıntım 18f2550 ile ilgili .  daha önce hiç 18f serisi kullanmadım.  kitaptaki uygulamalrı 18f serisinde başarılı bir şekilde gerçekleştiremedim.

muhittin_kaplan

özellikle 18f2550/4550 ile çalışırken OSC ayarlamalarına Özen gösterin. (PLL den dolayı)

skara1214

bu arada herkese ccs c ve onun kitaplarından örnek veriyorum ama burada  yine söyliyeyim KESİNLİKLE  ccs c ile başlamasınlar benim yorumlarım hep az zamanı kalan yada bu işi hobi olarak yapanlar için.Bu işi gerçekten öğrenmek isteyenler hitech c yada microchipin kendi dilini kullansınlar....
Herkes ölür ama herkes gerçekten yaşamaz

pax

yardımlarınız için teşekkürler, hobi olarak bu işlerle ilgileniyorum o yüzden ccs c daha kolay geldi bana :)  muhittin_kaplan arkadaşımın dediği gibi PLL ayarlarında kaynaklanıyormuş sorun. sorunu çözdüm.

şimdi bir adım daha ileri gittim ve analog girişlerden birine potansiyometre bağlayarak analog girişten gelen bilgiyi 0-1023 arasında lcd den görebiliyorum. ancak gördüğüm değer sabit kalmıyor devamlı değişiyor. örneğin 780-779-778-780 gibi değerler arasında gidip geliyor. bu sorunu nasıl halledebilirim veya bu normalmidir ?

ferit06

Alıntı yapılan: pax - 21 Mart 2012, 11:23:55
yardımlarınız için teşekkürler, hobi olarak bu işlerle ilgileniyorum o yüzden ccs c daha kolay geldi bana :)  muhittin_kaplan arkadaşımın dediği gibi PLL ayarlarında kaynaklanıyormuş sorun. sorunu çözdüm.

şimdi bir adım daha ileri gittim ve analog girişlerden birine potansiyometre bağlayarak analog girişten gelen bilgiyi 0-1023 arasında lcd den görebiliyorum. ancak gördüğüm değer sabit kalmıyor devamlı değişiyor. örneğin 780-779-778-780 gibi değerler arasında gidip geliyor. bu sorunu nasıl halledebilirim veya bu normalmidir ?

Normaldir. 1 bitlik bir hataya karşılık geliyor. Kesin bir değer için,  birden fazla ölçüm yapıp(2 ve üstleri şeklinde) ortalama değeri göstermek, değeri sapmayan (mümkün olduğunca...referansdaki sapma ölçümdeki hataya karşılık gelir) referans kullanmak gerekir.

skara1214

1 bit normaldir 4-5 mV luk bir sapma demektir (devreni boardda kurduğunu varsayıyorum,beslemelerede 0.1 mikro koyduğunu düşünüyorum).
Herkes ölür ama herkes gerçekten yaşamaz

pax

önceleri ADC işleminin basit olduğunu düşünürdüm ama şimdi baya detaylı olmaya başladı. Evet devreyi boardda kurdum ve .1uF lık kondansatörü kullandım. dediğiniz gibi her okuma için 4 örnek aldım ve ortalama değeri buldum. şimdi sonuç daha iyi. ama zaman ilerledikçe, örneğin 2dk sonra,  değerde 1 bitlik değişimler oluyor ve değer düşüyor.işin işine girince bilmediğimi fark ettiğim birçok şey çıkıyor.
  Anlamaya çalıştığım diğer bir konu da "setup_adc(ADC_CLOCK_DIV_16)" buradaki DIV değerinin ne olacağı 18f2550 nin datasheetine bakınca orada 20Mhz için 16 değeri verilmiş. ben 20 MHZ XTAL kullanıyorum ancak programda 48 Mhz olarak belirtiyorum. data sheet teki değerler için ben 48 Mhz i mi referans almalıyım 20 Mhz imi ?
diğer bir nokta "değeri sapmayan referans" derken neyi kastettiniz. programda mı yoksa donanımda mı olucak bu işlem ? 

muhittin_kaplan

 PLL ayarlarından yaptığınız hesaplamayla CPU hızını dikkate alacaksınız
Eger PLL kullanıp CPU yu 10Mhz de çalıştırıyorsanız. (Taktığınız Kristali demiyorum) 10mhz olarak dikkate alacaksınız.
(20Mhz Kristal Kullanıp PLL ayarıyla İşlemciyi 48Mhz de çalıştırabilirsiniz. İşlemciyi PLL ayarıyla 48 de çalıştırıyorsanız 48Mhz olarak İşlem Yapmanız gerekir)