16f84a pclath öğrenmek istiyorum

Başlatan mustafaaxu, 20 Nisan 2009, 18:34:23

mustafaaxu

sayın taglisayın bigbey
semayı eklemeyi beceremedim
50 kohm ayarli direncin değeri ile oynadıkça kapasitenin dolumunda geçen süreyi  dekadeye çevirip göreceğiz önceki verdiğim kod ile 225 kadar getiriyorum 255 den sonra 0000 geliyor anlattıklarınız  ve verdiginiz örneklerden ile konuyu  iyice anladım dosyanın içerigi 8 bit lik sayı alabiliyor b'11111111' buda 255 eşit biz taşma yı kontrol ederek üst byte
1 eliyecegiz  üstbyte 1 değerinide kullanarak 256 yapacağız işte tam burda kopuyorum. hocam birde nasıl çizim i ekliyeceğim epey uğraştim olmadı  şemayı ekliyemedim
porta,4 te gnd den  ra4 100 nf vcc den 50 kohm trimpot ra4
{-}gnd-----100 nf----->PORTA,4>-----50KOHM-----VCC{+}
selamlar

mustafaaxu

sayın tagli
verviş olduğunuz örnek kod u derledim derlemede sorun yok hex i 16f84 yükledim  devreyi çalıştırdığımda sorun displeylerde bazı oo10 gigi degişik rakamlar beliriyor sayıcı0 -sayıcı1 icine  
  MOVLW   d'255'
  MOVWF   SAYAC1
  MOVLW   d'150'
  MOVWF   SAYAC0
rasgele değerleri yükledim gene sonuc alamadım
selamlar

Tagli

Carry Bit'in çalışmasıyla ilgili bazı büyük dikkatsizlikler yapmışım, şöyle ki btfsc'lerin yerine btfss olması gerekiyor. Ama bu da yeterli değil. Bu dikkatsizliğim haricinde decf komutunun 16 serisinde C'yi etkilemediği gözümden kaçmış. Aslında datasheet'e bakma ihtiyacı duymuştum ama o sırada yanımda kağıda çıkarılmış 18F452 komut seti vardı ve ondan bakmıştım. 18 serisinde decf C'yi de etkiliyor. Beni yanıltan bu oldu. Kodu düzeltince yenisini buraya eklerim. Hatalar ve gecikme için üzgünüm...
Gökçe Tağlıoğlu

mustafaaxu


Tagli

Daha önceki mesajımda bulunan kodu düzelttim. Oradan alabilirsin. Kodu (kendi yazdığım parçalayıcıyı) denedim, çalışıyor gibi. Yine de gözümden birşey kaçmışsa haber ver.

Ufak bir hatırlatma, kod 9999'dan büyük bir sayı için çalışmayacaktır, çok garip sonuçlar verebilir, ama belki de vermez, emin değilim. En iyi ihtimalle küçük 4 basamağı görebilirsin.
Gökçe Tağlıoğlu

mustafaaxu

sayın tagli
düzelttiğiniz kodu  ekleyerek yeniden derleyip akşam evde deneyeceğim
evde foruma giremiyorum problemleri paylaşırız
semayı görebildinizmi sizin dediğiniz gibi yaptım
acaba başkaları görebiliyormu
selamlar

mustafaaxu

sayın tagli
son düzeltme yaptığınız kodu  
üzerinde sayıcı 0000-9999 olarak caliştiğimiz asm ekledim ve derledim
deney setinde çalıştırdım bir iki sorun var ra4 te bağlı olan r-50 k ve c-100nf
ikilisinden r ile değer değistirdiğimde 232 nin alttında 487 gösteriyor
TABLO
232-----altını göstermiyor
...........
sayac0  değeri
229------>485 gösteriyor  hatalı
230------>486 gösteriyor  hatalı
231------>487 gösteriyor  hatalı
.....232 üstü...........................
232------>232 gösteriyor  doğru
233------>233 gösteriyor  doğru
234------>234 gösteriyor  doğru
235------>235 gösteriyor  doğru
236------>236 gösteriyor  doğru
>>   >>
255------>255 gösteriyor  doğru
COUNT
   BCF    STATUS,C
   INCF   sayac0, F        ;TEMP değerini 1 arttır
   BTFSC  STATUS,C
   INCF   sayac1,F
   BTFSS  PORTA, 4       ;kapasite dolduysa 1 atla
   GOTO   COUNT          ;kapasite dolmadıysa goro cound

?count dongüsü uygunmu ?
sayac0 sayac1 count dongüsünde tablodaki hatali gösterimler oluyor
***********************************************
bu hataların count sayıcısından olabilir diyerek sayac0 sayac1
direk değer girdim
  movlw   b'11111111'      
  movwf   sayac0
  movlw   b'00000001'        
  movwf   sayac1
