Hi-Tech'te C18 Kütüphanesi

Başlatan mihri, 29 Temmuz 2009, 17:06:21

kenan_re

İsis Sim. ve reelde denedim olmadı farklı şeylerde yaptım yok. olmuyor acaba zamanlama hatası olabilir mi ?

Mr.Java

Müneccim değilim ki ben :)
Kodu gösterin devreyi gösterin ki yorum getireyim.Yoksa bilemem hata nereden kaynaklanıyor.Lcd_clear fonksyonu editleyin bir bakalım.

Lcd_Clear(void)
{
DelayMs(2);
}
dene bakalım bir.

kenan_re

Tüm kodları koydum buna göre yapıyorum. isis sim. denedim. Sonuç alamadım.

#include <stdio.h>
#include <stdlib.h>
#include "delay.h"
#include <pic18.h>

      #pragma config PLLDIV = 5 ,CPUDIV = 1 ,USBDIV = 2 					// CONFIG1L 
      #pragma config FOSC = HS, FCMEN = OFF, IESO = OFF 					// CONFIG1H         
      #pragma config PWRT = OFF, BOR = OFF, BORV = 3, VREGEN = OFF 			// CONFIG2L   
      #pragma config WDT = OFF, WDTPS = 128 								// CONFIG2H         
      #pragma config CCP2MX = OFF, PBADEN = OFF ,LPT1OSC = ON, MCLRE = ON 	// CONFIG3H  
      #pragma config STVREN = OFF ,LVP = OFF ,ICPRT = OFF ,XINST = OFF		// CONFIG4L


#define	XTAL_FREQ 20000000L

#define	rs RD0				//Pin tanımlamaları
#define	rw RD1
#define e  RD2
#define lcd_port  PORTD
#define uchar unsigned char

void lcd_beklet(void)
{
    DelayUs(500);
}

void Lcd_komut(uchar komut)
{
    rw = 0; // LCD'ye yazma yapılacak
    rs = 0; // LCD'ye komut gönderilecek
    e = 1;
    lcd_port = (komut & 0xF0); // İlk önce yüksek değerlikli bitler gönderiliyor
    e = 0;
    lcd_beklet();
    e = 1; //
    lcd_port = ((komut & 0x0F) << 4); // Düşük değerlikli bitler gönderiliyor
    e = 0;
    lcd_beklet(); // Belirli bir süre bekleniyor
}

void lcd_putch(unsigned char _data)
{
    rw = 0;
    rs = 1;
    e = 1;
    lcd_port = (_data & 0xF0);
    e = 0;
    lcd_beklet();
    e = 1;
    lcd_port = ((_data & 0x0F) << 4);
    e = 0;
    lcd_beklet();
}

void lcd_clear(uchar i)
{

    Lcd_komut(0x01);
    for (i = 0; i < 4; i++)
    {
        lcd_beklet();
        if (i == 3)break;
    }
}

void lcd_yaz(const char * s)	// LCD'ye string ifade gönderiliyor
{
    lcd_beklet();
    while(*s)
        lcd_putch(*s++);
}
void lcd_state(unsigned char x,unsigned char y)	// LCD'nin konumu
{
    if(x==1)
        lcd_putch(0x80+((y-1)%16));
    else
        lcd_putch(0xC0+((y-1)%16));
}
void lcd_init()		// LCD ilk yükleme ayarları yapılıyor
{
    rs = 0;
    e = 0;
    rw = 0;

    DelayMs(15);
    e=1;
    Lcd_komut(0x02);
    DelayMs(2);

    Lcd_komut(0x40);
    Lcd_komut(0x06);
    Lcd_komut(0x12);
    lcd_beklet();
    Lcd_komut(0x128);
}

void main(void)
{
	TRISA	= 0xff;
	TRISB 	= 0x00;//RB0 kesme için ayarlandığından giriş olarak ayarlandı.
	TRISC	= 0x00;
	TRISD	= 0x00;
	TRISE	= 0x00;
	
	PORTA	= 0x00;
	PORTB	= 0x00;
	PORTC	= 0x00;
	PORTD	= 0x00;
	PORTE	= 0x00;
	
	CCP1CON	= 0x00;
	CCP2CON	= 0x00;
	//////////Genel kesmeler /////////////////
	PEIE	= 0x00; 	// Yardımcı kesme KAPALI (INTCON,6. biti)
	GIE		= 0x00; 	// Genel kesme KAPALI    (INTCON,7. biti)
	//////////////////////////////////////////////////////
	ADCON1  = 0x06; 	//analog pinler dijitale çevrildi
    lcd_init();
    lcd_clear(1);
    lcd_yaz("TEST");
    while(1)
    {
    	PORTB=0XFF;DelayMs(500);
    	PORTB=0X00;DelayMs(500);
    }

}

