A

seri iletişim sorunu

Başlatan alikeskinkilic, 28 Eylül 2011, 13:57:43

alikeskinkilic

merhaba ete hocam benim sorunum 877 ile pot kontolu yapıp analog veriyi 10 bit dijital olarak 16f84a ya gönderip pot durumuna göre servo motoru seri olarak kontrol etmek.bunu da
ad sonucu 877 den k değişkenine yükleyip  örnek olarak şu şekilde gönderdim.
k var word
SEROUT2 PORTA.0,3313,[(A),K]
84 a da. bu veriyi
SERIN2 PORTA.0 ,3313,[WAIT ,A, K] ŞEKLİNDE ALDIM
K nın üst değerinin 1023 olmasını bekler iken 84 a da örneğin

portb.1=1
pauseus K 'yani 1023
portb.1=0
K burda byte gibi okunuyor yada gönderirken bişeyler oluyor ve maksimum  255 lik bir gecikme yapıyor 
ve pot ile oynadığımda düzenli şekilde bu değer 0 dan 255 e bile yükselmiyor bi yükseliyor belli bi seviyeden sonra tekrar düşüyor tekrar yükseliyor bir türlü çözemedim yardımlarınızı bekliyorum

inventor

Gönderme ve alma komutunu

SEROUT2 PORTA.0,3313,[("A"),K]

SERIN2 PORTA.0 ,3313,[WAIT ,("A"), K]

şeklinde denermisiniz?
İlmin en büyük düşmanı, sabırsızlıktır. (Şems-i Tırmizi)

ete

Ali,
Serout2 komutunda kullandığın A bir işaretçi karekteri ise yollama şeklin yanlış
Doğrusu;
SEROUT2 PORTA.0,3313,["A",K]
şeklinde olmalı.
Diğer taraftan K word tipinde bir değişken ise 16 bitliktir. Seri datalar 8 er bit olarak yollanırlar. BU nedenle K değişkeni yollama şeklinde şöyle olmalı;
SEROUT2 PORTA.0,3313,["A",K.byte1,K.byte0]

Baud rate olarak 300 kullanmışsın bu çok düşük bir değer. Hiç gerek yok. İŞlemciler 1200-2400 baud rate ile kolaylıkla ve sorunsuzca haberleşebilirler.

Mesajının son kısmında bahsettiğin sorun K değerinin yalnızca LowByte ının yollanıyor olmasından kaynaklanıyor. Yukarıdaki gibi düzeltirsen sorun ortadan kalkacaktır.
Unutmadan söyleyim Wait kısmını değiştirince alıcı kısmında aşağıdaki gibi değiştirmen gerek.
SERIN2 PORTA.0 ,3313,[WAIT("A"), K.byte1, K.byte0]

Ete

alikeskinkilic

#3
kodlar yanımda diil şimdi başka pc deyim ama onları örnek olarak vermiştim dediğiniz gibi yaptım  zaten benim sorunum gönderme sorunu diil word olarak gönderemiyorum yada alamıyor

***
hocam
SERIN2 PORTA.0 ,3313,[WAIT("A"), K.byte1, K.byte0]
SEROUT2 PORTA.0,3313,["A",K.byte1,K.byte0]
bu örnekleri deniycem çok teşekkürler 300 b ile gönderme konusu ise iletişimi yavaş yapmamın sebebi bu sinyalleri ses sinyalleri ile taşımak istemem yuksek hızları analog ses sinyallerinden ayırmam daha zor olur diye bitler fm modulator yardımı ile module edilecek alıcı kısmında ses sinyallerinden datayı süzmeye çalışacam amacım bu bakalım ne olucak bu arada
seri iletişimde sinyaller bipler halinde ses sinyaline dönüşüyor her 1 için bir bip telefon ile denedim büyük ölçüde hallettim dijital veri almayı.

alikeskinkilic

hocam okadar aradım seri olarak word gönderme ile ilgili bişey bulamamıştım çok teşşekkür ederim .bu arada siteniz hayırlı olsun yeni gördüm inşallah biter benim projem de sitenizde yayınlamak nasip olur

