Salvarea PIC EEPROM

S

SkeeterB08

Guest
Trebuie să mă gândesc la modul în care fiecare dintre hidrogen mele pe celulele cererea va fi diferit şi am nevoie de un mod de a economisi o valoare de cât timp ar trebui să fie o întârziere între momentul în care senzorul mai mici merge de mare şi cât de mult timp dupa ce a senzorului de sus merge la mare ţine de la supraumplerea celula cu electrolit.Mă gândeam de a folosi un EEPROM pentru a stoca că datele care ar fi citit şi sa mutat la contracara întârziere care este utilizat atunci când secţiunea Refill codului meu este activ.Mi-ar citit, probabil, un switch care spune pe un element care ar spune pic mea de a citi de intrare care ar creşterii Registrul W la întârzierea dorit.În cazul în care trecerea la majorările registrul W merge scăzute s-ar scrie registrul W la EEPROM.Ma gandesc deja a ceea ce cod pentru a scrie pentru subrutina de a stabili valoarea de la Registrul W, dar ceea ce registrele ar fi utilizate în EEPROM la bord şi ce comenzi vor fi folosite pentru a citi şi scrie la registrele??

Editare:

M-am gândit despre plecarea punerea în valoare de cod, dar aş dori să fie în măsură de a schimba această valoare, fără a trebui să recompilaţi şi reprograma PIC cu un fisier HEX nou dacă aş schimba vreodata celule HOD şi necesită o perioadă de timp diferită umple din nou pentru a umple suficient de celula de mai sus pentru a superior de nivel al apei Sensor.

 
Examp EEPROM, programul de e pot fi găsite aici
http://microcontroller51.blogspot.com/
şi a se vedea, de asemenea,
http://picinf.blogspot.com/

 
Am o problemă de scriere pentru a EEPROM folosind de mai jos pic de cod.Se presupune că pentru a scrie valoarea Registrul Count1v în memoria EEPROM a PIC.Unde merg greşit??

Cod:EPWrite

movf EEPROM_ADR, W; de sarcină cu o valoare în W

EEADR banksel

EEADR movwf

EEADRH clrf

banksel 0

movf EEprom_Data, w

EEDATA banksel

movwf EEDATAEECON1 banksel

EECON1 BCF, EEPGD

EECON1 BSF, WRENH'55 movlw '; secvenţă magic

EECON2 movwf

movlw H'AA "

EECON2 movwfEECON1 BSF, WR

EECON1 BSF, WREN

EECON1 BCF, EEIF; clar întrerupe pavilion_wloop

EECON1 btfsc, EEIF

_wloop gotoEECON1 banksel

EECON1 BCF, WREN; EEPROM nu fi de acord a scrie

banksel 0

întoarce

 
Scrierea în memoria EEPROM a PIC, unele Prospecte şi informaţii pot fi găsite aici
http://picinf.blogspot.com/

 
Salut,

Codul dvs. arată aproape dreptul, dar cateva lucruri s-ar putea nevoie de schimbare.

Nu s-au folosit oricare dintre comenzile de întrerupere - probabil, deoarece codul dumneavoastră principală nu este folosirea lor -?- Dar cred că ar trebui să fie incluse.

De asemenea, modul în care vă sunt compensarea apoi testarea pavilion este diferit de codul meu de lucru - exemplul meu a fost pe un 16F876a.
eewrite BSF STATUS, RP0; selectaţi bank1
corul movfw; obţine corul
BCF STATUS, RP0; a nu putea suporta la bank0
BSF STATUS, RP1; selectaţi bank2
EEDATA movwf; corul de sarcină pentru a EEdata
movlw 0x00; de sarcină eeaddresss 00
EEADR movwf;
BCF STATUS, RP1; a nu putea suporta la bank0

