18f452 ve LCD komedisi?

Başlatan axanc, 14 Haziran 2004, 16:42:39

axanc

CCS ile basit bir lcd programı yazıyorum ama nedendir bilmiyorum, LCD'nin ikinci karakteri (ekranı temizleme komutu kullanmaz isem birinci karakteri) simulasyonda cıkmıyor...
böyle bir sorunla karşılaşan oldu mu hiç? proteus'u (6.2 sp5) tekrar yükledim, elimdeki CCS'i (ccs 3.190) tekrar yükledim, sorun çözülmedi, pic18 kütüphanesini de yeniledim...  :?:

#if defined(__PCM__)
#include <16F877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)

#elif defined(__PCH__)
#include <18F452.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#endif

#include <lcd.c>


void main() {

   lcd_init();
   lcd_putc("\fmerhaba");

}
Uzmanlık: Bilgisayar Müh. öğrenci Derleyici: PicBasic Pro Compiler Ver. 2.45 Program: Proteus 6.2.5 ve MCSP

ise

rw ayağı bağlı değilse mesgul gecikmesi tam olmadığından zaman yetmediği için ilk harfi almıyordur ama sonraki harfleri yazar

ahmetu

adamlar kodu 4 mhz için dizayn etmişler aşağıdaki fonksiyonları değiştirirsen sorunun biter, bu fonksiyonlar 20 mhz'de bile çalışıyor.

void lcd_send_nibble(BYTE n) {
      lcd.data = n;
      delay_us(150);
      lcd.enable = 1;
      delay_us(5);
      lcd.enable = 0;
}

void lcd_send_byte(BYTE address, BYTE n) {
      lcd.rs = 0;
      delay_us(200);
      lcd.rs = address;
      delay_us(150);
      lcd.enable = 0;
      lcd_send_nibble(n >> 4);
      lcd_send_nibble(n & 0xf);
}

void lcd_init() {
    BYTE i;
    set_tris_lcd(LCD_WRITE);
    lcd.rs = 0;
    delay_cycles(1);
    lcd.enable = 0;
    delay_ms(15);
    for(i=1;i<=3;++i)
      {
       lcd_send_nibble(3);
       delay_ms(5);
      }
    lcd_send_nibble(2);
    for(i=0;i<=3;++i)
       lcd_send_byte(0,LCD_INIT_STRING[i]);
}

axanc

tamamdır ahmetu, teşekkürler...

yanlız "lcd_init" fonksiyonunu değiştirince sorun oluştu, lcd'de yazı hiç çımadı; o yüzden sadece bu değişiklikleri yaptım...
void lcd_send_nibble(BYTE n) { 
      lcd.data = n; 
      delay_us(150); 
      lcd.enable = 1; 
      delay_us(5); 
      lcd.enable = 0; 
} 

void lcd_send_byte(BYTE address, BYTE n) { 
      lcd.rs = 0; 
      delay_us(200); 
      lcd.rs = address; 
      delay_us(150); 
      lcd.enable = 0; 
      lcd_send_nibble(n >> 4); 
      lcd_send_nibble(n & 0xf); 
}


kullanacak arkadaşlara duyrulur...
Uzmanlık: Bilgisayar Müh. öğrenci Derleyici: PicBasic Pro Compiler Ver. 2.45 Program: Proteus 6.2.5 ve MCSP

ahmetu

hıms onun sebebide orjinal library rw bacağını kullanıyordu ben lcd'i okuma gereği duymadığım için bu bacağı gnd ile birleştirdim dolayısıyla koddan çıkarmışım (bayadır karakter lcd kullanmadım uyarmayı unutmuşum kusura bakma) bir bit bir bittir :lol:  kolay gelsin.

axanc

walla iyi yapmışsın, biz de biras gelişince GraphicLCD'e geçeriz artık.. :)
Uzmanlık: Bilgisayar Müh. öğrenci Derleyici: PicBasic Pro Compiler Ver. 2.45 Program: Proteus 6.2.5 ve MCSP

aydin

arkadaslar ccs c ile yaptigim bir uygulamada 4x20 lcd kullaniyorum. Bunu proteusta simule etmeye calistigimda sadece 1. satir gorunuyor diger satirlar gorunmuyor. Standart lcd surucu kutuphaneyi kullaniyorum. bu acaba koddaki bir eksikliktenmi yoksa proteustaki bir problemdenmidir. tesekkırler.proteus 6.2 sp5

