Haberler:

Eposta uyarılarını yanıtlamayınız ( ! ) https://bit.ly/2J7yi0d

Ana Menü

Picbasic'te Lcd_init()

Başlatan Salih, 17 Mart 2010, 10:03:55

Salih

Ben CCS kullanıyorum. CCS'de Lcd_init() diye bir fonksiyon var. Lcd ile bir işlem yapmadan önce bu fonksiyonu çalıştırıyoruz. Çevremde picbasic kullananlarda Lcd ile ilgili problem yaşandığını görüyorum. Bazı zaman karakterlerin yanlış çıkması veya hiç çıkmaması gibi. Picbasic'de lcd nin başlangıç işlemleri nasıl yapılabilir? Tecrübesini paylaşan arkadaş olursa sevinirim.

Tagli

PIC öğrenmeye ilk başladığım zamanlarda PicBasic Pro kullanıyordum. Program içinde bir yerde Lcd_init gibi bir fonksiyon çağrılmıyor. Kodun başına bazı ayarlar yazılıyor. Hangi bacakların kullanılacağı, arayüzün kaç bitlik olduğu, komutlardan sonra ne kadar bekleneceği gibi ayarlar bunlar. Öyle sanıyorum ki derleyici ilgili ayarları programın başlarında bir yere gömüp çalıştırıyor.

PicBasic Pro ile uğraştığım sayılı günlerde LCD ile ilgili herhangi bir sorunla karşılaştığımı hatırlamıyorum.
Gökçe Tağlıoğlu

Maxim

forumda arama yaparsanız ,
picbasic lcd tanımlamalarına ait bin tane örnek bulabilirsiniz .

ayrıca pek sorun yaşanmamaktadır .

ramazotti

Ben basicpro kullaniyorum genellikle lcdde cikan sorunlar donanimsal oluyor ya yanlis bir baglanti ya da bread boarddan kaynaklaniyor.Sorunlari cozmenin en pratik yolu proteus zamandan tasarruf  sagliyor.

Salih

Alıntı yapılan: "Tagli"PIC öğrenmeye ilk başladığım zamanlarda PicBasic Pro kullanıyordum. Program içinde bir yerde Lcd_init gibi bir fonksiyon çağrılmıyor. Kodun başına bazı ayarlar yazılıyor. Hangi bacakların kullanılacağı, arayüzün kaç bitlik olduğu, komutlardan sonra ne kadar bekleneceği gibi ayarlar bunlar. Öyle sanıyorum ki derleyici ilgili ayarları programın başlarında bir yere gömüp çalıştırıyor.

PicBasic Pro ile uğraştığım sayılı günlerde LCD ile ilgili herhangi bir sorunla karşılaştığımı hatırlamıyorum.
Benimde takıldığım nokta burası. Biliyoruzki Lcd'nin düzgün çalışması için belirli başlangıç işlemleri var. Lcd_init() fonksiyonunu inceleyenler görmüştür. Picbasic yapımcıları bu işlemi ya bizim fark etmediğimiz bir biçimde yapıyorlar, yada bizim yapmamızı istiyorlar.

xenix


ete

İlk açılışta LCD registerlerinin yerleştirilmesi için en azından 200 ms lik bir gecikmeden sonra ;
LCDOUT $fe,1  komutu LCD_init işlemini yerine getirmektedir.
Ben LCD ile ilgili hiç sorun yaşamadım. Yaşayanlar kullanmayı bilmeyenlerdir sanırım.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

alayli

Daha önce aynı dertten muzdariptim ve Proton+'da iki satır kod ile %100 çözüme ulaşmıştım. PBP için de aşağıdaki kendi alıntımda olası software ve hardware çözümlere değinmişim. Umarım işinizi görür...

Alıntı yapılan: "alayli"Merhaba Arkadaşlar;

Bir süredir uğrayamıyordum ama bu mesajı yazmayı kendime, dahası sevgili borduma borç bildim. Çünkü aşağıda çözümüyle birlikte bahsedeceğim sorundan muzdarip başkaları da olabilir ve ben kastım onlar kasmasın dedim...

