Rotary Switch

Başlatan onurinci, 14 Ağustos 2017, 03:22:05

onurinci

hocam mask' mı istiyor nasıl yapılır tıkandım,, PortB sıkıntısız çalışabilirken ,PortA if değerini okuyup değer değiştirmiyor,sadece ilk açılışta switch nerede kalmış ise onu okuyor,bir yardım..

@ 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

Main:

Start:

IF PORTA= %00000001 THEN                'Ch01

      LCDOUT $FE,$80," 200 mV "

ENDIF
'---------------------------------------------
  IF PORTA= %00000010 THEN                'Ch02

      LCDOUT $FE,$80," 500 mV "

ENDIF
'---------------------------------------------
  IF PORTA= %00000100 THEN                'Ch03
       
      LCDOUT $FE,$80," 1    V "

ENDIF
'---------------------------------------------
  IF PORTA= %00001000 THEN                'Ch04
       
      LCDOUT $FE,$80," 2    V "

ENDIF
'---------------------------------------------
  IF PORTA= %00010000 THEN                'Ch05
       
      LCDOUT $FE,$80," 5    V "

ENDIF
'---------------------------------------------
  IF PORTA= %00100000 THEN                'Ch06
       
      LCDOUT $FE,$80," 10   V "

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

IF PORTB= %00000001 THEN                'Ch01
       
      LCDOUT $FE,$C0," 10  uA "

ENDIF
'---------------------------------------------
  IF PORTB= %00000010 THEN                'Ch02
       
      LCDOUT $FE,$C0," 100 uA "

ENDIF
'---------------------------------------------
  IF PORTB= %00000100 THEN                'Ch03
       
      LCDOUT $FE,$C0," 1   mA "

ENDIF
'---------------------------------------------
  IF PORTB= %00001000 THEN                'Ch04
       
      LCDOUT $FE,$C0," 10  mA "

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


      GOTO Start

ete

Bu tür karşılaştırmaları daima mask ile yapmak daha doğru olur. Programın başına;
DURUM VAR BYTE şeklinde bir değişken ekle
START satırından sonra;
DURUM=PORTA & %00111111
IF DURUM=%00000001 then....
şeklinde dene istersen.
Diyeceksin ki PORTB de de mask kullanmıyoruz neden orası çalışıyor. Orası çalışıyor çünki PORTB nin son 4 biti LCD de data bitleri olarak kullanılmış. Bu bitler kullanıcı değiştirdiği zaman değişiyor. Halbuki PORTA. da LCD ye bağlı olan RS ve E bitleri işlemci tarafından sürekli değiştirilmektedir. Bu nednele IF PORT=%00000001 THEN dediğin zaman PORTA.nın ilk biti 1 olmasına rağmen son iki biti sürekli değiştiği için aslında PORTA=%00000001 olmamaktadır ve işlemcide bunu eşit değil kabul etmektedir.
Doğru su hem PortA nın hemde PortB nin mask edilerek kullanılmasıdır. Portun bütün pinlerini giriş olarak kullanırsanız MASK gerekli değil ama kontrolü senin elinde olmayan bitler var ise mutlaka kontrol ettiğin bitleri test etmen en doğrusu olacaktır.
Ete


onurinci

hocam süpersiniz.tam istediğim gibi oldu..

Powered by EzPortal