Portlardaki bilgileri takas nasıl edebilirim ??

Başlatan Proteus, 20 Kasım 2014, 00:37:48

Proteus

PORTB deki bcd bilgiyi PORTD ye PORTD dekini ise PORTB ye nasıl atabilirim

şöyle düşündüm ; 
   
  i=portb;
         j=portd;
        delay_ms(150);
       i=portd;
       j=portb;

Sizce nasıl yapabilirim ?

Gökhan BEKEN

#1
i=portb;
j=portd;
delay_ms(150);
portd=i;
portb=j;

veya:

i=portd;
portd=portb;
delay_ms(150);
portb=i;


150ms beklemek fazla olmuş

i ve j değişkenlerini char olarak tanımlamayın, unsigned char yapın, int'de olur ama gerek yok
18f serisi kullanıyorsanız, yazarken LATB ve LATD registerlarını kullanın.
Özel mesaj okumuyorum, lütfen göndermeyin.

Proteus

#2
16 serisi kullanıyorum değerler int tipinde ama olmuyo değerleri değişmiyor unsigned char diye de değiştim değerler takaslanmıyor

RaMu

//file1 > portb  file2> portd
//portb ile portd içeriğini yer değiştirir
#asm

      movf   PORTD,w    //file1=b'0001 0011' file2=b'0000 1111'  
                                   //w=b'0000 1111' (after execution) 
      xorwf  PORTB,f     //file1=b'0001 1100' w=b'0000 1111'        
      xorwf  PORTB,w   //file1=b'0001 1100' w=b'0001 0011'     
      xorwf  PORTB,f     //file1=b'0000 1111' w=b'0001 0011'
      movwf  PORTD      //file2=b'0001 0011'
#endasm


Bu hoşuma gittiği için paylaştım,
asm de başka değişken kullanmadan
(wreg kullanılıyor tabiki)
iki file register ı yer değiştirme.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

Proteus


Karamel

Meftun hocam. ben birsey sormak istiyorum. piclerde port registerlari ile lat registerlari arasindaki farklar neler?

Gökhan BEKEN

Alıntı yapılan: Karamel - 21 Kasım 2014, 00:52:40
Meftun hocam. ben birsey sormak istiyorum. piclerde port registerlari ile lat registerlari arasindaki farklar neler?
daha önce şu mesajımda da açıklamıştım: https://www.picproje.org/index.php/topic,53020.msg401790.html#msg401790

16F serisiyle denemedim ama 18F serisinde PORTA=PORTA; gibi birşey yazdığında normalde değerin değişmemesi beklenirken o port yanlış bir değer alır. Çünkü hemen okuyup aynı porta hemen yazmaya çalışmış oluyoruz. Bunu yapabilmek için bir süre beklemek gerekiyor. Yani önce başka bir değişkene aktarıp bir süre bekleyip, sonra değişkenin değerini porta yazmak gerekiyor. Bu yüzden LAT register'larını akıl etmişler, yazma yapacağımız zaman ilgili portun LAT register'ına yazıp, okuma yapcağımız zaman PORT register'ını okursak böyle bir sorun olmuyor. Örnek LATB=PORTB dersek, sorun olmaz. Okuma ise şöyle olmalı if(PORTA==0xAA) gibi... Bunları karşılaştığım sorunlardan ve denemelerimden buldum, işin teknik boyutunu tam anlamıyla araştırmadım(gerek duymadım), datasheet'lerden daha detaylı bilgiler edinilebilir.
Özel mesaj okumuyorum, lütfen göndermeyin.

bocek

Alıntı yapılan: RaMu - 20 Kasım 2014, 05:05:24
//file1 > portb  file2> portd
//portb ile portd içeriğini yer değiştirir
#asm

      movf   PORTD,w    //file1=b'0001 0011' file2=b'0000 1111'  
                                   //w=b'0000 1111' (after execution) 
      xorwf  PORTB,f     //file1=b'0001 1100' w=b'0000 1111'        
      xorwf  PORTB,w   //file1=b'0001 1100' w=b'0001 0011'     
      xorwf  PORTB,f     //file1=b'0000 1111' w=b'0001 0011'
      movwf  PORTD      //file2=b'0001 0011'