sayac0=255
sayac1=1
sayac0=254 sayac1=1------>511 gösteriyor  doğru
sayac0=40  sayac1=1------>296 gösteriyor  doğru
sayac0=10  sayac1=1------>778 gösteriyor  yanlış
sayac0=26  sayac1=1------>794 gösteriyor  yanlış
yine 232 in altı hatalı görüküyor

yukarıdaki uygulamada sayıları direk girersem
acaba yanlışmı düşünüyorum
sayac0=10  
sayac1=1------->265 görmemiz gerekiyor
hocam problemler bunlar teşekkür ederim

Tagli

mustafaaxu, uyarın üzerine ben de testler yaptım. Gerçekten de 232'nin altında sorun vardı, ki bu sorun muhtemelen senin test etmediğin daha büyük sayılarda da kendini gösterecek nitelikteydi. Ancak yanlış sonuç verdiğini raporladığın bazı testlerde ise sorunla karşılaşmadım, mesela sayac0=26 sayac1=1 ikilisi doğru bir şekilde 282 gösteriyor idi.

Hata binler basamağının hesabındaki son bölümden kaynaklanıyormuş. Şu şekilde değiştirilmesi gerekiyor (yukarıdaki kodda da düzelttim):
BINLER_CIK_1
                movlw           b'11101000'     ;1000'in küçük byte'ı W'ye yüklendi
                addwf           sayac0,F        ;Sayacın küçük byte'ı eski haline getiriliyor
                btfsc           STATUS,C        ;Taşma var mı?
                incf            sayac1,F        ;Taşma varsa sayac1 1 arttırılacak
                movlw           b'00000011'     ;1000'in büyük byte'ı W'ye yüklendi
                addwf           sayac1,F        ;Sayacın büyük byte'ı eski haline getiriliyor
                goto            YUZLER_HESAPLA  ;Sonraki adıma geçiliyor
BINLER_CIK_0
                movlw           b'11101000'     ;1000'in küçük byte'ı W'ye yüklendi
                addwf           sayac0,F        ;Sayacın küçük byte'ı eski haline getiriliyor


Ayrıca;

Görünen o ki bigbey de Carry Bit konusunda benimle aynı hataya düşmüş, count döngüsünde hata var. Çünkü 16 serisi PIC'lerde incf komutunun C üzerinde etkisi yok, sadece Z'yi etkiliyor. Bu durumda C'yi Z yapmak sorunun çözümü için yeterli olacaktır. Şöyle ki:
COUNT
INCF sayac0, F ;TEMP değerini 1 arttır
BTFSC STATUS,Z
INCF sayac1,F
BTFSS PORTA, 4 ;kapasite dolduysa 1 atla
GOTO COUNT ;kapasite dolmadıysa goro cound
İşlemden önce Z'nin sıfırlanmasına gerek olmadığından o satırı sildim.

Umarım başka hata yoktur. Kusra bakma, kodu yazdıktan sonra kapsamlı bir test yapmak pek mümkün olmuyor ve böyle hatalar çıkabiliyor. Umarım başka yoktur. Varsa da ben yine buradayım :).
Gökçe Tağlıoğlu

mustafaaxu

sayıın tagli
değerli arkadaşım yardımların için çok teşekkür ederim
umarım bu konuyu takip eden benim gibi yeni başlıyanlar sizin bilğinizden faydalanmışlardır.
hocam bende status,c ile sorun yaşadım iki byte sayarken status,c etkilemek için daha önce aşağıdaki çikarma   işlemini uyguladım
COUNT
	INCF	HEXLSB, F       ;HEXLSB SAYACINI 1 ARTTIR
	MOVLW	D'255'
	SUBWF 	HEXLSB, W
	BTFSC	STATUS, C	      ;CARRY FLAG 1 Mİ?
	INCF	HEXMSB, F       ;HEXMSB SAYACINI 1 ARTTIR
	BTFSS	PORTA, 4        ;KONDANSATÖR DOLDU MU? DOLDUYSA EĞER 
	GOTO	COUNT
----------------------------------------------------------------
status,c   sizin kodu ile değiştirerek derleyeceğim
COUNT 
INCF sayac0, F ;TEMP değerini 1 arttır 
BTFSC STATUS,Z 
INCF sayac1,F 
BTFSS PORTA, 4 ;kapasite dolduysa 1 atla 
GOTO COUNT ;kapasite dolmadıysa goro cound

hocam akşam denedikten sonra hata olursa detayları bildiririm
sellamlar

mustafaaxu

