SERİ RF HABERLEŞME PBP YARDIM..

Başlatan xxxxveyselxxxx, 06 Temmuz 2016, 15:23:53

xxxxveyselxxxx

Merhaba arkadaşlar  bir devre tasarladım rf haberleşme ile bir step motoru uzaktan kontrol edeceğim step motorda sürücü olarak hazır pololu sürücülerden kullandım sürücünün dir ve puls ucunu 16f628 in b.3 ile b.2 portuna bağladım  b.2de puls b.3 de ise direction ucu bağlı devrenin denemesini vericiden bağımsız deneme programıyla yapınca puls bacağından yanı portb.2 den 1 milisaniyelik low pulsiyle motoru sürünce gayet yeterli hızda step motor dönüyor fakat olayı rf ile uzaktan kontrol etmeye çalıştığımda sanırım aradaki haberleşme gecikmesinden yada seri iletişim komutlarının işletilmesindeki gecikmeden motor en minimum değerleride girsem çok yavas hızda dönüyor bu seri haberleşmedeki gecikmenin önüne nasıl gecerim komutlar aşağıdaki gibi

@ __config _INTRC_OSC_NOCLKOUT & _WDT_ON & _MCLRE_OFF & _LVP_OFF & _CP_OFF
CMCON=7
OPTION_REG.7=1
VER VAR BYTE
VER=0
TRISA=%11111100
TRISB=%00000000
PORTB=%00000000
PORTA=0
PAUSE 200
BASLA:
IF PORTA.3=1 THEN
VER=9
gosub gonder
ELSE
VER=0
GOSUB gonder
endif

pause 1
GOTO BASLA

GONDER
SEROUT2 PORTA.1,396,["Z","O","R",VER]
SEROUT2 PORTA.1,396,["Z","O","R",VER]
RETURN
END


@ __config _INTRC_OSC_NOCLKOUT & _WDT_ON & _MCLRE_OFF & _LVP_OFF & _CP_OFF 

CMCON=7
OPTION_REG.7=1

AL VAR BYTE
AL=0
TRISA=%11111011
PORTA.2=0
TRISB=%00000000
PORTB=0
PAUSE 500
BASLA
SERIN2 PORTA.1,396,[WAIT("ZOR"),AL]
IF AL=0 THEN
LOW PORTB.3
LOW PORTB.2
ENDIF
IF AL=9 THEN
HIGH PORTB.3
HIGH PORTB.2
pause 1
LOW  PORTB.2
goto SAG
ENDIF
GOTO BASLA
END




LÜTFEN KODLARINIZI KOD EKLE BUTONUNU KULLANARAK EKLEYİNİZ !

-- Yönetim --

ete

Verdiğiniz programlara iyi bakın lütfen.
Programda Goto SAG diye bir komut satırı var ama SAG diye bir etiket mevcut değil. Nasıl oluyor bu?
Bu şekilde program zaten derlenmez. Bazı yerlerini çıkartıp öyle koyuyorsunuz programları.
Her neyse böyle özensiz yazılmış mesajlara bakmıyorum bakmakda istemiyorum. Sebebi malum.
Siz özen göstermezseniz ben neden göstereyimki?
Her neyse bu defalık bir akıl vereceğim sadece,
Programın yazılış mantığı bana göre yanlış.
Bu tür programlarda verici kısımda sorun yok o sadece bir çalışma şekli belirleyip ona ait bilgiyi iletecektir.
Ama alıcıda önemli bir faktör var. Alıcı kısım her seferinde SERIN komutunu çalıştırır ise bu program kesinlikle istediğin gibi çalışmaz.
Onun yerine USART kesmesi kullanman gerek ve sadece sistem değişecek ise verici değişen durumu alıcıya iletecek, alıcıda bunu kesme ile alıncaya kadar mevcut sisteminde kesintisiz ve gecikmesiz çalışmasını sürdürecektir. Sistem değişince verici yeni durumu yollayacak alıcıda kesme oluşacak ve gelen bilgi alınıp çalışma yeni gelen duruma göre değiştirilecektir.
Kısaca alıcı sürekli bilgi alma ihtiyacı duymamalıdır. İhtiyaç olunca otomatik gelen bilgiyi almalı ama bilgi gelmiyor ise hiç istifini bozmadan mevcut düzeninde çalışmasına devam etmelidir.
Step motorla çalışırken direk CLK palsi ile çalışan bir sürücü kullanmak en doğrusu olurdu (Mesela ,L297-L298 çifti) . Böylece HPWM kullanarak serin komutundan etkilenmeyen bir CLK kaynağı oluşturulup bu şekilde de bir sonuç alınması mümkün olabilir

