0

PIC 16F877 PC Haberleşmesi

Başlatan 0nur, 15 Mart 2013, 20:25:17

0nur

Merhaba arkadaşlar,

Bayağıdır mikrodenetleyiciler üzerine çalışmalar yapıyordum fakat ilk kez seri iletişim kullanarak PC ile haberleşme kullanmamı gerektiren bir durum karşıma geldi..

İki PIC'i arasında seri haberleşme uygulamaları ile de uğraştım fakat PC ile olan durumda bazı sıkıntılar var.

Öncelikle kodu ekleyeyim;


@ __config _HS_OSC & _WDT_OFF & _PWRTE_OFF & _LVP_OFF & _CP_OFF
'-------------------------------------------------------------------------------
define osc 10
Include "Modedefs.Bas"
TRISA=255
TRISD=0
trisb=0


symbol ARTI=PORTA.0
SYMBOL EKSI=PORTA.1
SYMBOL S1=PORTD.0
SYMBOL S2=PORTD.1
SYMBOL S3=PORTD.2
SYMBOL S4=PORTD.3
symbol led=portb.0



ADCON1=7
PORTD=0




SDEGER VAR BYTE[5]
Deger var byte:ServoNo var byte     : x var byte



for x=1 to 10
led=1
pause 1000
led=0
pause 1000
next


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

CLEAR



'-------------------------------------------------------------------------------
   
basla:

'================ SERİ BİLGİ OKUMA ====================;
'SERIN2 PORTA.3,400,[WAIT("ERC"),Sdeger[1],SDEGER[2],SDEGER[3]]
'=============================================================
'Veya;
SERIN2 PORTA.3,396,[WAIT("ERC"),deger]


if ServoNo=1 then             
led=1
endif

if ServoNo=1 then Sdeger[1]=Deger
if ServoNo=2 then Sdeger[2]=Deger
if ServoNo=3 then Sdeger[3]=Deger
if ServoNo=4 then Sdeger[4]=Deger


gOTO BASLA




DISABLE


KESME:

'================ SERVOLARA DEĞER GÖNDERME ====================;
PULSOUT S1,SDEGER[1]
PULSOUT S2,SDEGER[2]
PULSOUT S3,SDEGER[3]
PULSOUT S4,SDEGER[4]
PAUSE 20
'==============================================================;

     
         INTCON.2=0        'TMR0 Kesme bayrağı sıfırlanıyor
         RESUME
         ENABLE
         
END
'-----------------------------------------------------------------------------------

     
 


Buradaki amacım Seri porttan gelen ilk veri ile çalıştıracağım servoyu belirlemek , sonrasında gelen açı değerince servoyu döndürmek.

Fakat kod çalışmayınca bende sadece seri bilgi olarak 1 gelirse led yansın diye basit bir denetleme durumu oluşturdum.

Verici olarak MicroCodeStudio'nun Serial Comunnicator'ü kullanıyorum.

Şuan hiçbir veri alamıyorum.Bu konuda tecrübe ve bilgi sahibi arkadaşlar yardımcı olabilirse çok sevinirim.

ete

Şayet bilgileri doğru yollayabiliyorsan senkron sorunun var demektir. Buda muhtemelen her 6,5 ms de oluşturduğun tmr0 kesmesinden kaynaklanıyordur. 10 mhz lik kristal kullndığın zaman bir komut çevrim süresi 0,4us dir. 1/64 bölme oranı ile kesme oluşturma süresi 0,4 x 256 x 64=6553us olacaktır. Usart kesmesi kullansan belki kurtaracak ama kesme olmadan bu süre zarfında gelenleri alman biraz zor gözüküyor.
Madem servo çalıştırıyorsun kesme süren 20 ms olmalı. Bu durumda bölme oranını 256 ya çıkartıp tmr0 a da 61 ön değeri verirsen yaklaşık 20 ms de bir kesme oluşturabilirsin. Zira 256-61=195 sayacak olan timer0  her kesmede aslında 0,4 x 256 x 195=19968 us zaman geçirmiş olur komut gecikmeleriöile birlikte bu 20 ms civarında gerçekleşir. Bu ise servoların normal peryot süresidir. Kesme süresi 20 ms yeye çıkınca seri haberleşmenin gerçekleşme şansıda artacaktır.
Aslında haberleşmenin gerçekleşmesi için serin komutundan önce global kesmelari kapatıp haberleşmeden sonra açarsan belkide daha iyi haberleşebilirsin.
Ayrıca kesmeleri kapatıp yine haberleşme oluyormu diye bakabilirsin.
Ete

0nur