Konu şu:

Pil ile çalışan ve elde taşınan ticari bir projem var. Bu projede 2x16 karakter LCD'de yer alıyor ve bir tür test ölçüm cihazı. Pilden tasarruf edebilmek için cihazda mevcut butonlara en son basıldıktan yaklaşık 1 dk sonra TMR0 interrupt ile PIC'i uyku moduna sokuyorum. PIC üzerinden kontrol edilen bir PNP transistör ile LCD'nin, LCD arka ekran ışığının ve diğer analog kısmın beslemesini kontrol ediyorum. Haliyle PIC uyku moduna girdiğinde tüm bu kısımlar akım çekmesin diye PNP transistörü PIC'i uyutmadan hemen önce kesime sokup bunları enerjisiz bırakıyorum. PIC'i uyandırmak için RB0 change interrupt'u kullanıyorum.

Buraya kadar sorun yok. Her şey tıkır tıkır çalışıyor. PIC uyanıyor. Uyanır uyanmaz, PNP transistörü benim emrim üzerine tekrar tetikleyip, diğer kısımları da tekrar enerjilendiriyor. Ama LCD'miz maalesef dünyadan bi haber ve bakir vaziyette olduğu için (enerjisini kesip verdik boru değil ya bakir işte! :D ) saçma sapan şeyler çıkartıyor ekrana... Kendince haklı tabii ki... İnitialization (yapılandırma) işleminden bi haber. Assemly kullananlar bilir asm ile kod yazarken LCD'ye karakter göndermeden önce bir takım komutlarla LCD yapılandırılır ve sonra asıl print işlemi başlar. Proton bu işi PIC'e ilk enerji verildiğinde bizim verdiğimiz deklarasyonlar doğrultusunda yapıyor ama yapılandırılmanın yenilenmesi için PIC'i resetlemek gerekiyordu. (yani eskiden öyleydi benim için :) )

Çözüme geçmeden önce çözüme yönelik kodu vereyim:

'****************************************************************
'*  Name    : SLEEP&LCD.BAS                                     *
'*  Author  : @alayli                                           *
'*  Notice  : Copyright (c) 2007 XXX Elektronik                 *
'*          : All Rights Reserved                               *
'*  Date    : 25.07.2007                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
ZURNANIN_ZIRT_DEDIGI_1: 'Bu satırın ne anlama geldiği mesajda var...
Device 16F628
XTAL 4
Config XT_OSC , WDT_OFF , PWRTE_ON , BODEN_OFF , LVP_OFF , CP_ALL ,MCLRE_OFF
ZURNANIN_ZIRT_DEDIGI_2: 'Bu satırın ne anlama geldiği mesajda var...
Declare SHOW_SYSTEM_VARIABLES = 1 'SİZİN TANIMLAMADIĞINIZ AMA PROTON+'IN KENDİNE ATADIĞI DEĞİŞKENLERİ 
                                  'PROTEUS'DA GÖRMENİZİ SAĞLAYAN DEKLARE
LCD_DTPIN = PORTB.4	
LCD_RSPIN = PORTB.1
LCD_ENPIN = PORTB.2
LCD_INTERFACE = 4
LCD_LINES = 2
LCD_TYPE = 0
ZURNA_BURADA_ZIRT_DIYEBILIYOR:
PORTB_PULLUPS = 1
ALL_DIGITAL = 1

TRISA = %11111100    
TRISB = %00000001
Dim BPF         As Byte ' ZURNA'NIN ZIRT DEMESİ İÇİN GEREKLİ...
                                 ' AÇIKLAMASI MESAJDA VAR.
Dim KESME_SAYAC As Byte
Dim SANIYE      As Byte            
Dim X           As Byte

Symbol BUZZ         = PORTA.0 'BUZZER ÇIKIŞI
Symbol ANALOG_POWER = PORTA.1 'ANALOG KISMIN BESLEMESİ İÇİN KONTROL PİNİ 
                              '(pnp TİPİ TRANSİSTÖR SÜRDÜĞÜ FARZEDİLİP 0 (SIFIR) AKTİF)
