avatar_ete

PIC Basic Ders-03 (LCD Kullanımı)

Başlatan ete, 28 Ağustos 2011, 14:45:56

52

Hocam hazırlamış oldugum program bread bord üzerinde sorunsuz calışmakta benim sorunum rakamların lcd üzerinde  yan yana bir dizi halında yazılması bu konuda yardımcı olacak arkadaşlara şimdiden tşkler...
program ektedir.

ete

Ne bir şema vermişsin nede programda LCD açılış komutları (tanımlama) yer alıyor. Muhtemelen default LC bağlantısını kullandın ama yinede program usulüne uygun hazırlanmalı. Sigorta ayarları vs. hepsi programda yer almalıdır.
Ne programda LCD komutları açılış vs var. Öyle toplamışsın bir şeyler böye olmaz. Lütfen doğru dürüst bir şeyler yazıp ver ve kendini alıştır rahat edersin. Böyle yarım yamalak programlar hep başına bela olur.

Ben yinede problemin çözümü konusunda bilgi vereyim. Enetgre nin ABCD çıkışlarını Pic de ters bağlamışsın bana kalırsa.
SYMBOL A=PORTC.3
SYMBOL B=PORTC.2
SYMBOL C=PORTC.1
SYMBOL D=PORTC.0
symbol E=PORTC.4
yerine
SYMBOL A=PORTC.0
SYMBOL B=PORTC.1
SYMBOL C=PORTC.2
SYMBOL D=PORTC.3
symbol E=PORTC.4
şeklinde bağlasan işin ne kadar kolay olduğunu aşağıda göreceksin.

DTMF=PORTC & %00001111
Şeklinde tek satır sana DTMF değerini 0-15 arasında verebilirdi. Ancak kullandığın "DAL" değişkeni mantığını anlamak mümkün değil. Neden basılan tuşlardan farklı tuşlar atıyorsun anlamıyorum.


İllaki kendi yöntemimde yapayım diyorsan 10 tabanına göre sayı sisteminin özelliğini kullan.
Yüzler Basamağı +Onlar Basamağı + Birler basmağı (0-9)
Her basılan tuş önce birler basamağında yer alır ve ikinci tuşa basılınca ilk basılan Onlar basamağına 10 ile çarpılarak atılır. Onlar basamağındaki sayıda yüzler basamağına 10 ile çarpılarak atılır.
Bu nedenle elinde bir DTMF (Tus) değeri birde birleştirilecek sayı değeri (DAL) var ise şunu yapabilirsin.
DAL=DAL*10+DTMF
İlk tuşa bastın diyelimki 1 tuşu, DAL=0-10+1=1 yani DAL=1 olacaktır. Ekrana yazdırırkende DAL olarak yazdırırsan ekranda 1 sayısını göreceksin.
İkinci uşa bastın diyelimki 8 tuşu burada aktarmaları yapmak lazım.
If DTMF=8 then DTMF=1 demek gerekiyor senin garip rakam algoritman nedeni ile.
Ardından DAL=1*10+1=11 olacaktır. Ekrana yazdırıncada bu sayı 11 olarak görülecektir.
Devamı gelebilir. Word tipinde bir DAL değişkeni kullanırsan 65535'e kadar DAL değer alabilecektir.

Ete

52

Hocam program konusunda yeniyim soylediklerinizi dikkate aldım ve programı yenıden derledım ısıs şemesı da ekte hocam lcd de  dtmf=3 oldugunda ekrana # dies sembolünü ve dtmf=13 oldugunda * yıldız sembolünü yan yana satır üzerinde  nasıl cıkartabilirim bilgileriniz icin tşkler...
program ektedir.

ete

#63
# işareti ile * işaretinin kendi dtmf kodları var zaten sen neden değiştirmek istiyorsun?
Yanlış hatırlamıyorsam birisi 11 diğeride 12 dir. Bunları kullansan olmuyormu illaki farklı bir şey mi yapmak zorundasın acaba?

Şemanı açamıyorum. Versiyon farklılığından dolayı. Her neyse aşağı yukarı basit bir şemayı kafamda canlandırabiliyorum.
Tam olarak istediğin nedir.
DTMF de her basılan tuşun karşılığı entgerenin 4 bitlik bacağından dışarı verilir. Aynı anda bir onay pini de set edilir.
Sende bunu kullanmışsın zaten . Ama tam olarak ne yapmaya çalıştığını anlamadım doğrusu.

