pcbway

7-segment display de Pic18f452 ile 0-9 sayıcı yapmak.

Başlatan habibceylan, 22 Mayıs 2012, 00:54:04

habibceylan

Arkadaşlar öncelikle herkese merhaba.

Aşağıya eklediğim şemadaki gibi bi devre yapmam gerekiyor. Elimde araç gereçler var ancak bir türlü assembly de yazamadım. Yardımlar için şimdiden teşekkürler.


kudretuzuner

Merhaba
Siz başlayın,programınızı yazın,takıldığınız yerlerde yardım edecek arkadaş olur.Kolay gelsin.Not,soru oldukça basittir \"0\"  ve  \"1\"   rakkamının kodlarını vereyim size fikir olur.
(SIFIR KODLARI)
CLRF PORTB
BSF PORTB,0
BSF PORTB,1
BSF PORTB,2
BSF PORTB,3
BSF PORTB,4
BSF PORTB,5
BCF PORTB,6
(BİR KODLARI)
CLRF PORTB
BCF PORTB,0
BSF PORTB,1
BSF PORTB,2
BCF PORTB,3
BCF PORTB,4
BCF PORTB,5
BCF PORTB,6
Kodlar çok açık bir şekilde yazılmıştır.Döngü ile de yazılabilir ama konuyu kavrama açısında bu yazılımı tercih ettim.

habibceylan

Benim kafamın karıştığı yer aslında şu 7 segmente göndereceğim binary sayılarda oluyor.

Mesela B\'0000000\' göndersem sıfırmı oluyor?
Yada    B\'0000011\' gönderdiğimde 3 mü olacak?

Çünkü anladığım kadarıyla pic in pinleri 7-segmentin pinlerine binary sayıları sırasıyla okuyacak şekilde bağlanmış.

Şu ana kadar 1sn lik gecikme olayını hallettim sayılır.Ama bu cont değişkenlerini tanımlarken sıkıntı oluyor. kaçıncı satırdan başlatayım bunları.(bizim picte 300 üncü satırdan başlayabiliyoruz işleme.)

     



  list  P=PIC18F452, F=INHX32, C=160, N=0, ST=OFF, MM=OFF, R=DEC, X=ON
        #include P18F452.inc
        __CONFIG  _CONFIG1H, _HS_OSC_1H  ;HS oscillator
        __CONFIG  _CONFIG2L, _PWRT_ON_2L & _BOR_ON_2L & _BORV_42_2L  ;Reset
        __CONFIG  _CONFIG2H, _WDT_OFF_2H  ;Watchdog timer disabled
        __CONFIG  _CONFIG3H, _CCP2MX_ON_3H  ;CCP2 to RC1 (rather than to RB3)
        __CONFIG  _CONFIG4L, _LVP_OFF_4L  ;RB5 enabled for I/O

;;;;;;; Değişkenler ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

        cblock  0x300 ;Beginning of Access RAM
coun1 EQU h\'30\'
coun2 EQU h\'31\'
coun3 EQU h\'32\'
endc


;;;;;;; Vectors ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

org 0x300 ;Reset vector

goto Main
;;;;;;; Main ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

main

MOVLW B\'00000000\'
MOVWF PORTB


;;;;;;;; Delay_1s ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Delay       
  MOVLW  D\'2\'   
  MOVWF  coun1   
Loop1       
  MOVLW  D\'200\'   
  MOVWF  coun2   
loop2       
  MOVLW  D\'250\'   
  MOVWF  coun3 
loop3       
 
DECFSZ  coun3,F   
  GOTO  loop3   
  DECFSZ  coun2,F   
  GOTO  loop2   
  DECFSZ  coun1,F   
  GOTO  loop1   
RETURN       

end

habibceylan

aklımdan geçen incf ile 1 artıracak şekilde bir döngü yapmak. En sonundada Cpfslt komutuyla 10\'dan küçük olduğunu kontrol edip başa dönecek bir döngü oluşturmak.

kgguler

 Şemanızda ortak anotlu display kullanmışsınız.Bu durumda mantık şu olmalı.Bit eğer 0 ise display aktif 1 ise pasif olacaktır.Buna göre;
B\'0000000\' komutu ile bütün bitler 1 olur.Displayda 8 rakamı  gözükür.
B\'0000011\' komutu ile ave b segmentleri pasif olur.Aktif segmentlerc d e f g\'dir.Displar 6 yı gösterir.
Yakmak istediğiniz segmentlere karşılık gelen bitleri 0,pasif etmek istediğiniz bitleri 1 değeri verin.Ortak katot display kullacak olursanız aktif bitler için 1 yazın.Kolay gelsin.