Alıntı yapılan: ete - 15 Mart 2013, 21:21:18
Şayet bilgileri doğru yollayabiliyorsan senkron sorunun var demektir. Buda muhtemelen her 6,5 ms de oluşturduğun tmr0 kesmesinden kaynaklanıyordur. 10 mhz lik kristal kullndığın zaman bir komut çevrim süresi 0,4us dir. 1/64 bölme oranı ile kesme oluşturma süresi 0,4 x 256 x 64=6553us olacaktır. Usart kesmesi kullansan belki kurtaracak ama kesme olmadan bu süre zarfında gelenleri alman biraz zor gözüküyor.
Madem servo çalıştırıyorsun kesme süren 20 ms olmalı. Bu durumda bölme oranını 256 ya çıkartıp tmr0 a da 61 ön değeri verirsen yaklaşık 20 ms de bir kesme oluşturabilirsin. Zira 256-61=195 sayacak olan timer0  her kesmede aslında 0,4 x 256 x 195=19968 us zaman geçirmiş olur komut gecikmeleriöile birlikte bu 20 ms civarında gerçekleşir. Bu ise servoların normal peryot süresidir. Kesme süresi 20 ms yeye çıkınca seri haberleşmenin gerçekleşme şansıda artacaktır.
Aslında haberleşmenin gerçekleşmesi için serin komutundan önce global kesmelari kapatıp haberleşmeden sonra açarsan belkide daha iyi haberleşebilirsin.
Ayrıca kesmeleri kapatıp yine haberleşme oluyormu diye bakabilirsin.
Ete

Cevabınız için teşekkür ederim.Aslında 2 pic'i seri haberleştirirken bu kodda hiçbir sıkıntı yok fakat bilgisayar işin içine girdiğinde tamamıyla farklı problemler oluştu.Normalde 2 pic haberleşirken aynı kod ile gayet istenildiği gibi verileri işleyebiliyordum.Burada Usart kesmesinden bahsettiniz onu nasıl kullanabilirim?

Bilgisayar-pic iletişimi ile ilgili örnek bir döküman mevcutsa paylaşabilirseniz çok sevinirim.


ete

Usart kesmesi için sitede pek çok örnek var. Rf ile ilgili projelere bakıver. Algoritma kısmında mastervslave çalışmasıda olması gerek.
İki pic arasında sorun yok ise pc ile de sorun olmaması gerekir. O zaman sorun bilgi yollama şeklin ve seviye uyuşmazlığı olabilir. Simulasyonda denediğini düşünerek detaya girmemiştim ama hala gerçek devrede denemediğini düşünüyorum.
Ete

0nur

Evet Pic'ler arasındaki haberleşmeyi smilasyon ortamında denedim.Fakat iletişim kısmında problem olsa smilasyon ortamındada çalışmaması gerekmezmi ?

Bilgisayardan veri gönderirken micro code'un serial communicator arayüzünü kullanıyorum veri gönderme esnasında da sıkıntı olabilir ama tam olarak çözemedim durumu..

ete

Hyper terminalden de veri yollayabilirsin. Yada ekrana bir hyper terminal yerleştir rx kısmını hatta bağlayarak data olarak ne geldiğine bak istersen.
Ete

0nur

Merhaba olayı daha basite indirgeyerek şöyle bir yazılım yaptım.

Include "Modedefs.Bas" 
TRISA=%00000000
TRISD=255
trisb=0
TRISC=%10000000

define osc 10
DEFINE HSER_BAUD 2400
DEFINE HSER_SPBRG 5
DEFINE HSER_RCSTA 90h
DEFINE HSER_TXSTA 20h
DEFINE HSER_CLROERR 1


symbol led=portc.0
symbol led2=portc.1



ADCON1=7
PORTD=0





ServoNo var byte : X VAR BYTE   

led2=0



for x=1 to 5
led=1
pause 1000
led=0
pause 1000
next


OPTION_REG=0    'Pull up dirençleri İPTAL- Bölme oranı 1/64.


basla:


hserin [sERVONO]

if ServoNo=65 then 
led2=0         
led=1
endif



gOTO BASLA


timeout:
led2=1

goto basla
end                         





bu şekilde bir yazılım yaptım.Gönderilen verinin gittiği konusunda bir sorun yok.C de yazılmış bir kod ile vericiden 65 gelirse led yansın diye bir program ile denemeyi gerçekleştirdik.Bu noktada kartta ve bilgisayar yazılımında bir sorun olmadığını test ettim. Fakat alıcı yazılımında bir problem var.Donanımsal seri bilgi alımı için HSERIN komutunu kullandım.Fakat sürekli program timeoutta kalıyor.

Acaba konfigirasyonlarda mı bir hata yaptım yada başka nerede sıkıntı olabilir?

Powered by EzPortal