Kazım

#18
Benim PIC 'in LOWER bitleri ile  Çalışan 2x16 LCD Kütüphanemi paylaşayım seninle belki birşeyler çözümlersin. LCD datasheetleri için Chiplerinin Modeli ile Aram yapıp onu indirmelisin. Buna göre yanlış hatırlamıyorsam 8bitlik data LCD 'ye doğru, önce üst 4 biti sonra alt 4 biti gidecek 4bitlik modda. Bende baya uğraşmıtım. ozaman LOWER bitler için örnek bulamayıp kendim yazmıştım.  Resimi de şunun için ekledim sen PIC 'in Lower yada Upper bitlerini kullansanda,, LCD 'nin 4-7 bitlerini kullanmalısın herhalükarda. Dediğim gibi Önce PIC18 ve LCD chip modelinin datasheetlerini indirip, kendin de halledebilirsin aslında

[IMG]http://img35.imageshack.us/img35/9417/p0t.png[/img]

Lcd_2x16.h    // h dosyası

#define __XTAL_FREQ 8000000
#define __delay_ms(x) _delay((unsigned long)((x)*( __XTAL_FREQ / 4000.0)))
#define __delay_us(x) _delay((unsigned long)((x)*( __XTAL_FREQ / 4000000.0)))


#define RS RC4
#define EN RC5

void enableWr (void);
void displayData(unsigned char data_value);
void CMD (unsigned char cmd_value);
void clearDisplay (void);
void lcdInitialize (void);
void cursorDown (void);
void lcdGotoXY (unsigned char x , unsigned char y);
void displayString(unsigned char *string);
void displayNumberToLCD (unsigned char number);


Lcd_2x16.c

void lcdInitialize (){
    
    unsigned char cmd_value_1;
    unsigned char port_c;
    
    RS=0;
   
    cmd_value_1=0b00110000 >> 4 ;
    PORTC&=0xF0;
    PORTC|=cmd_value_1;
    port_c=PORTC;
    enableWr();
    __delay_ms(10);

    cmd_value_1=0b00110000 >> 4 ;
    PORTC&=0xF0;
    PORTC|=cmd_value_1;
    port_c=PORTC;
    enableWr();
    __delay_us(100);

   cmd_value_1=0b00110000 >> 4 ;
    PORTC&=0xF0;
    PORTC|=cmd_value_1;
    port_c=PORTC;   // burada port_c değişken ,, PORTC ise PICIN Registeridir  - Karıştırma
    enableWr();
    __delay_us(100);

    cmd_value_1=0b00100000 >> 4 ;
    PORTC&=0xF0;
    PORTC|=cmd_value_1;
    port_c=PORTC;
    enableWr();
    __delay_us(100);

    CMD(0b00101000);
   __delay_us(50);
    __delay_us(50);
    CMD(0b00001100);
    __delay_us(50);
    CMD(0b00000001);
    __delay_ms(2);
    CMD(0b00000110);
   __delay_ms(20);
   
}


void enableWr (){
    EN=1;
   __delay_us(1);
    EN=0;
}

void displayData (unsigned char data_value){
    unsigned char bit0;
    unsigned char bit1;
    unsigned char bit2;
    unsigned char bit3;
    unsigned char data_value_1;

    RS=1;
    data_value_1=(data_value>>4);
    PORTC&=0xF0;
    PORTC|=data_value_1;
    enableWr();
    __delay_us(250);

    data_value_1=(data_value & 0xF);
    PORTC&=0xF0;
    
    if (data_value_1 & 0x08)
    {
        bit3=1;
    }
    else
    {
        bit3=0;
    }

    if (data_value_1 & 0x04)
    {
        bit2=1;
    }
    else
    {
        bit2=0;
    }
    if (data_value_1 & 0x02)
    {
        bit1=1;
    }
    else
    {
        bit1=0;
    }
    if (data_value_1 & 0x01)
    {
        bit0=1;
    }
    else
    {
        bit0=0;
    }


    PORTCbits.RC0=bit0;
    PORTCbits.RC1=bit1;
    PORTCbits.RC2=bit2;
    PORTCbits.RC3=bit3;
    enableWr();
    __delay_us(250);
}