axanc

"include" ettiğin dosyaların içinde birinci, ikinci, üçüncü ve dördüncü satırın felan nerede başlayıp bittiğinin yazılı olduğu bir yer olması gerekli.. işte bu verilerin proteus'taki 4 satırlık lcd'nin özellikleri bölümünde yazan bilgilerle uyuşması gerekir... bu şekilde proteus'takini değiştirirsen olur gibime geliyor.. ama gerçek değerlerin, yani almış olacağın lcd'nin değerleri ile aynı olmalıdır, onu da o lcd'nin "data sheet"inden öğrenebilirsin... biraz karışık oldu umarım anlatabilmişimdir...
Uzmanlık: Bilgisayar Müh. öğrenci Derleyici: PicBasic Pro Compiler Ver. 2.45 Program: Proteus 6.2.5 ve MCSP

rr

CCS den 2 gun Uğraştım 16f84 den A harfi bile alamadım. Gerçi c de bilmiyorum. Denedeim Örnek aşağıda nerede hata yapıyorum. Lcd 16 karekter kullanıyorum. Proteus sim.kullanıyorum. Lcd Port B ye bağlı
B7 D7, B6 D6,  B5 D5,  B4 D4,     B2 Rw,  B1 Rs, B0 REn

C Codları Aşağıda.
#include "E:\Belgelerim\Projeler\LcRF_Metre\CcS Calism\LCd16f84.h"
#include <LCD.C>
#include <float.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 

void main()
{

  setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
  lcd_init();
  lcd_putc("\merhaba");


}
Similasyonda hiç Yazı Çıkmıyor.

DumrulBey

Merhaba,

Başlarda bir yerde veya #include <LCD.C> satırından önce LCD'nin PORTB'de olduğunu derleyiciye haber vermen gerekir. Bunun için ise #define use_portb_lcd TRUE satırını dediğim yere koymalısın. Eğer 18F ailesi ile benzetim (simulation) yapacaksan bu sefer #fuses HS,WDT128,NOPROTECT,NOLVP satırını yerleştir. Burada önemli olan WDT'nin açılmış olması. Ben de denedim bu olmayınca hiç çalışmıyor. Ama dediklerimi yaparsan muhtemelen sorunları aşacaksın. Son söz: C güzeldir!

Başarılar...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)

rr

Söylediklerini aynen yaptım. isis 6-2-5 de çalışmadı yeni sürümünde çalıştı.isis 6-5-sp5 de çalıştı lcd yazı geldi. Denemem pic628 üzerinde Değişkeni glabal olarak tanımladığımda yine lcd yazı kayboldu.

//#include "E:\Belgelerim\Projeler\LcRF_Metre\CcS Calism\Lcd16f628.h"
#include <16F628A.h>
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_A2,rcv=PIN_A3)
#fuses NOWDT,HS, NOPUT, NOPROTECT, NOBROWNOUT, NOMCLR, NOLVP, NOCPD
#define use_portb_lcd TRUE
#include <LCD.C>
#include <Math.H>
#include <stdlib.h>
#int_RTCC

static int32 ff; //Bunu Yazdığım anda LCD hİÇBİRŞEY GELMİYOR.???

RTCC_isr()
{
ff=ff+1;

}

#int_TIMER1
TIMER1_isr()
{

}



void main()
{

  int32 xx;
  float a,b,c;
  //int8 x,y,z;

  setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
  setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1);
  setup_timer_2(T2_DISABLED,0,1);
  setup_comparator(NC_NC_NC_NC);
  setup_vref(FALSE);
  lcd_init();
  enable_interrupts(INT_RTCC);
  enable_interrupts(INT_TIMER1);
  enable_interrupts(GLOBAL);

  ff=111;
 //dg = MAKE8(ms,1); //Digit al
  //a=2344;
  //b=232;
  //c=a/b;
  //printf(lcd_putc,"%f",c); //%lu işaretsiz sayı için %ld işaretli sayı için Çalisti

  xx=343;
  printf(lcd_putc,"%lu",ff); //%lu işaretsiz sayı için %ld işaretli sayı için




}

DumrulBey

Hmm...

