Hserin çalışmıyor Hserout çalışıyor

Başlatan safaka123, 20 Eylül 2013, 01:06:38

safaka123

Daha önce ETE bey'in seri al-ver programını denedim ve eklemeler yaparak çalışmasını gördüm. hiperterminal ile de haberleşiyor problem yok.
Bir de Hserin komutlarıyla donanımsal kısmı kullanayım dedim örneklerden ve notlardan faydalanarak yaptım hseriver güzel çalışıyor. virtual terminalde tuşlara bastığımda gereken kodu alıyorum fakat hserial kısmında bir türlü başarılı olamadım. 2. virtual terminal'e serout komutuyla bağladım ne gelirse göstersin diye maalesef timeout kadar bekliyor fakat sonrasında bilgiyi alamadan çıkıyor. devre ve programlar ekli nerede hata yapıyorum bilemiyorum fakat 8mhz de datasheet formülden yararlanarak 9600 baud haberleşmeyle başladım sanırım başlangıçtaki hatam buydu  :) her örnek program 2400 baud a göre verilmişti. Fakat verici çalışıyorsa alıcı da çalışmalı diye düşünüyorum.
SERI_VER programı
'****************************************************************
'*  Name    : H-SERI-VER.BAS                                      *
'*  Author  : [Erol Tahir Erdal]                                *
'*  Notice  : Copyright (c) 2005 [ETE]                          *
'*          : All Rights Reserved                               *
'*  Date    : 11.05.2005                                        *
'*  Version : 1.0                                               *
'*  Notes   : SERI-AL.BAS programının  vericisidir.             *
'*          :                                                   *
'****************************************************************
'@ DEVICE pic16F628 'işlemci 16F628 
'@ DEVICE pic16F628, WDT_on 'Watch Dog timer kapalı 
'@ DEVICE pic16F628, PWRT_ON 'Power on timer açık 
'@ DEVICE pic16F628, PROTECT_OFF 'Kod Protek kapalı 
'@ DEVICE pic16F628, MCLR_off 'MCLR pini kullanılıyor. 
'@ DEVICE pic16F628, INTRC_OSC_NOCLKOUT 'Dahili osilatör kullanılacak 
'------------------------------------------------------------------------------
define OSC 8

#CONFIG
__config _XT_OSC & _WDT_ON & _LVP_OFF & _CP_OFF & _MCLRE_OFF

#ENDCONFIG
' Set receive register to receiver enabled
	DEFINE HSER_RCSTA	90h

	' Set transmit register to transmitter enabled
	DEFINE HSER_TXSTA	20h

	' Set baud rate
	DEFINE HSER_BAUD	9600

	' Set SPBRG directly (normally set by HSER_BAUD)
	DEFINE HSER_SPBRG	12

CMCON=7           '16F628 de komparatör pinleri iptal hepsi giriş çıkış
OPTION_REG.7=0    'Dahili pull-up lar AKTİF yapıldı
PortA=0
TrisA=%00000000
PortB=0
TrisB=%00001111
'------------------------------------------------------------------------------
SYMBOL CIKIS=PORTA.0
SYMBOL TUSA=PORTB.0
SYMBOL TUSB=PORTB.3

VER    var  byte
'------------------------------------------------------------------------------
PAUSE 200
VER=0
'------------------------------------------------------------------------------
BASLA: VER=0
       IF TUSA=0 THEN
          VER=88
          gosub gonder
          WHILE TUSA=0 
          WEND
       endIF
          
       IF TUSB=0 THEN 
           VER=66
           gosub gonder
           WHILE TUSB=0
           WEND
        endif    
           
       PAUSE 100
       GOTO BASLA
'-------------------------ALT PROGRAMLAR---------------------------------------
GONDER:
        
        'hSEROUT [REP$AA\5,REP$00\5,REP$FF\5]
        'PAUSE 200
        hserout ["AT",ver]
        PAUSE 200
        hserout ["AB",ver]        'pause 10
        'SEROUT2 CIKIS,84,["E","T","E",ver]
        'SEROUT2 CIKIS,84,["E","T","E",ver]
        return
