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);
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.
Ne 8 i bea ? :D
PB3'ü set etmek +0x08 anlamına gelir...
İ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)
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 (http://stackoverflow.com/questions/47981/how-do-you-set-clear-and-toggle-a-single-bit-in-c-c)
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.
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 */
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.
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.
Burada da güzel bilgiler var konu ile ilgili http://berik.net/forum/index.php?topic=494.0 (http://berik.net/forum/index.php?topic=494.0)
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.
http://bariscincorop.blogspot.com.tr/2016/01/atmel-avr-10-buton-led-uygulamas.html (http://bariscincorop.blogspot.com.tr/2016/01/atmel-avr-10-buton-led-uygulamas.html)