PIC ASSEMBLY ILE HAFIZA OYUNU
Merhaba arkadaşlar.
Bu dönem ki Mikroişlemciler dersinde herkesin gerçekleştirmesi gereken projeler vardı.Biz de arkadaşlarımız ile Hafıza oyunu yapmaya karar verdik.
Oyunumuzun mantığı söyle ki
Bu dönem ki Mikroişlemciler dersinde herkesin gerçekleştirmesi gereken projeler vardı.Biz de arkadaşlarımız ile Hafıza oyunu yapmaya karar verdik.
Oyunumuzun mantığı söyle ki
Projemizin donanım kısmı basit olmasına karşılık Yazılım kısmı bir hayli zorlamaktadır.
Yazılım aşamaları
- Random Sayı Tutu
- Tuttuğun sayıya göre ledleri yak sök
- Butonlardan deger oku
- Okuduğun deger sırası ve sayısı yanan ledlerin sırası ve sayısı ile aynı ise yeniden değer tutarak leveli artır
- Eğer yanlısşa oyun sona ermiştir.
- Random Sayı Tutma
KESME_ALT_PROG
TIMERKESMESI
BTFSS INTCON,2
GOTO KESMELERINSONU
BCF INTCON,2 ; TMR0 kesmesini sonrakilere hazırla
RLF DRM,F ; DRM REGISTERINI 0 ILE 3. BIR ARASINDA
BTFSC DRM,4 ;DONMESINI SAGLADIK CALL DRM_SIFIRLA ; EGER 4. BITI DRM 'UN 1 ISE SIFIRLADIK
; Durum sıfırlama fonksiyonu
DRM_SIFIRLA
MOVLW B'00000001'
MOVWF DRM
RETURN
2. Ledler yakma
Ledlerin yanmasını söyle yapmak istiyordum.İlk başta 1 tane led yanıp sönecekti.Sonra level 2 olduğu için 2 defe 2 kere yanıp sönecek ve eğer leveli geçersek levelimiz 3 olacak.Bu level de ledler 3 defa 3 kez yanıp sönecekti.Aklımda kağıt üzerinde o kadar yazarak algoritma oluşturmama rağmen ASM de bunu gerçekleştiremedim.C 'de C++ 'da Java ' da veya diğer programla dillerinde kullandığım FOR IF gibi komutları mumla arıyordum.Normal de yapmasını istediğim.
alt alta 2 tane for dongusu ve içteki döngü dıştaki döngü kdar dönecekti.
Yukarıda anlattığımı başaramadım ama ancak ona benzer sekilde bir döngü ile ledlerin yanmasını sağladım.
PROGRAM
CLRF DNG1
CLRF DNG2 ; DONGU DEGISKENLERIMI SIFIRLADIM
CLRF DNGSAKLA
LOOP1
INCF DNG1,F ; DONGU DEGISKENIN 1 ARTIRDIM
LOOP2
INCF DNGSAKLA,F
; DONGU2 DEGISKENINI 1 ARTIRDIM
; BUNU YAPMA AMACIM 2 TANE DONGU ACAARAK
; ILK DONGU BOLUMLERI BELIRLEMEKTEDIR
; ALTTAKI DONGU ISE LEDLERIN KAC DEFA YANACAGINI BELIRTMEKTEDIR
KOD
BCF STATUS,Z
INCF DNG2,F
MOVF DRM,W ;ALT TARAFTA SUREKLI OLARAK DEGISEN DRM DEGISKENINI YAKALADIM VE SA ;KLA DEGISKENINE ATADIM
MOVWF SAKLA
;SIMDI ELDE ETTIGIM DRM DEGERINDEKI 1 IN YERINE GORE LEDLERI YAKACAZ
BTFSC SAKLA,0
CALL LED1YAK
BTFSC SAKLA,1
CALL LED2YAK
BTFSC SAKLA,2
CALL LED3YAK
BTFSC SAKLA,3
CALL LED4YAK
MOVF DNG2,W
XORWF NUM1,F
BTFSC STATUS,Z
CALL REG1ATA
MOVF DNG2,W
XORWF NUM2,F
BTFSC STATUS,Z
CALL REG2ATA
MOVF DNG2,W
XORWF NUM3,F
BTFSC STATUS,Z
CALL REG3ATA
MOVF DNG2,W
XORWF NUM4,F
BTFSC STATUS,Z
CALL REG4ATA
MOVF DNG2,W
XORWF NUM5,F
BTFSC STATUS,Z
CALL REG5ATA
MOVF DNG2,W
XORWF NUM6,F
BTFSC STATUS,Z
CALL REG6ATA
MOVF DNG2,W
XORWF NUM7,F
BTFSC STATUS,Z
CALL REG7ATA
MOVF DNG2,W
XORWF NUM8,F
BTFSC STATUS,Z
CALL REG8ATA
MOVF DNG2,W
XORWF NUM9,F
BTFSC STATUS,Z
CALL REG9ATA
MOVF DNG2,W
XORWF NUM10,F
BTFSC STATUS,Z
CALL REG10ATA
BCF STATUS,Z
MOVF DNG2,W ; W --*> YA DNG1 DEGISKENI ATA
SUBWF DNG1,W ; DNG2-DNG1 'IN SONUCU SIFIR ISE DNG2 BI DAHA DONSUN
BTFSS STATUS,Z ; EGER 1 OLURSA DNG1 DONGUSUNE DONEREK
GOTO KOD
;BUTONDAN VERI OKUMA KISMI YANI INTERRTUPTLARI BURADA ACIĞ KAPATIM KONTROL EDERECEM
CLRF DNG2
;kOMUTLARI BURAYA YAZACAM
CALL GECIKME
CALL GECIKME
CALL GECIKME
BTFSC PORTB,3
BSF PORTA,0 sa
CALL GECIKME
CLRF PORTA
CLRF PORTA
BCF STATUS,Z
MOVF DNGSAKLA,W ; W --*> YA DNG1 DEGISKENI ATA
SUBWF DNG1,W ; DNG2-DNG1 'IN SONUCU SIFIR ISE DNG2 BI DAHA DONSUN
BTFSS STATUS,Z ; EGER 1 OLURSA DNG1 DONGUSUNE DONEREK
GOTO LOOP2
CLRF DNGSAKLA
GOTO LOOP1
;GOTO KOD
3.Butonlardan veri okuma
Proje buraya kadar çalışmakta ancak butonlardan veri alma kısmını tam yapamadım.Çünkü butona ne kadar basıp duracak veya basık tutacak.Onu ayarlamam gerekiyor.Ancak bunu CALL GECIKME yani gecikme yaparak olmaz.Olsa bile ayarlanması zor olaacak gibi.Anca yapsa yapsam RB kesmeleri ile yapacağım ancak butonlarda kesme olunca
ORG h'004' ;Kesme oluştuğunda
GOTO KESME_ALT_PROG ;Kesme alt programına dallan
Alt programa dallandığı yerde
KESME_ALT_PROG
TIMERKESMESI
BTFSS INTCON,2
GOTO KESMELERINSONU
BCF INTCON,2 ; TMR0 kesmesini sonrakilere hazırla
RLF DRM,F ; DRM REGISTERINI 0 ILE 3. BIR ARASINDA
BTFSC DRM,4 ;DONMESINI SAGLADIK
CALL DRM_SIFIRLA ; EGER 4. BITI DRM 'UN 1 ISE SIFIRLADIK
BUTONKESMESI
BTFSS INTCON,0
GOTO KESMELERINSONU
BCF INTCON,0 ;RB 4 5 6 7 BITLERI K
MOVF PORTB,W ;PORTB YI W YA KAYDET
MOVWF BTNSAKLA
; Buraya kodları yazılacak
MOVF BTNSAKLA,W
MOVWF PORTA
KESMELERINSONU
RETFIE
Şekilde yazdım ancak çalışmadı .Buton kesmesini gerçekleştiremedim.Projemiz bu aşamadadır.
Buton kısmını ve simülasyonları halledersem Devre kurmaya başlayacağım.
Kolay gelsin İyi çalışmalar.
Yorumlar