Symbol ON_OFF       = PORTB.0 'DİJİTAL AÇMA KAPAMA BUTONU

DelayMS 50
ANALOG_POWER = 0 '(PNP TRANSİSTÖRÜN BASE UCU ŞASEYE ÇEKİLDİ VE SİSTEME (lcd beslemesi ve backlight'i dahil) ENERJİ GİTTİ

BASLA:
Clear BPF.1  'ZURNA ASIL BURADA ZIRT DİYOR... SİHİRLİ SATIR! AÇIKLAMASI MESAJDA VAR.
GoSub EKRAN_TEMIZLE 'YUKARDAKİ KOMUTTAN SONRA ÇOĞUNLUKLA GEREKLİ... AÇIKLAMASI MESAJDA VAR.
GoSub TURKCE 'TÜRKÇE ÖZEL KARAKTER TANIMLAMALARI ALT PROGRAMINI ÇAĞIR
             'BUNU ALT PROGRAM HALİNDE BURADA ÇAĞIRMAZSAN; 
             'ENERJİSİ KESİLİP RESETLENEN LCD'NİN TÜRKÇE KARAKTERLERDEN HABERİ OLMAZ VE ZIÇAR...
GoSub REKLAMLAR
SANIYE = 59   '1 DK GERİ SAYIM İÇİN SANİYE DEĞİŞKENİ KURULDU
KESME_SAYAC = 0 'TIMER-0 İNTERRUPT İÇİN KESME SAYACI SIFIRLANDI

On Interrupt GoTo KESME
OPTION_REG=%00000111 '65 ms'DE BİR TMR0 İNTERRUPT YAPILANDIRMASI
INTCON=%10100000  'TMR0 KESMESİ AKTİF EDİLDİ
GoSub EKRAN_TEMIZLE

MAIN:
Print At 1,1,"OTO KAPANMA ",4,6,4,"N"
Print At 2,1,"KALAN ZAMAN:",DEC2 SANIYE,"sn"
If ON_OFF = 0 Then UYU 'UYKU MODUNA GEÇİŞİ İSTER BUTONA BASARAK YAP
If SANIYE = 0 Then UYU 'İSTERSEN DE ZAMAN AŞIMINI KULLAN (ÖZELLİKLE PİLDEN ÇALIŞAN CİHAZLAR İÇİN İDEAL) 
GoTo MAIN
   


UYU:
   INTCON   = 0 'TMR0 KESMESİNİ VE DİĞER TÜM KESMELERİ İPTAL ET 
   INTCON.4 = 1 'RB0 DONANIM KESMESİNİ AKTİF ET
   INTCON.1 = 0 'RB0 DONANIM KESME BAYRAĞINI SIFIRLA 
   GoSub EKRAN_TEMIZLE
   High BUZZ
   Print At 1,2,"D",2,3,2,"K G",2,6," MODU"
   Print At 2,4,"G",2,"LE G",2,"LE!"
   DelayMS 3000
   Low BUZZ
   GoSub EKRAN_TEMIZLE
   PORTB = %00000001 'LCD'YE GİDEN TÜM DATA PİNLERİNİN DURUMU SIFIR YAPILDI Kİ AKIM ÇEKMESİN HIYAR!
   ANALOG_POWER=1 'PIC HARİÇ TÜM SİSTEMİN ENERJİSİ TRANSİSTÖR ÜZERİNDEN KAPANDI...
   Sleep 'İŞLEMCİMİZ MIŞIL MIŞIL UYUYOR MİKROAMPER YETİYOR ŞU AN ONA...
   ANALOG_POWER=0 'BU SATIRA GELİNEBİLDİĞİNE GÖRE ON_OFF TUŞUNA BASILIP PIC RB0 CHANGE İNTERRUPT 
                  'İLE UYANDIRILMIŞTIR VE DİĞER KISIMIN DA ENERJİSİ TEKRAR SAĞLANIR...
   DelayMS 100    'DİĞER KISMIN BESLEMESİ BİRAZ STABİLLEŞSİN...
   GoTo   BASLA  '(ZURNANIN_ZIRT_DEDIGI1 ETİKETİNE GONDERMEK İSTEDIM AMA NAFİLE...)
  