END


SERI_AL programı
'****************************************************************
'*  Name    : H_SERI-AL.BAS                                      *
'*  Author  : [E.T.E]                                           *
'*  Notice  : Copyright (c) 2005 [ETE]                          *
'*          : All Rights Reserved                               *
'*  Date    : 13-02-2005                                        *
'*  Version : 41.00                                           *
'*  Notes   : SERI-VER.BAS PROGRAMININ ALICISIDIR.                                                  *
'*          :                                                   *
'****************************************************************    
PORTA=0 
PORTB=0 
TRISA=%00000001   'A portu A.0 giriş diğerleri çıkış yapıldı.
TRISB=%00000000   'B portu tamamı çıkış yapıldı.
'-----------------------------------------------------------------
'@ DEVICE pic16F628                      'işlemci 16F628                                
'@ DEVICE pic16F628, WDT_on              'Watch Dog timer açık
'@ DEVICE pic16F628, PWRT_ON             'Power on timer açık
'@ DEVICE pic16F628, PROTECT_OFF         'Kod Koruma kapalı
'@ DEVICE pic16F628, MCLR_OFF             'MCLR pini kullanılıyor.
'@ DEVICE pic16F628, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak 
'---------------------------değişkenler------------------------------
define OSC 8

#CONFIG
__config _XT_OSC & _WDT_ON & _LVP_OFF & _CP_OFF & _MCLRE_OFF

#ENDCONFIG
' Set receive register to receiver enabled
	DEFINE HSER_RCSTA	90h

	' Set transmit register to transmitter enabled
	DEFINE HSER_TXSTA	20h

	' Set baud rate
	DEFINE HSER_BAUD	9600

	' Set SPBRG directly (normally set by HSER_BAUD)
	DEFINE HSER_SPBRG	12
	'DEFINE HSER_CLROERR 1
 AL     VAR  BYTE
 GIRIS  VAR  PORTA.0
 ROLEA  VAR  PORTB.0
 ROLEB  VAR  PORTB.3
 LEDA   VAR  PORTB.6
 LEDB   VAR  PORTB.7
 SYMBOL CIKIS=PORTB.5
 
 VER    var  byte
'-----------------------------B A Ş L A N G I Ç ----------------------
CMCON=7
CLEAR                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              
PAUSE 500
VER=89
'PORTB=0  'tüm çıkışlar low seviyesinde
'-------------------------------------------------------------------------------    
BASLA:                
       HSERIN 1000 ,ATLA,[WAIT ("A"),AL]
       'hSerIn [WAIT("AB"),AL]
       'TOGGLE PORTB.3 
       IF AL=88 THEN 
          VER=88
'SEROUT2 CIKIS,84,[REP$AA\5,REP$00\5,REP$FF\5]
         SEROUT2 CIKIS,84,["A",AL]
          
          TOGGLE LEDA
          TOGGLE ROLEA
       ENDIF
           
       IF AL=66 THEN
          VER=66
          SEROUT2 CIKIS,84,["D",ver]
          
          TOGGLE LEDB
          TOGGLE ROLEB
       ENDIF   
       pause 200
       SEROUT2 CIKIS,84,["D",al]
       pause 5
       GOTO BASLA
ATLA:
 TOGGLE PORTB.3
 SEROUT2 CIKIS,84,["DD",AL]
 GOTO BASLA
END


Devre şeması :

http://sdrv.ms/18DGQqc

Teşekkürler.

ÜC

Bu şekilde dene

HSERIN 1000 ,ATLA,[WAIT ("AT"),AL]

safaka123

Alıntı yapılan: umitco - 20 Eylül 2013, 10:50:59
Bu şekilde dene

HSERIN 1000 ,ATLA,[WAIT ("AT"),AL]

