Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

C18 LCD Sorunu

Başlatan NaMcHo, 29 Ocak 2011, 03:10:42

NaMcHo

Main:
#include <p18f4520.h>
#include <delays.h>
#include "LCD216_benim.h"


void main(void)
{
	TRISB=0;	PORTB=0;
	TRISC=0;	PORTC=0;
	TRISD=0;	PORTD=0;	
	
	
	Delay100TCYx (2);
	lcd_init();
	cursor(1,2);
	lcd_write("123XXX!");
	Delay10TCYx(250);
	for(;;)
		{
			PORTBbits.RD0=0;
			Delay1KTCYx(3);
			PORTDbits.RD0=1;
			Delay1KTCYx(3);
			lcd_clear();
			cursor(1,1);
			lcd_write("xxxxx");
			Delay10TCYx(250);
		}
}

lcd kütühaneleri :
#include <p18f4520.h>
#include <delays.h>
#include "LCD216_benim.h"



void lcd_write(const   char  s[])
{  
   int i=0;
   while(s[i]!='\0')
   {
   Delay1KTCYx(2);
   lcd_send_byte(s[i++]);
   }
}

void lcd_send_byte(unsigned char data)
{
   rw=0;
   rs=1;
   e=1;
   lcd_port=(data&0xF0);
   e=0;
   Delay1KTCYx(2);
   
   e=1;
   lcd_port=((data&0x0F)<<4);
   e=0;
   Delay1KTCYx(2);
}

void cursor(unsigned int line, unsigned int column)
{
   if(line==1)
   lcd_set(0x80 + (column-1));
   else if(line==2)
   lcd_set(0x80 + (0x40 + (column-1)));
}

void lcd_init(void)
{
   lcd_set(0x02);         //Mutlaka en ba�ta bu komut g�nderilme yoksa cal�smaz lcd.
   lcd_set(0x28);        //4bit 5x8 2satir
   lcd_set(0x06);       //her karakterden sonra sa�a kay.
   lcd_set(0x08);      //dip kapal�,yan�p s�nme yok ,imlec gizli.
   lcd_set(0x0C);      //Disp ac�k,yan�p sonmez,imlec gizli.
   lcd_set(0x01);
   Delay1KTCYx(2);
}

void lcd_set(unsigned int command)
{
   rw=0;
   rs=0;
   e=1;
   lcd_port=(command&0xF0);
   e=0;
   Delay1KTCYx(2);

   e=1;
   lcd_port=((command&0x0F)<<4);
   e=0;
   Delay1KTCYx(2);
}

void lcd_clear(void)
{
   lcd_set(0x01);
   Delay1KTCYx(2);
}

---------------------------------
#define rs	PORTCbits.RC0
#define rw	PORTCbits.RC1
#define e	PORTCbits.RC2

#define lcd_port	PORTB

extern void lcd_write(const	char  s[]);
extern void lcd_send_byte(unsigned char data);
extern void cursor(unsigned int line, unsigned int column);
extern void lcd_init(void);
extern void lcd_set(unsigned int command);
extern void lcd_clear(void);


Isis,hex,main.c,lcd kütüphanesi : http://hotfile.com/dl/100274925/4c4285f/silinecek.rar.html

Mplab 8.60 kullanıyorum.Sorun ise
PORTBbits.RD0=0;
			Delay1KTCYx(3);
			PORTDbits.RD0=1;
			Delay1KTCYx(3);

Burada sinyal D0'a değilde D4 e gidiyor bir süreliğine sonra D7 ye gidiyor daha sonra tekrar D0'a.
Birde lcd de hic birsey göremiyorum.Aynı şekilde PORTB dede sorun var surekli B0 yanıp sönüp duruyo.Sorunu nasıl düzeltebilirim?

scaemteitn

"PORTBbits.RD0=0;"  bu kod derleniyomu merak ettim. eğer derleniyorsa bu kodda yanlışlık var. portb bitlerinde rd0 diye bir bit olmaması lazım.

NaMcHo

#2
PORTDbits.RD0 olucak ,yanlıs yazmısım
Ama hala lcd ye yazı yazdıramadım büyük ihtimalle delay sorunum var,10Mhz crystal kulanıyorum ve 2ms bekle icin Delay1KTCYx(2,5); olması gerekiyor ben ise 3 yaptım bu değeri...
Bu delay fonksiyonunun degeri  1K=1000  1000*2,5*4/Fosc  olarak hesaplanmıyormu?
         PORTDbits.RD0=0;
         Delay1KTCYx(3);
         PORTDbits.RD0=1;
         Delay1KTCYx(3);

Burdaki kodun frekansını ölçtüm ve 416Hz cıktı yani buda 2,4ms yapıyor sorun neyden kaynaklanıyor olabilir?
Lcd ye karakter yazdırdım fakat string yazdıramıyorum suan.
LATB ile PORTB komutları arasındaki fark nedir?