İllaki DTMF=3 olunca ekranda "#" ve 13 olduğunda ekranda "*" olsun diyorsan yeniden onay ver evet öyle istiyorum diye.
Bu hali ile bu program hiç bir işe yaramaz. Çünki tek tuşa basılmasına müsaade ediyorsun hatta hiç bir tuşa basılmasına müsaade etmiyorsun. Çünki DTMF=PORTC & %00001111 komutunu başla satırından önceye yazmışsın. Oraya program bir daha geçemiyorki nasıl okuyacak C portunu?

İstediğini yapmaya çalıştım. Umarım olmuştur.

Ete

52

Tşkler hocam program icin kusura bakmayın zamanınızı aldım programı tamamlayıp dönıcem ii akaşamlar.

othelo-x

hocam lcd ile ilgili bir sorum vardı,lcd de  yazan yazı  alıp sonra tekrar aynı yazıyı yazdırmam gerekiyor

ete

LCD de yazılı olan yazı elbette karekter hafızasına yazılıyor.
1. satır adres aralığı $80-$A0
2. Satır adres aralığı $C0-$D0
şeklindedir.
Öncelikle LCDIN komutu ile 16 adresteki bilgiyi alacak ve bir dizi değişkenine yerleştreceksin.
Bu bilgiyi alabilmek için  programında yer alan LCD tanımlama komutlarına iki satır ilave etmen gerekecek
DEFINE LCD_RWREG PORTX ' LCD read/write pin port, X yerine burada Port Adını yazacaksın
DEFINE LCD_RWBIT Z ' LCD read/write pin bit, Z yerinede hangi pine bağlı ise onu yazacaksın

Bu şekilde okunmuş olan karekterler sonra LCDOUT komutu ile istenilen yere yazdırılabilir.

Ete

othelo-x

#67
hocam LCDIN komutunu tam anlamadım örnek verebılırmınısın acaba bırde tekrar yazdırmaya örnek verebılırnısınz

ete

    DEFINE LCD_DREG		PORTB	'LCD data bacakları hangi porta bağlı?
DEFINE LCD_DBIT 4 'LCD data bacakları hangi bitten başlıyor?
DEFINE LCD_RSREG PORTB 'LCD RS Bacağı Hangi Porta bağlı ?
DEFINE LCD_RSBIT 2 'LCD RS bacağı Hangi Bite bağlı ?
DEFINE LCD_EREG PORTB 'LCD Enable Bacağı Hangi Porta bağlı?
DEFINE LCD_EBIT 3 'LCD Enable Bacağı Hangi bite bağlı ?
DEFINE LCD_RWREG   PORTA    ' LCD read/write pin port
        DEFINE LCD_RWBIT    3       ' LCD read/write pin bit
DEFINE LCD_BITS 4 'LCD 4 bit mi yoksa 8 bit olarak bağlı?
DEFINE LCD_LINES 2 'LCD Kaç sıra yazabiliyor
       cmcon=7

A     VAR BYTE
B VAR BYTE
C VAR BYTE
PORTA.3=0
pause 150
lcdout $fe,1   
   
PAUSE 300

BASLA:                           
     
     lcdout $fe,$80,65,66,67
     
     LCDIN $80,[A,B,C]
     LCDOUT $FE,$C0,A,B,C
         
     PAUSE 100
      GOTO BASLA


ETE

othelo-x

allah razı olsun hocam çok büyük yardımınız oldu

mtlcsns

Merhabalar,

Ete hocam 16x2 LCD display ve pic16f84 ile yaptığınız uygulamayı, pic16f628a ile yapmaya çalışıyorum ama maalesef lcd ekranında sadece tek satır kutucuklar görünüyor. Bunun bağlantıların yanlış olduğunu ya da pic in bozuk olduğunu yazmışsınız.

LCD ACM1602N-FL model

Pic-LCD bağlantılarım şöyle;

RB3 - LCD pin 6
RB2 - LCD pin 5
RB1 - LCD pin 4

RB4 - LCD pin 11
RB5 - LCD pin 12
RB6 - LCD pin 13
RB7 - LCD pin 14

LCD pin 1 - Vdd (+5V)
LCD pin 2 - Vss (Gnd)
LCD pin 3 söylendiği şekilde trimpodun orta ucuna bağlı. Trimpodun diğer ucları +5V ve Gnd ye bağlı.

