Serap Şen

Bilişim hakkında herşey…

Assembly ve PIC


Merhaba Arkadaşlar,

Bu haftaki assembly dersimizde PICle uğraştık.Yazdığımız kodları Pic’e yükleyerek nasıl çalıştığını gördük.Çok zevkliydi.Öğrendiklerimizin ürüne dönüştüğünü görmek gerçekten çok güzeldi.

Pic üzerinde 1′er 1′er sayan kod şu şekilde:

;*************************************************************
temp0 EQU 0×20
temp1 EQU 0×21
temp3 EQU 0×22
;*************************************************************
main
bsf STATUS,RP0 ;bank1′e geç
movlw b’00000111′
movwf ADCON1 ;PORTA dijital I/O seçildi
movlw b’00000000′
movwf TRISD ;PORTD’nin bütün pinleri çıkış yapıldı
bcf STATUS,RP0 ;bank0′a geç
movlw b’00000001′ ;değişiklik yapabiliriz.Ne şekilde çıkış gözlemlemek
movwf PORTD ;istiyorsak
;*************************************************************
bcf STATUS,C ; STATUS registerinin C bitini “0″ yap
call bekle ; 200 ms’lik gecikmeye dallan
loop
rrf PORTD,f ; PORTD’nin içeriğinin sağa kaydır
call bekle ; 200 ms’lik gecikmeye dallan
btfss PORTD,0 ; PORTD’nin 0′ıncı bitini test et “1″ ise 1 satır atla
goto loop ; loop etiketine git
call bekle ; 200 ms’lik gecikmeye dallan solakay
rlf PORTD,f ; PORTD’nin içeriğinin sola kaydır
call bekle ; 200 ms’lik gecikmeye dallan
btfss PORTD,7 ; PORTD’nin 1′inci bitini test et “1″ ise 1 satır atla
goto solakay ; solakay etietine git
call bekle ; 200 ms’lik gecikmeye dallan
goto loop ; loop etiketne git
;********************************************************
bekle ;bu rutin 200 ms lik gecikme sağlar
movlw .40
movwf temp3
loop5
call bes_ms_bekle
decfsz temp3,f
goto loop5
return
;**********************************************************
bes_ms_bekle ;bu rutin 5ms’lik gecikme sağlar değişkenler temp0, temp1
movlw .13
movwf temp1
loop1
decfsz temp1,f
goto loop2
return ;5ms lik döngü bitti dön
loop2
movlw .135
movwf temp0
loop3
decfsz temp0,f
goto loop3
nop
goto loop1
;******************************************************
END ; Programı sonlandır’

Sonucu Seven-segment displayde görmek için:

; Değişken atama
;************************************************************
sayi equ 0×20 ; 4 Elemanlı dizin
count1 equ 0×24 ;
segment equ 0×25 ; segment bilgi register’ı
digit equ 0×26 ; digit tarama register’ı
_w equ 0×27 ; Kopya register (W)
_status equ 0×28 ; Kopya regiter (STATUS)
sayac equ 0×29 ;
;**********************************************************
org 0×000
goto main
org 0×04
goto timer_interrupt
main;*******************************************************
call initial
devam call display ; Displaye yaz
goto devam ;

initial;******************************************************
bsf STATUS,RP0 ; Bank 1′e geç
clrf TRISB
clrf TRISE
clrf TRISD ; PortD –> Çıkış
clrf TRISA ; PortA –> Çıkış
movlw 0×07 ; PortA Digital
movwf ADCON1 ; I/O seçildi
movlw b’10000101′ ; Dahili OSC frekansı
movwf OPTION_REG ; 64′e bölündü
movlw b’10100000′ ; GIE ve T0IE
movwf INTCON ; aktif
bcf STATUS,RP0 ; Bank 0′a dön
clrf sayi ; sayi[0] <– 0
clrf sayi+1 ; sayi[1] <– 0
clrf sayi+2 ; sayi[2] <– 0
clrf sayi+3 ; sayi[3] <– 0
clrf sayac
return

