Y

pic16f877 serin ve serout beraber çalışması

Başlatan YasarGunaydin, 24 Şubat 2014, 13:14:29

YasarGunaydin

Arkadaşlar Merhaba;
Yardımınıza ihtiyacım var,Visualbasic ile haberleşme.Pic16f877 ana menüde yazılan normal işlemleri yaparken bir taraftanda dinleme yaptırmak ve gelen veriye göre işlem işlem yapmak istiyorum.2-3 aydır boş kaldıkça komut denemeleri yapıyorum,intte araştırmalar yapıyorum yapamadım .Lütfen yardım edin.

TRISA=%11111111     'portA giriş yapıldı
TRISB=%11111111     'portB giriş yapıldı
TRISC=%10000000
TRISD=0
'-------------------------------------------------------------------------------
@ DEVICE pic16F877
@ DEVICE pic16F877, WDT_on
@ DEVICE pic16F877, PWRT_ON               
@ DEVICE pic16F877, PROTECT_OFF
@ DEVICE pic16F877, XT_OSC


SO VAR PORTC.6
SI VAR PortC.7

DEFINE OSC 4
ADCON1=7 '7. bit 1 yapıldı 10 bit sonuç almak için.
'-------------------------------------------------------------------------------   
ON INTERRUPT GoTo KESME   'kesme oluşursa KESME adlı etikete git.
OPTION_REG=%10000101   'Pull up dirençleri İPTAL- Bölme oranı 1/64.
INTCON=%10100000  'Kesmeler aktif ve TMR0 kesmesi aktif
TMR0=0

DEFINE HSER_TXSTA 20h   'I wonder shall I define as DEFINE HSER_TXSTA 24h???
DEFINE HSER_RCSTA 90h   'same for all

DEFINE HSER_BAUD 2400   'for 2400 Baud rate
'DEFINE HSER_BAUD 4800   'for 4800 Baud rate
'DEFINE HSER_BAUD 9600   'for 9600 Baud rate

DEFINE HSER_SPBRG 25      'for 4Mhz/2400 & 8Mhz/4800 with an error %0.16
'DEFINE HSER_SPBRG 12   'for 4Mhz/4800 & 8Mhz/9600 with an error %0.16
DEFINE HSER_CLROERR 1   'same for all



GELEN VAR WORD 'VISUAL BASICTEN GELECEK OLAN VERİ
SYMBOL GONDER1=PORTB.4   'GONDER1
TERMIK VAR WORD
BRULOR VAR WORD
A var byte 'devamlı göndermesin diye
B VAR BYTE  'devamlı göndermesin diye

PORTD=%00000000

BASLA:

IF GONDER1=0 THEN
Intcon.5=0 'KESMEYİ KAPAT
TERMIK=120
IF A=0 THEN SEROUT SO,2400,[#TERMIK]
A=1
ENDIF

IF GONDER1=1 THEN
Intcon.5=1 'KESMEYİ AÇ
TERMIK=200 
IF A=1 THEN SEROUT SO,2400,[#TERMIK]
A=0
ENDIF

'GELEN VISUAL BASICTEN GELECEK OLAN VERİ ,
IF GELEN=65 THEN PORTD=%00010000
IF GELEN=92 THEN PORTD=%00100000 

GOTO BASLA

DISABLE


KESME:
  IF  (GONDER1=1 ) THEN
'SERIN SI,2400,GELEN
PORTD=%00000000
'HSerIn 100,BASLA,[Wait ("92")]
ENDIF
   
   IF  GONDER1=0  THEN

      PORTD=%11111111
      Intcon.5=0 'KESMEYİ KAPAT
      ENDIF
       
INTCON.1=0        'TMR0 Kesme bayrağı sıfırlanıyor
RESUME
ENABLE 
       
END

ete

Programa bakınca sağdan soldan toplanmış olduğu açıkça belli oluyor. Toplama işlerden de pek hayır çıkmaz biliyorsun.
İşin mantığına erip kendine uygun kodlar yazmadan bu iş olmaz.

Yapmakistediğin iş ancak ve ancak USART kesmesi ile yapılabilecek bir şey iken hiç alakası olmayanbir yöntem tutturmuşsun.
Veri gelişini kesme ile kontrol etmeyi planlamışsın ama kesem yalnızca Tmr0 kesmesi olup belirli aralıklarla veri kontrolü yapmayı amaçlıyor. Düşünce olarak belki fena değil ama hesaba katmadığın bir olay var, Programda bir kesme tanımlanmış ise ve çalışma esnasında kesme oluşmuş ise basic o esnada işlediği komutu tamamlamadan kesme etiketine gitmez.
Serin komutu programı bloke eden komutlardan birisidir. İstenen veri gelinceye kadar komut programı bloke eder ve ancak 65535 ms sonra timeout olur. Bu nedenle kullanmayı sevmediğim sakıncalı komutlardan birisidir. Hal böyle olunca senin düşündüğün sistem çalışmaz ve istediğini bu yolla yapamazsın.

Peki o kadar araştırma yapmışsın hiç anlamadınmı bu işin ancak USART kesmesi ile yapılabileceğini?. Yeterince araştırmadığını sanıyorum. Her neyse sitede USART kesmesi ile ilgili açıklamalar mevcut. Ete projelerinde RF termometre projesini incele.

Yapman gereken şey normal program akışı içinde HSEROUT komutu ile yollayacaklarını yollayacak ve ancak bir veri gelirse Kesme etiketine gidip veri alacaksın. Verilen verinin başına bir işaretçi yerleştirmeyi ihmal etme. Otomatik olarak alma komutunda (HSERIN) bir işaretçi beklenmesi gerekir.

Ete

Powered by EzPortal