Serin2 ve Button Komutu birlikte çalışmıyor neden?

Başlatan ete, 24 Şubat 2005, 12:43:55

ete

Arkadaşlar,

Bir sorunum var ve bir türlü çözümü bulamadım. Sorun şöyle;

iki adet 16F628 'i RF ile haberleştiriyorum. Tabiiki SEROUT2 ve SERIN2 komutlarını kullanarak.
SERIN2 tarafında  ayrıca bir de button ekleme ihtiyacı duydum. Manuel on/off yapabilmek için. Ancak ne button komutu nede yazdığım tuş kontrol rutini çalışmıyor. ANcak pic çalışıyor ve diğer pic den gelen bilgileri alıp komutları icra ediyor. Önce acaba komutumu yanlış kullanıyorum diye baktım hayır her şey doğru. Bu defa SERIN2 komutunu kaldırdım. Baktımki tuş mükemmel çalışıyor. Anlayacağınız SERIN2 komutunu gördüğü zaman tuşun bağlı olduğu port bloke oluyor. Portu değiştirdim , pin değiştirdim ancak nafile iki komut bir arda kesinlikle çalışmıyor. İsteyen basit bir programla denesin göreceksiniz. veya ben program vereyim
OPTION_REG.7=1

@ DEVICE pic16F628
@ DEVICE pic16F628, WDT_ON
@ DEVICE pic16F628, PWRT_ON
@ DEVICE pic16F628, PROTECT_OFF
@ DEVICE pic16F628, MCLR_OFF
@ DEVICE pic16F628, INTRC_OSC_NOCLKOUT

'---------------------------değişkenler------------------------------
 AL     VAR  BYTE
 TOPLAM var  byte
 GIRIS  VAR  PORTB.0
 ROLE   VAR  PORTA.1
 TUS    var  PORTA.6
 LED    VAR  PORTB.3
 YANDI  VAR  byte
 SONDU  VAR  Byte
 I      VAR  BYTE
 Z      VAR  BIT
'-----------------------------B A Ş L A N G I Ç ---------------------------    
CMCON=7
CLEAR:TRISA=%01100000
TRISB=%00000011
PAUSE 500:AL=88:sondu=0:LOW LED
'-------------------------------------------------------------------------------    
BASLA: 
    
     BUTTON PORTA.6,0,255,5,I,1,BAK 
     
     SerIn2 GIRIS,1646,[WAIT ("ER"),AL]
     SerIn2 GIRIS,1646,[WAIT ("ER"),AL]
     SerIn2 GIRIS,1646,[WAIT ("ER"),AL]

      
ATLA:  IF AL=88 THEN 
          IF SONDU=1 THEN ARA
          GOSUB SON
          Z=0
          GOTO BASLA
       ENDIF
          
       IF AL=66 THEN
         IF YANDI=1 THEN ARA
           GOSUB YAN
           Z=0
           GOTO BASLA
       ENDIF   
       pause 1
       
ARA:   Z=0
       IF TOPLAM>20 THEN TOPLAM=0
       GOTO BASLA


BAK:
         TOGGLE ROLE
         TOGGLE LED
         GOTO BASLA
         
YAN:   
       YANDI=1:SONDU=0 
       HIGH ROLE
       HIGH LED
       pause 1
       RETURN
      
SON:   LOW LED
       SONDU=1:YANDI=0  
       LOW ROLE
       pause 1
       RETURN  
       
       end  

İsis te denemek isterseniz bir 16F628 koyun ve PortA.6 ya pull up lı bir buton bağlayın ve deneyin
Bakalım.
Isis te  izleme penceresinde Port B nin durumunu gözlüyorum. Hiç bir şey değişmiyor. Anlıyorumki port bloke oluyor. Acaba sebebi nedir. Aynı şekilde SERIN komutuda aynı şeyi yapıyor.
Daha da komik olanı ise aynı programı Proton Basic de yazdım. Oda aynı sonucu veriyor hatta daha aptal işler yapıyor. Anlayamadım gitti nedendir.

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

