Seri iletişim Programdaki hatayı bulabilecek olan varmı L

Başlatan eee1984, 25 Şubat 2008, 13:14:51

eee1984

Merhaba Arkadaslar

Bi rf sistemi için iki uC lır arasında veri iletimi saglamam lazım verici kısım pic12f675 alıcı kısım ise pic16f870 olarak kullandım.. verici kısım kesin çalışıyor ama alıcı kısım gosub keytaramadn sonra işlemiyor butona bastugım halde acaba sorun ne olabilir...Lütfen yardımcı olun bu dil beni cıldırtacak  :cry:

Verici Programım şu: Çalışan yani

Alıntı Yapdefine osc 4


include "modedefs.bas"

datap   var GPIO.0    ;0 dan data cıkıyor

veri   var   byte
baud    con   16780             


veri=%01010101
CMCON=7
Trisio=%000000
OPTION_REG.7=0  'pull-up lar enable

main:
    serout2 datap,baud, [REP$55\8,REP$55\8,REP$55\8,REP$55\8,REP$55\8] 'uyandirma sinyali preambl
    serout2 datap,baud, [REP$00\8,REP$00\8,REP$00\8,REP$00\8,REP$00\8]
    serout2 datap,baud, [REP$FF\8,REP$FF\8,REP$FF\8,REP$FF\8,REP$FF\8]
    serout2 datap,baud, ["E","A","X","A",veri]  
goto main


end

Alıcı ise asagıda  :oops:

Alıntı Yapinclude "modedefs.bas"

DEFINE OSC 4 'Oscillator speed in MHz: 3(3.58) 4 8 10 12 16 20 24 25 32 33 40

'******LCD TANIMLAMALARI******
DEFINE LCD_DREG     PORTC 'LCD DATA BACAKLARI PORTC'YE BAGLI
DEFINE LCD_DBIT     0    'LCD DATA BITLERI HANGİ BITTEN BASLIYOR ??!
DEFINE LCD_EREG     PORTC 'LCD ENABLE BACAGI HANGI PORTA BAGLI
DEFINE LCD_EBIT     5    'LCD ENABLE BITI HANGI PORTA BAGLI  ??
DEFINE LCD_RSREG    PORTC 'LCD RS BACAGI HANGI PORTA BAGLI
DEFINE LCD_RSBIT    6     'LCD RS BACAGI HANGI BITE BAGLI   ???
DEFINE LCD_BITS     4     'LCD 4 BIT BAGLI
DEFINE LCD_LINES    2     'LCD KAC SIRADAN OLUSUYOR   satır sayısı

OPTION_REG.7=0 'pullup lar açıldı
Adcon1=7 ;A portları digital

TRISB=%11110000 ; rb4-7 sutun=giriş rb0-3=satır çıkış
portc=0:TRISC=0

Tus var byte

Veri var byte
GIRIS var PORTA.0

Veri=0
Portc.6=1
PORTC.5=1

gosub KEYPADTARAMA

SerIn2 GIRIS,16780,[WAIT ("EAXA"),dec Veri]
lcdout $fe,1
LCDOUT $fe,2, "ALINAN"
LCDOUT $fe,$C0,"VERI=", Veri ," "
write 5, Veri



end

KEYPADTARAMA:
Tus=16
PAUSE 500           '500 ms BEKLEME YAP

lcdout $FE,1
LCDOUT $FE,$80,"ExE"
PAUSE 500
LCDOUT $FE,$C0,"2008"
PAUSE 500


lcdout $FE,1
pause 500

OKU:
PORTB=%11111110 ;1.satır
;ve ardından dikeyleri kontrol edecegiz.
IF PORTB =%11101110 then TUS=7
IF PORTB =%11011110 then TUS=8
IF PORTB =%10111110 then TUS=9
IF PORTB =%01111110 then TUS=10 '/"

PORTB=%11111101;2.satır
IF PORTB=%11101101 then TUS=4
IF PORTB=%11011101 then TUS=5
IF PORTB=%10111101 then TUS=6
IF PORTB=%01111101 then TUS=11 'x tusu"

PORTB=%11111011;3.satır
IF PORTB=%11101011 then TUS=1
IF PORTB=%11011011 then TUS=2
IF PORTB=%10111011 then TUS=3
IF PORTB=%01111011 then TUS=12 '- tusu"

