BCD 'den 7 Segment'e uyku ihtiyacı

Başlatan onurinci, 20 Haziran 2023, 01:37:46

onurinci

Hocam BCD Thumbwheel şalterden 7 segment displeyi okutuyorum.alıcıya parazit yapmasın diye ,işlem bitince PIC'i uyutuyorum. bir şeyler karaladım. ileri gidebiliyorum ,geri gelirken sapıtıyor.
[#CONFIG
 __CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _MCLRE_OFF &_PWRTE_ON & _CP_OFF & _LVP_OFF & _BODEN_OFF 
#ENDCONFIG

REM 16F628A
DEFINE OSC 4

TRISA= %00000000 : PORTA= 0
TRISB= %11110000 : PORTB= 0

CMCON= 7

' ** Declare the Variables **

RBIF    Var INTCON.0	      ' PORTB[4..7] Change Interrupt Flag
RBIE    Var INTCON.3	      ' PORTB[4..7] Change Interrupt Enable
RBPU    Var OPTION_REG.7	  ' PortB pullups (1=disabled, 0=enabled)
GIE     Var INTCON.7	      ' Global interrupt enable/disable

DURUM VAR BYTE  ' for Mask'ing

' ** THE MAIN PROGRAM STARTS HERE **

    GIE= 0					        ' Turn OFF global interrupts
    While GIE= 1 : GIE= 0 : Wend	' And make sure they are off
    TrisB.4= 1				        ' Set PortB.4 as an Input
'    RBPU= 0				            ' Enable PortB Pullup Resistors
    RBIE= 1				            ' Enable PortB[4..7] interrupt

Start:
DURUM=PORTB & %11110000  ' for Mask'ing

;-------------------------------------------------------------------------------
 IF DURUM=%0000000 THEN                ' Screen view 0
 
PORTA= %00001111
PORTB= %00000011
    RBIF= 0					        ' Clear the PORTB[4..7] interrupt flag
   
@	Sleep					        ; Put the PIC to sleep
ENDIF
;-------------------------------------------------------------------------------
 IF DURUM=%00010000 THEN                ' Screen view 1
 
PORTA= %00000110
PORTB= %00000000
    RBIF= 0					        ' Clear the PORTB[4..7] interrupt flag
    
@	Sleep					        ; Put the PIC to sleep
ENDIF
;-------------------------------------------------------------------------------
 IF PORTB=%00100000 THEN                ' Screen view 2
 
PORTA= %00001011
PORTB= %00000101
    RBIF= 0					        ' Clear the PORTB[4..7] interrupt flag
    
@	Sleep					        ; Put the PIC to sleep
ENDIF
;-------------------------------------------------------------------------------
 IF DURUM=%00110000 THEN                ' Screen view 3
 
PORTA= %00001111
PORTB= %00000100
    RBIF= 0					        ' Clear the PORTB[4..7] interrupt flag
    
@	Sleep					        ; Put the PIC to sleep
ENDIF
;-------------------------------------------------------------------------------
 IF DURUM=%01000000 THEN                ' Screen view 4
 
PORTA= %00000110
PORTB= %00000110
    RBIF= 0					        ' Clear the PORTB[4..7] interrupt flag
    
@	Sleep					        ; Put the PIC to sleep
ENDIF
;-------------------------------------------------------------------------------
 IF DURUM=%01010000 THEN                ' Screen view 5
 
PORTA= %00001101
PORTB= %00000110
    RBIF= 0					        ' Clear the PORTB[4..7] interrupt flag
   
@	Sleep					        ; Put the PIC to sleep
ENDIF
;-------------------------------------------------------------------------------
 IF DURUM=%01100000 THEN                ' Screen view 6
 
PORTA= %00001101
PORTB= %00000111
    RBIF= 0					        ' Clear the PORTB[4..7] interrupt flag
    
@	Sleep					        ; Put the PIC to sleep
ENDIF
;-------------------------------------------------------------------------------
 IF DURUM=%01110000 THEN                ' Screen view 7
 
PORTA= %00000111
PORTB= %00000000
    RBIF= 0					        ' Clear the PORTB[4..7] interrupt flag
   
@	Sleep					        ; Put the PIC to sleep
ENDIF
;-------------------------------------------------------------------------------
 IF DURUM=%10000000 THEN                ' Screen view 8
 
PORTA= %00001111
PORTB= %00001111
    RBIF= 0					        ' Clear the PORTB[4..7] interrupt flag
   
@	Sleep					        ; Put the PIC to sleep
ENDIF
;-------------------------------------------------------------------------------
 IF DURUM=%10010000 THEN                ' Screen view 9
 
PORTA= %00001111
PORTB= %00000110
    RBIF= 0					        ' Clear the PORTB[4..7] interrupt flag
   
@	Sleep					        ; Put the PIC to sleep
ENDIF
;-------------------------------------------------------------------------------

	Goto Start				        ' Do it forever/code]

ete

#1
Port değişiklik kesmesi oluştuktan sonra RBIF=0 ile kesme bayrağını sıfırlayamazsın.
Bunun için PORT'u okuman gerekir.
Her bir karşılaştırma if döngüsü içinde bayrağı sıfırlayıp sistemi uykuya soktuğun için kesme bayrağı sıfırlamadan uykuya sokulmuş oluyor.
Ben olsa şöyle yapardım;
DURUM=PORTB & %11110000  
bu komuttan sonra sistemi tek bir sleep komutu ile uykuya sokup beklemeye alırdım.
Bu komut hem portu okur hemde kesme bayrağını sıfırlar.
Kesme oluşunca sistem uykudan çıkar. Çıkarçıkmaz yine aynı komut ile hangi tuşa basıldığı belirlenir ve if komutları ile yapılacaklar yapılıp program tekrar başa yönlendirilir.
Orada port tekrar okunur ve sistem uykuya sokulur.
Bu şekilde sağlıklı çalışacağını düşünürüm.

Sonuçta Start satırından hemen sonrasına;
DURUM=PORTB & %11110000
@ Sleep
DURUM= PORTB & %11110000 
satırları eklenip if döngülerindeki  Sleep komutlarının tamamı silinmelidir. Böylece program tek bir sleep komutu ile uykuya girer.
Ete

onurinci

evet haklısınız hocam yönteminizi denedim.taşlar yerine oturdu.

fakat farklı bir sorun çıktı. ilk enerji verdiğimde Thumbwheel anahtarın pozisyonunu okuyamadı. displey boş bir karakter yok.bir kere anahtara aşağı yada yukarı hareket ettirdikten sonra çalışmaya başlıyor.

ete

#3
Bu açılışta kesme oluşmayacağı için ortaya çıkan bir sorun. Normalde start etiketine gelmeden port'un okunup okunan değere göre display'e değer verdirmek gerekir. Bu işi iki şekilde yapabilirsin. Birincisi start etiketinden önce portu okuyup aşağıda bulunan aynı satırları tekrarlayarak ekrana okunan değeri yazdırabilirsin. Yada daha iyisi portu okuyup ekrana değer verdiren kod parçasını bir alt program haline getirip hem start etiketinden önce buraya Gosub ile gelip okunan değer ekrana verilir ve ardından sistem uykuya girerek uykudan kesme ile çıkınca yine alt programa yollanıp kesemyi oluşturan değer ekrana verdirilir.
Ete

onurinci

hocam ilginize teşekkür ederim,tavsiyeleriniz beni aşıyor,ileride uygun bir zamanınızda tekrar danışırım.
şimdilik PORTB'yi unutup Mask işleminin çalışmadığı kaanatine vardım. ve portu çıkış olarak PORTA'ya taşıdım. sorun çözüldü.

çalışsa idi iyi olacaktı , zira sorunsuzca COMMON Cathode displeyi sürebilecektim. PORTA4 ,sevimsizliği nedeniyle direnç ile PULL yapmak iyi bir fikir değil.zira diğer segmentler ile asla aynı ışığı veremiyor,o parça ayrı bir şekilde aydınlanıyor.

tabloyu değiştirip COMMON Anode displeye geçerek sorunu aştım.
fakat elimde hiç yok oysa Cathode bir sürü vardı.

ete

Aslında yapman gereken son derece basit. START etiketinden önceki bölüme aşağıdakileri ekle.
Start sonrasınıda yine aşağıdaki gibi yap.
    pause 200
    gosub port_bak
    
Start:

DURUM=PORTB & %11110000  ' for Mask'ing
@ sleep

gosub port_bak

goto START

Aşağıdaki bölüme de PORT_BAK şeklinde etiket ismi ver ve IF lerin en sonuna RETURN ekle.
PORT_BAK:
DURUM=PORTB & %11110000 
;-------------------------------------------------------------------------------
 IF DURUM=%0000000 THEN                ' Screen view 0
 
PORTA= %00001111
PORTB= %00000011
    RBIF= 0					        ' Clear the PORTB[4..7] interrupt flag					        ; Put the PIC to sleep
ENDIF
;-------------------------------------------------------------------------------
 IF DURUM=%00010000 THEN                ' Screen view 1
 
PORTA= %00000110
PORTB= %00000000
    RBIF= 0					        ' Clear the PORTB[4..7] interrupt flag					        ; Put the PIC to sleep
ENDIF
;-------------------------------------------------------------------------------
 IF PORTB=%00100000 THEN                ' Screen view 2
 
PORTA= %00001011
PORTB= %00000101
    RBIF= 0					        ' Clear the PORTB[4..7] interrupt flag					        ; Put the PIC to sleep
ENDIF
;-------------------------------------------------------------------------------
 IF DURUM=%00110000 THEN                ' Screen view 3
 
PORTA= %00001111
PORTB= %00000100
    RBIF= 0					        ' Clear the PORTB[4..7] interrupt flag					        ; Put the PIC to sleep
ENDIF
;-------------------------------------------------------------------------------
 IF DURUM=%01000000 THEN                ' Screen view 4
 
PORTA= %00000110
PORTB= %00000110
    RBIF= 0					        ' Clear the PORTB[4..7] interrupt flag					        ; Put the PIC to sleep
ENDIF
;-------------------------------------------------------------------------------
 IF DURUM=%01010000 THEN                ' Screen view 5
 
PORTA= %00001101
PORTB= %00000110
    RBIF= 0					        ' Clear the PORTB[4..7] interrupt flag					        ; Put the PIC to sleep
ENDIF
;-------------------------------------------------------------------------------
 IF DURUM=%01100000 THEN                ' Screen view 6
 
PORTA= %00001101
PORTB= %00000111
    RBIF= 0					        ' Clear the PORTB[4..7] interrupt flag					        ; Put the PIC to sleep
ENDIF
;-------------------------------------------------------------------------------
 IF DURUM=%01110000 THEN                ' Screen view 7
 
PORTA= %00000111
PORTB= %00000000
    RBIF= 0					        ' Clear the PORTB[4..7] interrupt flag					        ; Put the PIC to sleep
ENDIF
;-------------------------------------------------------------------------------
 IF DURUM=%10000000 THEN                ' Screen view 8
 
PORTA= %00001111
PORTB= %00001111
    RBIF= 0					        ' Clear the PORTB[4..7] interrupt flag					        ; Put the PIC to sleep
ENDIF
;-------------------------------------------------------------------------------
 IF DURUM=%10010000 THEN                ' Screen view 9
 
PORTA= %00001111
PORTB= %00000110
    RBIF= 0					        ' Clear the PORTB[4..7] interrupt flag					        ; Put the PIC to sleep
ENDIF
;-------------------------------------------------------------------------------

	return		



onurinci

oldu valla ..hocam harikasınız,çok teşekkür ederim..

Powered by EzPortal