Форум по разработке и ремонту электронной техники Киевский форум радиолюбителей и электронщиков. Форумы по разработке и ремонту электронной техники
    Схемы электрические принципиальныеГлавная    ФорумФорум    ПоискПоиск по форуму    Личные сообщенияФайлообменник    Личные сообщенияРадиотехнический каталог   

Фотогалерея   <b>Профиль</b>Ваш профиль    Личные сообщенияЛичные сообщения    ГруппыГруппы   

FAQFAQ    РегистрацияРегистрация    ВходВход

Уважаемые посетители! Это старая версия форума. Новая версия находится по адресу: http://www.remexpert.com
Добавление и вывод данных в EEPROM ( PIC16F84A)

 
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Форум по разработке и ремонту электронной техники -> Микроконтроллеры, процессоры, ПЛИС...
 
Автор Сообщение
alexander70
Новичок


Зарегистрирован: 11.10.2006
Сообщения: 1

СообщениеДобавлено: 11 Окт 2006, 13:23    Заголовок сообщения: Добавление и вывод данных в EEPROM ( PIC16F84A) Ответить с цитатой

Приветствую! Есть готовая программа (ниже) и схема счётчика (импульсов или
замыканий кнопки и т.д.) http://cdrecords.narod.ru/Count.pdf . При каждом нажатии
на кнопку SW5 счётчик уменьшается на 1, а при нажатии на SW3, счётчик
увеличивается на 1. Кнопками SW1, SW2, SW4, SW8 устанавливаются начальные показания
счётчика (удобно при работе счётчика в режиме уменьшения). При достижении
счётчиком нулевых значений, загорается светодиод. Предлагается добавить 2 кнопки на
свободные выводы, например на RB6 и RA4 . Первая кнопка записывает набранные
значения на индикаторе в память EEPROM , вторая кнопка выводит значения из памяти
на индикатор (чтобы каждый раз не набирать необходимые значения заново). А может
быть даже можно обойтись одной кнопкой подключённой к RB6. Короткое нажатие
записывает значение на индикаторе в память, а длительное нажатие выводит показания
из памяти на индикатор. Как лучше это сделать в программе?

С уважением, Александр

list p=16f84
include "P16F84A.inc"
__config _RC_OSC & _WDT_OFF & _PWRTE_ON
;Описание портов ввода/вывода (табл. 16)
;Вывод
ANODE equ PORTA
bFig1 equ 3 ;RA3 (выв. 2)
bFig2 equ 2 ;RA2 (выв. 1)
bFig3 equ 1 ;RA1 (выв. 18)
bFig4 equ 0 ;RA0 (выв. 17)
mANODE equ (1<<bFig1)|(1<<bFig2)|(1<<bFig3)|(1<<bFig4)
DCD equ PORTB
mDCD equ B'00001111' ;RB0-RB3 (выв. 6-9)
;Ввод
SENSORS equ PORTB
bKey equ 6 ;RB6 (выв. 12)
bSEN1 equ 5 ;RB5 (выв. 11)
bSEN2 equ 4 ;RB4 (выв. 10)
mSEN1 equ 1<<bSEN1
mSEN2 equ 1<<bSEN2
mSENS equ mSEN1+mSEN2

MaxInt equ (.31*4)-1
;Переменные (табл. 17)
cblock H'0C'
W_copy
STATUS_copy
FSR_copy
SensPos
FigPtr
Fig1
Fig2
Fig3
Fig4
FigSel
IntCtr ;счетчик прерываний
Alarm ;сигнал перехода 1->0
endc
;Возможные состояния датчиков
Pos0 equ 0
Pos1 equ mSEN1
Pos2 equ mSENS
Pos3 equ mSEN2
;Макроопределения
;Узел алгоритма (табл. 7)
NODE macro pp1,nn1,pp2,nn2,pp3,nn3
local NO
NO movfw SENSORS
andlw mSENS
movwf SensPos
xorlw pp1
BZ nn1
movfw SensPos
xorlw pp2
BZ nn2
movfw SensPos
xorlw pp3
BZ nn3
goto NO
endm
INCR macro Fig
local Lab
movfw Fig
addlw -9
BZ Lab
incf Fig,f
return
Lab clrf Fig
endm
DECR macro Fig
local Lab
movf Fig,f
BZ Lab
decf Fig,f
return
Lab movlw 9
movwf Fig
endm
SetLeft macro
movlw Fig1
movwf FigPtr
movlw B'00001000'
movwf FigSel
endm
;Начало исполняемого кода
org 0
goto START
org 4
;Обслуживание прерывания
;по переполнению таймера (табл. 19)
T0SERV movwf W_copy
movf STATUS,w
movwf STATUS_copy
movf FSR,w
movwf FSR_copy
;
decfsz IntCtr,f
goto Proceed
movlw MaxInt
movwf IntCtr
btfsc SENSORS,bKey
goto Proceed
btfsc FigSel, bFig2
call INCR1
btfsc FigSel, bFig3
call INCR2
btfsc FigSel, bFig4
call INCR3
btfsc FigSel, bFig1
call INCR4
Proceed
;
clrf ANODE
movfw FigPtr
movwf FSR
movfw INDF
; iorlw ~mDCD
iorwf Alarm,w
movwf DCD
movfw FigSel
movwf ANODE
incf FigPtr,f
bcf STATUS,C
rrf FigSel,f
btfss STATUS,C
goto ENDINT
SetLeft
ENDINT movf FSR_copy,w
movwf FSR
movf STATUS_copy,w
movwf STATUS
swapf W_copy,f
swapf W_copy,w
bcf INTCON,T0IF
retfie
;
INCR1 INCR Fig1
return
INCR2 INCR Fig2
return
INCR3 INCR Fig3
return
INCR4 INCR Fig4
return