Ete

aRci

        merhaba hocam arkadaşı bahsettiği sürücü galiba a4988 gibi bir sürücü bende pic16f876 ile bir deneme yapmıştım sadece ihtiyaç durumunda pals vermek yeterli oluyordu diğer durumlarda süreklii bir pals vermem gerekmediği için bir pwm ile sürmeyi deneme miştim.genede pwm ile de sürülebilir.

       alıcının veri gelmediği durumda mevcut durumuna devam etmesinin olumsuz sonuçlar vereceğini düşünüyorum mesala vericinin çalışmaması yada iletişimi engelleyecek faktörler yüzünden

xxxxveyselxxxx

#3
Alıntı yapılan: ete - 06 Temmuz 2016, 19:38:07
Verdiğiniz programlara iyi bakın lütfen.
Programda Goto SAG diye bir komut satırı var ama SAG diye bir etiket mevcut değil. Nasıl oluyor bu?
Bu şekilde program zaten derlenmez. Bazı yerlerini çıkartıp öyle koyuyorsunuz programları.
Her neyse böyle özensiz yazılmış mesajlara bakmıyorum bakmakda istemiyorum. Sebebi malum.
Siz özen göstermezseniz ben neden göstereyimki?
Her neyse bu defalık bir akıl vereceğim sadece,
Programın yazılış mantığı bana göre yanlış.
Bu tür programlarda verici kısımda sorun yok o sadece bir çalışma şekli belirleyip ona ait bilgiyi iletecektir.
Ama alıcıda önemli bir faktör var. Alıcı kısım her seferinde SERIN komutunu çalıştırır ise bu program kesinlikle istediğin gibi çalışmaz.
Onun yerine USART kesmesi kullanman gerek ve sadece sistem değişecek ise verici değişen durumu alıcıya iletecek, alıcıda bunu kesme ile alıncaya kadar mevcut sisteminde kesintisiz ve gecikmesiz çalışmasını sürdürecektir. Sistem değişince verici yeni durumu yollayacak alıcıda kesme oluşacak ve gelen bilgi alınıp çalışma yeni gelen duruma göre değiştirilecektir.
Kısaca alıcı sürekli bilgi alma ihtiyacı duymamalıdır. İhtiyaç olunca otomatik gelen bilgiyi almalı ama bilgi gelmiyor ise hiç istifini bozmadan mevcut düzeninde çalışmasına devam etmelidir.
Step motorla çalışırken direk CLK palsi ile çalışan bir sürücü kullanmak en doğrusu olurdu (Mesela ,L297-L298 çifti) . Böylece HPWM kullanarak serin komutundan etkilenmeyen bir CLK kaynağı oluşturulup bu şekilde de bir sonuç alınması mümkün olabilir

Ete

Hocam haklısınız bende olsam böyle bir programı cevaplamak istemezdim fakat gerçekten özen gösterdim özellikle programın karmaşık halinden yalın halde soruna odaklı şekle çevirmek için komutları çıkardım kafam donmuştu o ara  gözden kaçmış o etiket  usart  komutunu inceledim rf haberleşme dersinizde  tam olarak kullanımını çözemedim hser  komutuyla kullanılıyor önceden belirlenmiş port üzerinden ben devrede  değişiklik yapıp o porta bağlıyacağım data uclarını programda kafamı karıştıran vericide  gönder  alt programını çağırdığınızda uyandırma  biti göndermişsiniz  sonra değişken ısı bilgisini nerede  gönderdiğinizi anlıyamadım söylediğiniz gibi step motoru hazır clk pulsli sürücüyle sürmeyi düşündüm fakat alıcıda iki adet bd140 ile h köprü şeklinde sürdüğüm dc motorda var onların hız kontrolunu yapmak için pwm kullanıyorum o ara  geçikmeler  olacak yine  mecburen hser komutu benim devreye  ilaç olacak gibi aslında basitce  byte cinsinden bir değişkenin nasıl aktarıldığını kavrasam program çözülecek

