16*4 LCD Ekran Sorunu

Başlatan elektroacemi, 06 Ocak 2022, 11:35:40

elektroacemi

Merhabalar.

Proton Basic kullanarak 16*4 LCD Ekran kullanmaya çalışıyorum.
1. satırda sorun yok
2. satırda sorun yok
3. satır 5. karakterden yazmaya başlıyor (sorun)
4. satır 5. karakterden yazmaya başlıyor (sorun)

LDC Ekranı değiştirdim sorun düzelmedi.

Proton Basic Compiler Versiyon 3.5.7.7

Device = 18F4520
OSCCON = %01110000     'Internal 8 MHz clock select,
Xtal=8
Config_Start
   OSC = INTIO67 ; Internal oscillator block, port function on RA6 and RA7
   PWRT = OFF ; PWRT disabled
   BOREN = OFF ; Brown-out Reset disabled in hardware and software
   BORV = 0 ; Maximum setting
   WDT = OFF ; WDT disabled (control is placed on the SWDTEN bit)
   MCLRE = OFF ; RE3 input pin enabled; MCLR disabled
   PBADEN = OFF ; PORTB<4:0> pins are configured as digital I/O on Reset
   LVP = OFF ; Single-Supply ICSP disabled
   Cp0 = On ; Block 0 (000800-001FFFh) code-protected
   CP1 = On ; Block 1 (002000-003FFFh) code-protected
   CP2 = On ; Block 2 (004000-005FFFh) code-protected
   CP3 = On ; Block 3 (006000-007FFFh) code-protected
   CPB = On ; Boot block (000000-0007FFh) code-protected
   WRTD = OFF ; Data EEPROM not write-protected
Config_End
'LCD TANIMLAMALARI,,,,,,,,,,,,,,,,,,,,
Declare LCD_Type Alphanumeric        '
Declare LCD_DTPin PORTD.0            '
Declare LCD_ENPin PORTC.0      'e    '
Declare LCD_RSPin PORTA.6     'rs    '
Declare LCD_Interface 4              '
Declare LCD_Lines 4                  '
''''''''''''''''''''''''''''''''''''''
'Port Tanımlamaları,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
Symbol TUS_GERI PORTB.6      'GİRİŞ
Symbol TUS_MENU PORTB.4      'GİRİŞ
Symbol TUS_BOS PORTB.5       'GİRİŞ
Symbol TUS_EKSI PORTB.3      'GİRİŞ
Symbol TUS_ARTI PORTB.2      'GİRİŞ
Symbol TUS_RESET PORTA.5     'GİRİŞ
Symbol LED_Y PORTE.2         'ÇIKIŞ
Symbol LED_S PORTE.1         'ÇIKIŞ
Symbol LED_K PORTE.0         'ÇIKIŞ
Symbol BUZZER PORTA.7        'ÇIKIŞ
Symbol YOLLA_PIN PORTA.4    'ÇIKIŞ
Symbol INT0PIN PORTB.0    'giriş
Symbol SDA_IN PORTC.5   'ethernet 8
Symbol SCL_IN PORTC.6   'ethernet 7
Symbol SDA_OUT PORTA.1   'ethernet 6
Symbol SCL_OUT PORTA.2   'ethernet 5
TRISA.6=0
TRISC.0=0
TRISB.6=1 
TRISB.5=1
TRISB.4=1
TRISB.3=1
TRISB.2=1
TRISA.5=1
TRISB.0=1
TRISE.2=0
TRISE.1=0
TRISE.0=0
TRISA.7=0
TRISA.4=0
TRISC.5=1
TRISC.6=1
PORTA=0 :LATA=0
PORTB=0 :LATB=0
PORTC=0 :LATC=0
PORTD=0 :LATD=0
PORTE=0 :LATE=0
Dim VOLT100 As Word
Dim GERCEK_DEGER As Word
Dim SAYI As Word  
Dim DEGER_A As Word
Dim x As Byte
Dim y As Byte
Dim Address As Word
Dim ALINAN As Byte
Dim ALINAN_VERI[10] As Byte
INTCON2.7=0   'PULL UP AKTİF
CMCON=07h
''interrupt,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
On Interrupt GoTo KESME
INTCON=%11110000
'timer,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
T0CON=%10000100
INTCON.2=0 'TMR0 Kesme bayrağı sıfırlanıyor 
TMR0L=15  'TMR0h=15
'INT0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
INTCON2.6= 0
INTCON.1=0 'INT Kesme bayrağı sıfırlanıyor
DelayMS 1000
Clear
'SerIn SDA_IN\SCL_IN, 16468, [ALINAN]
Basla:
DelayMS 1000
Print $fe,1
Print At 1,1, "aaaaaaaaaaaaaaaa"
Print At 2,1, "bbbbbbbbbbbbbbbb"
Print At 3,1, "cccccccccccccccc"
Print At 4,1, "dddddddddddddddd"
GoTo Basla
KESME:
    Disable           ' INT LERE İZİN VERME 
    INTCON.7 = 0 ' DİĞER TÜM KESMELERE İZİN VERME
    If INTCON.2=1 Then
        INTCON.2=0        'TMR0 Kesme bayrağı sıfırlanıyor
       
        TMR0L=15
        'TMR0H=15 
    End If
    If INTCON.1=1 Then
        INTCON.1=0 'INT Kesme bayrağı sıfırlanıyor
    End If   
   
    INTCON.7 = 1 ' DİĞER TÜM KESMELERE İZİN VER
    Enable          ' INT LERE İZİN VER
    Resume
