Bu kodda ne hata var

Başlatan murat11h1, 11 Aralık 2010, 16:44:06

murat11h1

normalde bu kod 8 ledli karaşimşek devresiydi ben biraz kodlarla oynadım
derledim çalışmıyor birde siz gözden geçirin gençler

;=============================================
;Pic 16F628 ile 15 ledli Karaşimşek Devresi
;=============================================

LIST P=16F628
INCLUDE "P16F628.INC"

__config _CP_OFF & _DATA_CP_OFF & _LVP_OFF & _BODEN_ON & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_CLKOUT

SAYAC1 EQU h'20'
SAYAC2 EQU h'21'

;=====PORTLARIN GİRİŞ VE ÇIKIŞLARI AYARLANIYOR=====
CLRF PORTB
BCF STATUS, 0
BSF STATUS, 5
CLRF TRISB
BCF STATUS, 5

MOVLW h'01'
MOVWF CMCON

;=====BAŞLANGIÇ AYARLARI YAPILIYOR=====
MOVLW h'01'
MOVWF PORTB

;=====PROGRAM ÇALIŞMAYA BAŞLIYOR=====
SOL ;SOLA KAYDIRMA İŞLEMİ YAPILIYOR
CALL BEKLE
RLF PORTB, F
BTFSS PORTB, F
RLF PORTA, F
BTFSS PORTA, F
GOTO SOL

SAG ;SAĞA KAYDIRMA İŞLEMİ YAPILIYOR
CALL BEKLE
RRF PORTA, F
BTFSS PORTB, 0
RRF PORTB, F
BTFSS PORTB, 0
GOTO SAG
GOTO SOL

;=====GECİKME YAPTIRILIYOR=====
BEKLE
MOVLW h'5F'
MOVWF SAYAC1
DONGU1
MOVLW h'FF'
MOVWF SAYAC2
DONGU2
DECFSZ SAYAC2, F
GOTO DONGU2
DECFSZ SAYAC1, F
GOTO DONGU1
RETURN

;=====PROGRAMIN SONU=====
END


Bildiğini söylemeyen dilsiz şeytandır. (Hadis)

Tagli

#1
Öncelikle, "çalışmıyor" ne demek? Bu ifadeyi açmalısın. Yani, devreye elektrik verdiğinde ne gözlemlediğini yazmalısın. Kodun sen oynamadan önceki çalışır halini eklemen de faydalı olacaktır.

Gözüme çarpan bazı hatalar var:

  • _INTRC_OSC_CLKOUT yazmışsın. Bu durumda A6 bacağını kullanamazsın, çünkü buradan clock çıkışı verilir. Bu bacağın çalışabilmesi için _INTRC_OSC_NOCLKOUT yazmalısın.
  • "BTFSS PORTB, F" göze çarpıyor birkaç yerde. Bu ifade çok anlamsız, çünkü F demek 1 demektir. 1. biti kontrol etmenin bir anlamı yok.
  • Döngü mantığı da yanlış. İşi kolay yoldan yapmak için hem sağ hem de sol döngülerinde PORTA ve PORTB beraber kaydırılmalı, böylece kod genelleşmiş olur. Arada bir kontrol yapmana gerek yok, zaten C biti geçişi sağlayacaktır. Ama sola kaydırırken önce PORTB'yi, sağa kaydırırken de önce PORTA'yı kaydır.
  • Sola kaydırmadaki sınır "BTFSS PORTA, (son bacağın numarası)" şeklinde olmalı
  • A4 Open Drain Output olduğundan bir pull up direncine ihtiyacın var. A5 ise sadece giriştir, bu bacak ile LED yakamazsın.

Ekleme: Bir tane unutmuşum:
MOVLW d'7'
MOVWF CMCON
olmalı
Gökçe Tağlıoğlu

eseneren

CLRF PORTB
BCF STATUS, 0 <---- Bu satırın farketmedıgım bır amacı yoksa cıkabılır
BSF STATUS, 5

*******************
SOL ;SOLA KAYDIRMA İŞLEMİ YAPILIYOR
BTFSC PORTB, 7
GOTO SAG
RLF PORTB, F
GOTO SOL

BU GIBI OLMALI

Seçim yapmak için durum hakkında bilgi sahibi olmak zorunda değilsin, sonucuna hazır olmak için durum hakkında kaygılanırsın.  http://bit.ly/gixfTk

Tagli

"BCF STATUS, 0" ifadesi C'nin 0 olmasını garantiliyor. PIC'e enerji verildiğinde bu bitin ne olacağı belirsiz. Şansına 1 olarak başlarsa, kaydırma sırasında 2 adet LED'in yandığını görürsün.

senerenemre, verdiğin kod parçası 8 LED için uygun. murat11h1 ise LED sayısını arttırmak istiyor. A5'ten çıkış alınamayacağını göz önünde bulundurur ve de kodu karmaşık bir hale getirmemek için A6 ve A7'yi de bu işin dışında bırakırsak kaydırma kodları şu şekilde olmalı:

SOL
call     BEKLE
rlf     PORTB,F
rlf     PORTA,F
btfss     PORTA,4
goto     SOL
goto     SAG

SAG
call     BEKLE
rrf     PORTA,F
rrf     PORTB,F
btfss     PORTB,0
goto     SAG
goto     SOL
Gökçe Tağlıoğlu

eseneren

Sn Tagli,
haklısınız aklıma gelmedı rotate ıcın gereklı status tsk ederım:).

Farkındayım a portun da da gerekli kodları yazacak idim yukarı cıkıp tekrar okuyunca gozden bır sey kacırmısım
"derledim çalışmıyor birde siz gözden geçirin gençler" uslup hosuma gıtmedı o halı ıle yolladım.
Seçim yapmak için durum hakkında bilgi sahibi olmak zorunda değilsin, sonucuna hazır olmak için durum hakkında kaygılanırsın.  http://bit.ly/gixfTk