AVR "_BV" ve "1<<"

Başlatan veliusta, 16 Aralık 2015, 02:48:41

veliusta

1)

PORTB |= _BV(PB3);       vs        PORTB |= (1 << PB3);


Aradaki fark nedir? Hangisi doğru kullanımdır?


2)

DDRD &= ~(1 << DDD2);      vs      DDRD &= ~(1 << PD2);
PORTD |= (1 << PORTD2);             PORTD |= (1 << PD2);

z

Tercih meselesi olmalı.

1<<3, 3 nolu bitin 1 yapılacağını söylüyor ve   8 sayısına kıyasla daha kısa sürede yapılmak istenen amaç anlaşılıyor.


Bana e^st de diyebilirsiniz.   www.cncdesigner.com

veliusta


MrDarK

PB3'ü set etmek +0x08 anlamına gelir...
Picproje Eğitim Gönüllüleri ~ MrDarK

veliusta

#4
İyi de 0x08 yazsam PB3 HIGH Diğer pinler low olmayacak mı?

mesaj birleştirme:: 17 Aralık 2015, 04:26:52

PORTB |= (1 << 0x08 );  ile çalışmadı.

mesaj birleştirme:: 16 Aralık 2015, 14:28:20

ayrıca Bu komut 1 yapılacağını söylemiyor. Çünkü Lowda yapıyor. (1<<PB3)

MrDarK

Biraz Bitwise operatörlerini ve işlemlerini araştırmanı öneririm.

PORTB |= 0x08; yaptığında sadece PB3'ü set et demiş olursun.

http://stackoverflow.com/questions/47981/how-do-you-set-clear-and-toggle-a-single-bit-in-c-c
Picproje Eğitim Gönüllüleri ~ MrDarK

z

PORTB |= (1 << 0x03 ) ile
PORTB |= 0x08 aynı anlama gelir.

PORTB |= (1 << 0x08 );  Bu bambaşka bir şey.

Alıntı yapılan: veliusta - 16 Aralık 2015, 14:23:30
İyi de 0x08 yazsam PB3 HIGH Diğer pinler low olmayacak mı?

mesaj birleştirme:: 17 Aralık 2015, 04:26:52

PORTB |= (1 << 0x08 );  ile çalışmadı.

mesaj birleştirme:: 16 Aralık 2015, 12:28:20

ayrıca Bu komut 1 yapılacağını söylemiyor. Çünkü Lowda yapıyor. (1<<PB3)

Low yapmasını istiyorsan | işaretini kaldıracaksın.

PORTB = (1 << 0x03 ) yazarsan low da yapar.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

mehmet

PORTB &= ~(1 << 0x03)
Low için böyle yapmakta yarar var...

Bir kaç makro;
#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 */
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"

pax

Alıntı yapılan: mehmet - 16 Aralık 2015, 15:43:23
PORTB &= ~(1 << 0x03)
Low için böyle yapmakta yarar var...

1 yapmak için de PORTB |= (1 << 0x03) bu şekilde olmalı zannedersem.
yarar var derken neyi anlatmak istiyorsunuz. neden direk 1 veya 0 yapılmıyorda bu yöntem kullanılıyor.

z

Buradaki amaç PortB nin diğer bitlerine dokunmadan sadece 3 nolu biti 1 yapmak.

Eğer 3 biti 1, diğer bitleri 0 yapmak isteseydik o zaman PORTB=8 yada PORTB=1<<3 yazar geçerdik.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

crazy


veliusta

PullUp'lu Buton okumayı böyle yapıyorum.

  if(!(PIND & _BV(PD2))){
    Serial.println("BASILDI");
  }


DDRD &= ~(1<<PD2);
 PORTD |= (1<<PD2);
 DDRD &= ~(1<<PD3)
 PORTD |= (1<<PD3);
 DDRD &= ~(1<<PD4);
 PORTD |= (1<<PD4);
 DDRD &= ~(1<<PD5);
 PORTD |= (1<<PD5);


Daha az kodlar nasıl yazarım. Binary olarak denedim oldu fakat butona bastığımda led'in ışığı biraz sönüyordu. Kısa devre oluyor sanırım. Yukarıdaki gibi yapınca sorun yok.