End


Ekran Çıktısı:


"aaaaaaaaaaaaaaaa"
"bbbbbbbbbbbbbbbb"
"    cccccccccccc"
"    dddddddddddd"

sezgin05

Declare LCD_Type Alphanumeric        yerine    Declare LCD_Type 0  yazmayı deneyin

yas

Sorunun nedeni grafik lcd yönergelerinin kullanılmasından kaynaklı, Protonun lcd örneklerini incelemenizi tavsiye ederim, ayrıca yardım dosyasının 274 üncü sayfası sizin sorunuzun cevabı.

$FE, 1 Clear display
$FE, 2 Return home (beginning of first line)
$FE, $0C Cursor off
$FE, $0E Underline cursor on
$FE, $0F Blinking cursor on
$FE, $10 Move cursor left one position
$FE, $14 Move cursor right one position
$FE, $C0 Move cursor to beginning of second line
$FE, $94 Move cursor to beginning of third line (if applicable)
$FE, $D4 Move cursor to beginning of fourth line (if applicable)

Maxim

yukardaki kodun ekran tarafında bir sorun yok denedim çalışıyor proteusta
şu olabilir daha önce çok başıma geldi, pic ve lcd ekranın besleme ayaklarında 100nf kondansator varmı?

elektroacemi

Alıntı yapılan: sezgin05 - 06 Ocak 2022, 11:50:26Declare LCD_Type Alphanumeric        yerine    Declare LCD_Type 0  yazmayı deneyin
Fark olmadı


Alıntı yapılan: Maxim - 06 Ocak 2022, 13:05:17yukardaki kodun ekran tarafında bir sorun yok denedim çalışıyor proteusta
şu olabilir daha önce çok başıma geldi, pic ve lcd ekranın besleme ayaklarında 100nf kondansator varmı?
Pic ve LCD de 100nF vardı ama soküp tekrar taktım. (Smd olduğu için karışma ihtimaline karşı) Gene düzelmedi
Besleme katındaki kondansatörleri değiştirdim. Gene düzelmedi.

Proteusta kontrol ettiğiniz HEX dosyasını yollayabilir misiniz. Aceba derleyici hatası mı diye kontrol edeceğim





elektroacemi

Alıntı yapılan: yas - 06 Ocak 2022, 12:04:47Sorunun nedeni grafik lcd yönergelerinin kullanılmasından kaynaklı, Protonun lcd örneklerini incelemenizi tavsiye ederim, ayrıca yardım dosyasının 274 üncü sayfası sizin sorunuzun cevabı.

$FE, 1 Clear display
$FE, 2 Return home (beginning of first line)
$FE, $0C Cursor off
$FE, $0E Underline cursor on
$FE, $0F Blinking cursor on
$FE, $10 Move cursor left one position
$FE, $14 Move cursor right one position
$FE, $C0 Move cursor to beginning of second line
$FE, $94 Move cursor to beginning of third line (if applicable)
$FE, $D4 Move cursor to beginning of fourth line (if applicable)