;Инициализация (табл. 18)
START clrf ANODE
bsf STATUS,RP0
clrf TRISA
movlw B'01110000'
movwf TRISB
;movlw B'00000010'
;movwf OPTION_REG
bcf OPTION_REG,NOT_RBPU
bcf OPTION_REG,T0CS
bcf STATUS,RP0
SetLeft
clrf Fig1
clrf Fig2
clrf Fig3
clrf Fig4
movlw MaxInt
movwf IntCtr
clrf Alarm
bsf INTCON,T0IE
bsf INTCON,GIE


;Основной цикл (табл. 10)
;-----------------------------------------
;picmaniac's code
WP1 btfss PORTB,bSEN1 ;Проверим вход увеличения (активный - высокий)
goto WM1 ;Лог.0 - переход на проверку другого входа
call Pause ;Пауза от дребезга
btfss PORTB,bSEN1 ;Повторная проверка
goto WM1 ;Дребезг - переход
;-----------------------------------------

;ND0 NODE Pos1,ND1,Pos3,ND4,Pos2,ND0
;ND1 NODE Pos2,ND2,Pos0,ND0,Pos3,ND0
;ND2 NODE Pos3,ND3,Pos1,ND1,Pos0,ND0
;ND3 NODE Pos0,ND3A,Pos2,ND2,Pos1,ND0


ND3A bcf INTCON,GIE
call ADD1
bsf INTCON,GIE
clrf Alarm

;-----------------------------------------
;picmaniac's code
WP2 btfsc PORTB,bSEN1 ;Ждем, пока пройдет сигнал по входу увеличения
goto WP2 ;
call Pause ;Пауза от дребезга
btfsc PORTB,bSEN1 ;
goto WP2 ;


WM1 btfss PORTB,bSEN2 ;Проверим вход уменьшения (активный - высокий)
goto WP1 ;Лог.0 - переход на проверку другого входа
call Pause ;Пауза от дребезга
btfss PORTB,bSEN2 ;Повторная проверка
goto WP1 ;Дребезг - переход
;-----------------------------------------

;ND4 NODE Pos2,ND5,Pos0,ND0,Pos1,ND0
;ND5 NODE Pos1,ND6,Pos3,ND4,Pos0,ND0
;ND6 NODE Pos0,ND6S,Pos2,ND5,Pos3,ND0


ND6S bcf INTCON,GIE
call SUBT1
bsf INTCON,GIE
;
clrf Alarm
movf Fig1,w
addwf Fig2,w
addwf Fig3,w
addwf Fig4,w
btfsc STATUS,Z
bsf Alarm,7

;-----------------------------------------
;picmaniac's code
WM2 btfsc PORTB,bSEN2 ;Ждем, пока пройдет сигнал по входу уменьшения
goto WM2 ;
call Pause ;Пауза от дребезга
btfsc PORTB,bSEN2 ;
goto WM2 ;

goto WP1
;-----------------------------------------

;Подпрограммы (табл. 13)
ADD1 INCR Fig4
INCR Fig3
INCR Fig2
INCR Fig1
return
SUBT1 DECR Fig4
DECR Fig3
DECR Fig2
DECR Fig1
return
;-----------------------------------------
;picmaniac's code
Pause movlw 0
P_label addlw 1
nop
btfss STATUS,Z
goto P_label
return
;-----------------------------------------
end


:020000040000FA
:02000000502886
:080008008C0003088D000408C0
:100010008E00960B17287B309600061B17281519A3
:100020003020951838201518402095194820850152
:100030001008840000081704860015088500900A3F
:100040000310950C031C28281130900008309500EF
:100050000E0884000D0883008C0E0C0E0B11090095
:100060001108F73E03193628910A0800910108008B
:100070001208F73E03193E28920A08009201080070
:100080001308F73E03194628930A08009301080055
:100090001408F73E03194E28940A0800940108003A
:1000A00085018316850170308600811381128312C9
:1000B0001130900008309500910192019301940154
:1000C0007B30960097018B168B17861E7328C220F3
:1000D000861E73288B1388208B179701861A6E282B
:1000E000C220861A6E28061E6528C220061E6528B4
:1000F0008B13A5208B1797011108120713071407FC
:1001000003199717061A8228C220061A8228652822
:100110001408F73E03198E28940A08009401130866
:10012000F73E03199528930A080093011208F73E39
:1001300003199C28920A080092011108F73E03193E
:10014000A328910A08009101080094080319AA281D
:10015000940308000930940093080319B12893030D
:1001600008000930930092080319B8289203080088
:100170000930920091080319BF2891030800093043
:10018000910008000030013E0000031DC328080054
:02400E00F33F7E
:00000001FF
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
urry
Живет здесь... (>100)
Живет здесь... (>100)


