CCS de çıkış olan port okunur?

Başlatan emin1, 05 Mayıs 2012, 11:41:35

emin1

CCS C Çıkış olan portu nasıl okurum.

analog olarak değer okuyorum port A dan
bunu digitale çeviriyorum ve port B de ledlerle görüyorum. port b komple çıkış

data değişkenine nasıl atarım.
case de karşılaştırma yapamıyorum. nasıl yapabilirim.
....

if(an7<oran) output_high(PIN_B0); else output_low(PIN_B0);
if(an6<oran) output_high(PIN_B1); else output_low(PIN_B1);
if(an5<oran) output_high(PIN_B2); else output_low(PIN_B2);
if(an4<oran) output_high(PIN_B3); else output_low(PIN_B3);
if(an3<oran) output_high(PIN_B4); else output_low(PIN_B4);
if(an2<oran) output_high(PIN_B5); else output_low(PIN_B5);
if(an1<oran) output_high(PIN_B6); else output_low(PIN_B6);
if(an_0<oran) output_high(PIN_B7); else output_low(PIN_B7);

data=get_tris_b(); ---------------çıkış olan port_b değerini data'ya nasıl aktarırım.
switch (data)
{
case 0b00000001: {Mpos = 7;break;}
case 0b00000011: {Mpos = 6;break;}
case 0b00000111: {Mpos = 5;break;}

tmhzkhzhz

iyi gunler

#include <16F877.h>
#device adc=16
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#use delay(clock=4000000)
#use fast_io(b)
void main()
{
int8 veri;
set_tris_b(0);
set_tris_c(0);
output_b(85);
veri = input_b();
output_c(veri);
}

emin1

çıkış olan b portunu okumam gerekiyor.

esensoy

LATB register ını okursan olacaktır
En tehlikeli an "zafer" anıdır.

emin1

nasıl okuyabiliriz örnek kod filan ...

tmhzkhzhz

iyi gunler

sizin yazdiginiz programda ilk once degisken icinden okudugunuz degerlere gore cikis olan portb nin ilgili pinlerini high yada low yapiyorsunuz

daha sonra porb nin aldigi son durumu okuyup degerlendirmek istiyorsunuz

peki benim size gonderdigim programda yanlis olan neresi yazabilirmisiniz

bir proje olusturup  portb ye degisik degerler yazarak derleyip isisde denermisiniz

ben programda ne yaptim

ust satirdaki  #use fast_io(b) tanimlamasiyla ccs c nin portu okumaya calistiginda otomatik olarak yaptigi tris ayarlamasini iptal ettim
sonra altta portb  ve portc  yi cikis  yaptim
portb ve portc yi sifirladim
cikis olan portb ye deger verdim
cikis olan portb nin degerini okudum ve degiskene aldim
sonra degiskendeki degeri portc ye yazdim

farkli olan neresi

siz programinizda tris durumunu degerlendirmiyorsunuz  switch ederek portb nin durumunu degerlendiriyorsunuz

esensoy

datasheet i açmalısın,
LATB nin adresini bulmalısın,
sonra da lazım olduğu yerde okumalısın
En tehlikeli an "zafer" anıdır.

fahri-

data=input_state(pin) komutunu kullanabilirsin.

justice_for_all

picin ne oldugunu bilmedigim icin ornek veriyorum eger 16 f serisini kullaniyosan onlarda latb ve portb die iki ayri register yoktur okumayi ve yazmayi ayni registerden yani portb den yaparsin.

#byte b_portu=6 // burda 6 port benin adresidir senin kullandigin pice gore burayi degistirmen gerek.

output_c(b_portu);//olarak okuyup direkt cikisa aktarabilirsin.
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

fbasaris

emin1 hocam, problemi çözdünüz mü??

rree

#10
int1 PortOku(long PortN)
  {unsigned long AdresA,PinNo,TempA;
   char *PointA;
    TempA=PortN;
    AdresA=0b1111111111111000 & TempA;
    PinNo=TempA-AdresA;
    AdresA=TempA >> 3;
    PointA=AdresA;
   return (bit_test(*PointA,PinNo));
  }
   


Main kısmı:
    mdata= PortOku(pin_B7);

Konuyu hortlatacağım ama aynı soru beni de kapsadı. Yukarıdakigibi bir fonksiyon oluşturdum başka fikirlerde oluşabilir.

mir_as82

Hocam bu kadar uzun olmasa gerek. Port register i direkt olarak ayni türden bir degiskene aktarilamaz mi?

RaMu

#12
misal 16f877a da portb yi okumak istiyorsun,
datasheet te portb nin 06h adresinde olduğu görülür,
#byte portb=0x06
ile ccs c de portb yi tanımlarsın en başta,

sonra portb ye en son ne yüklediğini öğrenmek istiyorsan
yani portb de hali hazırda ne var görmek istiyorsan

öğren = swap(portb) ;
öğren = swap (öğren) ;

dediğinde artık portb de ne varsa öğren adlı değişkenin içindedir.

Aslında bunu asm komutu olan movf ile yapmak daha kolay,
( "movf    portb,w" dediğinde w registerına portb nin içeriği yazılır.
Veya "movfw    portb"    şeklindede yazabilirsin, aynı şey.)
Ama asm girdi yapacaktında falanda filanda değişken meğişken karışacak ortalık.

mesaj birleştirme:: 10 Eylül 2013, 20:18:54

https://www.dropbox.com/s/2j1opxhzribfzt9/reading_output_port_state.rar
Buda isis simulasyonlu ve örnek kodlu hazırladığım çalışma,

#include <main_state1.h>
#byte portb=0x06







/******************************************************
      PIC16F877 ile RS232 Seri İletişim Uygulaması
PIC PROG/DEKA     : Port B jumper'ı LCD konumunda olmalı
*******************************************************/

//#use rs232 (baud=9600, xmit=pin_C6, rcv=pin_C7, parity=N, stop=1) // RS232 protokolünün 9600 bit/sn baud hızında olacağını ve
                                                                  // TX,RX uçlarının hangi pinler olacağını tanımlıyor
                                                                  // parity bitinin olmadığını, stop bitinin 1 bit olacağı belirtiliyor

char   klavye[80];  // klavye isminde 80 üyeli bir dizi tanımlanıyor
int a,b,sayi;
#int_rda   // RX ucuna veri gelince meydane gelen kesme
void serihaberlesme_kesmesi ()
{
   disable_interrupts(int_rda); // int_rda kesmesini pasif yap
   output_high(pin_c5);  // RC5 çıkışı lojik-1
   gets(klavye); // String ifadeyi al ve "klavye" adlı dizi değişkenine aktar.
   printf("\n\rYazdiginiz sayi>  %s\n",klavye); // Satır atla, yeni satır,RS232 üzerinden klavye string ifadesini gönder,satır atla
   
   a=klavye[0] & 0x0f ;
   b=klavye[1] & 0x0f ;
   a=swap(a);
   sayi=a|b;
 if (sayi<0x80)
 {
   output_B(sayi);
   output_low(pin_c5); // RC5 çıkışı lojik-0
   printf("\n\rKlavyeden iki haneli bir sayi giriniz ve enter tusuna basiniz>"); // Satır atla, yeni satır,RS232 üzerinden belirtilen metni gönder
 }
 if (sayi>=0x80)
output_B ( swap(portb) );




}

/********* ANA PROGRAM FONKSİYONU********/

void main ( )
{
   setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
   setup_timer_1(T1_DISABLED);     // T1 zamanlayıcısı devre dışı
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
   setup_adc_ports(NO_ANALOGS);    // ANALOG giriş yok
   setup_adc(ADC_OFF);             // ADC birimi devre dışı
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı

   output_low(pin_c5); // RC5 çıkışı ilk anda sıfırlanıyor


   printf("\r**************** Merhaba *********************"); // Yeni satır, RS232 üzerinden belirtilen metni gönder ve satır atla.
   printf("\n\rKlavyeden girdiginiz iki haneli sayi 7 segment te gorunecektir\n\n"); // Satır atla, yeni satır, RS232 üzerinden belirtilen metni gönder
   printf("\n\r80 den buyuk sayi girilirse port b nin tersi gösterilir\n\n");
   printf("\n\rKlavyeden iki haneli bir sayi giriniz ve enter tusuna basiniz>"); // Satır atla, yeni satır,RS232 üzerinden belirtilen metni gönder

   enable_interrupts(GLOBAL);  // Aktif edilen tüm kesmelere izin ver

   while(1) // Sonsuz döngü
   {
      enable_interrupts(int_rda); // int_rda kesmesi aktif
   }
}
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

rree

Ccs nin    #include <16F628A.h>  pic tanımlı h dosyasındaki

#define PIN_A0  40
#define PIN_A1  41
#define PIN_A2  42
#define PIN_A3  43
#define PIN_A4  44
#define PIN_A5  45
#define PIN_A6  46
#define PIN_A7  47
                               değerleri  kullanabilmek için yazdım. daha kısayol olursa iyi olur.
Herhangi bir prosodur Output_bit(Pin_A3,1)  yaptı. Başka bir prosodur de öğrenebilmek için gerekli olabiliyor.


matador

swap komutu bir byte'ın üst 4 ile alt 4 bitinin yerini değiştirmek için değil mi?