Pic 16f877a da ledin yanması demek  kullanılan  potrun ilgili  bitinin “1″ olması demektir.Yanan bir  ledin sağa sola hareket etmesini sağlayan özel komutlar  vardır:

rlf :   Açılımı “rotate left file”,içeriği sola kaydırmaya yarar.Örneğin portun içinde b’01000000′  ise  rlf komutu bir kere uygulandığında b’10000000′   şeklinde olur.

rrf: Açılımı “rotate right  file”,içeriği sağa kaydırmaya yarar.Örneğin portun içinde b’01000000′  ise  rrf komutu bir kere uygulandığında b’00100000′   şeklinde olur.


portun içeriğini sağa  sonra sola kaydıran örnek kodu inceleyelim:

Bu kodda    PORTB nin içine en başta b’00000001′  sayısı  yerleştiriliyor,içerik 7. bit 1 olana kadar her defasında  bir bit sola kaydırılıyor, çünkü 7. bit  1 olduğunda sola kayacak yer klamıyor,bu kontrolden sonra  sağa kaymalar başlayacaktır.Bu aşamada da içerik0. bit 1 olana kadar  her defasında bir bit olmak üzere sağa kaydırılıyor ,0. bit  1 olduğunda yine sola kayma olacaktır.

SAYAC1 EQU h’0C’   ;gecikme sayacları için adresler belirtiliyor
 
                  SAYAC2 EQU h’0D’
 
                       CLRF PORTB      ;potrbnin içi en başta temizleniyor
 
            BSF STATUS,5             ;bank1 tris registerlarının ayarlanması için seçildi
 
                 CLRF TRISB             ;portb çıkış portu yapıldı
 
                  BCF STATUS,5                  ;port içeriği ile ilgili işlem yapılması için tekrar bank0 a geçildi
 
               MOVLW h’01’               
 
               MOVWF PORTB            ;portb nin içine b'00000001'  sayısı atıldı
 
SOL:
 
             CALL GECIKME;en başta bi bekleme anı oluyor
 
            RLF PORTB,F               ;içerik 1 birim sola kaydı
 
  BTFSS PORTB,7            ;portbnnin 7. biti kontrol ediliyor,
 
1 ise sağa kaydırma başlayacak 1 değilse tekrar  sola kayma olacaktır                                                                                                 
 
GOTO SOL
 
SAG:
 
CALL GECIKME                    ;bekleme yapılıyor
 
RRF PORTB,F                     ;içerik 1 birim sağa kaydırılıyor
 
BTFSS PORTB,0                  ;portbnin 0. biti kontrol ediliyor 1 ise sola kaymaya geçilecek,0 ise sağa ;kaymaya devam
 
GOTO SAG
 
GOTO SOL
 
GECIKME:
 
              MOVLW h’FF’
 
             MOVWF SAYAC1           ;gecikme için sayac1 in içine h'FF'  sayısı atılıyor
 
DONGU1:
 
          MOVLW h’FF’
 
               MOVWF SAYAC2                 ;gecikme için sayac1 in içine h'FF'  sayısı atılıyor
 
DONGU2:
 
          DECFSZ SAYAC2,F
 
    GOTO DONGU2           ;sayac2 nin içindeki sayı 0 olana  kadar her defasında 1 azalt,0 olunca saya1 i      ;                                       ;azaltmaya git
 
               DECFSZ SAYAC1,F        ;sayac1in içi 0 olana kadar her defasında 1 azalt,0 olduğunda return yap
 
              GOTO DONGU1
 
              RETURN            ;en son callın yapıldığı adrese  gider
 
        END        ;programo bitir

DERYA GÜNDÜZ

http://deryagunduz.blogspot.com

deryagunduz47@gmail.com

portlar nedir ne işe yarar?

port

şekilden de  anlaşılacağı gibi,portlar bir microcontrollerda microcontroller ile bileşenleri arasındaki iletişimi sağlar.

pic 16f877a da  5 tane  port vardır:

  • PORT A
  • PORT B
  • PORT C
  • PORT D
  • PORT E

portların giriş çıkış  portları olması

portlar  kullanılacakları konuma  göre bazen çıkış portu bazen de giriş portu olmalıdır.portun  giriş ya da  çıkış portu olmasını yada  bazı bitlerinin  giriş bazı  bitlerinin çıkış olmasını  TRIS adındaki  özel bir register sağlar.

hangi port için çalışacaksak trisx  deyip bitlerini  değiştiririz.

0——>çıkış

1——>giriş

clrf    TRISB            ;b  portunun bütün bitlerini çıkış yapar

movlw  h’ff’

movwf  TRISA         ;a  portunun  bütün bitlerini  giriş yapar

ya da  bazı bitleri girş  bazılarını çıkış da  yapabiliriz:

movllw  b’00001111′