Buradaki MANUEL komutlar ile yapmaya çalıştım

Print $fe,1
Print $FE, 2 'Return home (beginning of first line)
Print $FE, $0F 'Blinking cursor on
Print $FE, $94 'Move cursor to beginning of third line (if applicable)
Print $FE, $10 'Move cursor left one position
Print $FE, $10 'Move cursor left one position
Print $FE, $10 'Move cursor left one position
Print $FE, $10 'Move cursor left one position


3. Satıra geçince 5. karakterden başlıyor. "Print $FE, $10" ile 4 kez sola alıca ilk karaktere geçiyor.

yas

#6
@elektroacemi derleyici ile ilgili bir hata değil. Anladığım kadarıyla karakter lcd nin mantığını tam bilmiyorsunuz. Yukarıda belirtiğim öneriyi dikkate almadığınızdan bu kanıya varıyorum. Bu tarz lcd lerin neredeyse tamamı HD4470 yada birebir benzeri kontroller kullanırlar. Bu lcd lerin 80 bayt lık ram alanı vardır. Yani 1(satır)x80(karakter) lcd görsel oluşturulabilir. Fakat piyasadan satın aldığımız standart karakter lcd lerin boyutları genelde 4x20, 2x40, 2x20, 2x16, 1x16 gibi değerlerde bulunmakta.
Örneğin; 4x20 lik bir lcd 80 baylık alanın gösteriminin tamamı aşağıdaki gibi gerçekleşir.
01--------------20 (Birinci satır)
41--------------60 (İkinci satır)
21--------------40 (Üçüncü satır)
61--------------80 (Dördüncü satır)
Başka bir örnek; 2x40 lık bir lcd 80 baylık alanın gösteriminin tamamı aşağıdaki gibi gerçekleşir.
01--------------40 (Birinci satır)
41--------------80 (İkinci satır)

Sizin ekranınınız 4x16 olduğu için 4x20 ye göre birinci satırdan sonraki her satır için 4 karakter kayma olması normal.

"Print $FE,128" yada "Print $FE,$80" komutu ile imleç 1. satırın ilk başına konumlanır. 4x16 lık bir lcd nin üçüncü satırın başına konumlanmak isterseniz başlangıç adresine 16 ilave etmelisiniz yani 128+16=144 adresini seçmelisiniz.
"Print $FE,144" yada "Print $FE,$90" şeklinde.

yas

#7
Alıntı yapılan: elektroacemi - 06 Ocak 2022, 15:22:183. Satıra geçince 5. karakterden başlıyor. "Print $FE, $10" ile 4 kez sola alıca ilk karaktere geçiyor.

Ayrıca bazı lcd üreticilerin 4 satır üretimlerinde farklılık olabiliyor. Kimisi birinci satırın devamını ikinci satırdan kimisi üçüncü satırdan devam ettirebiliyor. Elinizdeki lcd ye siz uyduracaksınız. Yapmanız gereken tek şey "Print $FE,???" komuttaki soru işaretli yerlerdeki sayıyı 128~208 arasında bir değer vererek görüntüyü oturtmak olmalı.

elektroacemi

Alıntı yapılan: yas - 06 Ocak 2022, 15:39:21Ayrıca bazı lcd üreticilerin 4 satır üretimlerinde farklılık olabiliyor. Kimisi birinci satırın devamını ikinci satırdan kimisi üçüncü satırdan devam ettirebiliyor. Elinizdeki lcd ye siz uyduracaksınız. Yapmanız gereken tek şey "Print $FE,???" komuttaki soru işaretli yerlerdeki sayıyı 128~208 arasında bir değer vererek görüntüyü oturtmak olmalı.

O şekilde yaptığımız zaman Proton Basic kullanmanın anlamı kalmıyor. ASM yazarken o şekilde yapıyordum eskiden.
Yeni denemeler yaptım. Aynı devreye ;
- 4*16 Winstar taktım; Sorun devam etti.
- 4*16 Farklı Marka taktım ; Sorun devam etti.
- 4*20 Winstar taktım; Sorun olmadı.
- 4*20 Farklı Marka taktım ; Sorun olmadı.