pwm3434

ETE hocam benim de seri  iletişim hakkında buna  benzer bir  sorunum olduğu  için  başka bir  konu  başlığı  açmak  istemedim.

projemin içeriği r/c modeller  için esc  ve  servo  kontrolu  hakkında.
seri  iletişim denemelerimi  şu an  için  board  üzerinde  yapmaktayım, daha  henüz  rf denemedim. 

verici  kısmındaki  pıc  ile ürettiğim adc bilgilerini diğer  bir  pic'e serout2  komutuyla  gönerip  alıcı  tarafındaki pıc ilede  serın2  ile  alıp aritmetik  işlem  sonrasında tek  bir tane servo  için gerekli  olan  pulsları elde  ettim  ve servoyu  sorunsuz  kontrol  ettim, buraya  kadar  da  bir  sorunum  olmadı. şunu yapamıyorum  eş zamanlı  olarak  yanı  aynı anda iki  ayrı  servoyu kontrol etmek.   kodlarımı ekliyorum  ete  hocam  ve  diğer  ustalar  size zahmet  bir  bakın.

buyurun bunlarda  uygulamada ki kodlarım ekte de protous çizimimde  var. bu  kodlar  ile sadece  AL0 değişkeninde ki  rudder  puls  bilgisini elde  edebildim, AL1 değişkenine de hiç  bir  bilgi  atanmıyor  LCD de kontrol ettim, halbuki bana  gerekli olan ise sistemin  gereksimine   göre AL0 ve AL1 değişkenlerine atanan ad bilgilerinin  ikisi de  aynı  zamanlı  olarak  olarak  yollanıp, iki  servoyu  kontrol etmek.

veri ile alıcı bir  arada

TRISA=%000011:TRISB=0:TRISC=0
[move]verici[/move]

PORTA=0:portb=0:portc=0
INCLUDE"TANIM16f876"
INCLUDE"TANIMLCD"
DEFINE OSC 4
'-----------------------------------------
DEFINE ADC_BITS 8 'A/D çevirim sonucu kaç bit olacak
DEFINE ADC_CLOCK 3 'Clock kaynağı (3=rc)
DEFINE ADC_SAMPLEUS 100 'Örnekleme zamanı mikro saniye cinsinden.
'-------------------------------------------------------------------------------
ADCON1=%00000100 '7. bit 1 yapıldı 10 bit sonuç almak için.
HAM0   VAR BYTE
HAM1   VAR BYTE
LOWW0  VAR WORD
HIGHH0 VAR WORD
X VAR BYTE
X=0:HIGHH0=0:LOWW0=0:HAM0=0:HAM1=0

PAUSE 500:LCDOUT $FE,1:LOW PORTB.2 'LCD -R/W bacağı LOW'a çekildi.
BASLA:'------------------------------------------
GOSUB OKU
GOSUB VER         
LCDOUT $FE,$80,"HAM :",DEC3 HAM0
LCDOUT $FE,$C0,"BLD :",DEC3 HAM1
PAUSE 200
GOTO BASLA
OKU:
ADCIN 0,HAM0
RETURN
VER:
SerOut2 PORTB.0,396,["E","T","E",HAM0]
SerOut2 PORTB.0,396,["S","L","M",HAM1]
RETURN
END


[move]alıcı[/move]

