eeproma nasıl yazarım ?

Başlatan Maxim, 21 Nisan 2006, 16:31:14

Maxim

Daha önce bitirdiğim bu devreyi geliştirmeye çalışıyorum .Yazılımı anlaşılır olabilmesi için sadeleştirdim ,
tek girişli hale getirdim .
Devrede yapmaya çalıştığım "bir set değeri" girişi ile "alarm" çıkışını aktif etmektir .

Çalışma mantığı :
Devrede 16F877 10 bit adc kullanılmıştır ,girişe uygulanan gerilime göre ekranda ısı değeri okunmaktadır .
Devreyi sadeleştirdiğim için şemada thermocouple kuvvetlendiricisi (AD595) gözükmemekterdir .
Sonuçta girişe sıfır volt geldiğinde lcd ekranda 0 , 5 volt geldiğinde lcd ekranda 1200 derece yazmaktadır.

Set değeri :
Set değerinin çalışma mantığı şöyledir ,
Değer girişi için 1 adet buton kullanılmıştır .
Butona basıldığında set değeri 10 birim artar ,tekrar basıldığında 20 olur ,30 ,40 diye istenilen değer tanımlanır .
Bu değer 1200' e geldiğinde tekrar 0' a döner .
Ekranda okunan ısı değeri ayarlanan set değerinin üzerine çıktığında alarm çıkışı aktif olur ,
Isı, set değerinin altına inene kadar buzzer öter .
Normal şartlarda ekranda set değeri yazısı gözükmez ,butona basıldığı zaman ekran temizlenir ve
set değeri yazısı belirir ,ayarlanan gecikme süresi kadar ekranda kalır ve kaybolur .

Problem :
1-Set değeri kalıcı olmamaktadır ,pic beslemesi kesildiğinde daha önce girilen set değeri unutulmakta yani 0 olmaktadır .
Uzun lafın kısası bu set değerini picin içerisindeki eeproma kalıcı olarak yazamamaktayım .

2-Set değeri girişi sırasında bazen ! değer takılmakta butona basılmadığı halde set değeri kendi kendine 10 ar 10 ar artmakta
yani loop a girmektedir .

Proteus + hex + picbasic proton+ dosyası aşağıdaki adrestedir .
http://www.hemenpaylas.com/download/530082/Picproje.zip.html

DEVICE 16F877	

    Declare XTAL 4
  
  	    Declare LCD_DTPIN	PortD.4
        Declare	LCD_RSPIN	PortD.1
        Declare	LCD_ENPIN	PortD.0
        Declare	LCD_INTERFACE	4
        Declare	LCD_LINES	4 

	   	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 alarm as word
    DIM DWD0 AS WORD
    DIM OLCUM_VOLTAJI AS 1200
    DIM ADC_ORNEKSAYISI AS 100

    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 1000
        
    'OPTION_REG = %00000001      
    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, $84
    PRINT "ISI >"
    GOSUB DEC_DWD0
    
    IF Portb.4=1 then
    PRINT $FE, 1
    PRINT $FE,$C0,"SET DEGERI=",dec alarm
    DELAYMS 500 
    dwd0=cREAD alarm
    ALARM=alarm+10
    PRINT $FE, 1
    endif
    
    IF dwd0>=ALARM THEN
    PORTB.5=1
    ELSE
    PORTB.5=0
    ENDIF
         
     IF alarm>=1200 then 
     alarm=0
     'cwRITE alarm,[0]
     endIF
               
     RETURN

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

CaFFeiNe

DEVICE 16F877		' Needs to be a 16F87x type PICmicro 
DIM VAR1 as BYTE 
DIM WRD as WORD 
DIM Address as WORD 
Address = 1000			' Address now holds the base address 
VAR1 = CREAD 1000		' Read 8-bit data at address 1000 into VAR1 
WRD = CREAD Address+10	' Read 14-bit data at address 1000+10


hocam şekildeki gibi adress değişkenine bir adres bilgisi girmen gerekiyor bundan sonra o adresteki bilgiyi

x = CREAD Address

şeklinde x değişkenine okutabilirsin veya

CWRITE Address,


  • şeklinde o adrese x değişkenini yazdırabilirsin

    buradaki adres bilgisi pic içerisinde Flash hafızanın adresi oluyor