İki PIC arasında haberleşmede sorun yaşıyorum, takıldım kaldım bu sorunda

Başlatan corbaci, 23 Mayıs 2013, 13:47:58

corbaci

2 adet PIC16f877A yı haberleştirmeye çalışıyorum. İki PIC'in RX ve TX uçlarını çapraz olarak bağladım. Birinci PIC'den VERI isimli değişkeni başına S harfi ekleyerek gönderiyorum, virtual terminal ile gönderilen veriyi izliyorum ve bir sorun görünmüyor.

Alıntı YapHSEROUT ["S", DEC5 VERI, 10, 13]

Düzgün bir şekilde veri iletimi yapılıyor. İkinci PIC'den de USART kesmesi ile veriyi alıyorum, verinin geldiğini anlamak içinde
PORTD.1' in ucuna bir led koydum ve her veri geldiğinde yanıp sönmesini(toggle) sağlıyorum. Buraya kadar sorun yok. İkinci PIC'de USART kesmesi oluşuyor, led olması gerektiği gibi yanıp sönüyor (kendi durumunu toggle ediyor), fakat gelen veriyi bir değişkene atıp onu da tekrar HSEROUT ile gelen veriyi göndermeye çalışıyorum fakat hiçbir değişiklik yok.

Alıntı YapHSERIN , [WAIT("S"), BILGI]
HSEROUT ["B", BILGI, 10, 13]

İkinci PIC'i için yazdığım PicBasic Pro kodunu aşağıda veriyorum. Nerede hata yapıyorum yardımcı olabilecek biri var mı acaba?

Alıntı Yap;__config _XT_OSC & _WDT_ON & _LVP_OFF & _CP_OFF
Define OSC 4
Include "MODEDEFS.BAS"
ADCON1=7
PORTA=0:TRISA=%00110100
PORTB=0:TRISB=%00000001
PORTC=0:TRISC=%10000000
PORTD=0:TRISD=0
PORTE=0:TRISE=0
TMR1IF VAR PIR1.0
T1CON=%00110001
OUTPUT PORTD.1

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

BILGI VAR word

CLEAR
INTCON=%11010000
PIE1.5=1
PIR1.5=1
ON INTERRUPT GOTO KES

BASLA:
GOTO BASLA

DISABLE
KES:
    INTCON.7 = 0
    TOGGLE PORTD.1
    HSERIN , [WAIT("S"), BILGI]
    HSEROUT ["B", BILGI, 10, 13]
    PIR1.5=0
    INTCON.7=1
RESUME
ENABLE

END

Kabil ATICI

HSEROUT ["B", BILGI, 10, 13] ifadesini

BASLA:
<<<<<<<<<<<<<<<<<<<<<<<<<<<buraya taşısan
GOTO BASLA

bilgi sıfırdan farklı olduğunda (if başlat<>0) (gerçi bir bayrakda kullanılabilir)
HSEROUT ["B", BILGI, 10, 13]
bilgi=0
şeklinde başlat döngüsünün içinde yaptırsan nasıl olur?
ambar7

ete

USART kesmesi oluştuğu zaman kesme bayrağı olan  PIR1.5 biti direk ulaşılabilen bir bit değildir.
Senin yazdığın gibi PIR1.5=0 şeklindeki komut ile bayrak sıfırlanmaz. Onun yerine TEMP=RCREG şeklinde bir komut kullanılması gerekir.
Data sheet derki bayrağın sıfırlanması için RCREG registerinin okunması gerekir der. Bu işlem otomatikman PIR1.5 bitini sıfırlar.

Bu hatayı bir düzelt. Diğer taraftan ilk veri yollanırken ;
HSEROUT ["S", DEC5 VERI, 10, 13] şeklinde bir komut kullanmışsın. Bu komut ile 5 digitlik bir şey yollamaya çalışıyorsun. ANlaşılan değişkenin word tipinde. Bu şekilde yazarsan yollanan bilgi direk rakam olarak yollanır ve bu şekilde 16 bitlik veri yollanmaz.
Aynı veri yi alırken direk rakam mı yoksa karektermi ayırmadan bir değişkene alıyorsun. Bu da yanlış burada iki yanlış var.
Birincisi Dec5 VERI yerine  yalnızca VERI ifadesini kullanman daha uygun olur. Çünki alırken aynı şekilde alıyorsun.
İkincisi Veri değişkeni Word tipinde ise yollama işlemini aşağıdaki şekilde yapman daha uygun olur.
HSEROUT ["S", VERI.byte1,VERI.byte0, 10, 13]
Diyelimki VERI=1
Bunu VERI şeklinde yollarsan yollanan bilgi 49 olur (1 rakamının ASCII karşılığı)
Bunu Dec VERI şeklinde yollarsan yollanan veri 1 olarak yollanır.

Tabiiki alırken de yollanan sıraya uygun olarak Bilgi.Byte1, Bilgi.Byte0 şeklinde bir alım kodu yazman daha uygun olacaktır.
Bunları uygula sistem kusursuz çalışacaktır.

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

corbaci

Değerli yardımlarınız için teşekkürler, şimdi denemeler yapıyorum uyarı ve önerileriniz doğrultusunda buraya yazacağım sonuçları.