sayın tagli
hocam son yaptığınız değişiklerle tekrar derledim
tamam sonuç çok iyi 0000->1500 e kadar saydırdım  
hocam tam olarak düzenlenmiş  asm ve hex kodu  veriyorum
bu haliyle problem yok
çok sağol
hocam müsait olduğunuzda şu cblock ve fsr birde porttan keypet ile
W ye nasıl sayı giebiliriz bu konuyu mümkünse öğretebilirmisin.  
;-----sayıcı--thanksgiving to tagli---------------------------- 
;  0000 dan 9999 kadar sayıcı
;  port a 4 kontrollu 
;-----bir kapasitenin dolarken geçen süreyi sayma------- 
LIST P=16F84 
      INCLUDE "P16F84A.INC" 
      __CONFIG  _CP_OFF &_WDT_OFF &_XT_OSC &_PWRTE_OFF 

SAYACA      EQU   H'10'    
SAYACB      EQU   H'11'    
SAYAC1      EQU   H'12'    
SAYAC2      EQU   H'13'    
SAYAC3      EQU   H'14' 
GCKSAY1     EQU   H'15' 
GCKSAY2     EQU   H'16'    
TEMP	    EQU   H'17'    
SAYAC       EQU   H'1A' 
SAY1        EQU   H'0C'    
SAY2        EQU   H'0D'    
birler      EQU   H'1B' 
HEXLSB      EQU   H'1C' 
onlar       EQU   H'1D' 
yuzler      EQU   H'1F' 
binler      EQU   H'21'
sayac0	    EQU	  H'18'	
sayac1	    EQU	  H'19' 
;------------------------------------------------------------------------------ 
START 
   BSF   STATUS, 5   	;BANK 1'E GEÇ     
   MOVLW   B'00000000'  ;0 değeri portu çıkış yapar 
   MOVWF   TRISA      	;PORT A ra0-ra1-ra2-ra3-ra4 çıkış (00000000) porta hepsi çıkış                                 
   MOVLW   B'00000000'  ;0 değeri portu çıkış yapar 
   MOVWF   TRISB      	;PORT B rb0,1,2,3,4,5,6,7 ÇIKIŞ (00000000) portb hepsi çıkış     
   BCF   STATUS, 5   	;BANK 0'A GEÇ     
;----------------------------------------------------------     
   clrf	  onlar       ;Onlar basamağı sayacı sıfırlanıyor 
   clrf   yuzler      ;Yuzler basamağı sayacı sıfırlanıyor 
   clrf   binler      ;Binler basamağı sayacı sıfırlanıyor        
;------------------------------------------------------------- 
   MOVLW   d'100' 
   MOVWF   SAYAC      ;ekranda kalma süresi                                      
;------------------------------------------------------------ 
degeroku 
   CALL  DESARJ      ;kapasitenin boşalmalması için bekleme 
   BSF   PORTA, 4     ;port a,4 giris ayarlandı 
    
;-----sayıcı----------------------------------------------
COUNT 
    INCF sayac0, F 	;TEMP değerini 1 arttır 
    BTFSC STATUS,Z 
    INCF sayac1,F 
    BTFSS PORTA, 4 	;kapasite dolduysa 1 atla 
    GOTO COUNT 		;kapasite dolmadıysa goro cound           

;   movlw   b'00001010'       ;direk sayac0 icine yüklme
;   movwf   sayac0 
;   movlw   b'00000000'       ;direk sayac1 icine yüklme
;   movwf   sayac1 
;------binary dekade convert-----------------------------------------------------
                clrf            onlar           ;Onlar basamağı sayacı sıfırlanıyor 
                clrf            yuzler          ;Yuzler basamağı sayacı sıfırlanıyor 
                clrf            binler          ;Binler basamağı sayacı sıfırlanıyor 