habibceylan

@kudretuzuner sizin dediğiniz şekilde tamamladım. Isis olmadığından pc imde deneyemiyorum şu an için.

     



  list  P=PIC18F452, F=INHX32, C=160, N=0, ST=OFF, MM=OFF, R=DEC, X=ON
        #include P18F452.inc
        __CONFIG  _CONFIG1H, _HS_OSC_1H  ;HS oscillator
        __CONFIG  _CONFIG2L, _PWRT_ON_2L & _BOR_ON_2L & _BORV_42_2L  ;Reset
        __CONFIG  _CONFIG2H, _WDT_OFF_2H  ;Watchdog timer disabled
        __CONFIG  _CONFIG3H, _CCP2MX_ON_3H  ;CCP2 to RC1 (rather than to RB3)
        __CONFIG  _CONFIG4L, _LVP_OFF_4L  ;RB5 enabled for I/O

;;;;;;; Değişkenler ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

        cblock  0x300 ;Beginning of Access RAM
coun1
coun2
coun3
var1
var2
endc

;;;;;;; Vectors ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

org 0x300 ;Reset vector


;;;;;;; Main ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

main

MOVLW B\'00000000\'
MOVWF PORTB
CLRF TRISB

loop
CLRF PORTB
BSF PORTB,0 ; for display 0
BSF PORTB,1
BSF PORTB,2
BSF PORTB,3
BSF PORTB,4
BSF PORTB,5
BCF PORTB,6

BRA Delay

CLRF PORTB
BCF PORTB,0 ; for display 1
BSF PORTB,1
BSF PORTB,2
BCF PORTB,3
BCF PORTB,4
BCF PORTB,5
BCF PORTB,6

BRA Delay

CLRF PORTB
BSF PORTB,0 ; for display 2
BSF PORTB,1
BCF PORTB,2
BSF PORTB,3
BSF PORTB,4
BCF PORTB,5
BSF PORTB,6

BRA Delay

CLRF PORTB
BSF PORTB,0 ; for display 3
BSF PORTB,1
BSF PORTB,2
BSF PORTB,3
BCF PORTB,4
BCF PORTB,5
BSF PORTB,6

BRA Delay

CLRF PORTB
BCF PORTB,0 ; for display 4
BSF PORTB,1
BSF PORTB,2
BCF PORTB,3
BCF PORTB,4
BSF PORTB,5
BSF PORTB,6

BRA Delay

CLRF PORTB
BSF PORTB,0 ; for display 5
BCF PORTB,1
BSF PORTB,2
BSF PORTB,3
BCF PORTB,4
BSF PORTB,5
BSF PORTB,6

BRA Delay

CLRF PORTB
BSF PORTB,0 ; for display 6
BCF PORTB,1
BSF PORTB,2
BSF PORTB,3
BSF PORTB,4
BSF PORTB,5
BSF PORTB,6

BRA Delay

CLRF PORTB
BSF PORTB,0 ; for display 7
BSF PORTB,1
BSF PORTB,2
BCF PORTB,3
BCF PORTB,4
BCF PORTB,5
BCF PORTB,6

BRA Delay

CLRF PORTB
BSF PORTB,0 ; for display 8
BSF PORTB,1
BSF PORTB,2
BSF PORTB,3
BSF PORTB,4
BSF PORTB,5
BSF PORTB,6

BRA Delay

CLRF PORTB
BSF PORTB,0
BSF PORTB,1
BSF PORTB,2
BSF PORTB,3
BCF PORTB,4
BSF PORTB,5
BSF PORTB,6

BRA Delay

goto main






;;;;;;;; Delay_1s ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Delay       
  MOVLW  D\'2\'   
  MOVWF  coun1   
loop1       
  MOVLW  D\'200\'   
  MOVWF  coun2   
loop2       
  MOVLW  D\'250\'   
  MOVWF  coun3 
loop3       
 
DECFSZ  coun3,F   
  GOTO  loop3   
  DECFSZ  coun2,F   
  GOTO  loop2   
  DECFSZ  coun1,F   
  GOTO  loop1   
RETURN       

end


@kgguler sizin yanıtınızı yeni gördüm. O zaman benim buradaki bütün binary sayıları tekrar düzenlemem gerekiyor değilmi?


kudretuzuner

