uart kesmesinde hata

Başlatan gokhangokcen, 12 Haziran 2009, 11:08:52

gokhangokcen

cümleten selamlar aşağıda bir kod yazmaya çalıştım forumdan bir arkadaş yazmış kesme bölümünü ordan bakarak yazdım fakat rx ve tx pinleri sürekli '1' konumunda kaliyor ve kesmeye gitmiyor.Basit bir seri gelen bilgiyi okuyup geri göndermek istiyorum.birde seri giriş çıkış pinlerinin yani C6 ve C7 pinlerinin tris yazmacında giriş olarakmı çıkış olarakmı tanımlanması gerek acaba?bu konuda yardımlarınızı bekliyorum.iyi çalışmalar

Device  16F877A 
    XTAL    = 20 
'    Config  CP_OFF , BODEN_OFF , PWRTE_ON , WDT_OFF ,HS_OSC , LVP_OFF 

Declare HSERIAL_BAUD 9600 
Declare HSERIAL_RCSTA %10010000 
Declare HSERIAL_TXSTA %00100000 
Declare HSERIAL_CLEAR = On
    
    'Declare LCD_DTPIN PORTB.0	'DATA girişi PORTB'nin 4. ucundan başlayacak
    'Declare LCD_ENPIN PORTB.4	'LCD'nin ENable ucu
    'Declare LCD_RSPIN PORTB.5	'LCD'nin Register Select ucu
    'Declare LCD_INTERFACE 4	'LCD veri yolu 4 bit olacak
    'Declare LCD_LINES 2		'LCD 2 satırdan oluşuyor


 
Dim GELENVERI As Word 
Dim var1 As Word

INTCON.7=1 
INTCON.6=1 
PIE1.5 = 1 

ALL_DIGITAL = TRUE 

TRISA=0 
TRISB=0 
TRISC=0 
TRISD=0 
PORTA=0 
PORTC=0 
PORTB=0 
PORTD=0 

On Interrupt GoTo intr 

main:

var1 = GELENVERI

DelayMS 100


GoTo main 


Disable 
intr:
 
If PIR1.5 = 1 Then 
GELENVERI = RCREG 
HSerOut[GELENVERI] 

 

  
EndIf 

PIR1.5=0 
Resume 
Return
Bildiğini paylaşmak, Allah'ın verdiği öğrenme yeteneğinin zekatıdır.

MURSEL

veri gönderirken (tx)pin cıkış olarak , veri alacagımız pin de (rx) giriş olmalıdır

basic den anlamam ama

TRISC=0

c portu pinlerinin hepsinı cıkış yapmısın
TRISC=128; //0b10000000 //0x80 rx pinini  giiş olarak ayarlayıp tekrar dene bakalım

gokhangokcen

mursel hocam dediginiz şekilde rx pinini giriş tx pinini çıkış olarak ayarladım en azından şu an virtual terminalden coma veri geldiğini görebiliyorum isisde fakat pic gelen ifadeyi almıyor.protonda uart kesmesi kuran arkadaş varsa yardımcı olabilirmi acaba?

Saygılar
Gökhan
Bildiğini paylaşmak, Allah'ın verdiği öğrenme yeteneğinin zekatıdır.

Tagli

Normalde hem RX hem de TX girişe ayarlanmalı. Ama belki derleyicinin komutları kullanıcının TRIS ayarlarını bastırarak bacakları kendi bildiği gibi ayarlıyordur.
Gökçe Tağlıoğlu

ete

Gördüğüm kadarı ile bir iki sistematik hata var programda.

Birincisi  kesme kısmında şayet başka bir kesme yaratma sebebi kullanılmamış ise ;

If PIR1.5 = 1 Then
  GELENVERI = RCREG
  HSerOut[GELENVERI]

EndIf

satırlarının kullanılması anlamsız. Çünki zaten bir USART kesmesi oluşacak ve PIR1.5=1 olduğu içinde program kesme kısmına geçecektir. Buradaki
IF PIR1.5 şeklinde başlayan satır anlamsız.