cozturk

Galiba pbp tris ile  pini otomatik olarak giriş yaptığından bu esnada birşeyleri unutuyor olabilir.

Ben button komutunu zaten hiç sevmedim. Alternatif olarak kendi komutumuzu kullanabiliriz.   Butona kısa veya çok uzun basılması  farketmez. Ark söndürme olayı zaten var. DTMF okuyacak arkadaşlar da kullanabilir. (tuş bırakılana kadar bekler)

buton:
	pause 100
	if pin =1 then buton:
	pause 200
	if pin =1 then buton:

return

ete

sevgili çöztürk,

Bende zaten button komutunu kullanmam. Her kes anlasın diye bu komutu koydum programa. Ama gerçekten her ikisinide denedim. Kesin çalışmıyor. Bu gün aynı soruyu Picbasic.uk formunda sordum. Mister_e diye birisi şu cevabı verdi.
Serin komutu ile wait "karakter" kullanıyorsunuz diyor. Program bu karakterleri alıncaya kadar orada bekler ve tuşu normalde bu yüzden göremez. Serin komutu içinde birde  (timeout,label ) seçeneği var. Bu seçeneği kullanmamı önerdi. Bugün kullandım. Sİstem hakikaten isiste düzeldi. Ancak pic te yine düzelmedi. Bana timeout (ms cinsinden) değişik değerler kullanmamı önermiş çok kısa olmasın çokta uzun olmaması gerekiyor. Her neyse muhtelif değerler denedim. ancak sonunda 2 ms de karar kıldım. Bu sürede hiç değilse tuşa sık sık basıp bırakırsan toggle olayı çalışıyor. Sürekli basarsan hiç çalışmıyor. Timeout'u 1 ms. yaparsan tuş çalışıyor normal olarak ama bu seferde serin komutu hiç bir şey yakalayamıyor. Ama 2 ms. de sorun yok. Böylece bende işin olmayacağına karar verip 2 ms de işi bıraktım.
Aklına başka bir çözüm gelen olursa vede bildirirse sevinirim. Gerçi tüm olası çözümleri denedim zaten. Tek denemediğim HSERIN kullanmak. Çünki bu Mister_E birde bunu denememi öneriyor. Artık kartı yapmışım bu saatten sonra zor bu iş. İlgin için teşekkürler.

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

sezgin05

Evet arkadaşlar.Aynı sorunla bende uğraşıyorum.Tıpkı ETE nin ki gibi iki tane 628'i SERIN veya SERIN2 ile haberleştirmeye çalıştım.Aynı şekilde verici picte sorun yok.Ama alıcı Picte ise datayı aldıktan sonra taramalı displeyde göstermesini istiyorum.Ama maalesef datayı aldığında ekranda bir kez gösterip sonra tekrar SERIN satırında beklemeye geçiyor.Eğer gösterge kısmında LCD veya 595'li bir metod kullanırsam sorun yok.Bunun çözümünü bende merak ediyorum.

ftsahin

Daha önce bu sorunu ben de yaşamıştım ve portu tek başına SERIN komutu için kullanmaktan başka çarem kalmamıştı(16F877 için).
Serin komutu yerine kendi seri rutinimizi yazabiliriz. Bence çok zor olmasa gerek. Biraz uğraşıp biraz da interneti araştırırsak manuel serin altprogramı yazabiliriz diye düşünüyorum. Hem de baud hızına sadık kalarak.

CaFFeiNe

bu gibi sebeplerden pbp yi bıraktım CCS ye geçtim :)
sonuçta sıkışınca kendi rutinlerimizi yazacaksak bari C de olsun :)

mmengi

Alıntı yapılan: "sezgin05"Evet arkadaşlar.Aynı sorunla bende uğraşıyorum.Tıpkı ETE nin ki gibi iki tane 628'i SERIN veya SERIN2 ile haberleştirmeye çalıştım.Aynı şekilde verici picte sorun yok.Ama alıcı Picte ise datayı aldıktan sonra taramalı displeyde göstermesini istiyorum.Ama maalesef datayı aldığında ekranda bir kez gösterip sonra tekrar SERIN satırında beklemeye geçiyor.Eğer gösterge kısmında LCD veya 595'li bir metod kullanırsam sorun yok.Bunun çözümünü bende merak ediyorum.

