Set değeri tanımlama (tanımyamama)

Başlatan Maxim, 15 Kasım 2006, 14:51:26

Maxim

Aşağıda daha önce verdiğim kodu karışık olmaması için ben değiştirdim .
Konu üzerinde biraz daha uğraşarak problemlerin biri dışında hepsini çözdüm .
Artık butona basınca değer artıyor ,artarken takılmıyor ,değer eproma yazılıyor ,fakat bu değer bir yerden sonra sıfıra dönmesi lazım ama dönmüyor ! ilginç , aşağıdaki örnekte 110 dan sonra sıfır olması lazım olmuyor .


********************************************
Daha önce yazdıklarım:

Daha önce yapmaya çalışmıştım fakat olmadı ,

Amacım ekranda gördüğüm değer için bir set değeri tanımlamak ve bu set değeri geçildiği anda bir çıkışı aktif etmek ,bu değer pic`in flashına yazılmalıki ,besleme kesildiğinde kaybolmasın .

Devre basitçe analog değeri digitale çeviriyor, girişe 5 volt geldiğinde lcd`de 1000 okursunuz .

Örnek vermek gerekirse ;
Butona ilk basıldığında tüm ekran silinmeli ve set değeri yazısı çıktıktan sonra değer 10 yukarı doğru büyümeli ,hemen ardından set değer yazısı kaybolmalı ,butona tekrar basıldığında gene tüm ekran silinmeli ve daha önce set deger >10 olan yazı 20 olmalı .
Bu değer maximum limit olan 1000`e geldikten sonra tekrar 0`a dönmeli .

Problemler ;
Bu değeri kalıcı olarak internal flash eproma yazdıramıyorum ,
Butona basmaya başladıkça ya pic kilitlenip ekran donuyor veya değer loop`a girip sürekli artmaya devam ediyor .
Fakat siz butona 1 saniye aralıklarla basarsanız değer normal olarak artıyor ,sorun yok .

*******************************************************





device 16f876
xtal 4

dim dwd0 as word
dim A as word
dim B as word


IF Portb.5=1 THEN
cls
B = EREAD A
B=B+10
EWRITE A,[B]
print $FE,$C0,"SET DEGERI=",DEC B            
DELAYMS 300
CLS
endif     
return

IF dwd0>=B THEN
PORTb.7=1
ELSE
PORTb.7=0
ENDIF
RETURN

IF B>=110 THEN
EWRITE A,[0]
ENDIF
return

Maxim


Veli B.

IF B>=110 THEN
EWRITE A,[0]
ENDIF
return


Bu rutin, bu kod içerisinde hiç bir zaman yürütülemez. Hemen öncesinde bir geri dönüş(return) var.
Bir de RETURN  komutlarını görmeme rağmen, GOSUB' ları göremedim.Kodun tamamı bundan mı ibaret?

Maxim

Alıntı yapılan: "katana"
IF B>=110 THEN
EWRITE A,[0]
ENDIF
return


Bu rutin, bu kod içerisinde hiç bir zaman yürütülemez. Hemen öncesinde bir geri dönüş(return) var.
Bir de RETURN  komutlarını görmeme rağmen, GOSUB' ları göremedim.Kodun tamamı bundan mı ibaret?

Tamamı bu şekilde  :oops:


DEVICE 16F876
Declare XTAL 4

Declare LCD_DTPIN	Portc.4
Declare	LCD_RSPIN	Portc.1
Declare	LCD_ENPIN	Portc.0
Declare	LCD_INTERFACE	4
Declare	LCD_LINES	2 

Declare ADIN_RES	10
Declare ADIN_TAD	1
Declare ADIN_STIME	50

DIM ADC_KANAL1 AS float    
DIM TEMP1 AS byte    
DIM W1 AS word       
DIM W2 AS float
dim B as WORD
dim A as WORD       
DIM DWD0 AS WORD
DIM OLCUM_VOLTAJI  AS 1000     
DIM ADC_ORNEKSAYISI AS 50

GOTO RESET_VECTOR

PRJ_LOOP:
ASM
NOP
NOP
CLRWDT
NOP
NOP
ENDASM
call    adc_oku
DELAYMS 1
GOTO PRJ_LOOP

RESET_VECTOR:
ASM
BCF	INTCON,GIE
BTFSC   INTCON,GIE
GOTO    RESET_VECTOR
ENDASM

DELAYMS 500 
    
TRISA=%11111111
TRISB=%00001111
ADCON1=%10000000
INTCON=%00100000
             
TEMP1=ADC_ORNEKSAYISI
    
ADC_KANAL1=0
    
GOTO PRJ_LOOP

ADC_OKU:

ADC_OKU_1:    
ADCIN 0,W1
ADC_KANAL1=ADC_KANAL1+W1
    
TEMP1=TEMP1-1
IF TEMP1>0 THEN RETURN 
	
ADC_KANAL1=ADC_KANAL1/ADC_ORNEKSAYISI
		
W2=OLCUM_VOLTAJI        
W2=W2/1023
           
ADC_KANAL1=ADC_KANAL1*W2
        
cALL EKRANI_YAZ

TEMP1=ADC_ORNEKSAYISI
ADC_KANAL1=0
	               
RETURN

EKRANI_YAZ:

DWD0=adc_kanal1
Print $fe,$80
print "****************"
PRINT $FE, $C0
PRINT "SONUC > "
GOSUB DEC_DWD0

IF Portb.5=1 THEN
cls
B = EREAD A
B=B+10
EWRITE A,[B]
print $FE,$C0,"SET DEGERI=",DEC B            
DELAYMS 300
CLS
endif     
return

IF dwd0>=B THEN
PORTb.7=1
ELSE
PORTb.7=0
ENDIF
RETURN

IF B>=110 THEN
EWRITE A,[0]
ENDIF
return

DEC_DWD0:
select dwd0
case < 10   : PRINT DEC1 dwd0,"   " 
case < 100  : PRINT DEC2 dwd0,"  " 
case < 1000 : PRINT DEC3 dwd0," " 
case else   : PRINT DEC4 dwd0,"" 
endselect 
return
END

Maxim

Bu şekilde değiştirdim ,fakat doğru değil ki ,olay loop`a giriyor ,yani set butonu takılı kalıyormuş gibi değer yukarı çıkmaya devam ediyor (eğer butonu biraz uzun süre basılı tutarsanız) .

Onun dışında eeproma değer yazılıyor .

Değeri sıfırdan değilde 700 den başlatmak istedim ,1100 den 700 e dönüyor ,o da tamam.

Son olarak ,
bir buton daha ekledim sadece "set değerini" görebilmek için ,
bu olayı acaba tek düğme ile kullanabilirmiyiz ?

Örnek :
tek butonumuz var.
butona basıp hemen bırakırsak ekranda "set değeri" çıkar ve kaybolur.
butona basıp 1sn civarında tutmaya devam edersek ,değer 10 ar 10 ar artar .

evet çok şey istedim biliyorum.


if portb.4=1 then
cls
B = EREAD A
print $FE,$C0,"SET DEGERI=",DEC B
delayms 1500
cls
endif 

IF Portb.5=1 THEN
cls
B = EREAD A
B=B+10
EWRITE A,[B]
print $FE,$C0,"SET DEGERI=",DEC B            
DELAYMS 300
CLS
endif     
gosub out_on

out_on:
IF dwd0>=B THEN
PORTb.7=1
ELSE
PORTb.7=0
ENDIF
gosub zero

zero:
if b<700 then
ewrite a,[700]
endif
gosub zero1

zero1:
IF B>1100 THEN
EWRITE A,[700]
ENDIF
return