yas

Alıntı yapılan: elektroacemi - 06 Ocak 2022, 15:52:18- 4*20 Winstar taktım; Sorun olmadı.
- 4*20 Farklı Marka taktım ; Sorun olmadı.
Zaten yukarıdaki mesajlarımda 4x20 ile kayma olmayacağı anlaşılıyor.

Alıntı yapılan: elektroacemi - 06 Ocak 2022, 15:52:18O şekilde yaptığımız zaman Proton Basic kullanmanın anlamı kalmıyor.
:o  size kolay gelsin.


elektroacemi

Alıntı yapılan: yas - 06 Ocak 2022, 16:24:21Zaten yukarıdaki mesajlarımda 4x20 ile kayma olmayacağı anlaşılıyor.
 :o  size kolay gelsin.



Sizi kızdırdım. Galiba.

Temel sorun PROTON BASIC Print At 3,1, "cccccccccccccccc" komutunu $FE, $94 yapıp "cccccccccccccccc" yazıyor $FE, $90 yapıp yazsa sorun kalmayacak. Bununla ilgili bir ayar bulamadım. Yeni versiyonlarda vardır belki.

Print At 3,-3, "cccccccccccccccc" yazarak baştan yazması sağlanıyor ancak;
Print At 3, 0, "cccccccccccccccc" yazıldığı zaman derleyici hata veriyor...

Alıntı yapılan: Maxim - 06 Ocak 2022, 13:05:17yukardaki kodun ekran tarafında bir sorun yok denedim çalışıyor proteusta
şu olabilir daha önce çok başıma geldi, pic ve lcd ekranın besleme ayaklarında 100nf kondansator varmı?

Yazdığım kodu protousta denedim. LDC olarak LM041L seçersem aynı sorunu yapıyor.

İlginiz için teşekkür ederim.

Derleyicide bununla ilgili bir ayar var mı ?

yas

Derleyicinin böyle bir ayarı yok. Ama 4X16 lcd için şöylede kullanabilirsiniz.
Symbol SATIR1 = $80
Symbol SATIR2 = $A4
Symbol SATIR3 = $90
Symbol SATIR4 = $B8

PRINT $FE,SATIR1,"AAAAAAAAAAAAAAAA"
PRINT $FE,SATIR2,"BBBBBBBBBBBBBBBB"
PRINT $FE,SATIR3,"CCCCCCCCCCCCCCCC"
PRINT $FE,SATIR4,"DDDDDDDDDDDDDDDD"

elektroacemi

Alıntı yapılan: yas - 06 Ocak 2022, 17:05:40Derleyicinin böyle bir ayarı yok. Ama 4X16 lcd için şöylede kullanabilirsiniz.
Symbol SATIR1 = $80
Symbol SATIR2 = $A4
Symbol SATIR3 = $90
Symbol SATIR4 = $B8

PRINT $FE,SATIR1,"AAAAAAAAAAAAAAAA"
PRINT $FE,SATIR2,"BBBBBBBBBBBBBBBB"
PRINT $FE,SATIR3,"CCCCCCCCCCCCCCCC"
PRINT $FE,SATIR4,"DDDDDDDDDDDDDDDD"

Çok teşekkür ederim.

elektroacemi

Alıntı yapılan: yas - 06 Ocak 2022, 17:05:40Derleyicinin böyle bir ayarı yok. Ama 4X16 lcd için şöylede kullanabilirsiniz.
Symbol SATIR1 = $80
Symbol SATIR2 = $A4
Symbol SATIR3 = $90
Symbol SATIR4 = $B8

PRINT $FE,SATIR1,"AAAAAAAAAAAAAAAA"
PRINT $FE,SATIR2,"BBBBBBBBBBBBBBBB"
PRINT $FE,SATIR3,"CCCCCCCCCCCCCCCC"
PRINT $FE,SATIR4,"DDDDDDDDDDDDDDDD"

Symbol SATIR4 = $D0    OLACAK

yas

Tamam onu da sen düzelt :)  sonuçta deneyerek yapmıyorum mantığını anlatmaya çalıştım.  ::ok