BINLER_HESAPLA 
                movlw           b'11101000'     ;1000'in küçük byte'ı W'ye yüklendi 
                subwf           sayac0,F        ;W, sayacın küçük byte'ından çıkarıldı 
                btfsc           STATUS,C        ;Sonuç eksili mi? 
                goto            $+5             ;Değilse büyük byte işlenecek 
                movf            sayac1,F        ;Eksili ise sayac1 test için kendi üzerine yazılıyor 
                btfsc           STATUS,Z        ;sayac1 0 mıymış? (büyük byte da mı kurtarmadı?) 
                goto            BINLER_CIK_0    ;Demek ki döngü bitmis, (1000'in küçüğü) geri eklenecek 
                decf            sayac1,F        ;sayac1 1 azaltılıyor 
                movlw           b'00000011'     ;1000'in büyük byte'ı W'ye yüklendi 
                subwf           sayac1,F        ;W, sayacın büyük byte'ından çıkarıldı 
                btfss           STATUS,C        ;Sonuç eksili mi? 
                goto            BINLER_CIK_1    ;Evet ise döngü bitmiş, sayaca 1000 eklenecek 
                incf            binler,F        ;Binler sayacı 1 arttırılıyor 
                goto            BINLER_HESAPLA  ;Döngüye devam ediliyor 
BINLER_CIK_1 
                movlw           b'11101000'     ;1000'in küçük byte'ı W'ye yüklendi 
                addwf           sayac0,F        ;Sayacın küçük byte'ı eski haline getiriliyor 
                btfsc           STATUS,C        ;Taşma var mı? 
                incf            sayac1,F        ;Taşma varsa sayac1 1 arttırılacak 
                movlw           b'00000011'     ;1000'in büyük byte'ı W'ye yüklendi 
                addwf           sayac1,F        ;Sayacın büyük byte'ı eski haline getiriliyor 
                goto            YUZLER_HESAPLA  ;Sonraki adıma geçiliyor 
BINLER_CIK_0 
                movlw           b'11101000'     ;1000'in küçük byte'ı W'ye yüklendi 
                addwf           sayac0,F        ;Sayacın küçük byte'ı eski haline getiriliyor 

YUZLER_HESAPLA 
                movlw           d'100'          ;100 W'ye yüklendi 
                subwf           sayac0,F        ;W, sayacın küçük byte'ından çıkarıldı 
                btfsc           STATUS,C        ;Sonuç eksili mi? 
                goto            $+5             ;Değilse yüzler sayacı artar 
                movf            sayac1,F        ;Eksili ise sayac1 test için kendi üzerine yazılıyor 
                btfsc           STATUS,Z        ;sayac1 0 mıymış? (büyük byte da mı kurtarmadı?) 
                goto            YUZLER_CIK_0    ;Demek ki döngü bitmis, 100 geri eklenecek 
                decf            sayac1,F        ;sayac1 1 azaltılıyor 
                incf            yuzler,F        ;Yüzler sayacı 1 arttırılıyor 
                goto            YUZLER_HESAPLA  ;Döngüye devam ediliyor 
YUZLER_CIK_0 
                movlw           d'100'          ;100 W'ye yüklendi 
                addwf           sayac0,F        ;Sayacın küçük byte'ı eski haline getiriliyor 

ONLAR_HESAPLA 
                movlw           d'10'           ;10 W'ye yüklendi 
                subwf           sayac0,F        ;W, sayacın küçük byte'ından çıkarıldı 
                btfss           STATUS,C        ;Sonuç eksili mi? 
                goto            ONLAR_CIK_0     ;Demek ki döngü bitmis, 10 geri eklenecek 
                incf            onlar,F         ;Onlar sayacı 1 arttırılıyor 
                goto            ONLAR_HESAPLA   ;Döngüye devam ediliyor 
ONLAR_CIK_0 
                movlw           d'10'           ;10 W'ye yüklendi 
                addwf           sayac0,F        ;Sayacın küçük byte'ı eski haline getiriliyor 

                movf            sayac0,W        ;Kalan değer W'ye alındı 
                movwf           birler          ;Birler sayacı ayarlandı 
                clrf            sayac0          ;Sonraki işlemler için sayac0 sıfırlanıyor

;---display secimi-------------------------------------------------- 

DISPLEY_SEC_YAZ 

   BSF   PORTA, 0    
   BCF   PORTA, 1   ;display seç '00'( DISPLAY 0) 
   BCF   PORTA, 2    
   BCF   PORTA, 3            

   MOVF   binler, W 
   CALL   TABLO 
   MOVWF   PORTB      ;yüzleri port b ye gönder 
   CALL    gecikme    ;displey gecikme süresi 
    
   BCF   PORTA, 0    
   BSF   PORTA, 1   ;display seç '00'( DISPLAY 0) 
   BCF   PORTA, 2    
   BCF   PORTA, 3            

   MOVF   yuzler, W 
   CALL   TABLO 
   MOVWF   PORTB      ;yüzleri port b ye gönder 
   CALL    gecikme    ;displey gecikme süresi 
        

   BCF   PORTA, 0    
   BCF   PORTA, 1   ;display seç '01'( DİSPLAY 1) 
   BSF   PORTA, 2    
   BCF   PORTA, 3 

   MOVF   onlar, W 
   CALL   TABLO 
   MOVWF   PORTB      ;onları port b ye gönder 
   CALL    gecikme    ;displey gecikme süresi 
        

   BCF   PORTA, 0    
   BCF   PORTA, 1   ;display seç '10'( DİSPLAY 2) 
   BCF   PORTA, 2    
   BSF   PORTA, 3 

   MOVF   birler, W 
   CALL   TABLO 
   MOVWF   PORTB      ;birleri port b ye gönder 
   CALL    gecikme    ;displey gecikme süresi 
            

   BCF   PORTA, 0    
   BCF   PORTA, 1   ;DİSP TEMİZLE
   BCF   PORTA, 2    
   BCF   PORTA, 3 

   DECFSZ   SAYAC, F   ;sayac 00 olana kadar  ekranı göster 
   GOTO    DISPLEY_SEC_YAZ   ;sayac 00 olana kadar GÖSTER
   CALL    DİSPLAYSÖNME    ;sayac 00 oldu  
   GOTO    START      ;goto start git 
               
;----------------------------------------------------------- 
DESARJ 

   BSF   STATUS, 5   ;bank1 
   BCF   TRISA, 4   ;porta,4 çıkış 
   BCF   STATUS, 5   ;bank0 
   BCF   PORTA, 4   ; 
    
   MOVLW   d'255' 
   MOVWF   GCKSAY1 

DONGU1 
   MOVLW   d'255' 
   MOVWF   GCKSAY2 
    
DONGU2 
   DECFSZ   GCKSAY2, F 
   GOTO   DONGU2 
   DECFSZ   GCKSAY1, F 
   GOTO   DONGU1 
   RETURN 

;------display ortak anot tablosu----------------------------- 
TABLO 
   ADDWF   PCL,F 
   RETLW b'11000000' ; 0 
   RETLW b'11111001' ; 1 
   RETLW b'10100100' ; 2 
   RETLW b'10110000' ; 3 
   RETLW b'10011001' ; 4 
   RETLW b'10010010' ; 5 
   RETLW b'10000010' ; 6 
   RETLW b'11111000' ; 7 
   RETLW b'10000000' ; 8 
   RETLW b'10010000' ; 9 
;------------------------------------------------------------- 
DİSPLAYSÖNME 
        movlw   d'20' 
        movwf   SAYAC1 
dona1 
        
        movlw   d'20' 
        movwf   SAYAC2 
dona2 
        movlw   d'20' 
        movwf   SAYAC3 
dona3  
        
        decfsz  SAYAC3,f 
        goto    dona3 
        decfsz  SAYAC2,f 
        goto    dona2 
        decfsz  SAYAC1,f 
        goto    dona1  
        return 

;------------------------------------------------------------- 
gecikme 
        movlw   d'45' 
        movwf   SAYACA 
don1 
        movlw   d'45' 
        movwf   SAYACB 
don2 
        
        decfsz  SAYACB,f 
        goto    don2 
        decfsz  SAYACA,f 
        goto    don1 
        return 
;------------------------------------------------------------- 
DELAY 
        movlw   d'100' 
        movwf   SAY1 
STEP1 
        movlw   d'100' 
        movwf   SAY2 
STEP2 
        
        decfsz  SAY2,f 
        goto    STEP2 
        decfsz  SAY1,f 
        goto    STEP1 
        return 
;-------------------------------------------------------------- 
   END

hex kodu
;*************************************************

;****hex kodu*************************************
:100000008316003085000030860083129D019F0119
:10001000A10164309A006B200516980A0319990A09
:10002000051E0D289D019F01A101E83098020318CB
:100030001D28990803192A28990303309902031CE3
:100040002328A10A1528E83098070318990A0330D5
:1000500099072C28E8309807643098020318342850
:1000600099080319362899039F0A2C2864309807A9
:100070000A309802031C3E289D0A38280A30980747
:1000800018089B0098010514851005118511210899
:1000900078208600902005108514051185111F0811
:1000A00078208600902005108510051585111D0803
:1000B00078208600902005108510051185151B08F5
:1000C00078208600902005108510051185119A0B67
:1000D0004328832000288316051283120512FF305F
:1000E0009500FF309600960B7328950B7128080039
:1000F0008207C034F934A434B03499349234823451
:10010000F83480349034143092001430930014305A
:100110009400940B8928930B8728920B852808005C
:100120002D3090002D309100910B9428900B922847
:10013000080064308C0064308D008D0B9D288C0B82
:040140009B280800F0
:02400E00F93F78
:00000001FF
;------------------------------------------------

sağol

mustafaaxu

sayın tagli
selamlar count döngüsünde anlayamadiğim bir şey var
yapmak istediğim sizin yazdığınız ondalık çeviriciyi
0 dan 1-2-3-4-5----------->9999 saydırmak
hocam  yazılımda  BTFSS PORTA, 4 işlenirken sorun yok burada
kapasite  dolarken geçen süreyi saydırıyoruz şunu denedim
; BTFSS PORTA, 4 atlayıp  
GOTO COUNT   atlayıp sayac0  içeriği 255 den sonra sayac1 yapabilirmiyiz denedim olmuyor

rica etsem bu konuda yardımcı olurmusun toparlarsak tam olarak
BTFSS PORTA, 4    ;kapasite dolduysa 1 atla
bu komutu kullanmadan sayac0 ve sayac1 saydıracağız

su an çalışan kod nasıl bir değişiklik yapalım  
teşekkür ederim
;-----sayıcı---------------------------------------------- 
COUNT 
    INCF sayac0, F    ;TEMP değerini 1 arttır 
    BTFSC STATUS,Z ; status,z 0 mi 0 ise atla
    INCF sayac1,F      ;status,z 1 ise sayac1 1 arttır
    BTFSS PORTA, 4    ;kapasite dolduysa 1 atla 
    GOTO COUNT       ;kapasite dolmadıysa goro cound     

;------binary dekade convert-----------------------------  

tnr

sayın mustafaaxu anladığım kadarıyla kondansatör dolum işlemini değil, normal 0-9999 arası saydırmak istiyorsunuz. O zaman kod şöyle olmalı:
;-----sayıcı---------------------------------------------- 
COUNT 
    INCF sayac0, F    ;TEMP değerini 1 arttır 
    BTFSC STATUS,Z ; status,z 0 mi 0 ise atla 
    INCF sayac1,F      ;status,z 1 ise sayac1 1 arttır 
    call gecik_          ;BURAYA BİR GECİKME KOYMAK GEREKİYOR Kİ SAYMA İŞLEMİ GÖRÜLEBİLSİN..
    ;GOTO COUNT       ;kapasite dolmadıysa goro cound !BU SATIR DA SİLİNECEK!!!!     

;------binary dekade convert-----------------------------  

Siz btfss porta,4 satırını silfdiğiniz için program COUNT içinde sonsuz döngüye giriyor. goto count komutundan dolayı bu komutu da silin ve araya yukarıdaki gibi bir gecikme koyun böylece istediğiniz sürede saydırırsınız.

camby

güzel bi başlık olmuş, benim de düşündüğüm ama kod yazmaya üşendiğim bir konuydu , elinize aklınıza sağlık:)

