Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

XC8 Başlangıç

Başlatan Mucit23, 04 Mayıs 2014, 01:08:52

RaMu

Asm dede DsPic te aynı durum var,
bayağı bir kurcalamıştım ya çözüm bulamamış yada kullanılamayacak kadar garip bir çözüm bulmuştum.

C de kod taşınabilirliğini ön planda tutmak lazım.
Çok garip çözümlere girmeyip
byteadi.bitadi kullanımıyla devam etmeli.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

power20

#76
......
#Define bit1 byteadi.bitadi 

#on 1
#off 0

...
bit1=on;



tomi

#77
kılıç arkadaşım,
char x; değişkeni için 0. bitini tanımlayacak kod senin yazdıgına göre?

#Define bit1 byteadi.bitadi --> ne olacak yazabilirmisin?
  bitadı--> tamam
  byteadı-->? ne?   0. bit için bunu yazabilirsen cok sevinirim...


yukarı da raMU arkadaşımda   byteadı.bitadı demiş ama sadece 1 değişken için 1 adet örnege ihtiyacım var...:-)

RaMu

Önceki mesajlarda bahsedildiği gibi struct tanımlayacaksın orası için.

Port un biti için struct tanımlamanada gerek yok çünkü zaten tanımlı.

@Kılıç ın mesajına göre

#define led1 PORTBbits.1
demen yeterli
sonra
led1 = 1;
led1 = 0;
şeklinde ledi aç kapa yapabilirsin anlamı çıkıyor ama
define ile bu işin olacağını sanmam.

Ben sanmamaya devam edeyim.
5. sayfadaki mesajları tekrar okuyunca görüyorumki oluyormuş.

Son sorduğun soruyada zaten cevap verilmiş.
Struct tanımlayacaksın, verilen linklerdede anlatılmış ve
nette birçok anlatım var struct için.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

tomi

RaMu arkadaşım port tanımlamalarında sıkıntı yok yani,

#define led1 PORTBbits.1  değil de #define led1 PORTBbits.RB1 şeklinde tanımlıyorsun hiç sorun yak ve daha sonra led1=0 veya led1=1 rahatlıkla yapıyorsun ama;
iş değişkenin bitlerine gelince olmuyor,
dediğin gibi struct yapılara bakmam lazım oda attıgım taş ürkütdüğüm kuşa degermi bakalım... ;-)

power20

Kesin çözümü yazıyorum.  Az önce denedim

union {
    volatile char val;
 

    struct {
        unsigned b0 : 1;
        unsigned b1 : 1;
        unsigned b2 : 1;
        unsigned b3 : 1;
        unsigned b4 : 1;
        unsigned b5 : 1;
        unsigned b6 : 1;
        unsigned b7 : 1;
    };
} val;

#define val0 val.b0

void test3(void) {

    while (1) {



        val0 = !val0;

        if (val0 == 1) UART_Print("1\r\n");
        else UART_Print("0\r\n");

        __delay_ms(100);
        ClrWdt();
}

Çıktısı da şöyle:

1
0
1
0
1
...

mehmet

#81
https://www.codesdope.com/blog/article/set-toggle-and-clear-a-bit-in-c/

https://aticleworld.com/how-to-set-clear-and-toggle-a-single-bit-in-cc/

https://www.includehelp.com/c-programs/preprocessor-programs.aspx

Bunlar da benim kullandıklarım. Anahtar kelime "bitwise".
#define _BV(bit)				(1 << (bit))
#define sbi(port, bit) 	(port) |= _BV(bit) 
#define cbi(port, bit) 	(port) &= ~_BV(bit)

/* Bit Operation macros */
#define sbi(b,n) ((b) |=   (1<<(n)))        /* Set bit number n in byte b   */
#define cbi(b,n) ((b) &= (~(1<<(n))))       /* Clear bit number n in byte b */
#define rbi(b,n) ((b) &    (1<<(n)))        /* Read bit number n in byte b  */
#define fbi(b,n) ((b) ^=   (1<<(n)))        /* Flip bit number n in byte b  */

#define bit_is_set(b,n)   (b & (1<<n))      /* Test if bit number n in byte b is set   */
#define bit_is_clear(b,n) (!(b & (1<<n)))   /* Test if bit number n in byte b is clear */ 

#define pinToggle(PORT, n)  (PORT ^= 1 << n)
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

tomi

kılıç ve mehmet arkadaşım çok teşekkür ederim , tansiyon düşmüştür....sagolun  :-)

tomi

merhaba arkadaşlar,

xc8 kullanıyorum ve program içinde asm kodlarına ihtiyacım oluyor ama ne yaptıysam dahil edemedim mesela,

__asm
   RRCF veri_saat,F
__endasm
          yaptım hata veriyor sonra
#asm
   RRCF veri_saat,F
#endasm   yaptım yine hata veriyor

_asm
   RRCF veri_saat,F
_endasm         yaptım yine hata veriyor

   sanırım yardıma ihtiyacım var...:-(

Tagli

Bu tür soruların için resmi XC8 kullanım kılavuzuna bakmalısın. Son versiyonu burada.

Kılavuzda bu konuyla ilgili bir örnek verilmiş:
unsigned int var;
int main(void)
{
    var = 1;
    asm("bcf 0,3");
    asm("BANKSEL _var");
    asm("rlf (_var)&07fh");
    asm("rlf (_var+1)&07fh");
}

ASM kodu yazarken derleyicinin ürettiği kodla çakışabilecek şeylerden kaçınman gerekiyor. Derleyicinin kendisinin kullandığı register'lara özellikle dikkat etmen gerekiyor. Eğer bunlar bir şekilde değişecekse, sanırım önce yedekleyip sonra işin bittiğinde eski değerlerini geri yerine yüklemelisin.

Ancak sana tavsiyem, çok özel bir ihtiyaç yoksa C içine ASM kodu gömmekten kaçınman, özellikle de bu konularda yeni isen. Yapmak istediğin her ne ise C ile yaz. Birkaç komut ve cycle tasarruf etmek için ortalığı karıştırmaya gerek yok bence.
Gökçe Tağlıoğlu

tomi

teşekkür ederim tagli arkadaşım ...

RaMu

Aynı konu üzerinden farklı konularda mesaj yazmak uygunsuz oluyor.
İlgili bir başlık ile yeni konu açarsanız
hem bilgisi olanlar konu başlığını görüp yardımcı olabilir
hemde ileride benzer sorunu yaşayanlar konuyu rahatlıkla bulup faydalanabilir.

Birde kod paylaşırken kod tag ını kullanırsanız
mesaj düzenli ve okuması kolay olur.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

OG

Alıntı yapılan: RaMu - 01 Nisan 2021, 14:24:22Aynı konu üzerinden farklı konularda mesaj yazmak uygunsuz oluyor.
İlgili bir başlık ile yeni konu açarsanız
hem bilgisi olanlar konu başlığını görüp yardımcı olabilir
hemde ileride benzer sorunu yaşayanlar konuyu rahatlıkla bulup faydalanabilir.

Birde kod paylaşırken kod tag ını kullanırsanız
mesaj düzenli ve okuması kolay olur.
silindi,
gerekli uygun bir başlık ile yeni konu olarak açsın
bu başlıkla ilgisi yok
başka temizlenecekler var ise bildirin lütfen
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.