PORTB=%11110111;4.satır
IF PORTB=%11100111 then TUS=13 'ON/C tusu
IF PORTB=%11010111 then TUS=0
IF PORTB=%10110111 then TUS=14 '= TUSU
IF PORTB=%01110111 then TUS=15 '+ tusu"

PORTB=%11111111

IF TUS<10 THEN  LCDOUT $fe,2,"TUS=", Dec Tus ,"   "
IF TUS=10 THEN  LCDOUT $FE,2,"TUS="," /    "
IF TUS=11 THEN LCDOUT $FE,2,"TUS=", "X   "
IF TUS=12 THEN LCDOUT $FE,2,"TUS="," -    "
IF TUS=13 THEN LCDOUT $FE,2,"TUS=","ON/C   "
IF TUS=14 THEN LCDOUT $FE,2,"TUS="," =   "
IF TUS=15 THEN LCDOUT $FE,2,"TUS="," +  "

if Tus=16 then   oku

PAUSE 100

return

bymrz

hocam alıcı da yazılımsal olarak almayın seri bilgiyi, usartı kullanın, basicte serin2 komutu düzgün çalışmayabiliyor.
Ayrıca işlemciniz başka işlemler de yaptığı için, seri bilgi keldiğinde bazı sinyalleri kaçırma ihtimali var ve öyle de oluyo sanırım..

Dediğim gibi USART kullanın, çok pratik ve basit bi çözüm olacak...

eee1984

Alıntı yapılan: "alone_lover"hocam alıcı da yazılımsal olarak almayın seri bilgiyi, usartı kullanın, basicte serin2 komutu düzgün çalışmayabiliyor.
Ayrıca işlemciniz başka işlemler de yaptığı için, seri bilgi keldiğinde bazı sinyalleri kaçırma ihtimali var ve öyle de oluyo sanırım..

Dediğim gibi USART kullanın, çok pratik ve basit bi çözüm olacak...

Acıkcası pek bişey anlamadım örnek kod verebilirmisin acaba yani daha once usart kullanmadım da  :oops:

bymrz

şimdi buraya kod felan yazmamın bi yararı olmaz, piclerden biraz anlıyorsanız, ufak bi araştırmayla USART hakkında bilgi edinebilirsiniz, forumda da arama yapın mutlaka vardır bi örnek..

Yani USART ın ne oldugunu bilmek gerek önce...

ingilizcen varsa datasheet de yararlı olabilir, gerekli bütün açıklamalar var datasheet te...

teknikelektronikci

usart kesmede kullanabilirisniz daha saglikli olur
kolay gelsin
Ey Türk istikbalinin evlâdı! İşte, bu ahval ve şerâit içinde dahi, vazifen; Türk İstiklâl ve Cumhuriyetini kurtarmaktır! Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!

ferdem

RF modüllerden ve USART kullanımından önce:

Kodlarınız Proteus simülasyonda çalıştı mı? Çalışıyorsa sisteminizi kablolu deneyiniz. O da çalışıyorsa sonra rf modülleri bağlarsınız.

Yazılım hataları Proteus kullanarak kolayca bulunabilir, yazılım uzmanı olmaya gerek yok adım adım giderek değişiklik + compile + run... döngüsü içerisinde hatanızı bulabilir, keytarama rutini içerisinde ne olup bittiğini anlayabilirsiniz.

Bir arkadaş çıkıp hata şurda derse ne ala! Ama muhtemelen çözüme en yakın kişi olarak bu sorunu yine siz çözeceksiniz. Kolay gelsin, iyi çalışmalar.

eee1984

Alıntı yapılan: "ferdem"RF modüllerden ve USART kullanımından önce:

Kodlarınız Proteus simülasyonda çalıştı mı? Çalışıyorsa sisteminizi kablolu deneyiniz. O da çalışıyorsa sonra rf modülleri bağlarsınız.

Yazılım hataları Proteus kullanarak kolayca bulunabilir, yazılım uzmanı olmaya gerek yok adım adım giderek değişiklik + compile + run... döngüsü içerisinde hatanızı bulabilir, keytarama rutini içerisinde ne olup bittiğini anlayabilirsiniz.

