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

Yan taraftaki sekildeki gibi kullandığım 16f628a PIC 'ine 4 buton ve 4 tane led bağlayarak, Pic 'in tuttuğu değere göre ledlerin yanmasının ardından aynı kombinasyonu butonlar ile gerçekleyerek bir  sonraki level atlamak.

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.



  1. Random Sayı Tutma
Random sayı tutma işini şçyle gerçekleştirdim.Öncelikle DRM diye register tanımlayarak bu DRM değerini her timer0 kesmesinde bir sola kaydırarak eğer kaydırma <0 1 2 3> 3. bite geldiyse tekrar 0. bitini 1 yaptım.Bu olay gerçekleştirken main kısmında bunu çekerek ledleri buna göre yaktım

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.

//------------------------------------------------------------------------------------ Proje Dosyalarımı Aşağıdan İndirebilrsiniz veya yardımcı olabilirisiniz http://speedy.sh/p5xxX/HuseyinAycanFollowLed.rar //------------------------------------------------------------------------------------

Yorumlar

Bu blogdaki popüler yayınlar

Soru ve Cevaplarla Kompanzasyon

Aktif Güç Nedir,Reaktif Güç Nedir

Sinusoidal AC dalga şekli, Tepe, ortalama, efektif(rms), değer tanımları...