Vallahi ben C'de mikrodenetleyiciler için program yazmaya yeni başladım. Benden daha çok tecrübeli arkadaşlar var. Belki bu duruma net bir cevap verebilirler. Ben veremiyorum çünkü benim için her şey şu an teorik. Henüz C'de bir program yazıp LCD'de denemedim bile.

Yahu nedir bu CCS'de LCD sorunları? Acaba gerçek deneylerde de aynı sonucumu elde ediyoruz? Yoksa bu ISIS'den kaynaklanan bir sorun mu? Belki kendi LCD kütüphanemizi yazmalıyız. Ben hala 7 bitlik orijinal kütüphaneyi kullanıyorum. Bakalım uygulamalarda ne olacak!

Sevgiler, saygılar...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)

arif

Merhaba
Kodu denedim bu şekilde çalışıyor. Bir iki hata vardı incelersin.
Kolay gelsin.
#include <16F628a.h>
#use delay(clock=20000000)
#fuses xt, NOPUT,NOWDT, NOPROTECT, NOBROWNOUT, NOMCLR, NOLVP, NOCPD
#use rs232(baud=9600, xmit=PIN_A2,rcv=PIN_A3)

#include <LCD.C>
#include <Math.H>
#include <stdlib.h>


int32 ff; //Bunu Yazdığım anda LCD hİÇBİRŞEY GELMİYOR.???


#int_RTCC
RTCC_isr()
{
   
   ff=ff+1;
}

#int_TIMER1
TIMER1_isr()
{

}



void main()
{
   int32 xx;
   float a,b,c;
   //int8 x,y,z;

   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
   setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   lcd_init();
   enable_interrupts(INT_RTCC);
   enable_interrupts(INT_TIMER1);
   enable_interrupts(GLOBAL);

   ff=111;
   //dg = MAKE8(ms,1); //Digit al
   //a=2344;
   //b=232;
   //c=a/b;
   //printf(lcd_putc,"%f",c); //%lu işaretsiz sayı için %ld işaretli sayı için Çalisti

   xx=343;
   while(1)
   {
      
      

      printf(lcd_putc,"\fTest%lu",ff); //%lu işaretsiz sayı için %ld işaretli sayı için
      delay_ms(500);
   }


}

DumrulBey

Alıntı yapılan: "DumrulBey"Yahu nedir bu CCS'de LCD sorunları? Acaba gerçek deneylerde de aynı sonucumu elde ediyoruz? Yoksa bu ISIS'den kaynaklanan bir sorun mu? Belki kendi LCD kütüphanemizi yazmalıyız. Ben hala 7 bitlik orijinal kütüphaneyi kullanıyorum. Bakalım uygulamalarda ne olacak!
Dün, boş bir vaktimde, hiç üşenmedim, dahili osilator ile 16F628 kullanarak paralel LCD çalıştırmayı denedim. Sonuç ekranda kareler haricinde hiç bir şeydi...:)

Bir soketi, 4 bitlik (RB4-RB7) veri yolu denk gelecek şekilde LCD modüle lehimledim. Beşli dizi kablo ile diğer (E, RS, RW, VDD ve GND) bağlantıları da yaptım. PortB'nin boşta kalan 4. ucuna ise bir LED bağladım.

Önce LED'i bir saniye aralıklarla yanıp söndürdüm. Sonra LCD tanıtımı ve ekran basit bir yazı göndermeyi denedim. Ne LED yanıp sönüyordu ne de LCD'de bir hareket vardı.

VCC'yi üzerinde 561 (560 ohm) yazan bir SMD direnç ile GND'ye verdim. Nokta tonu gayet iyidi. Aynı bağlantının ISIS'de benzetimini (simulation) yapmayı ihmal etmedim. Sonuç mu? Aynıydı!

Acaba CCS PIC C'yi bırakmalı mıyım? Yoksa bir yerde hata yapıyor olabilir miyim?

Dip Not: Sadık yardımcımız saatli köpeğimizi (WDT: Watch Dog Timer) kurmayı denedim ama sonuç aynıydı! Halbuki 18F ailesinde işe yarıyordu.

Sevgiler, saygılar...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)

arif

Merhabalar,
DumrulBey Hocam
Yazdığınız programı gönderebilirmisiniz? Hangi versiyonu kullanıyorsunuz onuda yazın lütfen...
Kolay gelsin