bit işlemleri

Başlatan askin, 29 Mart 2017, 21:27:29

askin

Arkadaşlar biraz yardıma ihtiyacım var, IR kumanda ile uğraşıyorum ama bir yerde takıldım kaldım yorgunluktanmıdır yoksa eksikliğimdenmidir emin değilim, beceremedim. öncelikle programım çok güzel çalışıyor, sorun LCD kontrol panelime göre mevcut programı
değiştirmem gerek.

sayi var byte

kimlik var word
kimlik =  %0010000001011101

komut   var word
komut  =  %1100000100111110

header var word

header = komut

while buton=0
wend

while sayi<16
if header.15=0 then gosub sifir
if header.15=1 then gosub bir

header = header << 1
sayi = sayi + 1
wend

program şöyle çalışıyor: kimlik ve kumanda kodu, kimlik içindeki 1-0 ları header değişkenine kopyalıyor, 16.bitten itibaren
bitleri kaydırıyor 1-0 durumuna göre ir-led'i yakıp söndürüyor, 16bitlik komut değişkeni ilk sekizin tersi 11000001~00111110

yapmak istediğim ise ; 8biti sayı değişkenine göre döngü içerisinde sırasıyla okumak.
komut = %11000001

while sayi<8
if header.[sayi]=0 then gosub sifir
if header.[sayi]=1 then gosub bir

sayi = sayi + 1
wend

ilk sekiz bit gönderildikten sonra döngü geri sayacak baştan okuduğunu tersten okuyacak. kısacası [header.0] buradaki sıfırı
sayı değişkenine atamak istiyorum. "if header.[sayi]=0" pbp buna izin vermiyor.

ete

if header.0[sayi]=0  şeklinde dene. Açıklaması olarak da şöyle düşün 0 cı bit den sonra gelen (Sayi) biti ni sıfırla.
Index değişkeni olmadan bitleri Header.0=1 şeklinde değiştirebilir ve değer atayabilirsin.
Ama [Sayi] gibi bir index değişkeninin belirlediği bit üzerinde işlem yamak için DEGISKEN.0[Index] şeklinde kullanmak gerekiyor.

Ete

askin

Hocam Teşekkürler sayenizde sorun çözüldü.

askin

Arkadaşlar Serin2 komutu ile sorunum var, gerekli bilgileri önceden paylaşarak kafaları karıştırmak istemiyorum.
Pic ile 433mhz bilgi gönderiyorum. alıcı taraftaki pic gelen bilgiyi yorumlayıp IR kumanda kodu olarak Tv-uydu
yönlendiriyor, buraya kadar geldim ve son derece kararlı bir şekilde çalışıyor.

elimde dokunmatik TFT panel var panelin programı da tamam. PC ile 9600baud haberleşiyor, Seri çıkına 433mhz verici bağladım
Alıcı tarafı da hazırladık fakat düşünemediğim bir sorunla karşılaştım.


SERIN2 PORTB.1,180,20,basla,[WAIT ("ETE"),cihaz,komut]

"ETE" ascii karakteri fakat panelin yapısı gereği benim böyle karakter gönderme imkanım yok.

cihaz "5A A5 06 83 11 29 01 21 31" şeklinde veri bloğu gönderiyor, ben sadece "11 29" bölümüne müdahale edebiliyorum,
ilk başta şöyle bir kurnaz düşüncem vardı, göndermek istediğim veriden önce gelenler uyandırma sinyali yerine geçer
bir önceki "06veya83" verisini bekler sonra istediğim bilgiyi alır ve işlerim diye düşünmüştüm; ama olmadı.