#endasm


Bu hoşuma gittiği için paylaştım,
asm de başka değişken kullanmadan
(wreg kullanılıyor tabiki)
iki file register ı yer değiştirme.

Buna "XOR Swap Algorithm" deniyor zaten. PIC'e özgü değil, herkes kullanabilir.
http://en.wikipedia.org/wiki/XOR_swap_algorithm

#define XORSWAP(a, b)	((a)^=(b),(b)^=(a),(a)^=(b))
1 ya da 0. işte 'bit'ün mesele..

Karamel

Meftun hocam. yanitiniz icin tesekkur ederim ama halen aklimda neden boyle olduguna dair sorular var.... suan okuldayim. eve gecince vakit bulabilirsem datasheetleri bir karistirayim. birseyler ablayabilirsem burada paylasirim.... ::)

Gökhan BEKEN

Böyle birşey olmasının sebebi, normal register'a veri yazmak ile doğrudan pinlerle ilişkili register'a veri yazmanın farklı sürelerde olmamasıdır. Çünkü biri sadece ram'e birşeyler yazıyor, diğeri bir iş yapıyor yani pinleri set/reset ediyor. Bu yüzden LAT'ı akıl etmişler, bu register normal değişkenler gibi sadece ram ile ilişkili bir register, yani üst üste yazma sorunu yok. LAT register'ları direkt olarak portlara erişmiyor yani. Bunu sanal port gibi düşünebilirsiniz. Biz LAT register'ına yazarız, zamanı gelince PORT register'ına otomatik olarak aktarılır mimari tarafından.
Benim bildiğim budur, yanlış bilgi vermişsem bilen arkadaşlar düzeltsin.
Özel mesaj okumuyorum, lütfen göndermeyin.

Karamel




18f2550 nin datasheetinden yukaridaki kismi buldum. baska biryerde daha ayrintili anlatiliyormu bilmiyorum ama yukarida sunlari diyor.


secilen microchip e bagli olarak port sayisi 5 e kadar yukselebilir. IO portlarin bazilari alternatif fonksiyon icerebilirler. mesela cevresel birimler gibi. genellikle, cevresel birimler kullanildiginda. o pinler artik genel IO amaci ile kullanilamazlar.

her bir portun 3 tane register i varmis. bunlar, Tris, Port ve Lat.

The data latch register pinleri okumak, degistirmek ve yazmak icin cok kullanisliymis. figure 10-1 de basit olarak bu birimler gosterilmis.

porta 8 bit, cift yonlu ve genis kapsamli bir portmus. data selection register a karsilik gelen register Trisa imis. bunda 1 yaptiklarimiz giris. 0 yaptiklarimiz da cikis oluyormus.


-MEftun hocaminda dedigi gibi. okurken port registerini. yazarkende lat register ini kullanin diyor.

ayrica lat registerlari memory mapped falan diyor. baskada lat ile ilgili bilgi bulamadim.....




hocam suan dersler yuzunden elektronik e cok uzagim.. acaba asagidaki kod lari 18f pic te calistirabilirmisiniz?

KOd1:

TrisB = 0;

while(1)
{
   PortB = 0;
   PortB = 0xFF;
}


-----------------------------------------------------------------------------------------------------------------------

Kod2:

TrisB = 0;

while(1)
{
   LatB = 0;
   LatB = 0xFF;
}


acaba hiz farki olacakmi? ben yazin 18f2525 ile deneyler yaparken hep port registerini kullandim. bir sorun cikmadi. acaba yanlis birseymi yaptim? hatali ogrenmiyelim....  :-\

RaMu

http://electrosome.com/read-modify-write-problem-pic/

Sorunun cevabı burada,
lat ın amacı denebilir,
aslında daha güzel anlatan bir kişi vardı ama bulamadım.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html