ete

Usart kesmesini öğrenmen gerekiyor. Nasıl aktive ediliyor ve nasıl kullanılıyor biraz üzerinde çalış.
Burada açıklarım ama yüzlerce kez açıkladığım konuları tekrardan açıklamak pek hoşuma gitmiyor açıkçası. Heleki açıklamada uzun oluyorsa hiç hoş olmuyor. En güzeli ders notlarıma bakıver. Ben yinede adım adım ne yapman gerekiyor açıklayacağım.
Öncelkikle USART kesmesini aktive edeceksin.  INTCON=%11000000 şeklinde hem global kesmeleri hemde peripheral yani çevresel yada yan kesme uygulamalarını aktive etmen gerekiyor. Daha sonra PIE1.5=1 vererek usart kesmesini açmış oluyorsun.
Tabiiki kesme oluştuğunda programın o etikete gitmesi için ON ONTERRUPT GOTO KESME şeklinde bir komut satırı ilave ederek programı KESME isimli alt programa yönlendirmiş oluyorsun.
Buraya kadar Receive yani ALma kesmesini aktive etmiş olduk. TX için kesme kullanmaya gerek yok. Direk senin kontrolünde olacağı için istediğin zaman vericiden yollama yapabilirsin. Ama vericide de Usartı aktive etmen gerek. Unutma USART kullandığın işlemcide TX ve RX pinlerini başka amaçlarla kullanma.
Define komutları kullanarak USART arametrelerini belirle. Örnek vermek gerekirse 4 Mhz sistem frekansı ile yapılacak haberleşme için parametreler;
2400 Baud rate kullanacağımızı varsayarak ;
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

şeklinde veriyoruz. Bu değerleri kolaylıkla picmulticalc.exe isimli program size verebiliyor. Bu satırları programın başına ekledikmi işlem tamam demektir.

Daima uyandırma sinyali kullanmalısın. USART aslında bu iş için ayrılmış bir Buffer kullanarak çalışır. Sinyal geldiğinde geri planda çalışan işlemci programı bunu algıkar ve hemen buffer'e gelen bilgiyi yerleştirir. Bu nedenle uyandırma sinyali kullanıyoruz. Nedir bu dersen;
   HSEROUT [REP$AA\5,REP$00\5,REP$FF\5]'uyandirma sinyali preambl
şeklindeki komut satırı bu işi yapar. 5 adet $AA , 5 adet sıfır bilgisi ve 5 adet de $FF bilgisi yollayarak işlemciyi asıl veriyi alacak şekle sokar. Ardından     HSEROUT ["Z","O","R",VER] komut satırı ile yollayacağın bilgiyi yollarsın.
İşin asıl püf noktası alıcı kısmıdır. Unutma kesme yalnızca Alıcı da kullanılır. Vericide yalnızca Define satırları ile USart parametrelerini verirsin ama kesme açmazsın.
Alıcıda kesmeleri açtın uyandırma sinyali alıcıya ulaştığı an kesme oluşur. Program kesme etiketine atlar ve orada;
DISABLE
KESME:
    HSERIN , [WAIT("ZOR"),VERI]   
    TEMP=RCREG
    Resume
    enable

komut satırları ile gelen bilgi alınıp VERI isimli değişkene yerleştirilir. TEMP=RCREG kesme bayrağını sıfırlama işlemidir. RCREG registeri direk ulaşılabilir bir register değildir. İçindeki değeri bir başka değişkene aktardığın anda bayrak otomatik işlemci tarafından sıfırlanır.
Bazen ana programda kesme oluşup bilgi alındığını anlamana yarayan bir mantık kullanman gerekir. Ben bunu şu şekilde yapıyorum.
DISABLE
KESME:
    HSERIN , [WAIT("ZOR"),VERI]   
    ALDI=1
    TEMP=RCREG
    Resume
    enable

ALDI bit değişkeni olup  bilgi geldiğinde değeri 1 oluyor. Ana programda;
IF ALDI=1 then
  ALDI=0 önce bit değişkenini sıfırlıyoruz
  Bu satırlara ise artık yeni gelen bilgi ile ne yapılacak ise onları yazıyoruz
  Bu şekilde sistemler sorunsuz çalışıyor.

Ete

Powered by EzPortal