Tagli

Alıntı yapılan: NaMcHo - 29 Ocak 2011, 10:08:26LATB ile PORTB komutları arasındaki fark nedir?
Daha önce bu başlıkta tartışılmıştı.

Ayrıca bu başlıkta da konu ile ilgili bir durum var.
Gökçe Tağlıoğlu

NaMcHo

Bir deneme yaptım ve düzgün çalıştı 18f4520 ile,bir port çıkış olarak kullanılacaksa LATx register'ı giriş olarak kullanılacaksa PORTx register'ı kullanılması gerekiyormuş doğru anladıysam.
http://hotfile.com/dl/100797285/cfdacd4/ADC.rar.html

Birkaç sorum olucak;
-lcd'ye string halinde yazı gönderemiyorum,karakter karakter gönderiyorum şimdilik.Bunun için bir fonksiyon örneği paylaşılırsa daha az zaman kaybetmiş olucam :)
-
#pragma code interrupthighvector = 0x08            //Yüksek öncelikli kesme,Düsük öncelikli kesmenin adresi 0x18.
void interrupthighvector(void)
{
    _asm
        goto ADC
    _endasm        
}
#pragma code

#pragma interrupt ADC
void ADC (void)
{
    if(PIR1bits.ADIF)
        {
            PIR1bits.ADIF=0;
            LATDbits.LATD0 = !LATDbits.LATD0;
        }
}


Buradaki #pragma code kısmını yazmayıncada kesme fonksiyonu normal bir şekilde çalışıyor bunun yazılmasına gerek varmı?Varsa bu komutun görevi nedir?
-------------------------------------MAIN.C---------------------------------------------------------------------------------
#include <p18f4520.h>
#include "LCD216_benim.h"
#include <delays.h>

void main(void);
void ADC(void);
void interrupthighvector(void);

void main(void)
{
    unsigned int Voltaj,current;
    float adc;
    TRISA=0x01;
    TRISB=0;    LATB=0;
    TRISC=0;    LATC=0;
    TRISD=0;    LATD=0;

    ADCON0bits.CHS0=0;    ADCON0bits.CHS1=0;    ADCON0bits.CHS2=0;    ADCON0bits.CHS3=0;
    ADCON0bits.ADON=1;
    ADCON1bits.PCFG0=0;    ADCON1bits.PCFG1=1;    ADCON1bits.PCFG2=1;    ADCON1bits.PCFG2=1;
    ADCON1bits.PCFG3=1;
    ADCON2bits.ADFM=1;
    ADCON2bits.ADCS0=1;    ADCON2bits.ADCS1=1;    ADCON2bits.ADCS2=0;
    
    PIR1bits.ADIF=0;
    PIE1bits.ADIE=1;
    INTCONbits.GIE=1;
    INTCONbits.PEIE=1;
    
    lcd_init();
    for(;;)
    {
        ADCON0bits.DONE=1;
        while(ADCON0bits.DONE);
        Delay1KTCYx(50);
        Voltaj=(unsigned int)ADRESL;    Voltaj+=(unsigned int)ADRESH*256;
        adc=(25.0/1023)*Voltaj;
        Voltaj=adc*100;
        current=Voltaj/5;
        cursor(1,1);
        lcd_send_data('V');lcd_send_data('o');lcd_send_data('l');lcd_send_data('t');
        lcd_send_data('a');lcd_send_data('j');lcd_send_data(':');
        lcd_send_data(Voltaj/1000 + 48);
        lcd_send_data((Voltaj%1000)/100 + 48);
        lcd_send_data('.');
        lcd_send_data((Voltaj%100)/10 + 48);
        lcd_send_data(Voltaj%10 + 48);
        lcd_send_data('V');
        cursor(2,1);
        lcd_send_data('C');lcd_send_data('u');lcd_send_data('r');lcd_send_data('r');
        lcd_send_data('e');lcd_send_data('n');lcd_send_data('t');lcd_send_data(':');
        lcd_send_data(current/1000 + 48);lcd_send_data((current%1000)/100 + 48);
        lcd_send_data('.');
        lcd_send_data((current%100)/10 + 48);lcd_send_data(current%10 + 48);
        lcd_send_data('m');lcd_send_data('A');                
    }
}

#pragma code interrupthighvector = 0x08            //Yüksek öncelikli kesme,Düsük öncelikli kesmenin adresi 0x18.
void interrupthighvector(void)
{
    _asm
        goto ADC
    _endasm        
}
#pragma code

#pragma interrupt ADC
void ADC (void)
{
    if(PIR1bits.ADIF)
        {
            PIR1bits.ADIF=0;
            LATDbits.LATD0 = !LATDbits.LATD0;
        }
}

