Portları döngüde kullanmak

Başlatan osmanandac, 11 Mayıs 2010, 15:35:42

osmanandac

Bir projede PICin portlarını tanımlayıp döngü içinde kullanmak istiyorum.
Yani pic16f628 portlarını yani PORTA ve PORTB çıkışlarını örnek verecek olursam
RA3=benim_portlarim(0)
RB2=benim_portlarim(1)
RA1=benim_portlarim(2)
RB7=benim_portlarim(3)
RB0=benim_portlarim(4)
Rxx=benim_portlarim(x)
...
şeklinde eşleştirerek döngü içinde kullanmak istiyorum.
for(i=0;i<10;i++)
{
   benim_portlarim(i);
.....
.....
}

Bunu nasıl yapabilirim

arslan74

Merhaba,
Portlar da pinlerini değişken olarak kullanarak set veya clear etmek istiyorsan. Bunu ancak söyle yapabilirsin. Öncelikle 3 tane değişik bilgiyi bu fonksiyona iletmen gerek.
Bir hangi port, hangi pin, set mi yoksa clear mi edilecek. Ya üç parametreli tek bir fonksiyon yazabilirsin, yada set ve clear yapan iki tane ayrı fonksiyon yazabilirsin. Cok basid olan bitset veya bitclear asm fonksiyonun kullanamassın. Burada maskeleme yöntemini kullanmamısın. Portlar hafızada birer adresdir. Bu adrese yazma yaparsan doğrudan portlara erişirsin. pic18f4620 datasheetin de bu adresler var.

F84h  PORTE
F83h  PORTD
F82h  PORTC
F81h  PORTB
F80h  PORTA


hi-tech de söyle tanımlamışlar.

static volatile near unsigned char	PORTE		@ 0xF84;
static volatile near unsigned char	PORTD		@ 0xF83;
static volatile near unsigned char	PORTC		@ 0xF82;
static volatile near unsigned char	PORTB		@ 0xF81;
static volatile near unsigned char	PORTA		@ 0xF80;



Portları set veya clear için, basid bir macro düşünürsen, aşağıdaki gibi olabilir.

#define bitset(var,bitno) ((var) |= 1 << (bitno))
#define bitclr(var,bitno) ((var) &= ~(1 << (bitno)))



Örnek olması için basid bir kod yaziyorum.


{
	
	unsigned char* adr;
	
	adr = &PORTD;	
	
	bitset(*adr,7); // Port_D

	bitclr(*adr,7); // Port_D

}


Umarım işine yaramıştır.