Pic+buton+lcd

Başlatan ylmz, 21 Eylül 2011, 14:58:33

ete

Kullandığın LCD şayet 4x20 lik bir LCD ise her satırın tam tamına 20 karekter olarak yazılması gerekiyor.
Bazen hesabı yanlış yapıyorsunuz ve satıra fazladan yazılan karekter bir sonraki satırda (yada o satırın hafıza olarak devamı olan satırda) ilk karekterlerin sönmesine yada yanıp sönmesine sebep olmaktadır.
Yapılacak iş şudur. Her satıra yazdırılan karekterleri kesin olarak sayın. Emin olamadığınız sayısal karekterler için sabit digit yazdıran DECx komutunu kullanın. Genelde #ver gibi yazdırmalarda ver değişken kaç hane ise okadar yazı ekrana geliyor. Ama Dec2 Ver şeklinde yazarsanız hane sayısı 2 yi geçemez. Yada dec3 Ver şeklinde yazarsanız daima ver değişkeni 3 hane olarak yazılır.
Bu şekilde düzeltme yaparsanız sorun giderilir.

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

canbulut

kodların iflerden geçilmiyor dostum senin konuyada hakim olmadığım için sana bir öneride bulunabilirim sadece...eger düşündüğüm konudan ise bu sorununda hallolacaktır.öncelikle ete hocamın son mesajını ciddi şekilde dikkate almalısın.benim önerimse lcd out ile ekrana yazdırdıktan sonra 2000er mslik gecikmeleri koy aralarına.sanırım koyduğun if'lerden kaynaklanan bir karmaşa var.aralara  gecikmeyi koyarsan karmaşıyı göreceğini düşünüyorum.ayrıca lcdout komutlarını yetersiz kullanıyor gibisin.lcdout fe,2 "yazı" diye yazdırmışsın bence onlarıda düzenlemelisin.sade sade tek tek nereye neyin yazılmasını söyle lcdye:))iyi çalışmalar.

ylmz

teşekkürler arkadaşlar sorunu çözdüm gibi fakat bu basic de nedense lcd komutları çok yer tutuyor mcu nun hafızası doldu ıyımı :))
Regülatör Dns Trafo | Regülatör | Redresör | Ups

canbulut

Alıntı yapılan: ylmz - 04 Ekim 2011, 18:16:37
teşekkürler arkadaşlar sorunu çözdüm gibi fakat bu basic de nedense lcd komutları çok yer tutuyor mcu nun hafızası doldu ıyımı :))


dostum öncelikle tebrik ederim.problemi nasıl çözdüğünü burda açıklarsan seninle aynı derdi yaşayan yada yaşayacak olan arkadaşlara yardım olur.cevabınızı bekliyoruz.

ylmz

Problem karakter sığmıyordu ve şöyle yaptım
döngü yapmaktansa
İf portb.3 then
LCDOUT $fe, $D4, "  %40 %60 %80 %100"
ENDİF
Şeklinde çözdüm olayı

Regülatör Dns Trafo | Regülatör | Redresör | Ups

canbulut

Alıntı yapılan: ylmz - 22 Eylül 2011, 16:10:55
ZATEN ÖYLE YAZIYORUM FAKAT YAZI GELIYOR BI AN SONRA KAYBOLUYOR, IKINCI SATIRDA KAYBOLUYOR DİĞER SATIRLARDA KAYBOLMUYOR

bu sorunu nasıl çözdün:Daynı sistemmi?

ylmz

evet can bulut karakter sığmadığı için bir alt satıra atlıyormuş yanıp sönmesi ondan kaynaklanıyormuş tecrübe işte :)
Regülatör Dns Trafo | Regülatör | Redresör | Ups

ilhan_mkp

arkadaşlar alta eklediğim kodda atmega16 ile lcd ,adc,timer1 kesmesi var programın çalışmasını kısaca özetlersek adcnin channel(0) ında lm35dt bağlı ortam ısısını ölçüyor ve lcd izliyorum ben doğru ölçüm yaptığı kanaatindeyim optik termokupul le karşılaştırdım aynı sonuç birde öylesine yazılmış saat var kesmeyi denemek için ekledim ama tam doğru gitmiyor benim için kesmeyi görmek önemliydi

basic kullananlar için piclere alternatif bir işlemci olan olan atmel avr serisinden atmega16 kullandım

belki birinin işine yarar örnk olur diye paylaşmak istedim

bu arada kodu bascom ile yazdım lcd olan uygulamarda pbp kadar hafızamızdan yemiyor





$regfile = "m16def.dat"                                     'atmega16
$crystal = 8000000
$hwstack = 40
$swstack = 16
$framesize = 32
$prog &HFF , &HC4 , &HD9 , &H00                             'fuse ayarları dahili 8mhz osc jtag off




'**********lcd ayarları************

Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.1 , Rs = Portc.0       'lcd pin tanımlamarı

Config Lcd = 16 * 2                                         '16x2 lcd
'***********************************


'**********timer ayarları***********
Config Timer1 = Timer , Prescale = 64                       'timer 1 bölme oanı 64


'***********************************

'**********adc ayarları*************
Config Adc = Single , Prescaler = Auto , Reference = Internal       'dahili 2,56v referas voltajı
'***********************************