Anladığım kadarıyla sizdede ete nin başın agelen olay olmuş olabilir serin2 komuduyla alınması gereken datayı alana kadar bekliyor ve aldıktan sonra displayde 1 kere gösterip aynı rutinde yine karakter bekliyor bundan dolayı ekrana birşey gelmiyor. Bu tür uygulamalarda neden usart ı register bazında kontrol etmiyorsunuz birde int. kullanırsanız sanırım bu sıkıntılar olmayacak.

armys2000

Dostum Serin2 komutu belalı bir komuttur PBP de sebebine gelince iletişimdeki seviye durumları bazen karışıyor özelliklede wait eklersen cod da gördüğüm kadarıyla zaman aşımı etiketi konmamış serin2 lerde imlec ilk serin2 komutuna gelince wait ile ifade ettiğin karakteri beklemeye başlar takiii gelene kadar gelmezse ölece durur dolayısıyla senin buton devre dışı kalır kesme bile koysan kesme mantığında derki kesmenin çalışabilmesi için mutlaka o anda işlenen komutun sona ermesi gerekir senin kod da malesef serin2 ye girdiği için kesmede bir işe yaramaz bence ilk olarak serin2 lere zaman aşımı etiketi ekle eğer baudrate ayarın bu ayar içinde malum seviye  biti de var doğru ise belirli bir karakter alınmazsa mutlaka etikete yönelir imlec. benim şuana kadar karşılaştığım en gıcık sorunlardan biride bu serin2 portunun durumu çok önemli eğer herhangi bir seviye dönüştürücüsü kullanıyorsan bu sorun ortadan kalkar anladığım kadarıyla rf modul kullanıyorsun ki onların iletişim seviyesi genelde ttl pic de ttl baud rate ayarlıyorsun ama serin2 ve buna ait wait i kullanırsan işin zor çoğu zaman kararsızlıklar oluyor serin2 bacağının durumunu incele.. birde buton komutu mutlaka tris ister yoksa o bacaktan değer okuyamazsın onada dikkat et END OF CODE

Petek

rcif i kontrol edeceksiniz. set edilmiş ise seri portu okutacaksınız. Aynı durum C de getch() komutunda vardır.  O nedenle kbhit() fonksiyonu ile (yaptığı sadece rcif set edilmişmi diye bakmak) tuşa basılmış ise port okuma işlemine geçilir.

if(kbhit) ch=getch();

yada

if(rcif) ch=getch();

olacak.
“Önyargıları yıkmak atomu parçalamaktan zordur” A.Einstein

Petek

Alıntı yapılan: "armys2000"... kesme mantığında derki kesmenin çalışabilmesi için mutlaka o anda işlenen komutun sona ermesi gerekir senin kod da malesef serin2 ye girdiği için kesmede bir işe yaramaz ...
Bunu ilk defa sende duydum. Kesinlikle doğru değil. O zaman kesme yerine kesememe denmesi gerekirdi. Global interrupt enable set edilmiş ise, external interrupt adı verilen rb0 interruptı aktiflenmiş ise ve buton b0 a bağlı ise ister seri bilgi okusun, ister pwmle uğraşsın, ister se şarkı söylüyor olsun, b0 pini aktiflendiğinde öyle bir keser ki .... Hatta başka bir sebeple interrupt rutinine girdin diyelim, GIE bitini tekrar set et, o interrupt bitmeden b0 a basılsın, interrupt rutinini bile kesersin ikinci kere  ;)
“Önyargıları yıkmak atomu parçalamaktan zordur” A.Einstein

armys2000

