2 dotmatrix görüntüleme hatası

Başlatan cemilsivas, 26 Ağustos 2016, 11:54:13

cemilsivas

Merhabalar arkadaşlar. Ben 2 dotmatrixten aynı görüntü almak istiyorum. iki farklı yol kullandım ancak ikisinde de sonuç alamadım.


'satır taramalı
PORTA=0:portb=0
TRISB=0   'PortB tamamı giriş yapıldı.
TRISA=%00000000  'A portu tamamı çıkış yapıldı.
'-----------------------------------------------------------------
@ DEVICE pic16F628a                      'işlemci 16F628                               
@ DEVICE pic16F628a, WDT_ON              'Watch Dog timer açık
@ DEVICE pic16F628a, PWRT_ON             'Power on timer açık
@ DEVICE pic16F628a, PROTECT_OFF         'Kod Protek kapalı
@ DEVICE pic16F628a, MCLR_off            'MCLR pini kullanılıyor.
@ DEVICE pic16F628a, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak
'-----------------------------------------------------------------

CMCON=7
OPTION_REG=1

symbol CLK=PortA.0
SYMBOL DTA=PORTA.1
SYMBOL AKTAR=PORTA.2

SUTUN VAR BYTE [8]
I     VAR BYTE
X     VAR BYTE
satir var byte
sayi var byte
PORTA=0
portb=0
SUTUN[0]=%00000000
SUTUN[1]=%01111110
SUTUN[2]=%01000000
SUTUN[3]=%01000000
SUTUN[4]=%01000000
SUTUN[5]=%01000000
SUTUN[6]=%01111110
SUTUN[7]=%00000000

BASLA1:

x=128

FOR I=0 TO 7
PORTB=255-x
SHIFTOUT DTA,CLK,1,[sutun[i]]

'SHIFTOUT DTA,CLK,1,[sutun[i]]

X=X/2
HIGH AKTAR:PAUSEus 1:LOW AKTAR


PAUSE 5



NEXT
pause 1
goto basla1
end     

bu kodde shiftout ile tek veri gönderiyorum. Ancak resimdeki gibi 1 satır kayıyor.

shiftout'u 2 kere gönderdiğimde ise numaralandırdığım resimdekiler gibi 2 satır tekrar oluşuyor. 2. durum bana biraz proteusun oyunu gibi geldi ama yine de sorayım dedim.

1. durum neden oluyor?


cemilsivas

#1
Bu da proteus dosyası

ete

Programında herhangi bir kaydırma işlemi göremedim. Satır kaydırma değişkenleri bir birlerine aktararak yapılır.
toplam 8 adet değişkenin var (0-7) aralığında. İşlem sırası şöyle olmalı
1. Bütün değişkenleri satırlara sırası ile yerleştir.
2. SUTUN[7] değişkenini TEMP değişkenine aktar sonra bunu SUTUN[0] a aktaracağız. Ardından 6 nolu değişkeni 7 nolu değişkene, 5 nolu değişkeni 6 nolu değişkene .... 0 nolu değişkenide 1 nolu değişkene aktar. Ne oldu sıfır boşta kalmış oldu. Onada 7 nolu değişken değerini verdikmi oldu bitti bir satır sistem aşağı doğru yakmış oldu. Bunu bir döngü içinde yaparsan satırlar sürekli aşağı doğru kayar ve bitince en yukarıdan yeniden ortaya çıkar. İşin temeli budur.
PORTA=0:portb=0
TRISB=0   'PortB tamamı giriş yapıldı.
TRISA=%00000000  'A portu tamamı çıkış yapıldı.
''-----------------------------------------------------------------
'@ DEVICE pic16F628a                      'işlemci 16F628                               
'@ DEVICE pic16F628a, WDT_ON              'Watch Dog timer açık
'@ DEVICE pic16F628a, PWRT_ON             'Power on timer açık
'@ DEVICE pic16F628a, PROTECT_OFF         'Kod Protek kapalı
'@ DEVICE pic16F628a, MCLR_off            'MCLR pini kullanılıyor.
'@ DEVICE pic16F628a, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak
''-----------------------------------------------------------------
@ __config _BODEN_ON & _BOREN_ON & _CP_ON & _PWRTE_ON & _WDT_ON & _LVP_OFF & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT
CMCON=7
OPTION_REG=1