ben displayleri 74hc595 port çoklayıcı ile çalıştırmıştım , fakat siz aynı dataları bütün displaylere bağlayıp tarama yapıyorsunuz sanırım.
Sormak istediğim bir pic çıkışına kaç tane bu şekilde display bağlanabilir.
Daha doğrusu bu 4 adet displayi aynı anda aktif edersek pic'in çıkışı bunu kaldırabilir mi?
Tarama ile sırayla çalıştığından bir yüklenme olmuyor sanırım..?

Tagli

4 adet gösterge (veya daha fazla) hiçbir zaman aynı anda yanmıyor. Çekilen akım aslında her göstergede en fazla kaç LED'in yandığıyla ilgili, ki noktayı da sayarsak en fazla 8 adet olabilir. Elektronikten pek anlamadığım için (daha çok programlama işene yönelmiş bulunmaktayım) riske girmeyip transistör kullanmıştım bir uygulamamda. Belki de hiç gerek yoktu, bunu bilemem. İnternette bu ortak anotların (veya katotların) PIC'e doğrudan bağlandığını gösteren şemalar da gördüm. Aslında bu göstergede kullanılan LED'lerin özelliğine de bağlı. PIC ile sürmeden önce bir breadboard'a bağlanıp tüm LED'ler yakılarak ne kadar akım çektiğine bakılabilir, sonra da bunun PIC'in sınırları içinde olup olmadığı kontrol edilir (25 mA civarında).
Gökçe Tağlıoğlu