void displayString(unsigned char *string){
    __delay_ms(10);
    while (*string){
        displayData(*string);
        string++;
    }
}

void displayNumberToLCD (unsigned char number){
    unsigned char d1,d2,d3;
    unsigned char temp=number%100;
    d1=(number/100)+48;
    displayData(d1);
    d2=(temp/10)+48;
    displayData(d2);
    d3=(temp%10)+48;
    displayData(d3);
}


void CMD (unsigned char cmd_value){

    unsigned char bit0;
    unsigned char bit1;
    unsigned char bit2;
    unsigned char bit3;
    unsigned char cmd_value_1;


    RS=0;
    cmd_value_1=(cmd_value>>4);
    PORTC&=0xF0;
    PORTC|=cmd_value_1;
    enableWr();
    __delay_us(250);

    cmd_value_1=(cmd_value & 0xF);
    PORTC&=0xF0;

    if (BitTest(cmd_value_1,3))
    {
        bit3=1;
    }
    else
    {
        bit3=0;
    }

    if (BitTest(cmd_value_1,2))
    {
        bit2=1;
    }
    else
    {
        bit2=0;
    }
    if (BitTest(cmd_value_1,1))
    {
        bit1=1;
    }
    else
    {
        bit1=0;
    }
    if (BitTest(cmd_value_1,0))
    {
        bit0=1;
    }
    else
    {
        bit0=0;
    }

    PORTCbits.RC0=bit0;
    PORTCbits.RC1=bit1;
    PORTCbits.RC2=bit2;
    PORTCbits.RC3=bit3;
    enableWr();
    __delay_us(250);
 }

void clearDisplay (void){
    CMD(0x01);
     __delay_ms(10);
}

void cursorDown (void){
    CMD(192);
     __delay_ms(2);
}

void lcdGotoXY (unsigned char x , unsigned char y){
   if (x==1){
        CMD(0x80+((y-1)%16));
    }
    else{
        CMD(0xC0+((y-1)%16));
    }
}


Burada bir mesele var tabi. Kodlara bakınca bazısını belki anlayacak, bazısını anlamayacaksın.Bunun nedeni datasheette verilen talimatları okumamış olmandır( okumadı isen ). Yani kütüphane kullanıyorsan , kodları çözümlemeye değil sadece çalıştırabilmeye uğraş. Aksi boşa çaba olur diye düşünüyorum..

Mr.Java

Bakalım beraber..

En başta osilatör frekansınızı 48mhz için kaldırın 20mhz osilatörü işlemcinize bağlayın.Frekansınızı 20mhz olarak delay kütüphanenizde belirttiğim yerde değiştiriniz.LCD clear fonksyonunda ise tüm parametreleri silin ve DelayMs(2); diyip fonksyonunuzu oluşturun.Yani ;

void LCD_Clear (void)
{
  DelayMs(2);
 }


Sonra ise lcd'ye birşeyler yazdırın ilk etapta.Direk veri yazdırmaya çalışmayın.Önce string karakterler yazdırın.Veriyi direk yazdırmayın çünkü lcd ascıı olarak ayarlandı.

kenan_re

Sorunun ne olduğunu buldum arkadaşlar hepinize çok teşekkür ederim.

LCD nin Data ve sinyal uçlarını aynı portta kullanıyordum ve kod 877(Hi-tech pic16f) de çok güzel çalışıyordu. sonradan gördüm LCD.C içindeki tanımlarda aşağıdakini kullanıyordum.

#define	LCD_RS RB2
#define LCD_EN RB3

#define LCD_DATA	PORTB


Ama Mplab XC8 kodunda yukarıdakini tanımlayınca "OR"ve "AND" işlemlerinde beklenmedik biçimde hatalı yapıyor.
Aşağıdaki kodu kullanınca doğru çalışıyor.

#define	LCD_RS LATB2
#define LCD_EN LATB3

#define LCD_DATA	LATB


Bu tanımlamalar arasındaki fark nedir. Artık PORT yerini bu LAT mı almış oluyor ?

Mr.Java

LATH ve PORT kullanım alanı farkı şeyler.Forumda tartışılmıştı.Araştırınız.

kenan_re

Arkadaşlar hepinize teşekkür ederim. iyi kötü Pic18f serisi için ilk adımlarım atmış ve artık daha iyi sonuçlar aldım.