Mask Problemi

Başlatan onurinci, 27 Nisan 2018, 01:05:28

onurinci

hocam Mask'lamayı beceremedim. Function switch'i 6 pozizyonlu Time Base ise 4 pozisyonlu,Function anahtarını üçüncü ve altıncı duruma getirdiğimde Time Base anahtarı çalışmaz hale geliyor,doğru yaptığıma inandığım için hatayı bulamıyorum..


@ DEVICE PIC16F628A,INTRC_OSC_NOCLKOUT,WDT_OFF,MCLR_OFF,PWRT_ON,BOD_OFF,LVP_OFF,CPD_OFF,PROTECT_OFF
DEFINE OSC 4

TRISA= %00111111 : PORTA= 0
TRISB= %00001111 : PORTB= 0

CMCON= 7


DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 1
DEFINE LCD_EREG PORTA
DEFINE LCD_EBIT 7
DEFINE LCD_RSREG PORTA
DEFINE LCD_RSBIT 6
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2
DURUM VAR BYTE  ' for Mask'ing
Main:

Start:
DURUM=PORTA & %00111111  ' for Mask'ing
'----------------------------------------------
    IF DURUM=%00000001 THEN                ' Volts 1

    LCDOUT $FE,$80," Frequency      "

ENDIF
'---------------------------------------------
    IF DURUM=%00000010 THEN                ' Volts 2

    LCDOUT $FE,$80," Period         "

ENDIF
'---------------------------------------------
    IF DURUM= %00000100 THEN                ' Volts 3
       
    LCDOUT $FE,$80," Frequency Ratio"
ENDIF
'---------------------------------------------
    IF DURUM= %00001000 THEN                ' Volts 4
       
    LCDOUT $FE,$80," Time Interval  "

ENDIF
'---------------------------------------------
    IF DURUM= %00010000 THEN                ' Volts 5
       
    LCDOUT $FE,$80," Unit Counter   "

ENDIF
'---------------------------------------------
    IF DURUM= %00100000 THEN                ' Volts 6
       
    LCDOUT $FE,$80," Oscillator Freq"

ENDIF
'---------------------------------------------
' Volts Cuurrent Menu Seperation
'---------------------------------------------

    IF PORTB= %00000001 THEN                ' Current 1
       
    LCDOUT $FE,$C0," 0.01s/1 Cycle "

ENDIF
'---------------------------------------------
    IF PORTB= %00000010 THEN                ' Current 2
       
    LCDOUT $FE,$C0," 0.1s/10 Cycles"

ENDIF
'---------------------------------------------
    IF PORTB= %00000100 THEN                ' Current 3
       
    LCDOUT $FE,$C0," 1s/100 Cycles "

ENDIF
'---------------------------------------------
    IF PORTB= %00001000 THEN                ' Current 4
       
    LCDOUT $FE,$C0," 10s/1K Cycles "

ENDIF
'---------------------------------------------


      GOTO Start

ete

PortB de giriş pinin 4 adet ama mask ve sorgulama için 6 bit kullanıyorsun. Giriş pinlerini artır. TRISB tanımlamasını değiştirmen gerek.
Ete

onurinci

hocam PortA 6 giriş oldoğu için onu masklıyorum.
PortB'yi maskladığım zaman çalışmaz oluyor.
müdahele ederseniz sevinirim.

ete

Sorun nedir anlayamıyorum. Anladığım giriş pini eksikliğin ona farklı cevap vermişsin. İsis devren açılmıyor bende ordanda bir şey göremiyorum yapabileceğim bir şey yok.
Ete

onurinci

#4
hocam sıkıntı yok hallederim, İsis versiyonunu yükseltmiştiniz galiba..

F®T

onurinci hocam

DEFINE LCD_DBIT 1

DEFINE LCD_DBIT 4 olması gerekmiyormu?
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

onurinci

çok ilginçtir bunaldığım için LCD bitler ile oynamıştım öyle kalmış,programda en ufak bir değişiklik yapmadım tekrar derlerledim,Isis'te kusursuzca çalıştı ;D

ete

#7
Şemayı görünce her şey daha iyi oturuyor.
Rotary switch leri pull-down çalıştırıyorsun ama birisi PORTA ya bağlı ve PORTA.4 kendi başına HIGH veremez.
Doğrusu o switchleri PULLUP  çalıştırmak ve doalaşn ucu GND ye bağlamak. Şu anda yaptığının tam tersi olmalı. PORTA.4 Open Collectordur. Bu nedenle HIGH verebilmesi için pullup direnci bağlanması gerekir. Bunu düşünerek o switchlerin pulluplı çalışması daha doğru olur.
Diğer bir konuda ise,
PORTB de bağlı olan sw 4 bit bu programlada uyumlu zira orada 4 bit giriş vermişsin zaten. PortA da 6 giriş verilmiş bu da tamam.  Uyumsuzluk sw lerin Pull-down olması başka bir şey değil.
Aynı şeyi PORTB içinde yapabilirsin. Test sistemin de ona göre değişecektir elbette.
PORTA için bakacak olursak,
SW orta ucu PORT:0 da olduğunda DURUM=PORTA & %00111111 komutu sana DURUM=%00111110 değerini verecektir.
SW orta ucu PORTA.4 olduğunda ise DURUM=%00101111 verecektir. Bunları desimal kullanmak belkide daha doru olur.
PORTA için düşünecek olursak, Toplam 6 bit var. Hespi HIGH olduğunda değer 63 olacaktır. Bu nedenle DURUM=63-(PORTA & %00111111) yaparsan sana hangi sw nin bağlı olduğunu rakamsal olarak söyler.
Aynı testi PORTA.0 için ve PORTA.4 için yeniden yapalım. DURUM=63-(PORTA % %00111111)=63-%00111110=1 verecektir
DURUM=63-(PORTA % %00101111)=16 verecektir.
PORTB de ise 4 bitlik bağlantıda hepsi HIGH iken sana 15 değerini verir. Hangisi aktif ise o LOW olacağı için formülün 15-(PORTB & %00001111) şeklinde olacaktır.

Sorun tespitim bu yönde düzeltmeleri yapıp yeniden dene bak bakalım sorun varmı.
Ete

Powered by EzPortal