timer_interrupt;**********************************************
movwf _w ; STATUS ve W register’ın
movf STATUS,W ; > durumlarını
movwf _status ; / kopya registerlarında sakla
bcf INTCON,T0IF ; T0IF bayrağını temizle
incf sayac ;
movlw .61
subwf sayac,0
btfss STATUS,Z
goto tison
clrf sayac
incf sayi ; sayi <– sayi+1
movlw .10 ;
subwf sayi,0 ;
btfss STATUS,Z ; sayi[0] = 10 ?
goto tison ; Hayır. Alt prog. çık
clrf sayi ; Evet
incf sayi+1 ; sayi[0]=0
movlw .10 ; sayi[1]= sayi[1] + 1
subwf sayi+1,0 ;
btfss STATUS,Z ; sayi[1] = 10 ?
goto tison ; Hayır. Alt prog. çık
clrf sayi+1 ; Evet
incf sayi+2 ; sayi[1]=0
movlw .10 ; sayi[2]=sayi[2] + 1
subwf sayi+2,0 ;
btfss STATUS,Z ; sayi[2] = 10 ?
goto tison ; Hayır. Alt prog. çık
clrf sayi+2 ; Evet
incf sayi+3 ; sayi[2]=0
movlw .10 ; sayi[3]=sayi[3]+1
subwf sayi+3,0 ;
btfsc STATUS,Z ; sayi[3] = 10 ?
clrf sayi+3 ; Evet sayi[3]=0
tison movf _status,W ; Interruptan önceki
movwf STATUS ; > STATUS ve W regiter’ın
movf _w,W ; / değerlerini geri yükle
retfie

timer;………………………………………………………………..
movlw 0xff ;
movwf count1 ;
next1 decfsz count1,1 ; > Display taraması için
goto next1 ; / zaman geçikmesi
return ; /

display ;……………..Displaylere ait rakamları bulma…………………..

tara
movlw b’00000000′
movwf PORTB
movf sayi,w
call rakam
call gonder ; PORTD’den gönder
movlw b’00010000′ ; 1.Dijiti seç
movwf PORTB
call timer ; Bir süre bekle

movlw b’00000000′
movwf PORTB
movf sayi+1,w
call rakam
call gonder ; PORTD’den gönder
movlw b’00100000′ ; 2.Dijiti seç
movwf PORTB
call timer ; Bir süre bekle

movlw b’00000000′
movwf PORTB
movf sayi+2,w
call rakam
call gonder ; PORTD’den gönder
movlw b’01000000′ ; 3.Dijiti seç
movwf PORTB
call timer

movlw b’00000000′
movwf PORTB
movf sayi+3,w
call rakam
call gonder ; PORTD’den gönder
movlw b’10000000′ ; 4.Dijiti seç
movwf PORTB
call timer

return

gonder; ……Ortak Anoda Uyarlayıp Displaye veri Gönderme………………….
movwf segment ; Segmentlere gönderilecek
movwf PORTD ; / den gönder
return ;

rakam; ………….Rakamın kodunu elde etme………………………………
addwf PCL,1
; abcdefgdp
retlw B’11111100′ ;0
retlw B’01100000′ ;1
retlw B’11011010′ ;2
retlw B’11110010′ ;3
retlw B’01100110′ ;4
retlw B’10110110′ ;5
retlw B’10111110′ ;6
retlw B’11100000′ ;7
retlw B’11111110′ ;8
retlw B’11110110′ ;9
end

Tags: , , ,


Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

*

*

Şu HTML etiketlerini ve özelliklerini kullanabilirsiniz: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Follow Me

Microsoft Imagine Cup 2012 Repharm Project

Makalelerimi takip edebilirsiniz…

Arşivlerim

Readmee E-dergimiz

Anketler

Web Sitemi Beğendin mi?

  • Kötü (24%, 35 Votes)
  • Fena değil (8%, 12 Votes)
  • İdare eder (10%, 15 Votes)
  • İyi (18%, 27 Votes)
  • Çok iyi (40%, 57 Votes)

Total Voters: 146

Loading ... Loading ...

Kaç Kişi Online?