2 dijit 7 segment display sürmede problem

Başlatan Yasin, 22 Ekim 2016, 12:30:08

Yasin

Merhaba arkadaşlar. 2 dijit, 7 segment display sürmeye çalışıyorum. Birler basamağına sorunsuz şekilde yazdırabiliyorum. Onlar basamağına da yazdırabiliyorum ama onlar basamağındaki yanmaması gereken segmentlerde birler basamağına yazdırdığım rakam kısık bir şekilde çıkıyor. Problem ne olabilir?

Program:

@ DEVICE PIC16F628A
@ DEVICE PIC16F628A, WDT_OFF
@ DEVICE PIC16F628A, MCLR_OFF
@ DEVICE PIC16F628A, LVP_OFF
@ DEVICE PIC16F628A, BOD_OFF
@ DEVICE PIC16F628A, PWRT_OFF
@ DEVICE PIC16F628A, PROTECT_OFF
@ DEVICE PIC16F628A, INTRC_OSC_CLKOUT

DEFINE OSC 4

TRISA=%00000000
TRISB=%00000000
CMCON=7

SYMBOL LED_GRUP=PORTA.3
SYMBOL DISP_ONLAR=PORTA.2
SYMBOL DISP_BIRLER=PORTA.6

SAYI VAR BYTE
SAYI_2 VAR BYTE
DISP VAR BYTE

PORTA=0
PORTB=0

PROGRAM:
   SAYI=SAYI+1
   IF SAYI=>30 THEN
      SAYI_2=SAYI_2+1
      IF SAYI_2>99 THEN SAYI_2=0
      SAYI=0
   ENDIF
   
   DISP=SAYI_2 DIG 0
   GOSUB BAK
   DISP_BIRLER=1
   PAUSE 5
   DISP_BIRLER=0
   PAUSE 5
   DISP=SAYI_2 DIG 1
   GOSUB BAK
   DISP_ONLAR=1
   PAUSE 5
   DISP_ONLAR=0
   PAUSE 5
GOTO PROGRAM

BAK:
   LOOKUP DISP,[33,123,69,66,26,130,128,107,0,2],PORTB
RETURN

END

ete

İki sebebi olabilir. Birincisi o display yeterince ortak uç voltajını alamıyordur.
İkincisi ise sürme mantığı ile alakalı. Display ortak ucuna high verip 5 ms bekliyorsun bu doğru. Ancak sonra 0 verip 5 ms daha bekliyorsun bu yanlış. Sistem şöyle olmalı.
- O anda aktif olan display ortak ucu low yapılmalı.
- sıradaki displaye yazılacak bilgi al alt programından alınıp porta verilmeli
- bilgi hangi displaye ait ise onun ortak ucu 1 yapılmalı
- 5 ms beklenmeli
- ortak uca 0 verilmeli
- bir sonraki displaye ait bilgi al dan alınıp porta verilmeli
- o displayin ortak ucu 1 yapılmalı
- 5 ms beklenmeli ve ana programa dönülmeli.
Program tekrar bu alt programa gelince sırası ile yukarıdaki işlemler tekrarlanmalıdır.
senin işini muhtemelen 5 ms lik low beklemeleri bozuyordur.

Ete

Yasin

#2
Hocam şu şekilde düzenledim dediğiniz gibi:

@ DEVICE PIC16F628A
@ DEVICE PIC16F628A, WDT_OFF
@ DEVICE PIC16F628A, MCLR_OFF
@ DEVICE PIC16F628A, LVP_OFF
@ DEVICE PIC16F628A, BOD_OFF
@ DEVICE PIC16F628A, PWRT_OFF
@ DEVICE PIC16F628A, PROTECT_OFF
@ DEVICE PIC16F628A, INTRC_OSC_CLKOUT

DEFINE OSC 4

TRISA=%00000000
TRISB=%00000000
CMCON=7

SYMBOL LED_GRUP=PORTA.3
SYMBOL DISP_ONLAR=PORTA.2
SYMBOL DISP_BIRLER=PORTA.6

SAYI VAR BYTE
SAYI_2 VAR BYTE
DISP VAR BYTE

PORTA=0
PORTB=0