BSF STATUS, RP0; selectaţi bank1 EEWRITE
BSF STATUS, RP1; selectaţi bank3
EECON1 BCF, EEPGD; puncte de la datele de memorie
EECON1 BSF, WREN; permite scrie
BCF INTCON, GIE; dezactivaţi toate INTS
movlw 0x55;
EECON2 movwf; init scrie secvenţă
0xAA movlw; utilizând instrucţiunile de 2
EECON2 movwf;
EECON1 BSF, WR; scrie date
BSF INTCON, GIE; rândul său, INTS spate pe
BCF STATUS, RP0; selectaţi bank0
BCF STATUS, RP1;
wd01 PIR2 btfss, EEIF; este de biţi int pe WRTDONE adică
Du-te la wd01; dacă este făcută în continuare
PIR2 BCF, EEIF; a nu putea suporta întrerupe
BSF STATUS, RP0; selectaţi bank3
BSF STATUS, RP1
EECON1 BCF, WREN; dezactivează scrie
BCF STATUS, RP1; selectaţi bank1
BCF STATUS, RP0; selectaţi bank0; ************************************************* ************
; DECLARE EEPROM DATE cip 16f876a *
,
; EEPROM preload cu valori de bază, la timpul de programare numai!
,
; De date secventa: - CLK ore, minute CLK, Temp off, temp pe, chill1, chill2,
,
org 0X2100 *
de 0x09, 0X59, 0x50, 0X49, 0X60, 0X70, 0X55, 0x40, 0x80
de 0x00, 0x10, 0X15, 0x22, 0X15, 0x10, 0X30, 0x21, 0X30

 
Programul meu pare a fi achiziþie bloca când scris EEPROM.Unde merg greşit?

Cod:p = lista de 16f628A; directivă lista pentru a defini procesor

# include <p16f628A.inc>; procesor definiţiile specifice variabilă

errorlevel -302; ascunde mesaj bancar

;*****

__CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _INTRC_OSC_NOCLKOUT & _MCLRE_OFF & _LVP_OFF

;*****

; interne setările OSC

;*****

; "Directiva __CONFIG" este folosit pentru a încorpora în termen de date de configurare fişier ASM..

; Lables următoarele directivei se află în respectivul fişier. Inc.

; Respective, a se vedea fişa de date pentru informaţii suplimentare pe cuvântul de configurare.;***** DEFINIŢII VARIABILĂ

w_temp variabilă EQU 0x70; folosite pentru economisirea de context,

status_temp variabilă EQU 0x71; folosite pentru economisirea de context,

Count1 EQU 0x20; În primul rând pentru Counter Delay

Count1v EQU 0x21; Contele de depozitare pentru Refill Delay

EEPROM_ADDR EQU 0x00; Adresa de EEPROM octet utilizate

;************************************************* *********************

ORG 0x000; procesor vector a nu putea suporta

Du-te la Start; du-te la începutul programului de

ORG 0x004; întrerupe locaţie vector

w_temp movwf; salva conţinutul de pe registru actualizat W

STATUS movf, W; muta inregistreaza-te în starea W inregistreaza-te

status_temp movwf; salva off conţinutul registrului STATUS

status_temp movf, W; prelua copie a registrului STATUS

STATUS movwf; restabili de pre-STATUTUL ISR registru conţinutul

w_temp swapf, f

w_temp swapf, W; restabili de pre-conţinutul ISR registru W

retfie; întoarcerea de la întrerupereaPorni

PORTA clrf

PORTB clrf

Movlw 0x07

Movwf CMCON; Opriţi de comparaţie

BSF STATUS, RP0; Bank One

movlw 0xFF

movwf TRISA; Porta toate Intrare

movlw 0x00

TRISB movwf; PORTB toate de iesire

movlw 0x00; a se vedea foi de date pentru preferat

OPTION_REG movwf; setările de OPTION_REG

BCF STATUS, RP0; a reveni la banca 0

de apel Systest

PORTA btfsc, 2; Verificaţi dacă Setup Switch = 1

de apel Setup; Du-te la Setup subrutina

; Count1v movf, w

; Count1 movwf

btfss PORTA, 0; Verificaţi dacă superioare Sensor = 1

Call Refill; Dacă nu du-te la Refill subrutina

Du-te la Executare, apoi du-te la Mod de operareDe instalare

btfss PORTA, 2; Dacă programul de instalare Switch = 0

apel EP_Write; Scrie Count1v de date pentru a EEPROM

PORTA btfsc, 3; În cazul în care Count Switch = 1

incfsz Count1v, 1; Increment Count1v, până la 1

PORTA btfsc, 2; Dacă programul de instalare Switch = 1