TRISA=%000001:TRISB=0:TRISC=0
PORTA=0:portb=0:portc=0
INCLUDE"TANIMLCD"
INCLUDE"TANIM16f876"
DEFINE OSC 4
'-------------------------------------------------------------------------------
ADCON1=7
LOWW0  VAR BYTE
HIGHH0 VAR WORD
AL0    VAR WORD
AL1    VAR WORD
X VAR BYTE
X=0:AL0=0:AL1=0:HIGHH0=0:LOWW0=0
CLEAR 'tüm değişkenler sıfırlandı
PAUSE 500:LCDOUT $FE,1:LOW PORTB.2 'LCD -R/W bacağı LOW'a çekildi.
BASLA:'------------------------------------------
GOSUB AL
LCDOUT $FE,$80,"RUDDER :",DEC3 AL0
LCDOUT $FE,$C0,"BLD    :",DEC3 AL1
PAUSE 500
IF  HIGHH0>50 THEN 'rudder
FOR X=1 TO  50
HIGH PORTB.0
PAUSEUS  HIGHH0
LOW  PORTB.0
PAUSEUS LOWW0
NEXT
ENDIF           
GOTO BASLA
AL:
SerIn2 PORTA.0,396,[WAIT("ETE"),AL0]
SerIn2 PORTA.0,396,[WAIT("SLM"),AL1]
HIGHH0=AL1*11
LOWW0=20000-AL1'Servo pulsının low süre hesabı
RETURN
END
 

ete

Kullandığın mantık bence yanlış.
SerOut2 PORTB.0,396,["E","T","E",HAM0] komutunu verdiğin zaman program orada 65535 ms ETE bilgisi gelecek diye bekler.
Hiç bir zaman bir sonraki satıra hemen atlamayacaktır. Bu nedenle senkron denilen şeyi kayıp edersinve ikinci satırı hiç bir zaman alamazsın.
Anlayamadığım husu SerOut2 PORTB.0,396,["E","T","E",HAM0,HAM1]  şeklinde tek satırla iki değişkeni birden neden almıyor veya neden yollamıyorsun. İkinci serout ve serin satırına gerek yok ki.
Ayrı işlemciye bunu aldırsan o zaman anlarım Ama tek işlemciye iki serin komutu fazla gelir ve senkron yakalamak mümkün olmaz.
Çaresi ya tek satırda iki değişken olarak verecek ve alacaksın yada USART kesmesi kullanacaksın.

Ete

pwm3434

#7
ete  hocam  tek satırda iki  değişken  göndermeyi  düşünmüştüm ama  olmaz  diye  hiç  denemedim.olmayışının sebebini şuna  bağladım; eğer  iki   değişkeni tek  serout2 satırında  gönderirsem serın2 ile  aldığımda nasıl  ayıracağım 2  değişkeni, eğer  ayrırılıyorsa da  bunu  bilmediğim  için  çaresiz  kaldım.  sorun   yok  eğer dediğin  gibi  yapınca  iki  ayrı  servoyu değişkenlerdeki  değerlere göre     hareket  ettirebilirsem. yani misal  verecek  olursam  değişkenin  birinde 90  derecelik  servo  bilgisi  diğer  değişkende de 180  derecelik  servo  bilgisi olduğu farz edelim hocam.

verici de  SerOut2 PORTB.0,396,["E","T","E",HAM0,HAM1]
alıcı da    Serınt2 PORTB.0,396,10,SERVO,[WAIT("ETE"),AL0,AL1] sorout2 ile gönderilen 2 değişkenden  birisi serın2 deki  değişkenin birine  ve serout2 deki  değişkenin diğeri de serın2  deki  değişkenin  diğerine atanmış olacak anladığım  kadarıyla.

  hocam serın2 komutuna eklediğim tımeout'dan randıman alabilirmiyim ki çünkü rf haberleşme sitemleri  dersinizde serout ve  serout komutlarında  tımeout'un  randımanlı  çalışmadığını  ve   usart kesmesininde   sorun  çıkartmadan çalıştığını yazmışınız.tabiki  çok duyarsız kalırsa mecburen  usart  kullanacağım  hocam.

ete

Bu yazdığın şekil doğru. Komut satırını sen yazdığına göre ikinci değişkenin her zaman HAM1 değerini taşıyacağınıdan da emin olman gerekiyor. Bu işi yolu bu şekildedir.
Verdiğin sırayı sen tespit ediyorsun aldığını da buna uygun yaparsan sorun çıkmayacaktır.

Serin  komutlarında timeout maalesef istenildiği gibi çalışmamaktadır. Boşuna deneme bence.

Ete

pwm3434

ete hocam teşekkür ederim ve de  üzerine ziyade olarak da  alah  razı  olsun  dileğimle  başarılar  hocam.

