Picproje Elektronik Sitesi

DERLEYİCİLER => Microchip MPLAB C serisi => Microchip C18 => Konuyu başlatan: NaMcHo - 29 Ocak 2011, 03:10:42

Başlık: C18 LCD Sorunu
Gönderen: NaMcHo - 29 Ocak 2011, 03:10:42
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?
Başlık: Ynt: C18 Kod Sapıtma Sorunu
Gönderen: scaemteitn - 29 Ocak 2011, 08:49:51
"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.
Başlık: Ynt: C18 Kod Sapıtma Sorunu
Gönderen: NaMcHo - 29 Ocak 2011, 10:08:26
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?
Başlık: Ynt: C18 Kod Sapıtma Sorunu
Gönderen: Tagli - 29 Ocak 2011, 14:40:49
Alıntı yapılan: NaMcHo - 29 Ocak 2011, 10:08:26LATB ile PORTB komutları arasındaki fark nedir?
Daha önce bu başlıkta (https://www.picproje.org/index.php/topic,10891.msg146877.html#msg146877) tartışılmıştı.

Ayrıca bu başlıkta (https://www.picproje.org/index.php/topic,26188.msg177095.html#msg177095) da konu ile ilgili bir durum var.
Başlık: Ynt: C18 LCD Sorunu
Gönderen: NaMcHo - 31 Ocak 2011, 11:53:57
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);
}
Başlık: Ynt: C18 LCD Sorunu
Gönderen: eseneren - 31 Ocak 2011, 12:16:07

#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