Dostum petek ben bu yazıyı PBP için söyledim PBP oanda çalışan komut bitiminden sonra kesme rutinine gider  o anda çalışan komut mutlaka işletilir . benim orda yazdığımı sanırım yanlış anladın orda serin2 komutunun garip davranışlar sergilemesinden dolayı kesme rutinine gidemiyişinden bahsediyorum PBP da maalesef böyle  o neden le bende bıraktım C ye geçtim  PBP de kesmeler aktif yapıldığında her satırın başına kesme ile ilgili codu eklemiyormu sanırım bunda hemfikiriz aslında bana göre pic serin2 komutunun  assembly tarafında sapıtıyor burda serin2 ve bunun wait i düzgün çalıştığında kesmeye gitmez demiyorum kesinlikle ve kesinlikle gider ama pic serin2 de bir sorun yaşadığı ( daha doğrusu sapıttığı için kesmeye gidemiyor...


loop: goto loop



bana burda kesme yaptırabilirmisin

Petek

Anladım ne demek istediğini. Kusura bakma birden bazı şeyleri hatırlamak zor oluyor. Yaşlılık işte. Bazı kritik konularda örneğin eeprom okuma ve yazma işleminde (Jal de de öyleydi) gie bitini sıfırlayarak geçici bir süre kesmeleri devre dışı bırakabiliyorsun. Donanımdan seri bilgi almada buna gerek yok zira birinci bayt rxreg içerisinde tutulurken, ikinci bayt shift registere yüklenmeye başlamıştır. Nereden baksanız 19200 bps te sizin başka iş yapabilecek 900 komut adımlık süreniz var demektir (ikinci bayt rxreg dolu iken üzerine yazılırsa overrun hatası oluşur). Ancak uart yazılım emulasyonu ile seri bilgi alıyorsanız kesinlikle bütün kesmeleri kapatıp, zaman açısından kritik delay rutinleri hassas bir şekilde çalışması gerekir. Yoksa seri bilgiyi akçırırsınız.

Sonuç, donanım uart modülünü kullanıyorsanız,  basicte serin komutunu rcif biti set edilmişse çağırmak işinizi sorunsuzca görecektir.
“Önyargıları yıkmak atomu parçalamaktan zordur” A.Einstein

armys2000

Sayın petek hocam ilginiz için teşekkür ederim bu arada bir konuyla ilgili ileriki zamanlarda konuşmak paylaşmak isterim malum imzanızda belirttiğiniz gibi Embedded sistem şuan intelin pxa270  cpu ile ilgili dokuman vs topluyorum sanırım 1 kaç aya kalmaz donanımıda  halletmiş olacağım şuan çizim aşamasındayım sadece ve sadece pcb yi hazırlamak ve gerekli malzemeleri getirttirmek kalıyor o da sorun değil asıl bu sistem üzerinde RTOS yazmak kalıyor o safhaya gelince artık paslaşırız.. Eğer bir bakmak istersen www.compulab.co.il sitesinde gömülü sistemler için aradığımız dan fazlasına sahip  hazır donanımlar mevcut ilgilenirsen diye...
sevgiyle kalın

Petek

Alıntı yapılan: "armys2000"Sayın petek hocam ilginiz için teşekkür ederim bu arada bir konuyla ilgili ileriki zamanlarda konuşmak paylaşmak isterim malum imzanızda belirttiğiniz gibi Embedded sistem şuan intelin pxa270  cpu ile ilgili dokuman vs topluyorum sanırım 1 kaç aya kalmaz donanımıda  halletmiş olacağım şuan çizim aşamasındayım sadece ve sadece pcb yi hazırlamak ve gerekli malzemeleri getirttirmek kalıyor o da sorun değil asıl bu sistem üzerinde RTOS yazmak kalıyor o safhaya gelince artık paslaşırız.. Eğer bir bakmak istersen www.compulab.co.il sitesinde gömülü sistemler için aradığımız dan fazlasına sahip  hazır donanımlar mevcut ilgilenirsen diye...
sevgiyle kalın
http://www.compulab.co.il/atx/html/atx-x270.htm
:D 16F84 te emeklesek daha iyi olmazmı? :)