movwf     TRISD        ;d  portunun ilk 4  bitini giriş,son 4 bitini çıkış yaptık

porta yazma porttan okuma:

clrf          TRISB           ;önce  b  portunun bütün bitlerini çıkış olarak ayarlıyoruz

movlw     0×55

movwf      PORTB         ;portb nin içine  55 hex  yazdık

movlw  h’ff”

movwf    TRISA       ;a  portunu okuma yapmak için giriş portu yaptık

movf  PORTA,w

movwf   myreg          ;porta nın içeriğini  myreg adında  bir registera attık

DERYA  GÜNDÜZ

assembly programlama’da 3 çeşit adresleme vardır:

  • immidiate adressing
  • direct adressing
  • indirect adressing

immidiate adressing: bu adresleme türünde working egisterın içine doğrudan değişken atanabilir veya içeriğinde değişiklik yapılabilir,bu adresleme sadece working reg ile ilgili adres atamalarında kullanılır, çünkü başka bir adrese veri atacaksak mutlaka onu önce working registera ordan başka bir yere aktarmamız gerekir.

movlw 0×20;working registerın içine 20hex verisini atmış olduk
sublw 0×10;istersek bu atılan veride değişiklik de yapabiliriz

direct adressing: bu adresleme program yazarken en sık kullanılan adresleme türüdür,bu adresleme türünde bir veriyi bir adrese yazmak isterken onu önce working reg’e taşırız,ondan da istediğimiz yere.

movf 0×50,w ;50 hex verisini working reg’e atıyorum
movwf 0×20; ;working reg’in içindekini, yani 50hex verisini 20hex adresine atıyorum
böylece veriyi istediğim bir adrese atmış oluyorum.

indirect adressing: dolaylı adresleme diğer adresleme türlerine göre biraz daha karışk ve hata oranı daha fazladır.bu adresleme türünde veri yazmak istediğimiz adresi başka bir registerın içine yazıyoruz,bu exra registera yazdığımız adrese de başka bir register yardımıyla veri yazarız.

bu adresleme türünde yardımcı olarak kullandığımız iki extra register vardır:fsr ve indf registerları.

fsr register:   veri aktarmak istediğimiz adresin taşındığı registerdır.
indf register:fsrnin adreslediği yere karşılık geliyor,ram bellekte adresi buluna fiziksel bir register değildir.
indf registerını kullanan bir komut geldiğinde fsr’nin gösterdiği registerın içindeki veriye ulaşmak için kullanılır.
şimdi indirect adresleme yolu ile 0×20 verisini 0×50 adresine atalım:

movlw 0×50 ;w rege 50 adresini attım
movwf fsr ;w regindeki 50 hex adresini fsrnin içine attım
movlw 0×20 ;w regine 20 hex verisini attım
movwf indf ;workingdeki 20 hex verisini indf’nin içine attım,yani fsr’nin tuttuğu 50 hex adresine 20
;hex verisini yazmış oldum

neden indirect adresleme kullanma gereği duyarız???
indirect adresleme türünü daha çok ardıiık adreslerde işlem yapmak için kullanırız,
incf fsr diyerk bir sonraki adrese kolaylıkla geçmiş olruz.

DERYA GÜNDÜZ

http://www.deryagunduz.blogspot.com

mikroskosmos@hotmail.com

deryagunduz47@gmail.com

iki tane  registerımız olsun;
reg1
reg2
reg1 ve reg2nin içindeki verileri değiştirmek istiyorum.
assembly  programlamada essas olarak bir veriyi bir adrese taşıma istiyorsam o veriyi önce  working registera orda istenilen adrese taşımalıyım,iki registerın içini yer değiştirmek istiyorsam da hem working reg hem arada geçici kullanacağım bi reg kullanmalıyım,bu reg temp olsun.
değiştirme kodlar;:

movf reg1,w           ;reg1in içini w rege  at
movwf temp             ;wnin içeriğini  tempe at
movf reg2,w       ;reg2yi w ye at
movwf reg1         ;wnin içinde  reg2 vardı bunu  reg1e atıyorum
movf temp,w     ;tempin içini wye atıyorum,içinde reg1(içeriği) vardı
movwf reg2       ;wnin içini  yani tempten gelen reg1i de  reg2 ye attım

böylece temp geçici registrı ve  working registerı sayesinde reg1 ve reg2nin içini değştirmiş olduk

DERYA GÜNDÜZ

ESKİŞEHİR OSMANGAZİ ÜNİV. BİLGİSAYAR MÜHENDİSLİĞİ 2. SINIF

deryagunduz.blogspot.com

mikroskosmos@hotmail.com

deryagunduz47@gmail.com

© 2010 bilyaz.com , Programlama Makaleleri, Yazılım Makaleleri , Örnek Kodlar , Eğitim Videoları , C#,ASP.NET,SQL,PHP Suffusion WordPress theme by Sayontan Sinha