'**********kesme ayarları**********
On Timer1 Timer_1_int                                       ' timer1 kesme etiketi timer_1_int aktif

Enable Timer1                                               ' timer1 aktif

Enable Interrupts                                           ' tüm kesmeler aktif
'**********************************


'**********değişkenler*************                                                        '

Dim Sn As Byte , Dk As Byte , S As Byte , A As Byte , Isi As Word

'***********************************

'***********sabitler****************
Deflcdchar [0] , 16 , 6 , 9 , 8 , 8 , 9 , 6 , 32            'derece sembolü lcd için

Const Timerstart = 65536 - 12500                            'timer1 başlama değeri

Timer1 = Timerstart
'**********ilk değerler ************
Cls                                                         'lcd temizlendi

Cursor Off                                                  'kürsör kapatıldı
S = 11
Dk = 57
'***********************************


Do                                                          'sonsuz göngü başlanma etiketi

If A => 10 Then                                             'a=>10 ise end IF e kadar olan kodları işle
A = 0                                                       'a değişkenini sıfırla

Isi = Getadc(0)                                             'adcnin 0 kanalını okuyup ısı değişkenine yaz
Isi = Isi / 4                                               'ısı değerini 4e böl
Locate 1 , 1                                                'kürsörü lcdnin 1.satır 1. sutununa konumlandır
Cls                                                         'lcdyi temizle
Lcd S ; ":" ; Dk ; ":" ; Sn                                 'lcdye s dk sn değişkenlerini : karakterini yaz 24:15:42 şeklinde görülür
Locate 1 , 14                                               'kürsörü lcdnin 1.satır 14.sutuna konumlandır
Lcd Isi ; Chr(0)                                            'chr(0) karakterini lcdye yaz   °C şeklinde görülür

Incr Sn                                                     'sn değişkenini bir arttır                                                   '


End If                                                      'şart sonu



If Sn => 60 Then                                            ' Sn => 60 ise komutları işle
Sn = 0                                                      'sn değişkenini sıfırla
Incr Dk                                                     'dk değişkenini bir arttır
End If                                                      'şart sonu

If Dk => 60 Then                                            'Dk => 60 ise komutları işle
Dk = 0                                                      'dk değişkenini sıfırla
Incr S                                                      's değişkenini bir arttır
End If                                                      'şart sonu

If S = 24 Then                                              ' S = 24 ise komutları işle
S = 0                                                       's değişkenini sıfırla
End If                                                      'şart sonu

Loop                                                        'sonsüz döngü başlama etiketine dönüş komutu


Timer_1_int:                                                'timer1 kesme etiketi

Timer1 = Timerstart                                         'timer1 e   Timerstart  sabitini yaz

Incr A                                                      'a değişkenini bir arttır

Return                                                      'kesmeden çık


End

Kabil ATICI

Alıntı YapArkadaşlar merhaba kullanmış olduğum mcu nun portb.3 ucuna bır buton bağladım bu butona bastığım zaman lcd ekranda bişey yazmasını
butonu bıraktığım zaman yazmış olduğum yazının gıtmesını ıstıyorum fakat bir türlü beceremedım butona basıyorum yazı gelıyor ama butondan elımı çektiğim zaman yazı gıtmıyor bununla ılgılı pic basic de bir döngü oluşturdum fakat tam beceremedim olayı

İstediğim : Butona basılınca yazı ekrana gelsın , Butondan elımı çektiğim zaman yazı gıtsın
Programım :
endif
    if test.0=1 then goto atla1
    if portb.3 = 0 then   
    test.0 = 1
    LCDOUT $fe, $D4, "  YAZI 1"
     endif
atla1
    if test.0 = 0 then goto atla2
    if portb.3 = 1 then
    test.0 = 0
    LCDOUT $fe, $D4, "  YAZI 1"
    endif
atla2

İstediğim : Butona basılınca yazı ekrana gelsın , Butondan elımı çektiğim zaman yazı gıtsın
Programım :
endif
    if test.0=1 then goto atla1
    if portb.3 = 0 then   
    test.0 = 1
    LCDOUT $fe, $D4, "  YAZI 1"
     endif
atla1
    if test.0 = 0 then goto atla2
    if portb.3 = 1 then
    test.0 = 0
    LCDOUT $fe, $D4, "        "   <<<<hata bu satırda. Buton her iki halde aynı işlemi yaptırıyorsun
    endif
atla2

Program konusunda biraz dikkat. Buton basıldığında ve bırakıldığında aynı mesjı yazmaya çalışmışsın..
Kolay gelsin
ambar7

ylmz

butona bastığımda zaten o yazı yazacak bıraktığımda silinecekti bu gayet normal değilmi ?
Regülatör Dns Trafo | Regülatör | Redresör | Ups

Kabil ATICI

#25
LCD ekrandaki değeri silmek için aynı yazıyı mı göderirisin yoksa yazı ile aynı uzunluktaki  boşluk karakteri mi?

Siz karakter göndermişsiniz. Yazılan yazı üzerine aynı yazıyı tekrar yazdırır. (verdiğiniz programda öyle görünüyor)
Yazıyı silmek için ya LCD modüle ekranı sil komutunu gönderirisiniz, ya da yazı ile aynı uzunlukta boşluk karakteri dizisini...
Kolay gelsin..
ambar7