Maalesef bu da olmadı hatta wait kısmını iptal edip AL bıraktım belki ne alırsa alsın onu görebileyim diye sanki hiç bir şey gelmemiş gibi hareket ediyor. vericiden çıkanı virtual terminale bağlıyorum veriyi görebiliyorum fakat hem terminali hemde alıcı entegrenin RX ucunu bağladığımda terminalden de bir şey gelmiyor alıcı entegrenin ayarlarında bir problem olabilirmi. Verici ile aynı yaptım ama 90H adresi sadece alıcıda kullanılıyor burada yanlışlık olabilir mi? virtual term deki DD ler programdan da anlaşılacağı gibi timeout süresi dolduğunda yazıyor ama hiç bir kod dahi gelmiyormu ki bunu yansıtmıyor.


safaka123

Ayrıca isis bu tx rx bağlantısında çakışma olduğunu söylüyor benim bildiğim ve virtual terminalde kullandığım şekilde tx ten çıkan rx e girer. bir yerde bağlantı yada program hatası var mı. çakışma oluyor.

isis hatası : Logic contention detected #00003

zaman zaman görünüp kaybolan tx ucunda v rx ucunda sarı kutu (kırmızı 1 seviyesi yanan yer ) oluşuyor.

port ayarlarımda bir sorun olabilirmi yinede emin olmak için rx ucunu input ayarladım.


ete

Programlarda Define komutları ile USART aktif hale getiriliyor. Bu nedenle TX ve RX pinlerini artık mutlaka USART amaçlı kullanman gerekir.
Sen bir yandan USART ı aktif ederken bir yandan da PORTB.3 pinine tuş bağlamışsın yanlışlık burada. Çakışma bundan kaynaklanıyor.
Programda SEROUT veya SERIN kullanacak isen USART'a ait define komutlarını kaldırmalısın.

Gelelim diğer konuya, İki ünite bir biri ile haberleşirken bir veri yolladığı zaman alıcı da veri gelecekmi diye bekliyor olması gerekir. Sonuçta alış veriş denilen şey 1-2ms içinde yapılan bir iştir. Verici verisini istediği zaman yollar. Ama orada da pause 200 gibi bir gecikme lüzumsuz olarak durmaktadır. Neden 200 ms gecikme var orada bu semkron bozucu bir gecikmedir kaldırılması uygun olur.

ALıcı ise istediğini yapıp sonra veri geliyormu diye bakamaz. AKsini yaparsa veri kaçar gider kimse onu beklemez.
Üstelik bir veri paketi başına bir işaretçi koyularak yollanıyor. Alıcıda öncelikel işaretçiyi bekliyor. Görürse geriden gelenleri alıyor değilse boşuna beklemiyor. Bu nedenle işaretçi denilen şeyin dikkatlice kullanılması gerekir. Bir taraftan yollanan işaretçi ne ise alıcıda aynı işaretçi beklenmeli. AKsi yapılırsa hiç bir şey alamazsın. AT yollayıp karşıda A beklersen veya DD beklersen havanı alırsın .
Gerek alıcı gerekse verici programları çorbaya dönmüş. İpin ucunu kaçırmışsın. Toparlaman gerekiyor.
Verici Kaideleri:
Kaide-1: Veri önüne mutlaka bir uyandırma ekleyiniz.
Kaide-2: Veri paketininbaşına en az 3 karekterden oluşan bir işaretçi ekleyiniz
Kaide-3: programda mümkün olduğunca pause kullanmayınız.