'===============================================================================  
Disable        
KESME:
       Inc KESME_SAYAC 'kesme sayacı 1 sn = 15(sayac) x 256 (Tmr0) x 256 (bölme)
         If KESME_SAYAC = 15 Then '15 adet kesme olunca 1 sn. süre geçiyor.(983040 us)
           KESME_SAYAC=0 'sayaç sıfırlanıyor
           Dec SANIYE 'saniye degeri bir azaltılıyor
           If SANIYE > 59 Then SANIYE = 59
         EndIf      
INTCON.2=0 'TMR0 Kesme bayragı sıfırlanıyor

Resume        
Enable              
'------------------------------------------------------------------
EKRAN_TEMIZLE:
Cls : DelayMS 30
Return
        
BIBIP:
For X = 0 To 1
High BUZZ : DelayMS 100: Low BUZZ : DelayMS 50
Next
Return        
        
REKLAMLAR:
GoSub EKRAN_TEMIZLE
Print At 1,3,"@alayli' dan"
Print At 2,1,"SLEEP@LCD KIYA",1,"I"
GoSub BIBIP
DelayMS 3000
Return        

TURKCE:
Print $FE,$40,10,14,17,17,17,17,14,$0         'Ö
Print $FE,$48,14, 14, 17, 16, 23, 17, 15, 0    'Ğ dataları 
Print $FE,$50,$11,$0,$11,$11,$11,$11,$e,$0    'Ü dataları 
Print $FE,$58,$0E,$10,$10,$0E,$01,$05,$1E,$04 'Ş dataları 
Print $FE,$60,$04,$0E,$04,$04,$04,$04,$0e,$00 'İ dataları 
Print $FE,$68,4,4,4,4,21,14,4,0               'lamba dataları 
Print $FE,$70,$0E,$11,$10,$10,$10,$15,$0E,$4  'Ç dataları 
Print $FE,$78,4,14,21,$4,$4,$4,$4,$0          'ı datal
Return

End


Bu sorunu çözmek için ilk aklıma gelen şey; kodda görebileceğiniz "ZURNANIN_ZIRT_DEDIGI_2:" etiketini oluşturmak ve uyku modundan PB0 change kesmesi ile çıkan PIC'i goto ile bu etikete dallandırmaktı. LCD deklarasyonları bu etiketin altında olduğuna göre LCD yapılanması da yenilenir diye düşündüm. Ama olmadı... Proton+ bunu yemedi... Daha da ileri gidip yüzsüzlük edip "ZURNANIN_ZIRT_DEDIGI_1:" şeklinde bir etiket oluşturdum. Uyanığım ya herşeyin başına yani PIC'in ilk enerjilendiği konuma dallandıracam programı... Proton+ bunu da yemedi. O ancak "ZURNA_BURADA_ZIRT_DIYEBILIYOR:" a kadar geri dönmeme izin veriyor. Aşağıda Proton+'ın oluşturduğu  assembly kodlarda durum görünüyor.

;----------------------------------------------------------
; Code Produced by the PROTON+ Compiler. Version 3.2.5.5
; Copyright Rosetta Technologies/Crownhill Associates
; Written by Les Johnson. February 2007
;----------------------------------------------------------
 NOLIST
 #include "D:\_PROTON\SLEEP&LCD.PBP"
 LIST

 KESME_SAYAC = 47
 SANIYE = 48
 _X = 49
	#Define __LCD_DTPORT PORTB
	#Define __LCD_RSPORT PORTB
	#Define __LCD_ENPORT PORTB
	#Define BUZZ PORTA,0
	#Define ANALOG_POWER PORTA,1
	#Define ON_OFF PORTB,0