Bir arkadaş çıkıp hata şurda derse ne ala! Ama muhtemelen çözüme en yakın kişi olarak bu sorunu yine siz çözeceksiniz. Kolay gelsin, iyi çalışmalar.

Proteus da çalışmıyor yani zaten calıssa muhtemelen donanımda da calısacaktır gb me geliyor ama işte programın alıcı kısmının keypad ve lcd kısmı calısıyor sadece seri bilgiyi almıyor yani tecrübeli arkadasların bilebilecegini dusunmustum  :cry:


ferdem

Sizin bu "keypad" tarama olayınız sıkıntılı olabilir. Zamanında ben de bir hesap mak. yapmaya çalışırken düz mantık "kaypad" i bu mantıkla taramıştım, simülasyonda CPU %100 yükleniyor da olsa çalışıyordu ancak donanıma döktüğümde PIC e sürekli reset atıyordu.

"Keypad" tarama altprogramınızı daha verimli hale getirmelisiniz, gerekiyorsa "keypad" sürücü devre kurmalısınız. "Keypad"inizde toplamda 16 tuş varsa bunun kontrolü(hangi tuşa basıldığını yakalamak) için sadece 4 pin yeterlidir(2^4=16).

Forumda "keypad" sürme ile alakalı örnek yazılım ve devreler muhakkak vardır. USART olayına gelince: USART kullanımı ile gelen RS232 verinin çözümlenmesini(decode) yazılıma değil donanıma yaptırmış oluyoruz, çeşitli avantajları var: Daha güvenilir olması ve sanırım "buffer"da son gelen bir kaç verinin tutuluyor olması. USART kullanımı için kullandığınız PIC in bu donanımı bulunduruyor olması halinde iletişim için USART pinlerini seçmek ve bir kaç satır kodla çeşitli bildirimlerde bulunmak yeterli. İyi çalışmalar.

eee1984

Alıntı yapılan: "ferdem"Sizin bu "keypad" tarama olayınız sıkıntılı olabilir. Zamanında ben de bir hesap mak. yapmaya çalışırken düz mantık "kaypad" i bu mantıkla taramıştım, simülasyonda CPU %100 yükleniyor da olsa çalışıyordu ancak donanıma döktüğümde PIC e sürekli reset atıyordu.

"Keypad" tarama altprogramınızı daha verimli hale getirmelisiniz, gerekiyorsa "keypad" sürücü devre kurmalısınız. "Keypad"inizde toplamda 16 tuş varsa bunun kontrolü(hangi tuşa basıldığını yakalamak) için sadece 4 pin yeterlidir(2^4=16).

Forumda "keypad" sürme ile alakalı örnek yazılım ve devreler muhakkak vardır. USART olayına gelince: USART kullanımı ile gelen RS232 verinin çözümlenmesini(decode) yazılıma değil donanıma yaptırmış oluyoruz, çeşitli avantajları var: Daha güvenilir olması ve sanırım "buffer"da son gelen bir kaç verinin tutuluyor olması. USART kullanımı için kullandığınız PIC in bu donanımı bulunduruyor olması halinde iletişim için USART pinlerini seçmek ve bir kaç satır kodla çeşitli bildirimlerde bulunmak yeterli. İyi çalışmalar.

Yani keypad taraması ile sinyalin alınması farklı zamanlarda oluyor yani boyle bi durumun pic i kasmaması gerekmez mi aynı anda olsa belki de ve surekli bi tarama olmuyor sadece alt programda taranıyor sonrasında o program blogu işleme dahil olmuyor yani sizce hala sorun keypad uygulamasından mı kaynaklanıyor

ferdem

Kesin olarak "keypad" den kaynaklanıyor demek imkansız tabii ki, yazılanlara ve kodunuza baktığımda benim aklıma ilk olarak bu problem geldi. Bu programın "oku"  altprogramından çıktığına eminsiniz değil mi? Hiç Basic kullanmadığım için yorumlamakta da zorlanıyorum.

Yaptığınız çalışmada kontrolünüz dışında bir olay yok aslında, tek yapmanız gereken sisteminizi adım adım ilerletmek. Şu an benim çalışmalarımda da bazı sorunlar var, çözümüm üşenmeden adım adım gitmek :) Biraz daha uzun sürüyor ama  tecrübe kazandırmak gibi de artısı oluyor, şu durumda size de tavsiye ederim. Kolay gelsin.