Зарегистрирован: 23.10.2006
Сообщения: 243

СообщениеДобавлено: 16 Ноя 2006, 9:04    Заголовок сообщения: как записать в епром пика Ответить с цитатой

никак не нужно записывать. забыть, что оно там вообще есть. при каждом глюке питания содержимое епром где - то портится. нужно ставить внешнюю флешку. как-то у меня был проект с въедливым клиентом и была необходимость запоминать режим работы устройства - я запомнил в епром и.. Слезы Клиент не пожалел своего времени, чтобы проявился глюк. Кажется, он водил через дроссель по напильнику отверткой, чтобы сымитировать помехи. Радостный В конце концов, я продублировал инфу в 3 местах и закрыл контрольной суммой. Хотя - если для внутреннего потребления.. - может, и пойдет.. Имхо.
------------------------------------------------------------------------
Доступ к ней осуществляется через два регистра: EEDATA <08h>, который содержит в себе восьмибитовые данные для чтения/записи и EEADR <09h>, который содержит в себе адрес ячейки к которой идет обращение. Дополнительно имеется два управляющих регистра: EECON1 <88h> и EECON2<89h>.

При считывании данных из памяти EEPROM необходимо записать требуемый адрес в EEADR регистр и затем установить бит RD EECON1<0> в единицу. Данные появятся в следующем командном цикле в регистре EEDATA и могут быть прочитаны. Данные в регистре EEDATA защелкиваются. Пример фрагмента программы считывания данных из памяти данных-констант EEPROM приведена ниже:

; Считывание из памяти данных-констант.

Bcf STATUS , RP0 ; Установка банка 0.

Movlw CONFIG_ADDR ;

Movwf EEADR ; Адрес чтения.

Bsf STATUS , RP0 ; Установка банка 1.

Bsf EECON1 , RD ; Чтение EEPROM.

Bcf STATUS , RP0 ; Установка банка 0.

Movf EEDATA , W ; Считанные данные W.

При записи в память EEPROM, необходимо сначала записать требуемый адрес в EEADR регистр и данные в EEDATA регистр. Затем выполнить специальную обязательную последовательность команд, производящую непосредственную запись:

Movlw 55h ;

Movwf EECON2 ; Запись 55 h.

Movlw AAh ;

Movwf EECON2 ; Запись AA h.

Bsf EECON1 , WR ; Установка бита WR,

; начало цикла записи.

Во время выполнения этого участка программы, все прерывания должны быть запрещены для точного выполнения временной диаграммы. Время записи - примерно 10мс. Фактическое время записи будет изменяться в зависимости от напряжения, температуры и индивидуальных свойств кристалла. В конце записи бит WR автоматически обнуляется, а флаг завершения записи EEIF, он же запрос на прерывание, устанавливается. Пример фрагмента программы записи в память данных-констант EEPROM приведена ниже:

; Запись в память данных-констант.

Bsf Status , RP0 ; Установка банка 1.

Bcf Intcon , GIE ; Запрет прерываний.

; Обязательая последовательность команд.

Movlw 55h ;

Movwf EECON2 ; Запись 55 h.

Movlw Aah ;

Movwf EECON2 ; Запись AA h.

Bsf EECON1, WR ; Установка бита WR,

; начало цикла записи.

;Bsf Intcon , GIE ; Разрешение прерываний.

Для предотвращения случайных записей в память данных предусмотрен специальный бит WREN в регистре EECON1. Рекомендуется держать бит WREN выключенным, кроме тех случаев, когда нужно обновить память данных. Более того, кодовые сегменты, которые устанавливают бит WREN и те, которые выполняют запись должны храниться на различных адресах, чтобы избежать случайного выполнения их обоих при сбое программы.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Форум по разработке и ремонту электронной техники -> Микроконтроллеры, процессоры, ПЛИС... Часовой пояс: GMT + 2
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете добавлять вложения в этом форуме
Вы можете просматривать вложения в этом форуме


Rambler's Top100 PageRank Яндекс цитирования
Сайты наших друзей: Гири, все о гирях, Автоматизация магазинов, супермаркетов, ресторанов, кинотеатров,
Весы электронные, Сканеры штрих-кода, Принтеры штрих-кода

Powered by phpBB © 2001, 2005 phpBB Group

Время генерации страницы: 0.5362s (PHP: 92% - SQL: 8%) - SQL запросов: 11 - GZIP enabled - Debug on