İkincisi hemen if satırının altında yer alan ifadede
GELENVERI=RCREG   şeklinde bir kullanım şekli ile bir veri alınması zor gözüküyor. Gönderilen verinin ne olduğunu bilmeden yorum yapmak zor ama işin doğrusu gönderilen bilgi paketinin başına  uyandırma bitleri koyulmalı (5 bit $55, 5 bit $00, 5 bit $1F) ve bu bitlerin hemen ardından da gönderilecek veri yollanmalıdır.
Alıcı kısmında gelen uyandırma bitleri USART'ı aktif hale getirecek ve muhtemelen bu uyandırma bitlerinin bir kısmı ile uyandırmadan sonra gelen veri byte yada byte ları alınacaktır. İşin bu kısmında birde senkron problemi çıkar. Bu nedenle doğru haberleşmede bir senkron işareti gönderilmeli alıcıda bu senkron bilgisini yakaldıktan sonra gerisinden gelenleri sırası ile almalıdır. Bir örnek vermek gerekir ise
VERICI :
HSEROUT [$55\5 , $00\5 , $1F\5]     '.....yani 10101  00000  11111 bilgisi
HSEROUT ["V","E","R",veri]

ALICI: (kesme kısmında)
HSERIN [wait("VER"),Al]
HSEROUT ["G","I","T",Al]
TEMP=RCREG
RESUME
ENABLE

görüldüğü gibi verici göndereceği bilgiyi VER işareti ardından yollamakta alıcı ise önden gönderilen uyandırma bitleri ile USART kesmesini  çalıştırmakta ve VER işaretini bekleyip onu almakta ve ardından AL değişkenine yollanan Veri bilgisini almaktadır.
Hemen ardından da GIT işareti altında gelen veriyi geriye yollamaktadır.
Bu işlemden sonra  PIR1.5 bayrağının silinmesi gerekir. Bu yalnızca okunabilen bir bayrak olduğu için silinmesi donanımsal yapılır. Bununda yolu
GELENVERI = RCREG
komutudur. RCREG registerini boşalttığın anda bayrak otomatik sıfırlanır. Senin programda birde,
PIR1.5=0  şeklinde komut varki bu yanlıştır. Bu şekilde flag (bayrak) silinmez.  RCREG bir başka değişkene aktarıldığı anda zaten bu bayrak sıfırlanacaktır.
Kesme kısmından çıakrken RETURN ile çıkılmaması gerekir. Programı kesmeden önce gelinen yere RESUME komutu otomatik olarak döndürür. Tabiiki RESUME dan sonra birde kesmelerin yeniden açılması için ENABLE komutunun koyulması gerekir.

İşin temeli bu şekilde olup denemeni öneririm.

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

gokhangokcen

Sayın ETE hocam yorumunuz için teşekkür ederim söylediğiniz sistemi uyguladım ve gayet güzel bir şekilde seri kesmeyi oluşturabiliyorum seri bilgi geldigi gibi geri gönderen program düzenledim ve belki başkalarına yararı olur programı paylaşmak istedim tekrardan sağolun iyi günler...

[code]'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2008 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 30.09.2008                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
Device  16F877A
   XTAL    = 20
'    Config  CP_OFF , BODEN_OFF , PWRTE_ON , WDT_OFF ,HS_OSC , LVP_OFF

Declare HSERIAL_BAUD 9600
Declare HSERIAL_RCSTA %10010000
Declare HSERIAL_TXSTA %00100000
Declare HSERIAL_CLEAR = On




Dim GELENVERI As Word
Dim x As Byte
Dim var1 As Word
Dim al As Word
Dim temp As Word

INTCON.7=1
INTCON.6=1
PIE1.5 = 1

ALL_DIGITAL = TRUE

TRISA=0
TRISB=0
TRISC=%10000000
TRISD=0
PORTA=0
PORTC=0
PORTB=0
PORTD=0

On_Interrupt GoTo intr

main:

var1 = GELENVERI




DelayMS 1000

GoTo main


Disable
intr:
HSerIn [Wait("#"),al]
HSerOut [al]
temp=RCREG
temp=TXREG
Resume
Enable
Bildiğini paylaşmak, Allah'ın verdiği öğrenme yeteneğinin zekatıdır.