eee1984

Alıntı yapılan: "ferdem"Kesin olarak "keypad" den kaynaklanıyor demek imkansız tabii ki, yazılanlara ve kodunuza baktığımda benim aklıma ilk olarak bu problem geldi. Bu programın "oku"  altprogramından çıktığına eminsiniz değil mi? Hiç Basic kullanmadığım için yorumlamakta da zorlanıyorum.

Yaptığınız çalışmada kontrolünüz dışında bir olay yok aslında, tek yapmanız gereken sisteminizi adım adım ilerletmek. Şu an benim çalışmalarımda da bazı sorunlar var, çözümüm üşenmeden adım adım gitmek :) Biraz daha uzun sürüyor ama  tecrübe kazandırmak gibi de artısı oluyor, şu durumda size de tavsiye ederim. Kolay gelsin.

OKU alt programından butona bastıgımda çıkıyor bunu denedim ama sonrasında geri dondugunde sanki ilerlemiyor anlamadım yani gosub dan sonraki kodlar işlemiyor gb  8O Ama serin komutu olmadan keypad kısmında butona bastıgımda gene ana programa adonuyordu :( Bana yardım edebilecek kimse yok mu  :cry:

Logan

Bir defa tuşa bastıktan sonra programın son bulması normal gibi görünüyor. Çünkü;

Alıntı Yap
LCDOUT $fe,$C0,"VERI=", Veri ," "
write 5, Veri

satırından sonra END komutunu kullanmışsın. Zannedersem program burada bitiyor. Şöyle yaparsan programın sürekli çalışır;

Alıntı Yap
gosub KEYPADTARAMA

satırının üstüne bir etiket ata mesela MAIN olsun ve END satırının hemen üstüne programı buraya yollayan bir satır yaz "goto MAIN" gibi bir de bu şekilde dene.
İmza.

eee1984

Alıntı yapılan: "Logan"Bir defa tuşa bastıktan sonra programın son bulması normal gibi görünüyor. Çünkü;

Alıntı Yap
LCDOUT $fe,$C0,"VERI=", Veri ," "
write 5, Veri

satırından sonra END komutunu kullanmışsın. Zannedersem program burada bitiyor. Şöyle yaparsan programın sürekli çalışır;

Alıntı Yap
gosub KEYPADTARAMA

satırının üstüne bir etiket ata mesela MAIN olsun ve END satırının hemen üstüne programı buraya yollayan bir satır yaz "goto MAIN" gibi bir de bu şekilde dene.


Yok olmadı yani lcd kısmı calısıyor keypad de iyi ama sanırım sonrasında program işlemiyor protesu 7.1 deki devreyi ekliyorum.. Deneyebilmeniz için

   http://rapidshare.com/files/95066726/sonndevre.DSN.html

Programın son hali de su sadece rx kısmında değişiklik yaptım tx kısmı yukardakinin aynı

Alıntı Yap'****************************************************************
'*  Name    : RX.BAS                                            *
'*  Author  : ExE                                               *
'*  Notice  : Copyright (c) 2008 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 25.02.2008                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
include "modedefs.bas"

DEFINE OSC 4 'Oscillator speed in MHz: 3(3.58) 4 8 10 12 16 20 24 25 32 33 40

'******LCD TANIMLAMALARI******
DEFINE LCD_DREG     PORTC 'LCD DATA BACAKLARI PORTC'YE BAGLI
DEFINE LCD_DBIT     0    'LCD DATA BITLERI HANGİ BITTEN BASLIYOR ??!
DEFINE LCD_EREG     PORTC 'LCD ENABLE BACAGI HANGI PORTA BAGLI
DEFINE LCD_EBIT     5    'LCD ENABLE BITI HANGI PORTA BAGLI  ??
DEFINE LCD_RSREG    PORTC 'LCD RS BACAGI HANGI PORTA BAGLI
DEFINE LCD_RSBIT    6     'LCD RS BACAGI HANGI BITE BAGLI   ???
DEFINE LCD_BITS     4     'LCD 4 BIT BAGLI
DEFINE LCD_LINES    2     'LCD KAC SIRADAN OLUSUYOR   satır sayısı

OPTION_REG.7=0 'pullup lar açıldı
Adcon1=7 ;A portları digital

TRISB=%11110000 ; rb4-7 sutun=giriş rb0-3=satır çıkış
portc=0:TRISC=0

Tus var byte

Veri var byte
GIRIS var PORTA.0

Veri=0
Portc.6=1
PORTC.5=1
main:
gosub KEYPADTARAMA
pause 500
SerIn2 GIRIS,16780,[WAIT ("EAXA"),dec Veri]
lcdout $fe,1
pause 200
LCDOUT $fe,2, "ALINAN"
pause 200
LCDOUT $fe,$C0,"VERI=", Veri ," "
write 5, Veri
  goto main
end

KEYPADTARAMA:
Tus=16
PAUSE 500           '500 ms BEKLEME YAP

lcdout $FE,1
LCDOUT $FE,$80,"ExE"
PAUSE 500
LCDOUT $FE,$C0,"2008"
PAUSE 500


lcdout $FE,1
pause 500

OKU:
PORTB=%11111110 ;1.satır
;ve ardından dikeyleri kontrol edecegiz.
IF PORTB =%11101110 then TUS=7
IF PORTB =%11011110 then TUS=8
IF PORTB =%10111110 then TUS=9
IF PORTB =%01111110 then TUS=10 '/"

PORTB=%11111101;2.satır
IF PORTB=%11101101 then TUS=4
IF PORTB=%11011101 then TUS=5
IF PORTB=%10111101 then TUS=6
IF PORTB=%01111101 then TUS=11 'x tusu"

PORTB=%11111011;3.satır
IF PORTB=%11101011 then TUS=1
IF PORTB=%11011011 then TUS=2
IF PORTB=%10111011 then TUS=3
IF PORTB=%01111011 then TUS=12 '- tusu"

PORTB=%11110111;4.satır
IF PORTB=%11100111 then TUS=13 'ON/C tusu
IF PORTB=%11010111 then TUS=0
IF PORTB=%10110111 then TUS=14 '= TUSU
IF PORTB=%01110111 then TUS=15 '+ tusu"

PORTB=%11111111

IF TUS<10 THEN  LCDOUT $fe,2,"TUS=", Dec Tus ,"   "
IF TUS=10 THEN  LCDOUT $FE,2,"TUS="," /    "
IF TUS=11 THEN LCDOUT $FE,2,"TUS=", "X   "
IF TUS=12 THEN LCDOUT $FE,2,"TUS="," -    "
IF TUS=13 THEN LCDOUT $FE,2,"TUS=","ON/C   "
IF TUS=14 THEN LCDOUT $FE,2,"TUS="," =   "
IF TUS=15 THEN LCDOUT $FE,2,"TUS="," +  "

if Tus=16 then   oku

PAUSE 100

return

yas

Selam akadaşlar,
eee1984 çalıştırmak istediğin devreyi proton derleyiciye uyarlayıp, gerekli düzeltmeleri yapıp çalıştırdım proteus dosyasındada hata vardı düzeltim(u1 in osc frekansı 1mhz idi).
link teki dosyada çalışan devre ve kodlar mevcut
Pic Basic derleyici ile çalışman için gönderdiğim dosyalardaki kodları uyarlaman gerekli, bu çevrimi yapabilirsin diye düşünüyorum.
http://rapidshare.com/files/95085289/ser-rx-tx.zip.html

eee1984

Alıntı yapılan: "yas"Selam akadaşlar,
eee1984 çalıştırmak istediğin devreyi proton derleyiciye uyarlayıp, gerekli düzeltmeleri yapıp çalıştırdım proteus dosyasındada hata vardı düzeltim(u1 in osc frekansı 1mhz idi).
link teki dosyada çalışan devre ve kodlar mevcut
Pic Basic derleyici ile çalışman için gönderdiğim dosyalardaki kodları uyarlaman gerekli, bu çevrimi yapabilirsin diye düşünüyorum.
http://rapidshare.com/files/95085289/ser-rx-tx.zip.html

Ya calıstı mı gercekten inanamıyorum  :cry: Çok mutlu oldum sağolasın hemen deniyecegim sonsuz teşekkürler  ;)