linkteki kartı mı alacaksınız yoksa kendiniz mi kart hazırlıyorsunuz tam anlayamadım. Kendiniz hazırlıyorsanız linkteki donanımları ekleyecekmisiniz?

RTOS ile daha önce hiç ilgilenmemiştim ama artık zamanı geliyor, (darbenin ayak sesleri ... :))

Hocam yardımım olabilecekse emin ol zamanım olduğu sürece yardım ederim. Hele biz emeklerken başkaları koşuyorsa (hatta uçakla hedefe gidiyorsa) birbirimize yardım etmek farzıayın olmalı.
“Önyargıları yıkmak atomu parçalamaktan zordur” A.Einstein

armys2000

Petek hocam ilk başta ordaki donanımları alayım dedim ve çalışmaya başlayım dedim ( sanırım ilk etap bu olacak) ama sonra düşündüm ki eğer ben bu CPU yu kullanacaksam herdefasında amcalardan bana donanım gönderin demek maliyetli olur diye düşünüyoırum aslında onların da fiyatları hiç fena değil 100 ila 150 dolares arasında burd ao kartı çizip pcb sini almaya kalksam ve malzemeleri getirtsem herhalde bana nerden baksan 2000 dolaresi gecer birkereliğine sonrasında nasıl bir yol izler kestiremiyorum malum ar-ge işi maliyetli olur . ama eminim miktar artınca bu fiyat onların seviyesinin birazcık üzerinde olur ...  ordaki kartın birebir aynısını hazırlamayı düşünüyorum donanımsal olarak hepsinede ihtiyacım var çünkü   ( sanırım Linux topikli yazıda neden linux u seçtiğimi hedefimin ne olduğunu anlamışındır sayın hocam çünkü win ile çıldırmak istemiyorum artık  en basitinden bir örnek sanırım 70 li yıllardan kalma intergraph ın bir bilgisayarını kullanıyorum üzerinde unix var ve halende kapı gibi çalışır durumda aynı şeyi diğer pc deki windows için söyleyemiyorum 3 ayda bir format atmaktan bıktım ) ordaki kartı getirteceğim ve buna paralel olarakta donanımı hazırlamaya çalışacağım  hatta bu konuda diğer board üyelerinin de desteğini alıp birşeyler çıkartmaya başlaycağız  ekip ruhunun ne demek olduğunun yeni yeni anlaşıldığı ülkemizde bu olacak sanırım  herşeye rağmen güveniyorum arkadaşlarıma yeterki herkes birazcık feragat etmesini bilsin ha sonuçta ne olacak dersen eminim ben başta olmak üzere herkes birşeyler öğrenecek amaçta bu isteyen öğrendiğini istediği gibi kullanır.  daha 2 yıl öncesine kadar bir direnci bile ithal ederken bak şimdi transistör üretecek seviyeye bile geldik... Burda çok yanlış bilinen bir konu var özelliklede buna dikkat çekmek istiyorum "Amerikayı yeniden keşfetmeye gerek varmı "   fikri.. buna sinir oluyorum  bu şekilde düşünürsek hiç bir yere varamayız sonuçta yapılan şudur birileri bişeyi bulur başkaları ona bişey ekler yeni bişey çıkar başkalarıda buna bişey ekler daha yeni birşey çıkar  zincirleme herkes birbirine bağlıdır.. o zaman demez mi transistörü ilk bulan kişi verin telif hakkımı diye .... Bizim ülke araştırmacısı hariç diğer bütün ülkelerin insanları bu şekilde düşünmüyor. Yapılana bakıyor  onu öğreniyor ve sonrasında kendim ne yapabilirm diye düşünüyor. Ve sonucunda kendisi de birşeyler çıkartıyor.. yoksa dünya üzerinde işlemci üreticisi sanırım intel olurdu.  Düşünsene amd via cyrix intel işlemci üretimini yapmış biz artık sanatla uğraşalım  diye düşünselerdi ne olurdu ?
nese yien çenem düştü biraz görüşmek dileğiyle saygılarım la