camby

Bu Başlık bu konuda ders notu kalitesinde olmuş:)
Ben bu yazdığınız kodları ortak katot , 4'lü 7 segment  için 0-9999 sayıcı şeklinde tekrardan düzenledim.
Yazdığım ilk programda hazırladığınız kodları bozmamaya çalıştım fakat bu kodlar ile Tarama yöntemi ile 7 segment sürülmesi verimli değil. Çünkü Tarama işlemin yaptıktan sonra program tekrar ana kodlara döndüğü zaman 7 segmentte gösterilecek 2 sayı arası bekleme yapıyor. Yani 4 basamaklı sayımız sürekli bir şekilde displayde gözükmüyor. Tabi şu an ki program sadece 9999 sayıcı olduğu için böyle bir etki görülmedi ama uzun programlarda sorun çıkartacağı kesin. O yüzden displayde tarama ile sayı gösterme Tagli 'nın dediği gibi kesme ile yapılmalı yani ana programa paralel bir şekilde çalışmalı.
Tagli'nin kodlarını çözdüğümde bu programı o şekilde düzelteceğim:)

Tamam tarama yöntemi ile sadece 1 bölme 7 segmentin harcadığı kadar enerji harcanıyor ama enerjinin sınırlı olmadığı yerlerde bu yöntemi kullanmak çok hammallık. Şahsen Sadece tarama ile çalıştırılabilen bu 4lü 7 segmentleri kullanmak yerine teklilerden 4 tane alıp 74595 ile tarama yapmadan sürerim , bence daha iyi.

Son olarak da aşağıdaki devreye 74595 ekleyince 16f84 display dışında başka işlemler de yapabilecek hale gelecektir.

Konu başlığı da değiştirilirse iyi olur.


;Buton ile 4'lü 7 Segment LED'li 0-9999 Sayıcı
;1.BUTONA BASILDIĞINDA PROGRAM ÇALIŞMAYA BAŞLAR 
;7 Segment LED ortak KATOT(-) uçludur.
;Kristal tipi HS olduğundan 4-20MHz osilatör seçilebilir
		LIST 		P=16F84A    	
		include 	"P16F84A.inc"
		__CONFIG _WDT_OFF & _HS_OSC & _PWRTE_ON & _CP_OFF		
		ORG 		0x00			
		GOTO 		PRG