PROGRAM:
   SAYI=SAYI+1
   IF SAYI=>30 THEN
      SAYI_2=SAYI_2+1
      IF SAYI_2>99 THEN SAYI_2=0
      SAYI=0
   ENDIF
   
   DISP_BIRLER=0
   DISP=SAYI_2 DIG 0
   GOSUB BAK
   DISP_BIRLER=1
   PAUSE 5
   DISP_BIRLER=0
   DISP_ONLAR=0
   DISP=SAYI_2 DIG 1
   GOSUB BAK
   DISP_ONLAR=1
   PAUSE 5
   DISP_ONLAR=0
GOTO PROGRAM

BAK:
   LOOKUP DISP,[33,123,69,66,26,130,128,107,0,2],PORTB
RETURN

END


Ancak sorun yine devam ediyor. Her iki dijite de istediğimi yazdırıyorum ama onlar dijitinde yanmaması gereken segmentlerde, birler dijitine yazdığım rakam gözüküyor kısık olarak. Onlar dijiti seçme ucunun PORTA.6 OSC ucu olmasından olabilir mi sorun?

Yasin

#3
Tekrardan merhabalar hocam. Problemi çözdüm.

@ DEVICE PIC16F628A, INTRC_OSC_CLKOUT


dahili osc. sigorta ayarını,

@ DEVICE PIC16F628A, INTRC_OSC_NOCLKOUT


şeklinde değiştirince sorun çözüldü. Problemin sebebi, A.6'yı I/O olarak ayarlamadığım içinmiş.

ete

Problemi çözdüğüne sevindim işin o kısmı hiç aklıma gelmemişti doğrusu.
Kodların yinede benim istediğim gibi değil şöyle olmalı,
disp_onlar=0
Disp=Sayi_2 Dig 0
Gosub Bak
Disp_birler=1
Pause 5
Disp=sayi_2 Dig 1
Disp_birler=0
Gosub Bak
Disp_onlar=1
Pause 5
Goto program

Bu şekilde daha doğru sanırım.

Yasin

Alıntı yapılan: ete - 22 Ekim 2016, 18:10:30
Problemi çözdüğüne sevindim işin o kısmı hiç aklıma gelmemişti doğrusu.
Kodların yinede benim istediğim gibi değil şöyle olmalı,
disp_onlar=0
Disp=Sayi_2 Dig 0
Gosub Bak
Disp_birler=1
Pause 5
Disp=sayi_2 Dig 1
Disp_birler=0
Gosub Bak
Disp_onlar=1
Pause 5
Goto program

Bu şekilde daha doğru sanırım.

Hocam bu şekilde deneyeceğim ancak verdiğiniz programı incelerken tırnak içine aldığım satırlarda bir şey fark ettim.

disp_onlar=0
Disp=Sayi_2 Dig 0
Gosub Bak
Disp_birler=1
Pause 5
"Disp=sayi_2 Dig 1"
"Disp_birler=0"
Gosub Bak
Disp_onlar=1
Pause 5
Goto program


Bu programa göre birler basamağı dijitine yazdırdıktan sonra 5 ms bekliyoruz. Ama birler basamağı dijitini kapamadan onlar basamağının değerini yüklüyoruz. Ondan sonra birler basamağı dijitini kapatıyoruz. Bu şekilde birler basamağı dijitinde onlar basamağı değeri kısık olarak gözükmez mi?

ete

Değeri yüklüyorsun ama porta vermiyorsun. Ortak ucu sıfırladıktan sonra veriyorsun. Buda bir sorun yaratmaz. Amaç ıvır zıvır işler esnasında ekranı boşta tutmamak.
Ete

Yasin

#7
Alıntı yapılan: ete - 22 Ekim 2016, 20:59:02
Değeri yüklüyorsun ama porta vermiyorsun. Ortak ucu sıfırladıktan sonra veriyorsun. Buda bir sorun yaratmaz. Amaç ıvır zıvır işler esnasında ekranı boşta tutmamak.
Ete

Haklısınız hocam orayı atlamışım. Aklım direkt SYMBOL DISP=PORTB ifadesine gitmiş. Teşekkür ederim.

Powered by EzPortal