F2_SOF equ $ ; SLEEP&LCD.PRP
F2_EOF equ $ ; SLEEP&LCD.PRP
F1_SOF equ $ ; SLEEP&LCD.BAS
ZURNANIN_ZIRT_DEDIGI_1
F1_000014 equ $ ; in [SLEEP&LCD.BAS] Config XT_OSC , WDT_OFF , PWRTE_ON , BODEN_OFF , LVP_OFF , CP_ALL ,MCLRE_OFF
ZURNANIN_ZIRT_DEDIGI_2
ZURNA_BURADA_ZIRT_DIYEBILIYOR
F1_000025 equ $ ; in [SLEEP&LCD.BAS] PORTB_PULLUPS = 1
	Bsf STATUS,5
ram_bank = 1
	Bcf OPTION_REG,7
F1_000026 equ $ ; in [SLEEP&LCD.BAS] ALL_DIGITAL = 1
	Movlw 7
	Bcf STATUS,5
ram_bank = 0
	Movwf CMCON
.......
...........


*Uyandıktan sonra PIC'i hardware olarak resetlemek bu durumda bir çözümdü ama maalesef projede 16F628 kullanmıştım ve MCLR dahil tüm PIN'ler doluydu. MCLR pinini ve bunu resetleyecek bir başka pini heba etmek zaten normal şartlarda da -RACON-'a tersti. :D

*Uyku moduna geçişten sonra  LCD'nin sadece arka ekran aydınlatmasının enerjisini kesip, 2 nolu VDD pinini PIC gibi sürekli beslemede tutmak çözüm olabilirdi. Ama benim kullandığım LCD bu durumda bile 1-2 mA akım çekiyordu. Bu değer; şebekeden çalışan ve stand-by'a geçirilen bir cihazda 2W'lık avrupa birliği sınır değerini karşılasa da pille çalışan bir cihaz için çok çok fazlaydı. Uyku modunda LCD beslemesini tümden kesmem gerekiyordu.

*İlk başlarda,
LCD_DTPIN = PORTB.4	
LCD_RSPIN = PORTB.1
LCD_ENPIN = PORTB.2
LCD_INTERFACE = 4
LCD_LINES = 2
LCD_TYPE = 0


kısmında Proton+'ın derlediği kodları, "BASLA:" etiketinden sonra "LCD_initialization:" etiketli bir alt programla yeniden oluşturup, PIC uyandıktan sonra bunu çağırıp LCD'yi tekrar yapılandırayım dedim ama Proton+'ın derlediği kodlarla benim yazdıklarımın yıldızını barıştıramadım. Edemedim LCD deklarasyonlarını iptal edip LCD'yi tümden asm kontrolüne aldım. Sorun çözülmüştü ama bu sefer de Proton ile kod yazmanın anlamı kalmamıştı... Bu işi Proton+'ın bünyesinde çözmenin bir yolu olmalıydı... Zaten öteden beri Proton+'da herhangi bir sebeple resetlenen LCD'yi yeniden yapılandıramamanın sıkıntısını yaşardım. (Cls komutu LCD resetlemekle aynı şey değil malum. O sadece ekranı temizler... ve ardından initialization gerektirmez... Reset yiyen LCD'yi mutlaka yeniden yapılandırmak gerekir.) Ama özellikle gürültünün (elektriksel gürültü kast ettiğim) çok fazla olduğu sanayi bölgelerinde kullanılan, Proton+ ile yazılmış projelerimde, LCD'nin sapıttığına defalarca şahit oldum ve şu ana kadar bunu hep hardware ile çözmeye çalıştım. Oysa PIC'in reset yemediği bir çok durumda bu namussuz LCD'ler reset yer ve "İnitialization" isterdi hep... :evil:

