Merhabalar kolay gelsin herkese. son dönemde assembly dili üzerine kendimce eğitim alıyorum. diğer sitede paylaştığım başlangıç ile ilgili ders notlarımı burada da paylaşmak istiyorum.
benim gibi assembly'e yeni başlayan kişilere pratik yapma açısından faydalı olabilir.
Bu derslerde yeni olmam dolayısıyla, gereksiz, uzun, fazla kodlar falan da olacaktır : ) amacım sadece pratik yapmak
BUTONA 5 DEFA BASTIKTAN SONRA DEVREYE GİREN FLİP-FLOP PROGRAMI
LIST P=16F628A
INCLUDE "P16F628A.INC"
__CONFIG _INTRC_OSC_NOCLKOUT &_BODEN_OFF &_PWRTE_ON &_MCLRE_ON &_WDT_OFF &_LVP_OFF &_CP_OFF
DENE EQU 0X20
SAYAC1 EQU 0X21
SAYAC2 EQU 0X22
SAYAC3 EQU 0X23
SAYAC4 EQU 0X24
ORG 0X00 ;PROGRAM KODLARININ BAŞLANIÇ SATIRI
CLRF PORTB ;PORTB' Yİ SIFIRLA
BSF STATUS,5 ;BANK1'e GEÇ
CLRF TRISB ;PORTB'yi TEMİZLE
MOVLW 0XFF ;PORTA'ya 11111111 YÜKLEYEREK
MOVWF TRISA ;PORTA'yı GİRİŞ YAP
BCF STATUS,5 ;BANK0'a GEÇ
MOVLW 0X07 ;W SAKLAYICIYA B'00000111' YÜKLE
MOVWF CMCON ;PORTA GİRİŞLERİ DİJİTAL GİRİŞ ÇIKIŞ
MOVLW D'5' ;W SAKLAYICIYA 5 SAYISINI YÜKLE
MOVWF DENE ;DENE SAYACINA W'yi(5) YÜKLE
BASLA
BTFSC PORTA,0 ;PORTA'ya BASILDI MI
GOTO BASLA ;HAYIR - BASLA'ya GİT
CALL BUTON_GECIKME ;EVET - BUTON ARKLANMA ÖNLEME GECIKME SÜRESİNE GİT
DECFSZ DENE,F ;DENE SAYACINDA 1 EKSİLT DENE'ye YÜKLE. DENE=0 ise ALT SATIRI ATLA
GOTO BASLA ;BASLA'ya GİT
DONGU
MOVLW 0XFF ;W SAKLAYICIYA FF YÜKLE
MOVWF PORTB ;W'yi PORTB'ye YÜKLE
CALL FLIPGECIKME ;FLIP FLOP GECIKMESİNE GİT
CLRF PORTB ;PORTB'yi SIFIRLA
CALL FLIPGECIKME ;FLIP FLOP GECIKMESİNE GİT
GOTO DONGU
BUTON_GECIKME ;BUTON ARKLANMA ÖNLEME GECİKMESİ
MOVLW 0XFF
MOVWF SAYAC1
BUTON_GECIKME1
MOVLW 0XFF
MOVWF SAYAC2
BUTON_GECIKME2
DECFSZ SAYAC2,F
GOTO BUTON_GECIKME2
DECFSZ SAYAC1,F
GOTO BUTON_GECIKME1
RETURN
FLIPGECIKME ;FLIP-FLOP YANMA SÜRESİ DÖNGÜSÜ
MOVLW 0XEE
MOVWF SAYAC3
FLIPGECIKME1
MOVLW 0XEE
MOVWF SAYAC4
FLIPGECIKME2
DECFSZ SAYAC4,F
GOTO FLIPGECIKME2
DECFSZ SAYAC3,F
GOTO FLIPGECIKME1
RETURN
END
RLF - RRF
Gerilim uygulandığında 6 defa sola kaydıktan sonra 6 defa sağa kayan ve bu şekilde sonsuz döngüye giren program.
LIST P=16F628A
INCLUDE "P16F628A.INC"
__CONFIG _INTRC_OSC_NOCLKOUT &_BODEN_OFF &_PWRTE_ON &_MCLRE_ON &_WDT_OFF &_LVP_OFF &_CP_OFF
SAYAC1 EQU 0X20
SAYAC2 EQU 0X21
SOL_SAYAC EQU 0X22
SAG_SAYAC EQU 0X23
ORG 0X00 ;PROGRAM KODLARININ BAŞLANIÇ SATIRI
CLRF PORTB ;PORTB' Yİ SIFIRLA
BSF STATUS,5 ;BANK1'e GEÇ
CLRF TRISB ;PORTB'yi TEMİZLE
MOVLW 0XFF ;PORTA'ya 11111111 YÜKLEYEREK
MOVWF TRISA ;PORTA'yı GİRİŞ YAP
BCF STATUS,5 ;BANK0'a GEÇ
MOVLW 0X07 ;W SAKLAYICIYA B'00000111' YÜKLE
MOVWF CMCON ;PORTA GİRİŞLERİ DİJİTAL GİRİŞ ÇIKIŞ
BASLA
MOVLW 0X01 ;W SAKLAYICIYA B'00000001' YÜKLE
MOVWF PORTB ;W'yi PORTB'ye YÜKLE
MOVLW D'0' ;W SAKLAYICIYA 0 SAYISI YÜKLE
MOVWF SOL_SAYAC ;0'ı SOL_SAYAC YÜKLE
MOVLW D'0' ;W SAKLAYICIYA 0 SAYISI YÜKLE
MOVWF SAG_SAYAC ;0'ı SAG_SAYAC YÜKLE
SOL ;SOLDAN SAĞA KAYMA
RLF PORTB,F ;PORTB'yi BİR SOLA KAYDIR DEĞERİ YİNE PORTB'ye YÜKLE
CALL GECIKME1 ;LED YANMA SÜRESİ DÖNGÜSÜNE GİT
BTFSS PORTB,7 ;PORTB,7 (EN SOLDAKİ LED) YANDI MI
GOTO SOL ;HAYIR - SOL'a GİT (KAYMA DEVAM ETSİN)
GOTO SOL_DEVAM ;EVET - SOL_DEVAM'a GİT (BU KAYMA İŞLEMİ 6 DEFA GERÇEKLEŞTİREN DÖNGÜ)
SOL_DEVAM ;SOLDAN SAĞA 6 DEFA DEVAM ETTİREN DÖNGÜ
MOVLW D'7' ;W SAKLAYICIYA 7 SAYISI YÜKLE
INCF SOL_SAYAC,F ;SOL_SAYAC'ı 1 ARTTIR SOL_SAYAC'a KAYDET
SUBWF SOL_SAYAC,W ;SOL_SAYAC'tan W'yi ÇIKAR (F ve W eşit olana kadar "Z" 0'dır)
BTFSS STATUS,Z ;BU ÇIKARMA SONUCU 1 oldu mu (STATUS ZERO BİT 1 OLDU MU
GOTO SOL ;HAYIR - SOL'a GİT
GOTO SAG ;EVET - 6 DEFA KAYMA İŞLEMİ BİTTİ SAG'a GEÇ
SAG ;SAĞDAN SOLA KAYMA
RRF PORTB,F ;PORTB'yi BİR SAĞA KAYDIR DEĞERİ YİNE PORTB'ye YÜKLE
CALL GECIKME1 ;LED YANMA SÜRESİ DÖNGÜSÜNE GİT
BTFSS PORTB,0 ;PORTB,0 (EN SAĞDAKİ LED) YANDI MI
GOTO SAG ;HAYIR - SAG'a GİT (KAYMA DEVAM ETSİN)
GOTO SAG_DEVAM ;EVET - SAG_DEVAM'a GİT (BU KAYMA İŞLEMİ 6 DEFA GERÇEKLEŞTİREN DÖNGÜ)
SAG_DEVAM ;SAĞDAN SOLA 6 DEFA DEVAM ETTİREN DÖNGÜ
MOVLW D'7' ;W SAKLAYICIYA 7 SAYISI YÜKLE
INCF SAG_SAYAC,F ;SAG_SAYAC'ı 1 ARTTIR SAG_SAYAC'a KAYDET
SUBWF SAG_SAYAC,W ;SAG_SAYAC'tan W'yi ÇIKAR (F ve W eşit olana kadar "Z" 0'dır)
BTFSS STATUS,Z ;BU ÇIKARMA SONUCU 1 oldu mu (STATUS ZERO BİT 1 OLDU MU
GOTO SAG ;HAYIR - SAG'a GİT
GOTO BASLA ;EVET - 6 DEFA KAYMA İŞLEMİ BİTTİ EN BAŞA DÖN
GECIKME1 ;LED YANIK KALMA SÜRESİ (YAKLAŞIK 196 ms)
MOVLW 0XFF
MOVWF SAYAC1
GECIKME2
MOVLW 0XFF
MOVWF SAYAC2
GECIKME3
DECFSZ SAYAC2,F
GOTO GECIKME3
DECFSZ SAYAC1,F
GOTO GECIKME2
RETURN
END
RLF
SOLA DOĞRU KAYAN LED
PORTA,0 İLE OLDUĞU YERDE DURAN
PORTA,1 İLE KALDIĞI YERDEN DEVAM EDEN
UYGULAMA
(bu programda LED'ler sola doğru kayarken ikisi beraber yanıyor nedenini anlamadım. nerde hata yaptığımı bulamadım.
LIST P=16F628A
INCLUDE "P16F628A.INC"
__CONFIG _INTRC_OSC_NOCLKOUT &_BODEN_OFF &_PWRTE_ON &_MCLRE_ON &_WDT_OFF &_LVP_OFF &_CP_OFF
SAYAC1 EQU 0X20
SAYAC2 EQU 0X21
ORG 0X00
CLRF PORTB
BSF STATUS,5
CLRF TRISB
MOVLW 0XFF
MOVWF TRISA
BCF STATUS,5
MOVLW 0X07
MOVWF CMCON
BASLA
MOVLW B'00000001'
MOVWF PORTB
SOL
CALL GECIKME
RLF PORTB,F
BUTON
BTFSC PORTA,0
GOTO DEVAM
DONGU
BTFSC PORTA,1
GOTO DONGU
GOTO DEVAM
DEVAM
BTFSS STATUS,C
GOTO SOL
GOTO BASLA
GECIKME
MOVLW 0XFF
MOVWF SAYAC1
GECIKME1
MOVLW 0XFF
MOVWF SAYAC2
GECIKME3
DECFSZ SAYAC2,F
GOTO GECIKME3
DECFSZ SAYAC1,F
GOTO GECIKME1
RETURN
END
Bende gördüğüm bir İnternet sitesini paylaşayım. Birilerine faydası dokunur.
https://www.circuitbread.com/tutorials/how-to-use-a-simple-microcontroller-series-intro-pic10f200-part-1