Sonuç olarak; [WAIT ("ETE"),......  buradaki ascii "ETE" yerine  "hex 83" nasıl beklerim. hex83 ün ascii karşılığı da yok.
Ayrıca 20mhz oscillator 9600baud için hesabımdan şüpheliyim.

Teşekkürler

ete

#4
WAIT ("ETE") yerine WAIT (hex 83) yaz veya WAIT ($83) dene
("ETE") formatı karekteri ASCII karşılığı şeklinde göstermek içindir. WAIT ("ETE") yerine WAIT (69,84,69) yazmakla aynı sonucu elde edersin. 83 Hex değerini bekleyeceğine desimal 131 beklesen daha iyi değilmi sonuçta sayı zaten bit bazında (binary ) olarak yollanıyor ve alındıktan sonra format ayarlaması yapılıyor. Dolayısıya $83 beklemekle #131 beklemek aynı anlama gelmektedir.

Ete

askin

ETE hocam teşekkürler, yine hayat kurtardınız, formatı doğru girince çalışmam demedi.
pic li devrelerde sorunu sayenizde hallettim fakat panel üzerinden çalıştıramadım. Baud hızımdan şüpheleniyorum.

hesapladığım 9600baud değeri 20mhz için doğrumudur.
20mhz için kaynak bulamadım. nasıl hesaplandığı hakkında bilgi verebilirmisiniz.?


SERIN2 PORTB.1,180,20,basla,[WAIT ($83),cihaz,komut]

Teşekkürler

ete

Haberleşme hızı frekansla çok bağlantılı değildir. Ama 9600 baud hızı 10Mhz den büyük ferkanslar için uygundur.
Aletin standart bir haberleşme hızı olması gerekir.

Ete

askin


ETE hocam yardımlarınız için teşekkürler; sayenizde projemi toparladım fakat nihai sonuca erişemedim !

Konuyu fazla uzatmak istemiyorum çünkü defalarca yazılmış, üzerinde konuşulmuş fakat insan doğası işte
yenilgiyi kabullenmek zor, girdiğim sokağın çıkmaz sokak olduğunu bir kez de sizden duyma beni rahatlatacak,
çünkü geldiğim noktada pes etmiş durumdayım.

Basla:
SERIN2 PORTB.1,180,5,basla,[WAIT (#6,#131),cihaz,komut]     
if cihaz = 17 then toggle led
Goto basla

verici kısımdaki kodlarımı TFT panelimin çıkışını taklit edecek şekilde düzenledim.

    "5A A5 06 83 11 29 01 21 31"

SEROUT2 PORTB.2,180,[rep$AA\5,rep$00\5,rep$FF\5]   'Preamble
SEROUT2 PORTB.2,180,[$5A,$A5,$06,$83,$11,$29,$01,$21,$31]

Preamle satırı varken sistem hatasız çalışıyor, TFT Panel'e preamble ekleyemeyeceğime göre ve timeout süresini 5e
çekmeme rağmen ilerleme kaydedemedim. "5A A5" sistemi uyandırmaya yetmiyor demek ki. USART kesmesi kullansam derdime derman olurMu Acep ?

Teşekkürler

ete

SERIN2 PORTB.1,180,5,basla,[WAIT (#6,#131),cihaz,komut]
komut satırının istediğin şekilde çalışabileceğini sanmıyorum.
Şimdiye kadar SERIN komutlarında Timeout seçeneğinin çalıştığını hiç görmedim. Her ne kadar bu parametre komutta yer alsada bu seçenek kesinlikle çalışmıyor. Bu nedenle bu tür kritik işlerin HSERIN komutu ila yapılmasında yarar görürüm.
HSERIN de time out da çalışır diğer parametrelerde çalışır.
Bu nedenle kısa yoldan USART dan alış veriş yapacak şekilde sistemini değiştirmeni öneriyorum. Aksi halde eşelenip duracaksın olduğun yerde.

Ete

askin


INCLUDE "MODEDEFS.BAS"

'***********************DEFINITIONS***************************************
DEFINE OSC 20

@ __config _HS_OSC & _WDT_OFF & _MCLRE_OFF & _LVP_OFF & _CP_OFF

CMCON=7 '16F628 de komparatör pinleri iptal hepsi giris çıkıs
OPTION_REG.7=1 'portB deki  dahili PULL-UP lar iptal edildi.

TRISA=%00000001  'porta.0 giriş
TRISB=%00000110  'portb.1-2 giriş ayarlandı

'*************************************** Seri iletişim ayarları
DEFINE HSER_RCSTA 90h    ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 24h    ' Enable transmit, BRGH = 1
DEFINE HSER_BAUD 9600    '  Baud @
DEFINE HSER_SPBRG 51   '  asenkron için 129 

SYMBOL buton = PORTA.0
symbol LED = PORTA.1

cihaz var byte
komut var byte

Basla:

if buton=1 then gosub gonder

HSERIN 20,basla, [WAIT ($3F),cihaz,komut] 

Goto basla


gonder:
HSEROUT [(63),17,41,1,33,49,cihaz,komut]

    led = 1
    PAUSE 250
    led = 0
return
     

end



Değerli arkadaşlar, ETE hocam;

Projemin son aşamasında takılmış durumdayım, söylediğiniz gibi sistemi değiştirdim, son aşamada bilgisayarla
iletişim kurmak durumundayım; devreme max232 ekledim, pic tarafından Hyper Terminale

HSEROUT [(63),17,41,1,33,49,cihaz,komut]  gönderdiğim bilgiyi bilgisayardan sorunsuz şekilde alıyorum fakat

Bilgisayardan pic'e [5A,A5,06,83,11,29,01,21,31] bana lazım olan 11,29

HSERIN 20,basla, [WAIT ($83),cihaz,komut] hiçbir şekilde pic'e bilgi gönderemiyorum, hatta max232 girişine led
bağladım led kısa bir süre aktif oluyor ama bilgi göndermeyi başaramadım.

Bu durumda bilmediğim bişeyler var ama ne? kesme kullanmak zorundamıyım? yada eksik olan nedir?

  Teşekkürler


ete

bana kalırsa desimal sayılarla hexadesimal sayılar arasında sıkışıp kalmışsınız siz.
PC den yollanan sayılara dikkat edin hexadesimal olduklarından emin olun.
Ayrıca   [WAIT ($83)... yazmak yerine,
[WAIT ([$5A,$A5,$06,$83),..... yazın bu şekilde daha emniyetli olur.
Bağlantılarınızı da kontrol edin. PC tarafından gelen RS232 seviyesindeki sinyalleri Max232 kullanarak TTL seviyeye düşürdüğünüz gibi Pic den gelen TTL seviyedeki sinyalide aynı MAX232 ile RS232 seviyesine çevirmeniz gerektiğini unutmayın. Max232 bir Voltaj pompası entegresidir. 0-5V ile -10V ve +10V voltajları üretir. Bu nedenle kondansatör bağlantıları biraz karmaşıktır ve en çok hata yapılan yeri bu bağlantılardır. Bağlantılarınızı kontrol edin. O sistemde bir -10V genel GND yani 0 volt ve bir de +10V vardır. Kondansatör bağlantılarıda buna uygun olarak yapılır.  İyice kontrol edin bir hata olmasın. Birden fazla şemaya bakın hatta data sheet'deki şemaları uygulayın.

Ete

askin

Hocam sorun şurada olabilir mi? Projemi Laptop üzerinden gerçekleştiriyorum, dolayısıyla bende -10v +10v yok, usb-ttl çevirici olan PL2303 çevirici kullanıyorum, Max232nin 12pini//pic 7pin bağlı ve 7. pin sürekli high durumunda, bilgi geldiğinde low oluyor.

http://adapterz.com/item.htm?id=60414    kullandığım dönüştürücü bunun benzeri

yada RX receive pinini max232ye girmeden direkt pic'e mi girsek? nasıl olsa USB dönüştürücü 5v dan fazla vermiyor.
tam kafamda canlandıramadım ama sanırım ne demek istediğimi anladınız.

ete

Pl2303 ün doğru dürüst çalıştığını hiç görmedim. Ft232 temelli bir çevirici kullanmalısın.
Laptoplarda voltaj seviyesi  -10v ve +10v seviyesi 7volta düşer. Daha altında çalışmaz zaten sistem.
Ete

Powered by EzPortal