Merhaba
Evet kusura bakmayın ters yazmışım.BSF olanları BCF ile değiştirin tabii ki BCF leri de BSF olarak değişecek.Yazdığım gibi aslında PIC\'in pinlerini öyle bir ayarlamalısınız ki istediğiniz rakkamı elde etmek için o segmentin ledi yanmış olsun.Daha doğrusu belli bir düzende led yak söndürden başka bir şey değil.Binary sistem kafanızı karıştırmasın.

engin.763

06 Temmuz 2012, 18:00:34 #7 Son düzenlenme: 06 Temmuz 2012, 18:13:17 engin.763
;===PROGRAM20.ASM====

LIST P=16F628A
INCLUDE \"P16F628A.INC\"

__CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _MCLRE_ON & _PWRTE_OFF & _BODEN_OFF & _LVP_OFF & _CP_OFF & _DATA_CP_OFF

;===============================================BASLAMA ADRESİ

ORG H\'0000\'

DALLAN  EQU H\'20\'    ;DALLANMA DEĞİŞKENİ TANIMLANDI
SAYAC1  EQU H\'21\'    ;SAYAC1 DEĞİŞKENİ TANIMLANDI
SAYAC2  EQU H\'22\'    ;SAYAC2    \"\"                    \"\"

CLRF PORTA
CLRF PORTB

BANKSEL TRISA
CLRF TRISB                ;PORTB NİN HEPSİ ÇIKIŞ OLARAK YÖNLENDİRİLDİ
BANKSEL PORTB

;.............SAYMAYA BAŞLAMA BLOĞU-----

BASLA
MOVLW H\'00\'           ;W=00
MOVWF DALLAN      ;DALLAN=W


DONGU
MOVF DALLAN,W      ;W=DALLAN
ANDLW B\'00001111\'  ;W YUNUN ÜST 4 BİTİ 0 LANDI  2^4=16 dan dolayı toplam 16 karakter var         
                                  ;BUKADAR PC OFSET ADRESİ YETERLİ
                 
CALL CEV_TAB

MOVWF PORTB
INCF DALLAN,F  ;DALLANMA ADRESİNİ 1 ARTTIR VE SONRAKİ SAYIYI TABLODAN AL W YA YÜKLE ORDAN
                         ;PORTB YE AKTARIM YAPACAĞIZ

CALL GECIKME  ;YAZILIMSAL GECİKME SAĞLA
GOTO DONGU   ;BİR SONRAKİ RAKAMI GÖSTERMEK İÇİN DÖNGÜYÜ BAŞA SAR

;............................

;================
CEV_TAB
ADDWF PCL,F     ;PCL=PCL+W   

RETLW H\'3F\'
RETLW H\'06\'
RETLW H\'5B\'
RETLW H\'4F\'
RETLW H\'66\'
RETLW H\'6D\'     
RETLW H\'7D\'
RETLW H\'07\'
RETLW H\'7F\'
RETLW H\'6F\'
RETLW H\'77\'
RETLW H\'7C\'
RETLW H\'39\'
RETLW H\'5E\'
RETLW H\'79\'
RETLW H\'71\'
;================

;===========YAZILIMSAL GECİKME ÜNİTESİ------------İÇ İÇE DÖNGÜLERLE GECİKME SAĞLANIYOR-------
GECIKME
MOVLW D\'255\'
MOVWF SAYAC1
BEKLE1
;--------------
MOVLW D\'255\'
MOVWF SAYAC2
BEKLE2
NOP
NOP
NOP
NOP
DECFSZ SAYAC2,F
GOTO BEKLE2
;--------------
NOP
NOP
NOP
NOP
DECFSZ SAYAC1,F
GOTO BEKLE1
;================
RETURN

END


5 AYDIR ASSEMBLY İLE UĞRAŞIYORUM ELİMDEN BUKADAR GELİR AKLINIZA TAKILAN BİŞEY OLURSA ÇEKİNMEDDEN SORUN...İYİ GÜNLER...EKTE Kİ DOSYADA İSİ ÇİZİMİ MEVCUTTUR  ....İSTERSENİZ BUTONA BASTIKÇA ARTAN 7-SEG SAYICI DEVRESİNİN KODLARINIDA YAZIP GÖNDEREBİLİRİM ....
Bir insan iyi bir mühendis olabilir,yada iyi bir doktor,çok iyi bir yöneticide olabilir ,ama ne olursa olsun insan iyi yumruk atmayı ve iyi nişan almayı mutlaka bilmeli....