5V'u 7805 ile elde ediyorum.
Pic'in besleme bacaklarına 100nF'lık seramik kondansatör bağlı.

Üç gündür üzerinde çalışmama rağmen henüz yüzüm gülmedi. Bir yeri mi atlıyorum yoksa LCD mi bozuk?
Pic sağlam, farklı Pic'lerle de aynı sorun devam ediyor.

Pic'e yazdığım kod şöyle;

'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2016 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 01.05.2016                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************

'@ __config _XT_OSC & _WDT_ON & _MCLRE_ON & _LVP_OFF & _CP_OFF

@ __config _INTRC_OSC_NOCLKOUT & _WDT_ON & _MCLRE_ON & _LVP_OFF & _CP_OFF

'dahili osilatör aktif  (4 MHz)  _INTRC_OSC_NOCLKOUT

'MCLRE OFF  yapılırsa mutlaka 10k pull up bağla

'harici osilatör kullanılırsa ve bu 1-8 MHz arasındaysa _XT_OSC
'eğer 8 MHz'den büyükse _HS_OSC yazılmalı.

DEFINE LCD_DREG PORTB         'LCD data bacakları PortB de bağlı
DEFINE LCD_DBIT 4             'LCD data bacakları 4. bitten başlıyor

DEFINE LCD_EREG PORTB         'LCD Enable Bacağı PortB de bağlı
DEFINE LCD_EBIT 3             'LCD Enable Bacağı 3. bite bağlı

DEFINE LCD_RWREG PORTB        'LCD RW Bacağı PortB de bağlı
DEFINE LCD_RWBIT 2            'LCD RW Bacağı 2. bite bağlı

DEFINE LCD_RSREG PORTB        'LCD RS Bacağı PortB de bağlı
DEFINE LCD_RSBIT 1            'LCD RS bacağı 1. Bite bağlı

DEFINE LCD_BITS 4             'LCD 4 bit olarak bağlı
DEFINE LCD_LINES 2            'LCD 2 sıra olarak çalışıyor.

TRISA=0                       'A portu çıkış olarak ayarlandı.
TRISB=0                       'B portu çıkış olarak ayarlandı.

LOW PORTB.2                   'RW bacağı ekrana yazmaya imkan vermek için LOW yapıldı.

PAUSE 200                     'LCD nin kullanıma hazır hale gelebilmesi için gerekli süre

LCDOUT $FE,1                  'Önce Ekranı siliyoruz.
LCDOUT "BASIC DERSLERI"       'ilk sıra baştan itibaren yazdırıyoruz. Aslında bu komutu başka bir
                              'şekilde de yazabiliriz, şöyle
'LCDOUT $FE,2,"BASIC DERSLERI"
LCDOUT $FE,$C0,"DERS No: 3"   'ikinci satıra yazdırıldı.
End


ete

Kodlarda bir sorun yok. Eksiklik olarak 16F628A da komparatör vardır ama A portunu ilgilendirir.
Onunda iptal edilmesi uygun olur. Komutu CMCON=7 şeklinde programın baş taraflarına eklenmesi gerekir.
Diğer bir konu da Pic'in 4 nol'lu pini yani MCLR pinine 10K lık bir pullup direnci bağlaman gerektiği.
Sigorta ayarlarında MCLR_ON yazdığın için bu pullup direnci gerekir. MCLR_OFF yazsa idin bu direnç de gerekmeyecek idi.
Bu söylediklerimi uygulaman rağmen çalışmıyor ise o LCD bozuk demektir.
BU LCD ler voltaja karşı çok hassaslar. Özellikle yanlış bacaklara besleme verirsen anında bozlulabiliyorlar. Biraz fazla voltaj ver yine bozuluyorlar çalışırken her şeyin doğru olduğundan emin olmak gerekir.

LCD R/W bacağı yalnızca LCD den okuma yapacak isen bir pic pinine bağlanmalıdır. Aksi halde yalnızca LCD ya yazdırma yapıyor isen direk GND ye bağlanır ve bir pin tasarruf etmiş olursun. Böyle programda yer alana LOW PORTB.2 komut satırınıda kaldırabilirsin. Çünki o satır R/W pinini LOW a çekmek için ilave edilmiştir.