symbol CLK=PortA.0
SYMBOL DTA=PORTA.1
SYMBOL AKTAR=PORTA.2

SUTUN VAR BYTE [8]
I     VAR BYTE
X     VAR BYTE
satir var byte
sayi var byte
temp var byte
PORTA=0
portb=0
SUTUN[0]=%00000000
SUTUN[1]=%01111110
SUTUN[2]=%01000000
SUTUN[3]=%01000000
SUTUN[4]=%01000000
SUTUN[5]=%01000000
SUTUN[6]=%01111110
SUTUN[7]=%00000000

BASLA1:

x=128

FOR I=0 TO 7
PORTB=255-x
SHIFTOUT DTA,CLK,1,[sutun[i]]

'SHIFTOUT DTA,CLK,1,[sutun[i]]

X=X/2
HIGH AKTAR:PAUSEus 1:LOW AKTAR
PAUSE 5
NEXT

TEMP=SUTUN[7]
FOR I=6 to 0 Step-1
SUTUN[I+1]=SUTUN[I]
Next
sutun[0]=temp
pauseus 1
goto basla1
end



cemilsivas

cevap için teşekkür ederim hocam. Yazı hareketlendirme işlemini dediğiniz gibi yapıyorum. Ama 2 dotmatrix kullandığımda tekshiftout.jpg resmindeki gibi birinde bir satır yukarıda oluşuyor yazı. 2 kere shiftout kulladığımda ise resim 1 deki gibi 1. satır yanıyor. Bu neden olabilir? 2 dotmatrixe 74hc595 ile yazı basmak için farklı bir yol var mıdır? Şu an amacım sadece ekrana yazı çıkarmak.
Not: 2. resim yanlış yüklenmiş.

ete

tek shiftout kullandığında her seferinde bir displaye bilgi veriliyor. İkinci döngüde birinci, kayarak ikinci displaye geliyor ama tek satır eksiliyor. Eksilme sebebi o satırın birinden diğerine geçerken kullanılması. İşin doğrusu kaç tane 595 var ise o kadar değişken kullanılması. Yani ya çift shiftout yada tek shiftout içinde iki değişken
SHIFTOUT DTA,CLK,1,[sutun,sutun] komut satırıda aynı işi görecektir.
Ete

cemilsivas

Peki hocam çift shiftout kullandığımda bazı satırların yanıp sönmesi neden olabilir?

ete

Simulasyondan veya gözün yeterince aldatılamamasındandır.  Her satır normqlde kesme ile sürülmeli ve her satırların ekrana verilmesi arasındaki süreler eşit olmalıdır. Bu eşitlik olmaz ise ve hr bir satır en az saniyede 25 kez yenilenmez ise göz bu satırların yitrediğini algılar. Sen programında kesme kullanmadığın için satırların ekrana gelme araşığı farklı oluyor. Ama asıl faktör ekran yenileme adedi saniyede 25 defadan az olursa ekran titremeyi farkeder.

Ete

cemilsivas

Teşekkür ediyorum hocam. Bir de kesme ile deneyeyim.

cemilsivas

İyi akşamlar hocam. Kodları şöyle değiştirdim.

OPTION_REG=%10000100    'Pull up dirençleri İPTAL- Bölme oranı 1/32.
INTCON=%10100000 
TMR0=0
CMCON=7   
on interrupt goto kesme

symbol CLK=PortA.0
SYMBOL DTA=PORTA.1
SYMBOL AKTAR=PORTA.2

SUTUN VAR BYTE [8]

I     VAR BYTE
X     VAR BYTE
satir var byte
sayi var byte
temp var byte

SUTUN[0]=%00000000
SUTUN[1]=%01111110
SUTUN[2]=%01000000
SUTUN[3]=%01000000
SUTUN[4]=%01000000
SUTUN[5]=%01000000
SUTUN[6]=%01111110
SUTUN[7]=%00000000
x=128
i=0
BASLA1:
if x=1 then:x=128
if i=7 then:i=0