ALıcı kaideleri:
1. Mutlaka ve Mutlaka USART kesmesi kullanın. Bunun başlıca sebebi veri başında bekleme olayının ortadan kalkmasıdır. Verinin sağlıklı alınabilmesi için geleceği yerde beklemek gerekir. Ama yapılacak başka işlerinde var ise sen işine bakıp senin yerine USART ın gelen veriyi kontrol etmesini sağlayabilirsin. Böyelce veri başında beklemez işine bakarsın. Veri geldiğinde sistem hemen kesme oluşturup gelenleri almaya başlayacaktır. Bu aşamada veri kaçırılmaması için mutlaka paket başında Preambl yani uyandırma işaretlerinin olması gerekir. Onlar USart'ı uyandırıp kesmeyi oluşturur ve program kesmeye gittiğinde bir kaç uyandırma daha alıp peşinden gelen işaretçileri alır. Böylece veri kaçırılmamış olacaktır.
2. USART kullanmayacaksanız, USART a ait define komutlarını programdan siliniz.
3. Programda fazla iş yapmadan mutlaka veri gelecekmi deiye beklemelisiniz. Burada da pause kullanmamaya özen gösteriniz. Geickme gerekiyorsa başka yöntemlerle bunu sağlayınız. Gerekiyorsa Timer gecikmeleri kullanınız.
4. Her iki tarafta da haberleşme hızının aynı olmasına dikkat ediniz.
5. Taraflardan birisi Pic yerine PC olacak ise veri paketi sonuna bir 10 (Line Feed) ve bir 13 (Carriage Return) ekleyiniz. Unutmayınız PC (RS232 standardına sahip) ile Pic (TTL standardına sahip) sinyal seviyeleri açısından farklılıklar gösterirler. PC nin LOW sinyali +10V dur
Pic Low sinyali 0V dur. PC HIGH sinyali -10V dur. Pic HIGH sinyali +5V dur. BU sinyallerin bir birine uydurulması Max232 entegresi ile sağlanmaktadır. BU nedenle PC==>PIC haberleşmesinde mutlaka bu ara birimi kullanmanız gerekir.

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

safaka123

Öncelikle ayrıntılı yazdığınız için teşekkürler.
Ben usart kullanırken portb.1 ve portb.2 rx-tx olarak kullandığımdan portb.3 teki yada portb.0 daki anahtarın kullanılamayacağını düşünemedim. sandımki sadece usart 2 pinle meşgul olur.

Pause koymak konusunda haklısınız. başta 2 gönderme arasında pause bulundurursam karşı taraf daha iyi algılar diye düşünmemden kaynaklanıyordu. Karşı tarafta bekleme süresi olduğundan senkron kayacaktır. denk gelmeyecektir.

wait ("A") komutu ise şuradan doğdu. sizin zaten derslerinizdeki devrede gayet iyi açıklamışsınız. orada serin-serout çok güzel çalışıyor. O devreyi çalışır vaziyette hala inceliyorum çalışıyorum. Fakat bu şekilde yazmam hserin çalışmadığı için A harfi de 2 göndermede ön işarette de var diye düşünüp bari A görsün arkasında ne varsa onu alsın fakat hep timeout yaptı. bir arkadaşta uyardı ben onu da dikkate aldım AT belirteci koydum o da olmadı. Bundan sonra beklemeyi iptal ettim ne gelirse onu alabileyim diye yine timeout olunca zaten olay koptu.
Tüm söylediklerinizi dikkate alarak bir kez daha düzenleyeceğim.

Sizin bir arkadaşa örnek olarak verdiğiniz bir RF programı vardı burada gönderme serout ile alış hserin ile yapılıyordu acaba bunun sebebi isis'in 2 entegredeki USART kullanımını desteklemediğinden olabilirmi? Çünkü ben hem hserin hem de hserout kullanmaya çalışıyorum.http://dl.dropbox.com/u/25364674/RF_ete.rar

USART kesmesi kullanın diyorsunuz sadece "on interrupt goto kesme" yeterli olacakmı yoksa başka registerlerde ayarlama yapılması gerekirmi. (TMR kesmelerinde ve diğer kesmelerde olduğu gibi) 16F628 için. Bu konuda o kadar çok bilgi okudum ki aklımda kirli bilgi çoğunlukta.

Kafam çorba gibi olunca belki karıştırmış olabilirim. Fakat sanırım sizin önerilerinizle doğru hedefe varacağım. 




ete

