output_b (deger); kodu hakkinda

Başlatan Digimensch, 30 Aralık 2005, 01:03:44

Erol YILMAZ

Ya boylesine basit bir konu  nasil bu kadar mesaj aldi hayret birsey.
155 tane mesaji olan birisi hala daha Tris ne output ne diye soruyor o da ayri konu.

@Digimensch

Yapabileceklerin,

***CCS te ayrintili LST dosyasi uretilir.

  yani yazdigin her C koduna karsilik olarak ASM de ne uretilmis, gorursun.

....................    output_b(15);
0007:  BSF    STATUS.5
0008:  CLRF   TRISB
0009:  MOVLW  0F
000A:  BCF    STATUS.5
000B:  MOVWF  PORTB


***CCS de bir help dosyasi var.

  Kullandigin her standart fonksiyonun ne is yaptigi yaziyor.

output_b() icin

Alıntı YapFunction:
Output an entire byte to a port. The direction register is changed in accordance with the last specified #USE *_IO directive.

Availability:
All devices, however not all devices have all ports (A-E)

Examples:
OUTPUT_B(0xf0);

Digimensch

Aslinda bu kadar basit konularin sorulmasina sevinmeniz lazim.
Cünkü yeni baslayanlara kaynak oluyturacak nitelikte.Eger daha önce böyle konular sorulmus olsaydi okurdum ve sizleride sorularimla rahatsiz etmezdim.Insallah bundan sonra yeni baslayanlar bu konulari okur zorluk cekmezler.


Aslinda
output_b (15);
satirini anladim
Cevab su bu Kod TrisB'yi cikis yapar sonrada PortB bitlerini  00001111 haline getirir bitti.
ama,
Konuyu bastan beri iyi okuduysan HEXF2 arkadas
Alıntı YapTRISB low olur daha sonra PORTB'ye 15 yüklenir ve Portb.2den 15 bilgisi gönderilmiş olur
ifadesini kullanmis.Burda portb.2 ifadesinin nerden ciktigini anlayamadim.
Belkide bu arkadasimiz yazarken yanlislikla Portb.2 yazmisda olabilir.
Eger basit konular sormak sizi rahatsiz ediyorsa yazmayalim.
Yinede sabirla cevap veren arkadaslara tesekkür ederim.

Petek

Alıntı yapılan: "Digimensch"Konuyu bastan beri iyi okuduysan HEXF2 arkadas
Alıntı YapTRISB low olur daha sonra PORTB'ye 15 yüklenir ve Portb.2den 15 bilgisi gönderilmiş olur
ifadesini kullanmis.Burda portb.2 ifadesinin nerden ciktigini anlayamadim.
Belkide bu arkadasimiz yazarken yanlislikla Portb.2 yazmisda olabilir.
Eger basit konular sormak sizi rahatsiz ediyorsa yazmayalim.
Yinede sabirla cevap veren arkadaslara tesekkür ederim.
Arkadaşımız yazarken belki portb.low nible demek istedi yani portb nin ilk 4 biti. Yoksa tek bir bitten portb.2 den ancak 0 ve 1 çıkışı olabilir bunun farkındayız 8)