EVREKA! EVREKA!  :D
Proton+ içinde LCD'yi yeniden yapılandırmanın yolu sadece iki satır koddan geçiyor. Bunu bulmak için Proteus'da sistem değişkenlerini (Proton'un kendine makroları için oluşturduğu değişkenler) görebilmek için gerekli deklarasyonu yazıp adım adım simulasyonda her bir sistem değişkenini bir dedektif gibi takip ettim. Bu yaklaşık 48 saatime maloldu ama değdi... Farkettim ki "BPF" isimli SİSTEM değişkeninin 1 nolu biti her cls ve print komutundan sonra set veya reset ediliyor. Bu değişkeni kendim de mıncıklıyabilmek için önce kodun içine direkt;
clear BPF


gibi bir satır yazmayı denedim ama Proton+ yemedi. Tanımlı böyle bir değişken yok diye hata verdi. Ben de bu değişkeni Dim ile tanımladım. (Açıkçası proton+'dan "bu benim kullandığım bir değişken ismi ve rezerve, git kendine başka isim bul!" şeklinde bir hata mesajı bekliyordum ama bendeki orijinal kayıtlı ve son sürüm sorun çıkarmadı... :D ) Artık PBF değişkenini mıncıklayabiliyordum. Bu PBF değişkeninin değişik bitleri ve bütünüyle bir hayli haşır-neşir oldum. Sonra anladım ki değişkenin bütününü veya 1. biti hariç diğerlerini mıncıklamak bir takım istenmeyen yan etkiler doğurabiliyor. (Mesela kullanıcı tanımlı değişkenlerin desimal ve/veya hex ve/veya bin vb. değerlerini ekrana yazdırırken veya Print komutu içinde aritmetik işlem yaptırırken diğer bitlerin lojik durumu da değişebiliyor. Bunları kurcalarsanız ekrana yazdırılan değerlerde sapmalar olabiliyor.)

Bu değişkenin 1. bitini (dikkat 0. bit değil, sağdan sola 2. bit) resetledikten sonra baktım ki sapıtan (yada deneme amaçlı tarafımdan resetlenip, PIC çalışırken enerjisi kesilip tekrar verilmek suretiyle sapıttırılan) LCD, takip eden ilk Cls komutundan sonra, titreyip kendine geliyor. Tek eksikle: Türkçe karakterler veya özel oluşturulan semboller! Bunun da kolayı vardı. Normal şartlarda programımın Main'inden önce bir yerlerde bir kez yazdığım bu tanımlamaları bir alt program haline getirip tekrardan çağırmak çözüm için yetti. Özetle:

Programınızın değişken tanımlamalarına
Dim BPF         As Byte
satırını da ekleyeceksiniz. Ama bu değişkeni hiçbir şekilde başka amaçlı kullanıp içeriğine müdahale etmeyeceksiniz. Sadece bizi ilgilendiren bitine müdahale için lazım o kadar. Eski ve/veya crackli proton+ sürümleri bu sistem değişkenini sizin tanımlamanıza itiraz edebilir ve "kendine başka değişken ismi bul" diyebilir. O zaman;
Dim BPF as Byte SYSTEM
' i bir deneyin. Büyük ihtimalle sorun çıkartmayacaktır.

Sonra LCD'nin yeniden yapılandırılmasını istediğiniz yerde

Clear BPF.1 
Cls : DelayMS 30
yazacaksınız... Cls'yi kullanmak veya zaten Cls kullandığınız kısımların hemen önüne "Clear BPF.1"'i eklemek ve vırt-zırt kullanıp b...kunu çıkartmamak menfaatinizedir.

Son olarak hatırlatmak istediğim bir kaç husus var:

*BPF değişkeninin tümünü "Clear BPF" şeklinde veya diğer bitlerini "Clear Bpf.X" şeklinde mıncıklamayın. Nitekim Proton+ bu değişkeni başka işlerde de kullanıyor ve diğer bitlerin mıncıklanması başka sorunlar çıkarıyor. Ama "BPF.1" de sorun yok. Ben uzun uzun mıncıklayıp değişik LCD'li projelerimde (PIC18fXXX'li, PIC16F87X'li lerde dahil) test ettim başka herhangi bir probleme yol açmıyor...

*Eğer LCD'nin beslemesini benim projemde olduğu gibi bilinçli kesiyorsanız; PIC'i uyutmadan hemen önce LCD data portlarına bağlı 4 veya 8 pini (DB4----DB7 veya DB0----DB7 ye bağlı pinleri) LCD RS ve LCD EN uçlarına bağlı pinleri sıfırlamayı unutmayın. Aksi taktirde lojik 1 de kalan pin veya pinler üzerinden namussuz LCD akım çekmeye devam ediyor. Hatta ekran aydınlatması için tek beyaz led kullanan LCD'lerde ekran arka ışığının hafifçe parıldadığı bile seçilebiliyor. Burada vereceğim Proteus dosyasında yok ama, normalde ben LCD'ye giden her bir data,RS,EN ucuna seri birer direnç atarım. Şebeke gürültülerine büyük faydası olur. Sizin de özgün projenizde bu akım sınırlama dirençleri varsa dahi bu dediğimi yapın. Nitekim bu dirençler üzerinden LCD akım çekmeye devam edecektir ve  pil ile çalışan projelerde bu akım küçümsenmemelidir. Hatta pil ile çalışan projelerde cihazın açık kalmasına müsaade ettiğiniz süre boyunca çektiği akımı azaltıp pilden daha da tasarruf etmek için; arka ekran ışığı beslemesinin önüne duruma göre 47R ile 150R arası seri bir direnç atın. Bu direnç bir çok LCD'nin kendi PCB'sinde SMD olarak vardır ve şebekeden çalışan cihazlarda arka ekran aydınlatmasını direkt 5V'a bağlamak sıkıntı çıkartmaz. Ama pilli projelerde de ihtiyaç kadar aydınlık verecek bir direnç ile sınırlamak büyük fayda sağlar. Çoğunlukla negatif çalışan BLUE LCD'lerde parlak beyaz tek bir led lullanılır ve seri bağlı 8-10 led kullanan yeşil ekranlılardan çok daha az akım çeker bu mavi negatif ekranlar. Mavilerdeki beyaz led direkt 5V'a bağlandığında 20-25 mA civarı akım çekerken, yeşillerde bu akım 150 mA'leri bulabiliyor. Pille çalışan bir sistem için sırf arka ekran aydınlatması için bu akım israf değil midir sizce de?.. Sınırlayın!

*Az sonra aşağıda linkini vereceğim proje kodlarını ve Proteus dizayn dosyasını bilgisayarına indirip çalıştıran ve iki günüme malolan sihirli satırları koddan çıkarıp, tekrar derledikten sonra, SADECE PROTEUS'DA KODUN HALA ÇALIŞTIĞINI GÖRÜP, "İki gün boşuna uğraşmışsın, bu satırlar olmadan da çalışıyor bu kod!" diyen sazanları ŞEFKATLE BAĞRIMA BASAR, protobordda (gerçek hayatta) denemelerini salık veririm. Nitekim proteus, PIC'in ve LCD'nin beslemesini simulasyon sürdüğü müddetçe kesmez. Dizayn dosyasında her ne kadar LCD'nin VDD ucu transistörden enerji alıyormuş gibi çizilse ve devre gerçek hayatta da böyle (hatta LCD'nin simulatörde görünmeyen 15 nolu ekran aydınlatmasının + besleme pini)  yapılandırılacak olsa da, simulasyonda PIC uyku moduna girdiğinde LCD'nin enerjisi kesilmez ve doğal olarak resetlenmez. Resetlenmeyen LCD'de yeniden yapılandırma gerektirmeyeceği için, o satırlar olmadan derlenen kod simulasyonda çalışır ama gerçek hayatta yan yatar.

İşte hepsi bu kadar. Ve işte içersinde;
* TMR0 interrupt ile uyku moduna geçip otomatik kapanma,
* Buton marifetiyle  uyku moduna geçip otomatik kapanma,
* RB0 change kesmesi ile uyanıp, analog kısmı enerjilenen

örnek kodun tüm dosyaları...

http://dc151.4shared.com/download/121660686/5be2fda8/SLEEP_LCD.rar?tsid=20090730-022458-89378891



Saygılar...

Edit: Çalışmayan kırık link düzeltildi...
Anca kazganmiş itmiş ilimiz törümüz erti. Türk Oguz begleri budun esiding. Üze tengri basmasar, asra yir telinmeser, Türk budun, ilingin törüngin kim artati? (udaci erti)

alayli

Edit : Üstteki mesajım mükerrer mesaj olmuş, sayfayı işgal etmesin diye bu mesajı kısalttım... Mümkünse moderatör arkadaş bu gereksiz mesajı siliversin bir zahmet.
Anca kazganmiş itmiş ilimiz törümüz erti. Türk Oguz begleri budun esiding. Üze tengri basmasar, asra yir telinmeser, Türk budun, ilingin törüngin kim artati? (udaci erti)

muhittin_kaplan

Tebrik Ediyorum. Programlamak Böyle bişey

hasangurlek

Alıntı yapılan: "alayli"Proton bu işi PIC'e ilk enerji verildiğinde bizim verdiğimiz deklarasyonlar doğrultusunda yapıyor ama yapılandırılmanın yenilenmesi için PIC'i resetlemek gerekiyordu.

Protonda istediğiniz herhangi bir aşamada lcd yi initialize edemiyormusunuz ?
http://www.cyber-warrior.org, Although they like whiteness, sometimes twilight is required...  Hala evlilermi bilinmez ama kesinlikle artık uygun değiller !!!

Salih

İlerde okuyacak arkadaşlara faydalı olur diye son denemeleri yazayım. PBP derleyicisi arkadaşların dediği gibi Lcd init işlemini bir yerlere yerleştirip hal ediyor. Ama nerde nasıl bilemiyoruz.
ETE arkadaşımız PBP'de LCDOUT $fe,1 komutunun init işlemini yaptığını söyledi benim denemelerime göre bu komutu başlangıçta yazmadan da LCD başlayıp çalışabiliyor.
Fakat CCS'de mutlaka LCD kullanmadan önce Lcd_init() fonksiyonunun kullanılması gerekiyor. Yoksa düzgün çalışmıyor.

alayli

Alıntı yapılan: "hasangurlek"
Alıntı yapılan: "alayli"Proton bu işi PIC'e ilk enerji verildiğinde bizim verdiğimiz deklarasyonlar doğrultusunda yapıyor ama yapılandırılmanın yenilenmesi için PIC'i resetlemek gerekiyordu.

Protonda istediğiniz herhangi bir aşamada lcd yi initialize edemiyormusunuz ?

Aynen öyle arkadaşım. LCD'yi kontrol eden pic'e reset atmadan istediğiniz herhangi bir zamanda LCD'yi initialize edebiliyorsunuz. Bunun için kodunuzun deklarasyon kısmına;

Dim BPF as byte SYSTEM
yazıp,

LCD initialize istediğiniz yerde kod içinde de;

Clear BPF.1 
Cls : DelayMS 30

yazmanız yeterli. Proton LCD'yi resetleyip tekrar initialize ediyor otomatik olarak. "Clear BPF.1" LCD initializeyi tetikliyor, fakat hemen ardından cls kullanımı gerekiyor. Eğer kullanıyorsanız her initializasyon sonrası yeniden türkçe karakter tanımlaması da kaçınılmaz. Ben bunu bir alt program olarak çağırıyorum. Aslında yukarıdaki kod ve mesajda tüm ayrıntı var.
Anca kazganmiş itmiş ilimiz törümüz erti. Türk Oguz begleri budun esiding. Üze tengri basmasar, asra yir telinmeser, Türk budun, ilingin törüngin kim artati? (udaci erti)

alayli

Alıntı yapılan: muhittin_kaplan - 18 Mart 2010, 19:29:46
Tebrik Ediyorum. Programlamak Böyle bişey

Gözümden kaçmış, tebrik bana ise çok teşekkürler...
Anca kazganmiş itmiş ilimiz törümüz erti. Türk Oguz begleri budun esiding. Üze tengri basmasar, asra yir telinmeser, Türk budun, ilingin törüngin kim artati? (udaci erti)