Verme işlemi daima sizin kontrolünüzdedir. İstediğiniz zaman gönderme yapabilirsiniz. O halde serout veya serout2 kullanılabilir.
Elbette pinler size gerekli değilse usart kullanarak yollamak da uygun ve emniyetli olur. Ama Serout da işinizi mükemmel görür.
Sizin kontrolünüzde olmayan alma işlemidir. O halde burada kesme kullanmak akıllıca olur. Böylece alma işinde de kontrolü ele almış olursunuz.
Sebep budur.
AT yollayıp A almak hatalı bir işlemdir. Zira  Wait("A"),AL şeklinde kullandığınız zaman sistem A harfini aldıktan sonra Veri değişkenine "T" harfini yerleştirir otomatikman. Halbuki sizin istediğini zbu değil. T den sonra gelen rakam AL değişkenine yerleşmesi lazım gelir. Bu şekilde de aldıktan sonra senkron kayması oluyor dikkat ederseniz. Bu nedenle yazdığım kaidelere uymanız menfaatiniz icabıdır.

Verdiğiniz linkte yer alan RF_Ete dosyasında yer alan Alıcı programda zaten Usart kesmesi kullanılmıştır. Örnek olarak inceleyebilirsiniz.

Temel kriterler şunlar;
Global Kesmeler açılacak (INTCON.7=1)
Peripheral Kesmeler açılacak (INTCON.6=1)
USART ALma kesmesi açılacak (PIE1.5 =1)
Kesme oluşunca gidilecek adres yada etiket belirlenecek (ON INTERRUPT GOTO KESME)

Bazen RF alıcılarındaki parazitlerde gelen veri gibi değerlendirilip kesme oluşturulmasına sebep olabilirler. Bu nedenle HSERIN komutuna bir timeout eklenmesinde yarar vardır. Serin komutlarında çalışmayan bu özellik Hserin de çok iyi çalışmaktadır.
Örnekde de bu verilmiştir. Bu gibi durumlarda da TEMP=RCREG satırı kullanılmalıdır. Bu nedenle sözkonusu satır time out sonunda gidilecek satıra yerleştirilmelidir.
Bir diğer husus da normalde kesme içinde işlemler bitirildikten sonra kesme bayrağı sıfırlanarak kesmeden çıkılır.
USART kesme bayrağı (PIR1.5) direk ulaşılabilen bir bit değildir. BU nedenle sıfırlama işlemi RCREG registerinin okunması ile otomatik yapılır.
Bu nedenle Kesme içinde alma işleminden sonra TEMP=RCREG şeklinde bir satır kullanıyoruz ki bu kesme bayrağını sıfırlamak amaçlı kullanılmıştır.
Başkada söylenecek bir şey göremiyorum.

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

safaka123

#7
Sizin verdiğiniz bilgiler doğrultusunda ve RF programınızı gözeterekten gerekli düzeltmeleri yaptım fakat sizde bakabilirseniz göreceksiniz alıcı entegrenin rx ucunu verici kısımda a portunda nereye bağlarsam sarı yanıyor. sanırım alıcı entegrenin benim bilmediğim bir port b ayarı var. hiç kesmeye dahi gitmiyor. Sanki oraya hiç bir şey bağlı değilmiş gibi. Bir ara rx ucuna pull up direnç bağladım denemek için kesmeye gitti ama doğru bilgiyi alamıyordu. sadece tepkisini gördüm. Belki bende sabahtan beri uğraştığımdan burnumun ucunu görmüyor olabilirim. Yardımcı olabilirseniz bir şey daha öğrenmiş olacağım yoluma devam edebileceğim.


Program ve isis dosyası bu adrestedir. rs232haberlaşma.rar

http://sdrv.ms/16uenNV


ete

#8
RX pini daima giriş olması gereken bir pindir. Ama sen çıkış olarak ayarlamışsın. Karşılıklı iki pinde çıkış olmuş. Birisi HIGH diğeri LOW artı ile eksi çakışıyor. Alıcı pic deki RX pinini TRIS registerinden giriş olarak ayarla sorun ortadan kalkacaktır.

Alıcı programında bir kusur var. Seri portdan 88 sayısı geldiği zaman program;
          TOGGLE LEDA
          TOGGLE ROLEA