goto basla1
disable

kesme:
PORTB=255-x
temp=sutun[i]
SHIFTOUT DTA,CLK,1,[sutun[i],temp]
X=X/2
i=i+1
HIGH AKTAR:PAUSEus 1:LOW AKTAR
INTCON.2=0
RESUME
enable
end     

Bu sefer birkaç döngüden sonra bazı satırlarda parlama oluyor. Bu arada hocam burada tmr0 değerini değiştiriyorum daha hızlı kesmeye girsin diye. Ama hiçbir değişiklik olmuyor. Neden hocam?

ete

Ne gibi bir değişiklik bekliyorsun? Düzgün çalışan bir sistemin dahada düzgün çalışması neyi değiştirir. Sonuçta ekranda hep aynı sonucu görürsün.
Kullandığın mantık yanlış değil ancak çoklu displaylerde sorun çıkartabilir.
Bir satır aktif edilip o satırdak ledler yakılır. Bir sonraki kesmeye kadar bu satır aktif kalır. Yeniden kesme oluşup satır değiştirmeden önce aktif olan o satır pasif hale getirilmelidir. Yoksa bir müddet sonra göz o satırın hala yandığını sanar ve yanık görmeye çalışır. Bu nedenle önce önceki satır pasif hale getirilip sonra yeni satıra bilgisi verilip satır aktif hale getirilerek kesmeden çıkılır.
Aşağıdaki örnekte olduğu gibi.
Ete

PORTA=0:portb=0
TRISB=0   'PortB tamamı giriş yapıldı.
TRISA=%00000000  'A portu tamamı çıkış yapıldı.
''-----------------------------------------------------------------
'@ DEVICE pic16F628a                      'işlemci 16F628                               
'@ DEVICE pic16F628a, WDT_ON              'Watch Dog timer açık
'@ DEVICE pic16F628a, PWRT_ON             'Power on timer açık
'@ DEVICE pic16F628a, PROTECT_OFF         'Kod Protek kapalı
'@ DEVICE pic16F628a, MCLR_off            'MCLR pini kullanılıyor.
'@ DEVICE pic16F628a, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak
''-----------------------------------------------------------------
@ __config _BODEN_ON & _BOREN_ON & _CP_ON & _PWRTE_ON & _WDT_ON & _LVP_OFF & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT
'000=1/2:001=1/4 , 010=1/8 , 011=1/16 , 100=1/32 , 101=1/64  011=1/128  111=1/256
OPTION_REG=%10000100    'Pull up dirençleri İPTAL- Bölme oranı 1/32.
INTCON=%10100000 
TMR0=224' her 1 ms de bir kesme oluşacak
CMCON=7   
on interrupt goto kesme

symbol CLK=PortA.0
SYMBOL DTA=PORTA.1
SYMBOL AKTAR=PORTA.2

SUTUN VAR BYTE [8]

I     VAR BYTE
X     VAR BYTE
satir var byte
sayi var byte
temp var byte
ESKI VAR BYTE

SUTUN[0]=%00000000
SUTUN[1]=%01111110
SUTUN[2]=%01000000
SUTUN[3]=%01000000
SUTUN[4]=%01000000
SUTUN[5]=%01000000
SUTUN[6]=%01111110
SUTUN[7]=%00000000
x=128
i=1
BASLA1:


goto basla1
disable

kesme:
I=I+1:IF I=8 THEN I=0
ESKI=I-1:IF ESKI=255 THEN ESKI=7
PORTB.0[ESKI]=1 'ÖNCE AKTİF SATIRI PASİF YAPIYORUZ Kİ SÜREKLİ YANIK GİBİ GÖZÜKMESİN.
temp=sutun[i]
SHIFTOUT DTA,CLK,1,[sutun[i],temp]
HIGH AKTAR:PAUSEus 1:LOW AKTAR
PORTB.0[I]=0    'EN SONDA YENİ SATIRI AKTİF YAPIYORZ.
TMR0=224    'HER 1 MS DE BİR EKRAN YENİLENECEK
INTCON.2=0
RESUME
enable
end     

Powered by EzPortal