birde bu işlemcide MCLR pinini mutlaka +5 VCC 'ye bir dirençle çekmek gerekiyor..
Başlık: Ynt: PIC16F877A LCD sorun
Gönderen: ete - 25 Kasım 2024, 21:28:05
Öncelikle aşağıdaki linkte yazılı olanları bir gözden geçirin. Simulasyonda çalışıpda fiziki olarak yapılıp çalışmayan devrelerde mutlaka Simulasyonun var saydığı birimlere bakmak gerekiyor. Linkte bu konulara açıklık getirilmiştir.
https://etepic.com/index.php/topic,1670.0.html
sorunu bulup devrenizi çalıştırdığınızda mutlaka sorun neymiş burada belirtin ki diğer arkadaşlara rehber olsun.
Bu arada programda bir kusur var. YUKLEME isimli etikete GOSUB ile gidiliyor ama oradan dönüşü GOTO BASLA komut satırı ile yapılıyor. Bu program çalıştıktan bir müddet sonra stack taşması hatasına sebep olur ve program kilitlenip kalır. Hatayı düzeltmek için ya YUKLEME isimli etikete giderken GOTO ETIKET şeklinde gitmek yada oradan dönüşte GOTO BASLA yerine RETURN komutunu yazmak gerekir.
Ete
Başlık: Ynt: PIC16F877A LCD sorun
Gönderen: hlale - 25 Kasım 2024, 23:09:37
Başlangıç olarak proğram çalışıyor 30 sn sonra LCD 1.satır kare kare görünüyor.Proğram diğer tüm fonksiyonları yerine getiriyor. Sensör okuyor ve portlara bağlı mosfet ve transistörleri tetikliyor..
Başlık: Ynt: PIC16F877A LCD sorun
Gönderen: ete - 26 Kasım 2024, 08:15:42
Sonradan stack taşması nedeni ile kilitleniyordur. Programda ve tanımlalarda hata yok zaten. Bir şekilde programın çalışmasını durduruyor. Ben yalnızca bir tanesini görebildim kusurun. Belki başkalarıda vardır. Bu nedenle simulasyonda çalıştırıp olanbitene bir bakmak lazım. Simulasyon en azından stack taşmasınıda gözlemleyip söylüyor sana. İllaki stack taşması olacak diye bir kural yok ancak bunu yaratacak bir sebep var ortada. Başka kusurları da gözlemlemek gerekir ki buda epeyce bir araştırma gerektirebilir. Bize verdiğin yalnızca text şeklinde kod bununla bizim bir sonuca ulaşmamaız mümkün değil maalesef. İş sana düşüyor. Bir sürü ip ucu verdik bunları değerlendir.
Mesela bir tane daha gördüm. FAN isimli etikete bakarsan program bu etikete GOSUB ile geliyor ve her halukarda RETURN ile dönmeli. Etiketin en altında RETURN var ama bir iki satır üstünde şarta bağlı olarak GOTO BASLA bulunuyor bu yanlış ve hata işte. Burada da RETURN olmalı. GOSUB ile geldiğin yerden kesin olarak GOTO ile dönmemelisin. Şart ne olursa olsun. Bu iki kusur programı bir müddet sonra kilitler. Anlaşılan Stack nedir bilmiyorsun yada biliyor ama önemini kavramamışsın. STACK bir ara depo hafızasıdır. Program GOSUB ile bir yere gittiği zaman program ayrıldığı adresi (tekrar aynı yere dönebilsin diye) STACK içine atar.Bu hafızada son giren ilk çıkar prensibi uygulanır. Atılan bu adres bilgisi ilk RETURN komutu görüldüğünde geri alınır. Ancak siz GOSUB ile gidip GOTO ile geri döndüğünüzde oradaki adresi kullanmamkış olursunuz ve yaklaşık 7-8 hafızadan oluşan bu STACK de bir hafıza kayıp etmiş duruma düşersiniz. Bir kaç döngüden sonra STACK hafızasında adres koyacak yer kalmaz. Böylece program nereye g,deceğin bilmez ve kilitlenir kalır. Umarım anlaşılmıştır.
Normal şartlarda bir kod konusunda yardım istenirse en azından devre şeması yada daha iyisi simulsyon devresini buraya kod ile birlikte koymak gerekir. Kimse yeniden şema çizmekle uğraşmak istemez üstelik senin nasıl bir devre çizdiğin daha önemlidir.
Yazdıklarına bakarak ben bir şema oluşturmaya başladım ve gördümki programda başka kusurlarda var. - TRISA komutuna bakılırsa yalnızca PORTA.0 giriş pini olarak atanmış durumda. Ancak programa bakınca;
if porta.1=0 or porta.0=0 then
komut satırında PORTA.1 den bir giriş beklendiği görülüyor. O pini giriş olarak ayarlamaz isen ve oraya bir pullup direnci bağlamaz isen o pin LOW olarak gözükür ve programda otomatikman komutun gereği olarak Goto Ayaryap satırına uygun olarak Ayaryap etiketine gider. O halde yapılacak iş PORTA.1 pinini de giriş olarak ayarlamak ve o pine bir pullup direnci bağlamak gerekir.
programda Ayar kısmında PORTA.2 pinide giriş olarak kullanılmış. Bu nedenle bu pininde giriş yapılması ve pine bir pullup direnci ile buton bağlanması gerekir.
IF porta.3=0 then
pause 100
Gosub Fan
endif
Bu kodlara bakarsan PORTA.3 pinide giriş olmalı. Giriş yapılmadığı için o pinde LOW gözüküyor ve program Ayaryap etiketine gitmese bile bu seferde FAN etiketine gitmek istiyor. PORTA.3 pini de giriş yapılmalı ve o pinede bir Pullup direnci bağlanmalı.
IF porta.5=0 then
pause 100
Gosub Yukleme
endif
bu kodlara bakınca PORTA.5 pini de giriş olması gerektiği anlaşılıyor. Pin giriş yapılmalı ve bu pinede bir Pullup dirrenci bağlanmalı. Bu durumda TRISA=%00101111 şeklinde değer almalı. Giriş olarak ayarlanan pinlerde sanırım birer Buton olacak. Şema vermediğin için ne yaptığını yada yapmak istediğini anlamak mümkün değil maalesef. Yukarıda dediklerimi yaparsan ekranın normal çalışma moduna göreceğini görebilirsin. Programın olması gereken şeklini senin verdiğin kodları değiştirerek aynı yere yerleştirdim. İlk mesajın kod ekranında sağ üst taraftaki işarete tıklarsan kodun tamamını kopyalamış olursun. Bu şekilde yap ve kendi programını bununla değiştir ve yeniden derleyip denemeye çalış bakalım ne olacak sonuç. Ben yine hem şemayı hemde kodları ilişikte veriyorum.
Ete
Başlık: Ynt: PIC16F877A LCD sorun
Gönderen: istinaf duvarı - 26 Kasım 2024, 13:19:59
Bu görüntü aynı zamanda LCD'nin sadece besleme pinlerini bağladığımızda ortaya çıkan görüntü. Kontrast ile alakası yok. LCD MCU ile bağlantı kuramadığında ilk satırı yakıp öyle kalır. Sizin bulmanız gereken şey neden iletişim kurulamıyor.
(https://i.ibb.co/DYKcSYH/lcd.png)
LCD'nin sadece üst satırını kullanan bir kodunuz varsa sorun kontrasttan da kaynaklanıyor olabilir. Bunun dışında kontrast kaynaklı bu hata çıkmaz.
Başlık: Ynt: PIC16F877A LCD sorun
Gönderen: hlale - 26 Kasım 2024, 14:43:43
Başlık: Ynt: PIC16F877A LCD sorun
Gönderen: hlale - 26 Kasım 2024, 15:06:00
@__CONFIG _FOSC_HS & _WDTE_OFF & _PWRTE_OFF & _BOREN_ON & _LVP_OFF & _CPD_OFF & _WRT_OFF & _CP_OFF
include "MODEDEFS.BAS"
OPTION_REG.7=1
define OSC 16
ADCON1 = 7
CMCON = 7
'***********LCD Tanýmlamalarý***********
DEFINE LCD_DREG PORTB 'LCD data pinleri PORTBye baðlý
DEFINE LCD_DBIT 4 'LCD data bitleri hangi bitten baþlýyor
DEFINE LCD_EREG PORTB 'LCD enable pini hangi porta baðlý
DEFINE LCD_EBIT 3 'LCD enable biti hangi porta baðlý
DEFINE LCD_RWREG PORTB 'LCD RW bacaðý hangi porta baðlý
DEFINE LCD_RWBIT 2 'LCD RW pini hangi bite baðlý
DEFINE LCD_RSREG PORTB 'LCD RS pini hangi porta baðlý
DEFINE LCD_RSBIT 1 'LCD RS pini hangi bite baðlý
DEFINE LCD_BITS 4 'LCD 4 bit baðlý
DEFINE LCD_LINES 2 'LCD kaç sýradan oluþuyor
PAUSE 200 '200 milisaniye bekleme yap
'***********Özel Karakter Tanýmlamalarý
LCDOUT $FE,$40, 6, 9, 9, 6, 0, 0, 0, 0 'Derece Ýþareti
LCDOUT $FE,$48, 4, 14, 4, 4, 4, 4,14,0 'Ý Harfi
LCDOUT $FE,$50, 14, 17, 16, 16,16,17,14,4 'Ç Harfi
LCDOUT $FE,$58, 14, 17, 16, 14,1, 17,14,4 'Þ Harfi
'***********Port Ayarlarý***********
TRISA=%1111111
TRISB=%11111111
TRISC=%11110001
TRISD=%11001100
TRISE=%111
PORTA=%1111111
PORTB=%00000000
PORTC=%00000000
PORTD=%00000000
PORTE=%000
'***********Sensör Tanýmlamalarý***********
Busy VAR BIT ' Busy Status-Bit
HAM VAR WORD ' Sensör HAM okuma deðeri
ISI VAR WORD ' Hesaplanmýþ ISI deðeri
Float VAR WORD ' Holds remainder for + temp C display
X VAR WORD
ISARET_BITI VAR HAM.Bit11 ' +/- sýcaklýk Ýþaret biti, 1 = olursa eksi sýcaklýk
EKSI_ISI CON 1 ' Sýfýr altýnda isaret biti=1 oluyor kontrol için
DERECE CON 223 ' ° iþareti
ISARET VAR BYTE ' ISI deðeri için +/- iþaret
TEMP VAR word ' Div32 bit hesap için geçici deðiþken
SYMBOL COMM_PIN=PORTD.0 ' One-wire Data-Pin "DQ" PortB.0 da
Set var byte
SAYI var byte
SAYI1 var byte
SAYI2 var byte
'***********LCD yi Kullanýma Hazýr Hale Getir***********
LOW PORTB.2 'RW bacaðý ekrana yazmaya imkan vermek için LOW yapýldý.
set=40
lcdout $FE,1
PAUSE 250 ' LCD nin kullanýma hazýr hale gelebilmesi için gerekli süre
lcdout $FE,1
LCDOUT $FE,$80,"****TASARIM****"
pause 1500
lcdout $FE,1
pause 200
'***********Program Baþlangýcý***********
Main:
high portc.1
high portc.2
high portc.3
gosub sensoroku
SAYI=250
SAYI1=200
LCDOUT $FE,$C0, "SET : ",#set
PAUSE 500
if porta.1=0 or porta.0=0 then
gosub ayaryap
endif
if ISI=>set then
low portc.1 'motor
endif
if ISI<set-5 then
high portc.1
endif
IF ISI<=18 THEN
low portc.1
ENDIF
IF ISI>=75 THEN
low portc.1
ENDIF
IF ISI>=15 THEN
high portc.2 'devir
ENDIF
if ISI<=12 then
low portc.2
endif
IF ISI<=$4 THEN HIGH PORTC.2
IF porta.3=0 then
pause 100
Gosub Fan
endif
IF porta.5=0 then
pause 100
Gosub Yukleme
endif
;IF porta.4=0 then
;pause 100
;Gosub dur
;endif
Goto Main
'***********1. Sensörü Oku***********
SENSOROKU:
OWOUT Comm_Pin, 1, [$CC, $44]' ISI deðerini oku
Bekle:
OWIN Comm_Pin, 4, [Busy] ' Busy deðerini oku
IF Busy = 0 THEN Bekle ' hala meþgulmü? , evet ise goto Bekle..!
OWOUT Comm_Pin, 1, [$CC, $BE]' scratchpad memory oku
OWIN Comm_Pin, 2, [HAM.Lowbyte, HAM.Highbyte]' Ýki byte oku ve okumayý bitir.
GOSUB Hesapla
RETURN
Hesapla: ' Ham deðerden Santigrat derece hesabý
ISARET = "+"
IF ISARET_BITI = EKSI_ISI THEN
ISARET = "-"
HAM=~HAM+2
ENDIF
ISI=HAM*10/16
FLOAT = ISI//10
ISI=ISI/10
LCDOUT $FE,$80,"TEMP:",ISARET,DEC ISI,".",DEC1 (Float),Derece,"C " '2. satýrda ýsý
RETURN
'*********** Ayarlama Yap *********
ayaryap:
LCDOUT $FE,$80," SET & ENTRY "
LCDOUT $FE,$C0, "SET : ",#set,".0",0,"C "
pause 75
if set=90 then
else
if porta.0=0 then
set=set+1
pause 100
endif
endif
if set=0 then
else
if porta.1=0 then
set=set-1
pause 100
endif
endif
if porta.2=0 then
LCDOUT $FE,$80," SET EDILDI "
lcdout $FE,1
pause 1000
return
endif
goto ayaryap
Fan:
low porte.1
LCDOUT $FE,1
LCDOUT $FE,$83,"MANUEL FAN"
lcdout $FE,$C0,"SURE = ",DEC SAYI
PAUSE 1000
SAYI=SAYI-1
IF SAYI=0 OR PORTC.1=0 THEN
lcdout $FE,1
PAUSE 250
return
else
goto Fan
ENDIF
LCDOUT $FE,1
return
Yukleme:
LOW PORTE.0
LOW PORTE.1
high PORTE.2
LCDOUT $FE,$80, " YUKLEME "
LCDOUT $FE,$C0, " YAPILIYOR "
PAUSE 4000
If porta.5=0 THEN
LCDOUT $FE,1
PAUSE 100
low PORTC.3
return
else
goto yukleme
ENDIF
;Dur:
;high porte.1
;LCDOUT $FE,1
;LCDOUT $FE,$83,"STOP"
;lcdout $FE,$C0,"SURE = ",DEC SAYI
;PAUSE 1000
;IF porta.0=1 THEN
;PAUSE 250
;GOTO Basla
;ENDIF
;LCDOUT $FE,1
;return
GOTO main
End
kodu düzenledim ama sonuç değişmedi
bağlatılarda sorun göremedim gözden kaçan başka bir detay var ama farkedemiyorum..
Başlık: Ynt: PIC16F877A LCD sorun
Gönderen: ete - 26 Kasım 2024, 15:19:10
Sen aslında çok şey düzenlemişsin. TRIS registerlerinin hepsini giriş yapmışsın hangi sebeple acaba?
Mesajdaki kodu değiştirmeyi unutmuşum, şimdi değiştirdim. Sen en iyisi onu kopyala ve onu derleyip kullan. Yaptıkların yine yanlış çünki.
Varsa elinde başka bir LCD kullanmaya da çalışsan fena olmayacak. Elindeki bir şekilde bozulmuş gibi gözüküyor.
Ete
Başlık: Ynt: PIC16F877A LCD sorun
Gönderen: hlale - 26 Kasım 2024, 15:56:23
Hocam A portu tamamı input olarak kullanılacaktır.
boşta kalan I/O ları GND bağlantısı yaptım harmonik ve gürültülerden etkilenmemesi için.
16Mhz osc 33pf ve 20pf ile test ettim. 3 larklı ldc ile aynı sonuc alıyorum. osilakop ile kontrolleri yaptım tüm değerler uygun.
Başlık: Ynt: PIC16F877A LCD sorun
Gönderen: istinaf duvarı - 26 Kasım 2024, 15:58:17
Ana fonksiyonun başında 500ms delay ver bakalım ne olacak?
Bir de LCD'nin lehimlerini kontrol et, çatlak, soğuk lehim vs. var mı? Kullanılmayan D0-D3 pinlerini VDD ya da GND'ye çek. Float durumda kalmasın.
Bana kalırsa en temizi I2C LCD. Sadece dört kablo bağlıyorsun miss. :)
Başlık: Ynt: PIC16F877A LCD sorun
Gönderen: mehmet - 26 Kasım 2024, 16:43:33
LCD 2 numaradaki 10K direnci çıkarınız. Direkt bağlayınız. LCD'nin LED pinine seri bir diyot ekleyiniz. /MCLR pini pull-up olmalı.
Başlık: Ynt: PIC16F877A LCD sorun
Gönderen: hlale - 26 Kasım 2024, 20:27:05
Özdisan firmasından yeni MCU aldım kodlama yaptım sorunsuz çalıştı..
Yardımlarınız için teşekkürler..
Başlık: Ynt: PIC16F877A LCD sorun
Gönderen: istinaf duvarı - 07 Aralık 2024, 13:51:00
16x2 formatında OLED'ler de varmış. Besleme bağlantısı sadece 2 pin. VDD ve VSS, normal LCD'de olan Vo pini bunlarda NC, yani boş. Arka ışık bağlantısına da ihtiyaçları yok, zaten arka ışık pinleri de NC, yani boş.
Vo pinine ihtiyaç olmaması güzel bir şey. Trimpot bağla, görüntü gelinceye kadar çevir zahmetinden kurtarıyor.
Aliexpress'te falan satılıyor.
Edit:Özdisan satıyormuş. En ucuzu 15 dolar falan. Çok pahalı. Geleneksel LCD'ye devam.
Başlık: Ynt: PIC16F877A LCD sorun
Gönderen: onurinci - 07 Aralık 2024, 20:27:09
resiztans.net'ten yıllar evvel 3 adet aldım . dip sarı portakala yakın görüntü muhteşem 50USD idi. artık alamam.EAW162-X9LG