komutlarını icra ediyor. Ancak bu komutlar çalıştıktan sonra AL=0 yapmadığın için program BASLA etiketine gidip yeniden aynı komutları sürekli çalıştırıyor.
Belki bunu bilerek yaptırmışsındır ama genellikle bu hatayı pek çok kişi yapmakta ve bu işi bilmeden yaptırmaktadırlar uyarayım istedim.
Aynı sorun Seri portdan 66 gelince de oluşuyor. KOmut icra edildikten sonra gelen veriyi sıfırlaman daha doğru olur. Böylece her veri geldiğinde ilgili komutlar yalnızca bir kere icra edilmiş olur.

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

safaka123

#9
Çok dikkatlisiniz. Teşekkürler o satırlar kopyalamadan kalan satırlar ve benim yazdığım kısım define osc den başlıyor. ve TRISB satırı aşağıda tekrar yazılıp input olarak yapılmıştı ama sanırım devreye almamış.
TRIS komutlarının belli bir yeri varmıdır. config den önce yada sonra gibi. başlangıçta yazılması doğru olur biliyorum ama bu şekilde yazıldığında ikincisini devreye almamış bir sebebi olabilir mi?

Bazen insan bakar kör oluyor. yine de çözümlenmiş olması güzel.

PORTA=0 
PORTB=0 
TRISA=%00000001   'A portu A.0 giriş diğerleri çıkış yapıldı.
TRISB=%00000000   'B portu tamamı çıkış yapıldı.

'-----------------------------------------------------------------
'@ DEVICE pic16F628                      'işlemci 16F628                                
'@ DEVICE pic16F628, WDT_on              'Watch Dog timer açık
'@ DEVICE pic16F628, PWRT_ON             'Power on timer açık
'@ DEVICE pic16F628, PROTECT_OFF         'Kod Koruma kapalı
'@ DEVICE pic16F628, MCLR_OFF             'MCLR pini kullanılıyor.
'@ DEVICE pic16F628, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak 
'---------------------------değişkenler------------------------------
define OSC 4

#CONFIG
__config _XT_OSC & _WDT_ON & _LVP_OFF & _CP_OFF & _MCLRE_OFF

#ENDCONFIG
' Set receive register to receiver enabled
'	DEFINE HSER_RCSTA	90h

	' Set transmit register to transmitter enabled
'	DEFINE HSER_TXSTA	20h

	' Set baud rate
'	DEFINE HSER_BAUD	9600

	' Set SPBRG directly (normally set by HSER_BAUD)
'	DEFINE HSER_SPBRG	12
	'DEFINE HSER_SPBRGH	0
'	DEFINE HSER_SPBRG 25
'
'DEFINE HSER_CLROERR 1
	'DEFINE HSER_CLROERR 1

'**************  AŞAĞIDAKİLERİ 2400 BOUD İÇİN STANDART KOYDUM.****************

DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 20h ' Enable transmit, BRGH = 0
DEFINE HSER_SPBRG 25 ' 2400 Baud @ 4MHz, 0,17%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically
'*************************************************************

SYMBOL  GIE  =INTCON.7  
SYMBOL  PEIE =INTCON.6  
SYMBOL  RCIE =PIE1.5    
SYMBOL  RCIF =PIR1.5

 AL     VAR  BYTE
 GIRIS  VAR  PORTA.0
 ROLEA  VAR  PORTB.0
 ROLEB  VAR  PORTB.3
 LEDA   VAR  PORTB.6
 LEDB   VAR  PORTB.7
 temp   var byte
 SYMBOL CIKIS=PORTB.5
 
TRISB=%00000010     ' PORTB.1 RX UCU İNPUT YAPILDI       <------------bu satır devreye girmemiş

AL konusunda da haklısınız orada devamlı bir hserin satırı  vardı bundan dolayı kendini sıfırlıyordu. hserin kesme içine konulduğunda orada boşluk oluştu sizin dediğiniz gibi AL=0 satırı yetti.

Kolay gelsin