--------------------------------------------LCD216_benim.h---------------------------------------------
#define rs    LATCbits.LATC0
#define rw    LATCbits.LATC1
#define e    LATCbits.LATC2

#define lcd_port    LATB

extern void lcd_send_data(unsigned char data);
//extern void lcd_write(unsigned int *data);
extern void cursor(unsigned int line, unsigned int column);
extern void lcd_init(void);
extern void lcd_set(unsigned int command);
extern void lcd_clear(void);

-----------------------------------------------LCD216_benim.c-------------------------------------------------------
#include <p18f4520.h>
#include <delays.h>
#include <string.h>
#include <stdio.h>
#include "LCD216_benim.h"


/*void lcd_write(unsigned int *data)
{
    unsigned int string[],adress;
    char i=0;

    Delay1KTCYx(5);
    while(string[i])
    {
    adress=(sizeof(&data)/strlen(&data))+sizeof(&data);
    string[i]=*adress;
    lcd_send_data(string[i]);
    i++;
    Delay1KTCYx(5);
    }
}
*/
void lcd_send_data(unsigned char data)
{
   rw=0;
   rs=1;
   e=1;
   lcd_port=(data&0xF0);
   e=0;
   Delay1KTCYx(5);
   
   e=1;
   lcd_port=((data&0x0F)<<4);
   e=0;
   Delay1KTCYx(5);
}

void cursor(unsigned int line, unsigned int column)
{
   if(line==1)
   lcd_set(0x80 + (column-1));
   else if(line==2)
   lcd_set(0x80 + (0x40 + (column-1)));
}

void lcd_init(void)
{
   lcd_set(0x02);         //Mutlaka en ba�ta bu komut g�nderilme yoksa cal�smaz lcd.
   lcd_set(0x28);        //4bit 5x8 2satir
   lcd_set(0x06);       //her karakterden sonra sa�a kay.
   lcd_set(0x08);      //dip kapal�,yan�p s�nme yok ,imlec gizli.
   lcd_set(0x0C);      //Disp ac�k,yan�p sonmez,imlec gizli.
   lcd_set(0x01);
   Delay1KTCYx(5);
}

void lcd_set(unsigned int command)
{
   rw=0;
   rs=0;
   e=1;
   lcd_port=(command&0xF0);
   e=0;
   Delay1KTCYx(5);

   e=1;
   lcd_port=((command&0x0F)<<4);
   e=0;
   Delay1KTCYx(5);
}

void lcd_clear(void)
{
   lcd_set(0x01);
   Delay1KTCYx(5);
}

eseneren

#include <htc.h>
#include "lcd.h"
#ifndef _XTAL_FREQ
	#define _XTAL_FREQ 20000000
#endif


void lcd_go(const char x, const char y)	// LCD imlec konumlandırma
{
if(x==0)								// 0 satır ise
	lcd_command(128+y);
	else if(x==2)						// 2 satır ise
		lcd_command(148+y);
		else if(x==1)					// 1 satır ise
			lcd_command(192+y);
				else if(x==3)			// 3 satır ise
					lcd_command(212+y);
}//
void lcd_string(const char x, const char y, const char *str)		// LCD'ye string ifade gönderiliyor
{
lcd_go(x,y);							// LCD once konumlandırılır		
lcd_rs=1;
__delay_us(100);	
	while(*str)							// Str bitene kadar
	{	
		lcd_port=*str;						// Harf harf gonderilir
		lcd_e=1;
		lcd_e=0;
		*str++;							// Sonraki harfe geç 
		__delay_us(100);
	}
}//
void lcd_data(const char data)			// LCD data gonderen komuttur.
{
lcd_rs=1;								// LCD data gonderilecek
__delay_us(100);
lcd_port=data;
lcd_e=1;
lcd_e=0;
__delay_us(100);
}//
void lcd_command(const char cmd)		// LCD komut gonderen komuttur.
{
lcd_rs=0;								// LCD komut gonderilecek
__delay_us(100);
lcd_port=cmd;
lcd_e=1;
lcd_e=0;
__delay_us(100);
}//
void lcd_init()							// LCD acılır ve ayarları yapılır
{
__delay_ms(100);						// Acılısda 250 ms Bekle
lcd_command(0b00111100);				// 2 line
lcd_command(0b00001100);				// display cursor on blink off
lcd_command(0b00000001);
__delay_ms(20);
lcd_command(0b00000011);
}//


Gecikmeler fazla fazla küçültülebilir 44780 - 4*20 de kullanıyorum . Umarım işine yarar
Seçim yapmak için durum hakkında bilgi sahibi olmak zorunda değilsin, sonucuna hazır olmak için durum hakkında kaygılanırsın.  http://bit.ly/gixfTk