16F84A "SERIN" SORUNU

Başlatan deepdiver, 27 Ekim 2015, 22:01:22

deepdiver

ETE Hocam Merhaba,

PIc konusunda yeniyim ancak yerli yabancı birçok kaynak inceliyorum. Proteus ve PBP ile  çook basit bir SERIN işlemini bir türlü beceremedim. Yardımınızı rica ediyorum. Devre ve kod aşağıda. Devredeki ledler ve röle vs gereksiz ve kullanım dışıdır. Sadece Terminal ile bir porttan PIC'e veri gönderip, PIC'in bunu algılaması ve yanıt vermesi gibi temel bir olay. Ancak SERIN komutu bir türlü veri alışını yapmıyor. Sadece veri göndermede herhangi bir sorun yok (SERIN'i iptal edince) ancak kod aşağıdaki gibi olunca alış yapmıyor.
Köşeli parantez içini önce "A" şeklinde denedim. Olmayınca PRE değişkenini kullandım.
Şimdiden teşekkürler.
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  :                                  *
'*  Notice  : Copyright (c) 2015 Izinsiz Kullanilamaz           *
'*          : All Rights Reserved                               *
'*  Date    : 27.9.2015                                         *
'*  Version : 1.0                                               *
'*  Notes   : SERIN VE SEROUT ILE RS232 ILETISIMI               *
'*          :                                                   *
'****************************************************************
INCLUDE "modedefs.bas"  ' bu olmazsa baud modunu anlayamıyor ve bad expression hatası veriyor.
RX VAR BYTE
PRE VAR BYTE

TRISB.3 = 1       ' SWITCH PORTU INPUT AYARLA 
TRISA= 0          ' PORTA OUTPUT AYARLA
TRISB.4 = 0        ' pORT 4 OUTPUT
PORTA.3 = 0
PORTA.2 = 0       ' USTTEKI LED ON
TRISB.7 = 1

PRE = "A"
SEROUT PORTB.4,T9600,["*************************",10,13]  ' YAZI + CR+LF GONDER
PAUSE 500
serout PORTB.4,T9600,["SERI PORT DENEMESI",10,13]       ' YAZI + CR+LF GONDER
PAUSE 500
SEROUT PORTB.4,T9600,["*************************",10,13]  ' YAZI + CR+LF GONDER
BASLA:
SERIN PORTB.7,T9600,100,BASLA,[PRE],RX
SEROUT PORTB.4,T9600,[#RX," TUSUNA BASILDI!!"]

END
Tüm işlemciler aynı hızda bekler!

ete

Programında n ebir sigorta ayrı var ne çalışma frekansı belirlenmiş nede kodun devamlı çalışması sağlanmış.
Şu andaki hali ile programa start verdiğin zaman sen daha bir tuşa basmaya çalışırken program END satırına gelir ve orada kalır.
Yada kalması gerekir tabiiki SERIN komutunu aşabilirse. Zira her ne kadar Timeout koymuş olsanda maalesef o timeout çalışmayacak ve sistem 65535 ms orada bekleyecektir.  Her şeyden programı düzeltmen gerekiyor;
- EKsik olan sigorta ayarlarını yerleştir
- Define OSC 4 (veya hangi frekansta çalışıyor ise onu yaz) komutunu ekle.
- TRISA ve TRISB  tanımlamalarını programın başında ver.
- Değişken tanımlamalarından sonra bir açılış gecikmesi ver Pause 200 olabilir.
- Serin Komutunu şöyle yaz,
SERIN PORTB.7, T9600,["A"],RX
- Altındaki komutu şöyle değiştir
SEROUT PORTB.4,T9600,[RX," TUSUNA BASILDI!!"]
GOTO BASLA

Virtual terminalde tuş basarken önce A sonra yollamak istediğin tuşu beklemeden bas AA AB AC AD gibi

Ete

deepdiver

Hocam öncelikle yanıt için teşekkürler. Birçok deneme yapıp olmayınca contayı sıyırdığım için denemelik ufak yazılımı göndermiştim. Öncelikle amacım geliştirmeyi düşündüğüm projelerim için sağlıklı ve fiilen çalışmasını gördüğüm yordamlar oluşturmak. Bu kodu test devremde hazır aldığım max 232 modul ile usb .evirici üzerinden PC'ye aktaracağım.
Bundan sonra gerekirse bunları bir include dosyasına toplayacağım.
Ancak kodun düzgün son hali (aşağıda) halen çalışmıyor.
SEROUT ile ilgili sorunum yok, her türlü test ettim, ancak dediğim gibi SERIN'den sonuç alamıyoruz.

Sizin kodda gördüğünüz bir sorun var mıdır? Yoksa bu soruna neden olabilecek ISIS ile ilgili bir ayar veya hata olabilir mi?
NOT: Geçen hafta da 16F690 ile  ISIS'te her işlemi sorunsuz yaptım ancak SERIN ve PULSIN komutları hiç sonuç vermedi. (SERIN komutunu en az 10 farklı versiyonla denedim.)
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  :                                     *
'*  Notice  : Copyright (c) 2015 Izinsiz Kullanilamaz           *
'*          : All Rights Reserved                               *
'*  Date    : 01.03.2015                                        *
'*  Version : 1.0                                               *
'*  Notes   :        DENEME

'                                                               *
'*          :                                                   *
'****************************************************************
' DEFINITIONS
include "modedefs.bas"
@ __config _XT_OSC & _WDT_OFF & _CP_OFF


' LCD için gerekli tanımlamalar....
DEFINE LCD_DREG PORTB ' Set LCD data port to PORTB
DEFINE LCD_DBIT 5 ' Set data starting bit to 5
DEFINE LCD_RSREG PORTA ' Set RS register port to PORTA
DEFINE LCD_RSBIT  0' Set RS register bit to 0
DEFINE LCD_EREG PORTA 'Set A register port
DEFINE LCD_EBIT 1 ' Set A register bit to 1
DEFINE LCD_BITS 4 ' Set 4 bit operation
DEFINE LCD_LINES 2 ' Set number of LCD rows
'Islemci HIZI
DEFINE OSC 4

'DEGISKEN TANIMLAMALARI
sayac var BYTE
x var BYTE
GELEN VAR BYTE

TRISB.2 = 1   ' Rx Port
TRISB.3 = 0   ' Tx Port

PAUSE 200 ' LCDnin devreye girmesini bekle!
gosub ekran_temizle
' LCD Ekran Fonksiyonu......
LCDOUT "LCD T E S T"
pause 1000
gosub ekran_temizle ' Evet çok saçma bir alt program. Sadece test ve eğitim amaçlı...
for sayac = 1 to 20
     lcdout $FF
     pause 20
next sayac
LCDOUT $FE, $C0
for sayac = 1 to 20
lcdout $FF
pause 5
next sayac
pause 1000
gosub ekran_temizle
LCDOUT "TEST TAMAM!"
pause 1000
gosub ekran_temizle

LCDOUT "SERI PORT UZERINDEN"
LCDOUT $FE, $C0
LCDOUT "VERI TESTI..."
serout PORTB.3,T9600,["SEROUT CALISTI! BAGLANTIDA SORUN YOK",10,13] 
RX:
'"A" TUSUNA BASILANA KADAR BEKLE VE ONDAN SONRA GELEN KARAKTERI "GELEN" ICINE AT
SERIN PORTB.2,T9600,["A"],GELEN
LCDOUT $FE, 01
LCDOUT "SERIN CALISTI!"
serout PORTB.3,T9600,[GELEN, "  TUSUNA BASILDI",10,13] 
GOTO RX


'GERCEK Devrede baglantı icin surekli veri göndermesi, sonsuz dongu!
'X=1
'WHILE X=1
'serout PORTB.1,T9600,[00,"SERI PORT ILE BILGISAYARA VERI GONDERME TESTI",10,13] 
'serout PORTB.1,T9600,[00,"QUICK BROWN FOX JUMPS OVER THE LAZY DOG",10,13] 
'WEND


ekran_temizle :
LCDOUT $FE, 1
return
 



Tüm işlemciler aynı hızda bekler!

ete

#3
Serin komutunu mecbur kalmadıkça kullanma. Basit işlerde (programın serin beklemekten başka şeyler yapmıyor ise) kullanabilirsin. Ancak komplike programlarda sorun çıkartır şu anda çıkarttığı gibi. Onun yerine HESERIN komutunu kullanman daha doğru olur. Tabiiki Hserin kullanabilmen ancak Donanımsal seri portu olan pic ler ile mümkün ve donanım hangi pinleri TX ve RX olarak atamış ise mecburen onları kullanman gerekiyor.  Hserin komutunda timeout komutuda güzel çalışmaktadır.

Bir defa 16F84A işlemcisinden vazgeç. Yerine 16F628A veya yapabilirsen en iyisi 16F1827 işlemcisini kullanmaya bak. Yada 16F88 de olabilir.
Bu saydıklarımın hepsinde donanımsal seri port bulunmaktadır.

Son mesajına simulasyon dosyasıda eklersen programa bakıp gerekirse test edebiliriim. Değilse ancak yüzeysel bakıyorum ve bir sorun göremiyorum.

Gördüğüm tek kusur Açılışta Pause 200 satırından önce GOSUB EKranı_Temizle komutunu vermen lazım. LCD nin ilk açılışı en azından 150 ms zaman alır. Initalize etmek yani LCD yi çalışmaya hazır hale getirmek için önce LCDOUT $FE,1 komutunu verip sonra 200 ms beklemek gerekir.
Sende ters olmuş.
Ete

Edit: sonradan gördüm LCD tanımlamalarında Data bitleri 5 den başlayamaz. Ya 0 yada 4 olmalıdır. Sen 5 yazmışsın.

deepdiver

BAS, HEX ve ISIS dosyaları ektedir hocam.
Tavsiyeleriniz için teşekkürler. Nihai projelerimde 84A düşünmüyorum.
Basit olduğu için ilk devre tasarımlarımda deneme için kullanıyorum şu anda.
Tüm işlemciler aynı hızda bekler!

ete

Ne yazıkki simuasyon-8 dosyalarını açamıyorum. Her neyse basit bir şema hazırladım ve denemeyi yaptım.
SERIN ve SEROUT komutları senin kullandığın şekilde T9600 olarak çalışamıyor. Onun yerine N9600 olarak kullanman gerekecek.
Bu durumda ekranda yer alan virtual terminal üzerine sağ tıklayarak açılan pencerede yer alan;
advanced properties altındaki kutuda yer alan TX/RX polarity karşısındaki kutuyu Inverted olarak değiştirmen gerekiyor.
Bunu yaptıktan sonra sistemi çalıştırıp virtual terminal ekranında "SEROUT CALISTI! BAGLANTIDA SORUN YOK" yazısını okuman gerekiyor.
Bu işlemden sonra şayet 2 adet A girersen A tuşuna basıldı olarak ekrana yazıldığını göreceksin.
AB tuşlarına basarsan B tuşuna basıldı yı yine ekranda göreceksin. Önden A tuşuna basılması gerekli değil dersen;
SERIN PORTB.2,N9600,["A"],GELEN
komut satırını,
SERIN PORTB.2,N9600,GELEN
şeklinde değiştirmen yeterli olacaktır.

Bu arada unutma Pause 200 altında yer alan Gosub ekran_temizle satırını Pause 200 den önceki satıra al.

Ete

deepdiver

Hocam ilginize teşekkürler.
LCd olayını düzelttim.

SERIN olayı baud 2400 yapılınca çalıştı. Normal ve Inverted her ikisinide de çalışıyor.
9600 Baud Normal ve Invert Çalışmıyor.
Gerçek projelerde bu komutu kullanmayacağım için bu sorun değil şu anda.

İyi çalışmalar
Tüm işlemciler aynı hızda bekler!

Powered by EzPortal