Du-te la Setup; Revenire la partea de sus a subrutina

btfss PORTA, 2; Dacă programul de instalare Switch = 0

de apel EP_Write

return; Revenire la programul principalSystest

apel Delay; Apel Întîrziere de rutină pentru a seta ora Delay

movlw 0x80; Set PORTB, 7 High ceilalţi Min

PORTB movwf

Delay1 de apel; Apel Delay subrutina

apel Delay; Apel Întîrziere de rutină pentru a seta ora Delay

movlw 0x40; Set PORTB, 6 High ceilalţi Min

PORTB movwf

Delay1 de apel; Apel Delay subrutina

apel Delay; Apel Întîrziere de rutină pentru a seta ora Delay

movlw 0x20; PORTB Set, 5 High ceilalţi Min

PORTB movwf

apel Delay; Apel Întîrziere de rutină pentru a seta ora Delay

Delay1 de apel; Apel Delay subrutina

movlw 0x10; PORTB Set, 4 High ceilalţi Min

PORTB movwf

apel Delay; Apel Întîrziere de rutină pentru a seta ora Delay

Call Delay1; Apel Delay subrutina

0xF0 movlw; setează Toate High Indicatori

PORTB movwf

apel Delay; Apel Întîrziere de rutină pentru a seta ora Delay

Delay1 de apel; Apel Delay subrutina

movlw 0x80; Porniţi LED

PORTB movwf

Return; Revenire la programul principalFugi

movlw 0xC0; Operaţiunea Set Mod

btfss PORTA, 0; Verificaţi dacă superioare Sensor = 1

0xE0 movlw; Set de avertizare Mod

PORTB movwf; Mutare la PORTB

btfss PORTA, 1; Verificaţi dacă este mai mică Sensor = 1

de apel Delay; Apoi Du-te la Delay1 subrutina

btfss PORTA, 1; Verificaţi dacă este mai mică Sensor = 1

Call Refill; Du-te la Refill subrutina

Du-te la A alerga; Return to TopUmple din nou

0xB8 movlw; Set Refill Mode

PORTA btfsc, 0; Check Dacă superioare Sensor = 1

0xC0 movlw; Apoi Operaţiunea Set Mod

PORTB movwf; Mutare la PORTB

PORTA btfsc, 1; Verificaţi dacă este mai mică Sensor = 1

Delay1 de apel; apoi mergi la Delay subrutina

btfss PORTA, 0; Check Dacă superioare Sensor = 1

Refill goto; dacă nu Întoarceţi-vă la Partea de sus a subrutina

Return; Revenire la punctul anteriorDelay:

movlw 0x05; Counter Setare pentru a 05H

Count1 movwf

Return; Revenire la punctul anteriorDelay1:

decfsz Count1, 1; Decrement Count1 1

Du-te la Delay1; Dacă Count1> 0 Revenire la început

Return; Întoarceţi-vă la punctul anterior

EP_Write

movfw Count1v; citi valoarea curentă

BSF STATUS, RP0; Bank 1

EECON1 BSF, WREN; Activează scrie

EEDATA movwf; set de date EEPROM

movlw EEPROM_Addr

EEADR movwf; set EEPROM adresa de

movlw 0x55

EECON2 movwf; Scrie-55H

movlw 0xAA

EECON2 movwf; Scrie Aah

EECON1 BSF, WR; Set WR de biţi

; Începe să scrie

BCF STATUS, RP0; Banca 0PIR1 btfss, EEIF; aşteptaţi pentru a scrie pentru a finaliza.

Du-te la -1 dolari

PIR1 BCF, EEIF; şi clare "scrie pavilion complet"

BSF STATUS, RP0; Bank 1

EECON1 BCF, WREN; de acord A scrie

BCF STATUS, RP0; Banca 0

retlw 0x00

Întoarceţi -EP_READ

BSF STATUS, RP0; Bank 1

Movlw EEPROM_ADDR;

Movwf EEADR; Adresa pentru a citi

BSF EECON1, RD; EE Citeşte

MOVF EEDATA, W; W = EEDATA

BCF STATUS, RP0; Banca 0

RETURNARESFÂRŞIT

 

Welcome to EDABoard.com

Sponsor

Back
Top