;=========Kaydediciler=========	
DONGU1	 	EQU 0C			
DONGU2 		EQU 0D
dtekrar		EQU 0E	
onlar       	EQU 10
yuzler     	EQU 11
binler     	EQU 12
birler		EQU 13
sayac0     	EQU 14   
sayac1     	EQU 15
sayici0		EQU 16
sayici1		EQU 17

;=========Display Tarama Gecikmesi=====

GECIKME		
		movlw 		.100
		movwf 		DONGU1
B000		
		movlw 		.10
		movwf 		DONGU2
B011		
		decfsz 		DONGU2,F
		GOTO 		B011
		decfsz 		DONGU1,F
		GOTO 		B000
		RETURN

;==========2byte binary 'den 4 basamak decimal'e dönüşüm===========

SAYI_CEVIR      
		clrf            onlar           ;Onlar basamağı sayacı sıfırlanıyor
                clrf            yuzler          ;Yuzler basamağı sayacı sıfırlanıyor
                clrf            binler          ;Binler basamağı sayacı sıfırlanıyor

BINLER_HESAPLA
                movlw           b'11101000'     ;1000'in küçük byte'ı W'ye yüklendi
                subwf           sayac0,F        ;W, sayacın küçük byte'ından çıkarıldı
                btfsc           STATUS,C        ;Sonuç eksili mi?
                goto            $+5             ;Değilse büyük byte işlenecek
                movf            sayac1,F        ;Eksili ise sayac1 test için kendi üzerine yazılıyor
                btfsc           STATUS,Z        ;sayac1 0 mıymış? (büyük byte da mı kurtarmadı?)
                goto            BINLER_CIK_0    ;Demek ki döngü bitmis, (1000'in küçüğü) geri eklenecek
                decf            sayac1,F        ;sayac1 1 azaltılıyor
                movlw           b'00000011'     ;1000'in büyük byte'ı W'ye yüklendi
                subwf           sayac1,F        ;W, sayacın büyük byte'ından çıkarıldı
                btfss           STATUS,C        ;Sonuç eksili mi?
                goto            BINLER_CIK_1    ;Evet ise döngü bitmiş, sayaca 1000 eklenecek
                incf            binler,F        ;Binler sayacı 1 arttırılıyor
                goto            BINLER_HESAPLA  ;Döngüye devam ediliyor
BINLER_CIK_1
                movlw           b'11101000'     ;1000'in küçük byte'ı W'ye yüklendi
                addwf           sayac0,F        ;Sayacın küçük byte'ı eski haline getiriliyor
                btfsc           STATUS,C        ;Taşma var mı?
                incf            sayac1,F        ;Taşma varsa sayac1 1 arttırılacak
                movlw           b'00000011'     ;1000'in büyük byte'ı W'ye yüklendi
                addwf           sayac1,F        ;Sayacın büyük byte'ı eski haline getiriliyor
                goto            YUZLER_HESAPLA  ;Sonraki adıma geçiliyor
BINLER_CIK_0
                movlw           b'11101000'     ;1000'in küçük byte'ı W'ye yüklendi
                addwf           sayac0,F        ;Sayacın küçük byte'ı eski haline getiriliyor

YUZLER_HESAPLA
                movlw           d'100'          ;100 W'ye yüklendi
                subwf           sayac0,F        ;W, sayacın küçük byte'ından çıkarıldı
                btfsc           STATUS,C        ;Sonuç eksili mi?
                goto            $+5             ;Değilse yüzler sayacı artar
                movf            sayac1,F        ;Eksili ise sayac1 test için kendi üzerine yazılıyor
                btfsc           STATUS,Z        ;sayac1 0 mıymış? (büyük byte da mı kurtarmadı?)
                goto            YUZLER_CIK_0    ;Demek ki döngü bitmis, 100 geri eklenecek
                decf            sayac1,F        ;sayac1 1 azaltılıyor
                incf            yuzler,F        ;Yüzler sayacı 1 arttırılıyor
                goto            YUZLER_HESAPLA  ;Döngüye devam ediliyor
YUZLER_CIK_0
                movlw           d'100'          ;100 W'ye yüklendi
                addwf           sayac0,F        ;Sayacın küçük byte'ı eski haline getiriliyor

ONLAR_HESAPLA
                movlw           d'10'           ;10 W'ye yüklendi
                subwf           sayac0,F        ;W, sayacın küçük byte'ından çıkarıldı
                btfss           STATUS,C        ;Sonuç eksili mi?
                goto            ONLAR_CIK_0     ;Demek ki döngü bitmis, 10 geri eklenecek
                incf            onlar,F         ;Onlar sayacı 1 arttırılıyor
                goto            ONLAR_HESAPLA   ;Döngüye devam ediliyor
ONLAR_CIK_0
                movlw           d'10'           ;10 W'ye yüklendi
                addwf           sayac0,F        ;Sayacın küçük byte'ı eski haline getiriliyor

                movf            sayac0,0        ;Kalan değer W'ye alındı
                movwf           birler          ;Birler sayacı ayarlandı
                clrf            sayac0          ;Sonraki işlemler için sayac0 sıfırlanıyor 
		RETURN

;==========Gösterilecek Sayının binary karşılığı ORTAK KATOT=======

TABLO	
		addwf		PCL,1
		DT 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x7,0x7F,0x6F
		return

;==========7 Segment TARAMA===============

DISPLEY_SEC_YAZ
		bcf   		PORTA, 0   ;( DISPLAY 0)
   		bsf   		PORTA, 1   
   		bsf   		PORTA, 2   
 		bsf   		PORTA, 3           

  	 	movf   		binler, W
   		CALL   		TABLO
   		movwf  		PORTB      ;binleri port b ye gönder
   		CALL   		GECIKME    ;displey gecikme süresi
   
   		bsf   		PORTA, 0   
   		bcf   		PORTA, 1   ;( DISPLAY 1)
   		bsf   		PORTA, 2   
   		bsf   		PORTA, 3           

   		movf   		yuzler, W
   		CALL   		TABLO
   		movwf   	PORTB      ;yüzleri port b ye gönder
   		CALL    	GECIKME    ;displey gecikme süresi
       
  		bsf   		PORTA, 0   
   		bsf   		PORTA, 1   
   		bcf   		PORTA, 2   ;( DİSPLAY 2)
   		bsf   		PORTA, 3

   		movf   		onlar, W
   		CALL   		TABLO
   		movwf   	PORTB      ;onları port b ye gönder
  		CALL    	GECIKME    ;displey gecikme süresi
       
 		bsf   		PORTA, 0   
   		bsf   		PORTA, 1   ;( DİSPLAY 3)
   		bsf   		PORTA, 2   
   		BCF   		PORTA, 3

   		movf   		birler, W
   		CALL   		TABLO
   		movwf   	PORTB      ;birleri port b ye gönder
   		CALL    	GECIKME    ;displey gecikme süresi
           
		DECFSZ   	dtekrar, F   	;sayac 0 olana kadar  ekranı göster
   		GOTO   		DISPLEY_SEC_YAZ   ;sayac 00 olana kadar GÖSTER
   		
		bsf   		PORTA, 0   
   		bsf   		PORTA, 1   ;DİSP TEMİZLE
   		bsf   		PORTA, 2   
   		bsf   		PORTA, 3  
		RETURN

;==========KONFİGÜRASYON===========

PRG		
		bsf 		STATUS,5	;Bank1'e geç	
		movlw 		b'00000000'
		movwf		TRISB		;B portunu çıkış olarak ata
		movlw  		b'11110000'	;RA4 giriş,diğerleri çıkş
		movwf 		TRISA		
		bcf 		STATUS,5	;Bank0'a geç
		movlw		b'00001111'	;Display'ler kapalı
		movwf		PORTA
		movlw		b'00000000'	
		movwf		PORTB 

;==========ANA PROGRAM=============

KONTROL		
		btfss		PORTA,4		;RA0 1 ise 1 satır atla ;Butona Basıldı mı?
		GOTO  		KONTROL

SIFIRLA		
		clrf		sayici0
		clrf		sayici1

SAYICI						;0-9999 arası sürekli olarak sayan program
   		incf 		sayici0, F     ;sayici0 ve sayici1 'den oluşan 2byte'lik sayıcı
    		btfsc 		STATUS,Z       ;sayici0 alcak değerlikli,sayici1 yüksek değerlikli
    		incf		sayici1,F      
    		    
		movf		sayici0,w	;sayici0 ve sayici1 , 10'luk sisteme çevirilmek üzere sayac0 ve sayac1'e yazılır.
		movwf		sayac0
		movf		sayici1,w
		movwf		sayac1			

		movlw		3		;7 Segment tekrarlama sayısı
		movwf		dtekrar

		CALL		SAYI_CEVIR	;16bitlik binary sayıyı 10'luk bileşenine ayırır

		CALL		DISPLEY_SEC_YAZ	;4 basamaklı sayıyı 7segmentte gösterir

		movlw		b'00100111'	;sayici 9999 oldu mu?
		subwf		sayici1,w   
		btfss           STATUS,Z	;sonuc 0 mı,0'sa 1 satır atla
  		GOTO 		SAYICI  
		movlw		b'00001111'
		subwf		sayici0,w
		btfss		STATUS,Z	;sonuc 0'mı ,0'sa 1 satır atla
		GOTO		SAYICI
		GOTO		SIFIRLA       
		END