Pic ile uğaşmaya yeni başladığımda bende bir kaç LCD yi bir kaç işlemciyi ters bağlayarak yakmıştım. Bu normal.
Tavsiyem şu yönde. Bir devre çalıştırırken gerek LCD yi gerekse Pic işlemciyi soketli kulanmaya çalış.
Başlangıçta iki elemanıda devreye takma. Devreye voltaj ver. Önce LCD besleme bacaklarına bak gerekli yerlere doğru voltaj geliyormu. Voltaj en fazla 5,1V olmalıdır. azlası LCD yi bozar. Daha sonra Pic besleme bacaklarına bakarak orayada 5V geldiğinden emin olduktan sonra devre voltajını kes ve elemanları yerine tak. Unutma devrede voltaj var iken ne pic nede LCD yi takıp çıkarma sakın. Özellikle LCD bu işlemde bile anında bozulabilir. Daima voltajı kes hatta giriş voltaj uçlarını kısa devre ederek kondansatörde birikmiş enerjinin boşalmasını sağla. Sonra elelamnları yerlerine takıp devreyi çalıştır.

Ete

mtlcsns

#72
Tamam hocam halolldu. LCD bozukmuş. Yeni bir tane satın aldım düzgün olarak çalıştı.
Teşekkür ederim.

Emro

Merhabalar ETE hocam
Benim üstesinden gelemediğim bir sorunum var.

- )Devremin ana ekranı ortam ısısı ve hava hızı göstermekte.
-) "+" ve " -" tuslarına basarak da ortam ısısı alarmının alt limitini belirliyorum. Belirlediğim limit eeproma yazılıyor ve limit altına düştüğünde buzzer alarm veriyor.
-) "+" ve "-" tuslarına bastığımda ana ekran temizlenip yerine "ALT SINIR : ... m/s " ekranım geliyor arttırarak yada azaltarak limiti belirliyorum.

sorun şu ki ;
"+" ve "-" tuşlarına bastığımda alt sınır ekranım 1 artıp yada 1 azalıp tekrar ana ekrana dönüyor.
Yani;

IF ARTI = 1 THEN                                                                     ' ARTI portd.4 butonunun symbol hali
SAYI = SAYI + 1
lcdout $FE,1 : LCDOUT "ALT LiMiT:", DEC3 SAYI                    '"SAYI" alt limit için değişken
ENDIF       şeklinde...

ben ise ARTI tusuna birkere bastığımda ekranımda "ALT SINIR: ... m/s" yazsın tusa her basıldığında değilde tusa bir kaç saniye basılmadığında ekrandan kaybolsun istiyorum.

umarım anlatabilmişimdir. Yardımlarınız için şimdiden teşekkürler.

ete


Artı tuşuna bir kere bastık ekrana ;
ALT LIMIT : xxx şeklindeki ibare çıktı.
Bu noktada Artı tuşunu bırakıp bırakmadığını kontrol etmemişsin. Bu durumda program hemen aynı satırlara yeniden gelecek ve artırmaya devam edecektir.
O kısımda sorun yok diyor isen aşağıdaki şekilde bir ilave işini görür diye düşünüyorum.

IF ARTI = 1 THEN                                                                     ' ARTI portd.4 butonunun symbol hali
SAYI = SAYI + 1
lcdout $FE,1 : LCDOUT "ALT LiMiT:", DEC3 SAYI                    '"SAYI" alt limit için değişken
ENDIF       
SAYAC=0
while ARTI=0 and SAYAC<3000    '3 sn
pause 1
sayac=sayac+1
WEND

Sayac değişkeni word tipinde olacaktır.
Bu ilave ne yapar onu açıklayayım.
Her şeyden önce bu ilave Artı tuşu bırakılmış ise çalışır. Basılı tutuyor iken çalışmaz.
Tuşa basılmadığı ve sayac değeride 3000 den az olduğu müddetçe program o satırlarda döner durur. Döngüyü iki şey bozar. Birincisi Artı tuşuna basılması. Bu durumda program While - wend döngüsünden çıkar ve sonraki satırda ne var ise ona geçer.
İkincisi Tuşa basılmadığını varsayarsak saayc değeri toplm 3000 ms sonra 3000 değerine ulaşır ve yine döngüden çıkılarak program alt satıra geçmiş olur. Buda senin istediğin şey idi sanırım.
Ete

Powered by EzPortal