paçi

merhaba
benim seri port hakkında bir sorunum vardı. kodu pic basicde yazdım, serin komutu ile bilgiyi alamıyorum. isis de sanal makineden gönderilen değer alınmıyor, nedeni ne olabilir acaba yardımcı olur musunuz?
teşekkür ederim

F®T

trilyonlarca sebebi var bu sorunun. >:( vede bunu bilmek çok zor. ::)
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

paçi

mesela ne olabilir? projeyi göndersem bakabilir misiniz?

ete

Böyle bir sistemin çalışmasını nasıl beklersin?
Yalnızca komutu bir yere yazıp çalışmasını beklemekle olmuyor bu işler. Biraz daha fazla mantığınızı çalıştırmanız gerekiyor.
Biraz düşünün bakalım. Senaryo şöyle.
- PC veya herhangi bir kaynaktan kurduğun Pic devresine veri yollanıyor. Üstelik haberleşme hızı 9600 Bit/sn seçilmiş.
- Senin pic devrende ise Buton kontrolü yapılıyor . Bir kere bir butona bastınmı 500ms programa gecikme vermişsin.
- Yine devrende sıcaklık ve nem ölçümü yapılıyor. Ölçülen değerler ekrana veriliyor ve orada da ayrıca 500 ms bekleniyor.
   Her nedense işaret farklı ise yanı şeyler ekrana yazdırılıp yine 500 ms bekleniyor ama normal yazdırma yine peşinden yaptırılıyor.

Şimdi şöyle bir bakarsak en azından hiç bir yere dokunmaz isen program komut gecikmeleri, sensör okumaları ve pause komutları nedeni ile 1 sn den fazla beklemeye uğruyor ve sonunda serin2 komutuna geliyor. Peki bu komut ile gelecek olan bilgi seni orada bekliyormu? Hayır beklemiyor. Sen onu beklemek zorundasın.
Yazdığın komut 65 ms civarında veri geliyormu diye bekler gelmiyorsa atlar aşağdaki satırları icra eder. Ama farzedelim 65 ms ver gelmedi de 100 ms sonra geldi ne olacak? alınamıyacak elbette. Çünki programın o esnada başka işlerle uğraşıyor olacak.
Anlayacağın bu sistemle veri alamazsın. Bir iki veri tesadüfen denk gelebilir ama sürekli veri alamazsın bu sistemle.
Kısa yoldan mantığını değiştir ve USART kesmesine geç. Kesme sisteminde veri alma işini kesme içinde yaparsın. Veri gelinceye kadar program yukarıda bahsini ettiğim diğer işleri yapar ve veri gelirse o yaptığı işlere ara verip gider verileri alır. Böylece kesintisiz veri aktarımı sağlamış olursun.

Ete

paçi

öncelikle projeyi inceleyip vakit ayırdığınız için teşekkür ederim. belki çok yanlış bir devre olmuş olabilir ama ben de öğreniyorum işte.
şöyle bir şey var ki, bu devre öncelikle ortam sıcaklığını ve nemini ölçüp LCD ye yazdırmak amacı ile yapıldı. devrede üç tane buton vardı. biri sıcaklığı değiştirmek istenirse set butonu, diğer iki buton ise sıcaklık değerini istenilen dereceye getirmeye yarayan arttırma ve eksiltme butonlarıydı. sıcaklık ve nem değerlerini LCD ye yazarken de sıcaklığın eksi veya artı derecesine göre kontrol edilerek yazıldı.
şimdi ise bu butonların yaptığı işlevi ben seri port ile bilgisayardan alıp yapmak istedim. kodları çok değiştirmem gerektiğini düşünmemiştim. o yüzden yine aynı kodlar üzerinden yapmayı düşündüm. önce serout komutu ile LCD ye gönderdiğin değerleri virtual terminale gönderdim başarılı oldu. serin komutu da bir sorun çıkarmaz mantığıyla ilerledim ama olmadı. usart kesmesi ile tam olarak istediğim şeyi yapabilir miyim?

Powered by EzPortal