Şu mübarek fetih gününde (Mekke'nin fethi) kırmayalım birbirimizi, sınırlarımızın ötesinde fethedilecek çok şey var 8)
“Önyargıları yıkmak atomu parçalamaktan zordur” A.Einstein

Erol YILMAZ

Bu mesaj yanlis anlasilmaya kapi acmamak icin tarafimdan editlenmistir.

kurumahmut

Erol kareşime hak veriyorum. biraz CCS helpine bakılsa o fonksiyon anlaşılır. Ama tris ne kısmına gelirsek bunun sorulmasını doğru karşılamalıyız. Daha yeni başlayan bir arkadaş olduğu açıkki bu soruyu sordu. O halde kardeşimizi yönlendirmemiz gerekiyor. Ben kendisine İstanbulda Sahaflarda 6.5milyona Altaş yayını olan Orhan Altın başak' ın kitabını öneriyorum. Türkçe ve PICten bahsediyo. Assembly dili ile örnekler vermiş ama kolayca C de yazarsın onları. Önemli olan sana bu işin temelini verecek olması.

Ben o kitaptan başladım. Şimdi C ile PIC programlıyorum. Ve bugüne dek kimseden yardım istemedim. Temelini öğrendim şimdide daha derine inmek için forumlarda geziyorum. Sen sormana devam. Cevap verecek kesin bulursun.

Ama erol gibi tepkilerde normal karşılamalısın. Zira bnları bende veriyorum bazen insanlık hali.

Petek

Erol Hocam, ortda bir yanlış anlama var. o arkadaşımız olayı anlağını söyledi ama diğer arkadaşımızın portb.2 den 15 gönderilirdeki ifadesini anlayamamış. Gerçekten de yazım hatasından kaynaklı bir durum var. Yani bir pinden 15 rakamı paralel gönderilmez. Belki de o arkadaşımız seri port ile karıştırdı da putc(15) bir pinden gönderilir demek istedi.

Doğrusu şimdi baştan kim ne yazmış ne anlaşılmamış yada kim ne demek istemiş tekrar okuyup bir daha düşünse, hatalı olan taraf hatasını mesajını edit leyerek düzeltse, geriye doğru da kırıcı ifadeler ortadan kaldırılsa çok anlamlı ve olgunca bir davranış sergilenmiş olur.
“Önyargıları yıkmak atomu parçalamaktan zordur” A.Einstein

SpeedyX

Buralarda biyerlerde Soru sormasını bilmek ile ilgili Erol hocanın açtığı eski bir konu olacaktı ama bulamadım. Okumamış olanlar okursa çok yararı olacağını sanıyorum.

CaFFeiNe

HEXF2 nerdesiiiiin?

büyük ihtimalle shifte basamadın portb'den yerine portb2den yazdın :)

HEXF2

Burdayııımmm :D

Arkadaşlar inanmıycaksınız ama hızlı yazarken yaptığım bir hata o yoksa yıllardır assembly ile program yazıyorum öyle bir yalnışlık asla yapmam şu açıklamayı tekrar yapayım ve konuyu bitirelim bence

yukarıdaki komutun açılımı şudur;

bsf        STATUS,RP0
clrf        TRISB
bcf        STATUS,RP0
movlw       0x0F
movwf       PORTB


output_b(15) yazdığınızda devamlı bu komut bloğu işlenir .list dosyasına bakabilirsin

Petek

@Erol hocam, davranışını takdir ettim. Ben de kendi mesajımda bir cümleyi çıkarttım. belki daha çıkrtacağım yerler olabilir. Bu başlıklar başka zaman başka kişilerce tekrar okunacak. Güzel örnek olalım...
“Önyargıları yıkmak atomu parçalamaktan zordur” A.Einstein

mcan

#use fast_io (B) ,ve daha sonra b potnun 8. bitini giriş olarak tanımlayıp portb=255 yazarsak 8. bitte bir değişim görülmez o hala giriş özelliğini korur, inşallah doğru anlamışımdır... input_b() yazarsak ne olur peki elimize nasıl bir veri gelir sadece 8. bit giriş diğerlerinin yerine ne yazılacak?

Petek

Bunları isis ten izleyebilirsiniz. Gerçekten simulasyonu çok güzel. rmw yi bile dikkate almışlar. Bunu denedim ve adamları takdir ettim.
“Önyargıları yıkmak atomu parçalamaktan zordur” A.Einstein

melaltunkara

burda o kadar yazıldı çizildi. herkes bişeyler dedi. hatta bazıları bu kadar basit bi konu sorulurmu diye sitemlerde bulundu. ilk mesajım diye beni bu konuda bilgisiz zannetmeyin yaklaşık bi aydır ccs ile uğraşıyorum. ayrıca assammly diliyleylede uğraştım. ama sanırım bu ccs ile uğraşmaktan vazgeçecem. zira bu sitedeki herkesi kapsayarak konuşuyorum. bu konuda bilgi sahibi kimse yok. herkes ucundan bişeyler biliyor. ve öyle konuşuyor. ccs te bi çok uygulama yaptım. ama genelde 877 kullandığım için port koşullandırma sorunum olmadı. şimdi uğraştığım projede bu gerekli çünkü yaklaşık 30 a yakın giriş çıkış ucu kullanıyorum. her giriş ve çıkış benim için önemli ama port koşullandırma sorununu halledemedim. aşağıdaki örnekte yapmaya çalıştığım basit bi uygulama var ama çalışmadı. bunu bi çok farklı yöntemle denedim. (örneğin #use fast_io (B) kullanmadan portB yi adreslemden direk olarak output komutuyla falan) ama bu komutlar proteusta çalışmıyo. zannetmiyorum ama bilgi sahibi biri çıkarsa bu sorunun cevabını bekliyorum. belkileri için basit bi sorun gibi görünsede bunun cevabını veremiyeceklerini bilerek.....                

#include <16F877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP      
#use delay(clock=4000000)
#use fast_io (B)
#byte PORTB = 0x06 
#byte TRISB = 0x86 

int8 yedek;
void main()
{

    TRISB = 0b00001111; 
   
    for(;;)
    {
         yedek=PORTB;
                 
         if(yedek==2)     //portb 2. tuşa basılınca çıkışta portb 7. ve8. uçları setle
         {
           PORTB=11000000;
         }
         if(yedek==1)  
         {
           PORTB=01110000;
         }
    }
}


Mod notu: Lütfen verdiğimiz kodları msj yazdığımız yerdeki # işaretine 2 kere tıklayarak tam ortasındaki 2 ters tırnak arasına yazalım, nasıl olduğunu görmek için msj ın alıntı butonuna tıklayınız

kurumahmut

sitemkar mesaj yazmana üzüldüm açıkçası...:(:(:(:(

Sorunun cevabına gelince

init işlemi sırasında portb yi sıfır yüklemediğin için yedek==2 yedek==1 koşulların hiçbir zaman gerçekleşemiyor.

CaFFeiNe

#include <16F877.h> 
#fuses XT,NOWDT,NOPROTECT,NOLVP      
#use delay(clock=4000000) 

#byte PORTB = 0x06 
#byte TRISB = 0x86 
#bit  TUS1 = PORTB.0
#bit  TUS2 = PORTB.1

void main() 
{ 
    PORTB = 0b00000000;
    TRISB = 0b00001111; 
    while(true) 
    { 
       if(TUS2)
       {
         delay_ms(20);
         if(TUS2) PORTB = PORTB | 0b11000000;
       }
       if(TUS1)
       {
         delay_ms(20);
         if(TUS1) PORTB = PORTB | 0b01110000;
       }
    }
}


böyle bişiy daha iyi olur tuşlar için 20ms. gecikmeyle tekrar okutup pikleri elimine edersin (aslında tuş bırakılmadan diğer tuşu kontrol etmemesi içinde ekleme yapmak lazım ama CCS de birsürü uygulama yaptığın için orasınıda sen hallediver artık)

kolay gelsin