Сравнение ячейки EEPROM.

Поклонники продукции Microchip Technology Inc тусуются тут.
taime
Открыл глаза
Сообщения: 70
Зарегистрирован: Пн сен 22, 2008 14:19:27
Откуда: Челябинск

Сравнение ячейки EEPROM.

Сообщение taime »

Доброй ночи всем! Нужна помощь чайнику! Есть ячейка EEPROM 0x79 в которой периодически появляются вот такие данные 00, 01, 02, 03. Не знаю как написать кусок программы, чтоб в зависимости от этих вариантов, можно было уйти в разные метки.
Все надо делать с юмором! - сказал палач рубя голову дольками....
koms48
Встал на лапы
Сообщения: 132
Зарегистрирован: Пт окт 19, 2012 05:54:55

Re: Сравнение ячейки EEPROM.

Сообщение koms48 »

А если язык дольками порубить, чтоб понятней стало? На какой мове ваяем?
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15549
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Сравнение ячейки EEPROM.

Сообщение BOB51 »

Векторный переход по типу
addwf PCL,f
или чего подобного (предобработка указателя адреса вектора), а по тому адресу сам вектор или короткая программа-исполнитель.
только не забывать, что по факту будет переход на PCLATH:PCL и по исполнении в PCH останется полное значение из PCLATH. Плюс еще нюанс - перенос из старшего разряда PCL не учитывается! Т.е. переход только в пределах текущей страницы.
:beer:
taime
Открыл глаза
Сообщения: 70
Зарегистрирован: Пн сен 22, 2008 14:19:27
Откуда: Челябинск

Re: Сравнение ячейки EEPROM.

Сообщение taime »

На ассемблере, забыл указать!

BCF STATUS,RP0
MOVF 0x79
MOVWF EEADR
BSF STATUS,RP0
BSF EECON1,0
BCF STATUS,RP0
movF EEDATA
BTFSC EEDATA,0
GOTO PROV
BTFSC EEDATA,1
GOTO GUARD0
BTFSC EEDATA,0
GOTO LIGNT0
BTFSC EEDATA,0
GOTO ALARM

Вот пытался, хоть как то ...
Все надо делать с юмором! - сказал палач рубя голову дольками....
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25151
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Сравнение ячейки EEPROM.

Сообщение КРАМ »

BOB51 писал(а):Векторный переход по типу
addwf PCL,f

Речь не шла о чтении из программного флеша.
Речь шла о EEPROM данных.
taime писал(а):Вот пытался, хоть как то ...

Проверка бита здесь не слишком удобна.
И к тому же у Вас с ошибками.

Код: Выделить всё

.......
movlw     0x01
subwf     EEDATA, w
btfsc       STATUS, Z
goto        <метка 01>
movlw     0x02
subwf     EEDATA, w
btfsc       STATUS, Z
goto        <метка 02>
............

Это фрагмент, как Вы сами поняли...
taime
Открыл глаза
Сообщения: 70
Зарегистрирован: Пн сен 22, 2008 14:19:27
Откуда: Челябинск

Re: Сравнение ячейки EEPROM.

Сообщение taime »

Не доходит до меня, в какое место вставить этот текст...(
Все надо делать с юмором! - сказал палач рубя голову дольками....
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25151
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Сравнение ячейки EEPROM.

Сообщение КРАМ »

Весь код

Код: Выделить всё

movlw     EEADR
movwf     FSR
movlw     0x79
movwf     INDF
movlw     EEDATA
movwf     FSR
movlw     0x00
subwf     INDF, w
btfsc       STATUS, Z
goto        <метка 00>
movlw     0x01
subwf     INDF, w
btfsc       STATUS, Z
goto        <метка 01>
movlw     0x02
subwf     INDF, w
btfsc       STATUS, Z
goto        <метка 02>
movlw     0x03
subwf     INDF, w
btfsc       STATUS, Z
goto        <метка 03>

PS Исправил на косвенную адресацию, поелику не помню где расположен EEDATA
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15549
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Сравнение ячейки EEPROM.

Сообщение BOB51 »

Так а что мешает данные из той ячейки EEPROM в акумулятор (W) считать и затем прыгнуть? 8)
В принципе и перебор вариантов с анализом на совпадение проходит - для начинающего он более безопасный.
Все зависит от требований к программе и ресурсов.
:beer:
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25151
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Сравнение ячейки EEPROM.

Сообщение КРАМ »

BOB51 писал(а):и затем прыгнуть? 8)

С точки зрения кода выигрыша никакого не будет, потому что СНАЧАЛА нужно прочитать ТАБЛИЦУ переходов, а лишь затем "прыгнуть".
То, что ТС запутается - 100%.
Но можно:

Код: Выделить всё

; для первой страницы кода
movlw   EEADDR
movwf   FSR
movlw   0x79
movwf   INDF
movlw  EECON1
movwf  FSR
bsf       INDF, RD
movlw   EEDATA
movwf   FSR
movf    INDF, w
clrf    PCLATH
call    tabFoo
movwf   PCL
...........
tabFoo:
addwf   PCL, f
retlw   <метка 00>
retlw   <метка 01>
retlw   <метка 02>
retlw   <метка 03>
Последний раз редактировалось КРАМ Вс июн 28, 2015 06:14:53, всего редактировалось 5 раз.
taime
Открыл глаза
Сообщения: 70
Зарегистрирован: Пн сен 22, 2008 14:19:27
Откуда: Челябинск

Re: Сравнение ячейки EEPROM.

Сообщение taime »

Блиин, да я и так запутался))) не хочет прыгать на метку...
Все надо делать с юмором! - сказал палач рубя голову дольками....
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25151
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Сравнение ячейки EEPROM.

Сообщение КРАМ »

Я поправил адресацию EEDATA в первом варианте.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15549
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Сравнение ячейки EEPROM.

Сообщение BOB51 »

Это если таблица на нулевой странице. - Проще с исходным содержимым PCLATH.
А ежли сразу же за текущим значением счетчика? - там простая подстановка как константы.
Да и в любом случае или три (несколько) сравнений с предварительно записанным в буфер ОЗУ значением или непосредственными данными (у среднемладших нет команд неразрушающего контроля вида CPL/CPI)... Возможен и побитовый перебор - но там данные надо готовить в соответствующем виде
Другое дело было бы исходным условием не "каждому значению свой обработчик", а переход только по аварийному статусу при нескольких нормально завершенных - тогда всё значительно проще будет.
:roll:
Топикстартеру вопросы для "конкретики выпутывания" :
- а что за ПИК используется? (для конкретного анализа структуры возможных решений) ;
- зачем пересылка через еепромку, когда достаточно ОЗУ? ;
- есть ли смысл в отдельной подпрограмме для каждого состояния или достаточно обработки статуса ошибки? ;
- обязательна ли структура контролируемого значения в виде числовых данных или возможно иное представление данных для анализа? .
8)
taime
Открыл глаза
Сообщения: 70
Зарегистрирован: Пн сен 22, 2008 14:19:27
Откуда: Челябинск

Re: Сравнение ячейки EEPROM.

Сообщение taime »

КРАМ писал(а):Весь код

Код: Выделить всё

movlw     EEADR
movwf     FSR
movlw     0x79
movwf     INDF
movlw     EEDATA
movwf     FSR
movlw     0x00
subwf     INDF, w
btfsc       STATUS, Z
goto        <метка 00>
movlw     0x01
subwf     INDF, w
btfsc       STATUS, Z
goto        <метка 01>
movlw     0x02
subwf     INDF, w
btfsc       STATUS, Z
goto        <метка 02>
movlw     0x03
subwf     INDF, w
btfsc       STATUS, Z
goto        <метка 03>

PS Исправил на косвенную адресацию, поелику не помню где расположен EEDATA


Ну не хочет прыгать на метку, хотя в 0x79 биты записаны... Я точно должен был только метки проставить?
Все надо делать с юмором! - сказал палач рубя голову дольками....
Аватара пользователя
Albert_V
Друг Кота
Сообщения: 4119
Зарегистрирован: Чт сен 12, 2013 00:54:12
Откуда: ЗаМКАДье. Там, где ЦУП

Re: Сравнение ячейки EEPROM.

Сообщение Albert_V »

Ничего не забыли?
Есть процедура чтения EEPROM, которая указывается в каждой документации на контроллер в разделе "DATA EEPROM MEMORY".
К примеру, такая:
Изображение

taime, С каким конкретно контроллером вы работаете?
Сравнение чисел, обычно, проще делать через XOR.
Каким образом через FSR вы хотите обратиться к EEPROM???
Берёте данные из EEDATA, загружаете в TEMP и работаете с TEMP-ом.
TEMP, естественно, в SRAM.
taime
Открыл глаза
Сообщения: 70
Зарегистрирован: Пн сен 22, 2008 14:19:27
Откуда: Челябинск

Re: Сравнение ячейки EEPROM.

Сообщение taime »

Albert_V писал(а):Ничего не забыли?
Есть процедура чтения EEPROM, которая указывается в каждой документации на контроллер в разделе "DATA EEPROM MEMORY".
К примеру, такая:
Изображение

taime, С каким конкретно контроллером вы работаете?
Сравнение чисел, обычно, проще делать через XOR.
Каким образом через FSR вы хотите обратиться к EEPROM???
Берёте данные из EEDATA, загружаете в TEMP и работаете с TEMP-ом.
TEMP, естественно, в SRAM.


Тут даже, можно сказать не знал! Работаю с PIC16F628, дело имею с ассемблером можно сказать второй раз, задача поправить один имеющийся чужой исходник и разобраться в нём ) так что сильно меня не ругайте...)
Все надо делать с юмором! - сказал палач рубя голову дольками....
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25151
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Сравнение ячейки EEPROM.

Сообщение КРАМ »

Albert_V писал(а):Сравнение чисел, обычно, проще делать через XOR.

Чем проще?
:)
Вы видите разницу между:

Код: Выделить всё

movlw 0x01
subwf  <RAM>, F
btfsc    STATUS, Z
goto     <label 01>

и

Код: Выделить всё

movlw 0x01
xorwf  <RAM>, F
btfsc    STATUS, Z
goto     <label 01>

? :tea:

Albert_V писал(а):Каким образом через FSR вы хотите обратиться к EEPROM???

На эту тему есть ограничения?
Разве EEDATA или EEADR не отображены на общее адресное пространство ОЗУ?
:)
Использование FSR-INDF позволяет забыть о расположении используемых SFR в конкретном банке.
Что весьма удобно и устраняет множество ошибок.
А вот управление чтением я действительно пропустил - виноват, забыл... :oops:

Любезный ТС, вставьте пожалуйста фрагмент кода:

Код: Выделить всё

movlw  EECON1
movwf  FSR
bsf       INDF, RD

перед

Код: Выделить всё

movlw     EEDATA
movwf     FSR

Получится:

Код: Выделить всё

; пишем адрес в EEPROM
movlw     EEADR
movwf     FSR
movlw     0x79
movwf     INDF
; даем команду чтения
movlw     EECON1
movwf     FSR
bsf       INDF, RD
; ставим указатель на EEDATA
movlw     EEDATA
movwf     FSR
; сравнение и переход по 0
movlw     0x00
subwf     INDF, w
btfsc       STATUS, Z
goto        <метка 00>
; сравнение и переход по 1
movlw     0x01
subwf     INDF, w
btfsc       STATUS, Z
goto        <метка 01>
; сравнение и переход по 2
movlw     0x02
subwf     INDF, w
btfsc       STATUS, Z
goto        <метка 02>
; сравнение и переход по 3
movlw     0x03
subwf     INDF, w
btfsc       STATUS, Z
goto        <метка 03>
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15549
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Сравнение ячейки EEPROM.

Сообщение BOB51 »

taime
Весьма смелое решение внести свои правки в чужой исходник на ассемблере для начинающего :beer:
Только тут одной консультацией по подстановке не обойтись - весь исходник и собственно чего от измененного получить хотелось видеть надобно.
Ежли интерес имеется - скинь в личку "на посмотреть" - может чего путнего увидится..
:roll:
taime
Открыл глаза
Сообщения: 70
Зарегистрирован: Пн сен 22, 2008 14:19:27
Откуда: Челябинск

Re: Сравнение ячейки EEPROM.

Сообщение taime »

Всем спасибо откликнувшимся в особенности КРАМ, теперь работает!!!!)
Все надо делать с юмором! - сказал палач рубя голову дольками....
Аватара пользователя
Albert_V
Друг Кота
Сообщения: 4119
Зарегистрирован: Чт сен 12, 2013 00:54:12
Откуда: ЗаМКАДье. Там, где ЦУП

Re: Сравнение ячейки EEPROM.

Сообщение Albert_V »

КРАМ писал(а):Вы видите разницу между:

Код: Выделить всё

movlw 0x01
subwf  <RAM>, F
btfsc    STATUS, Z
goto     <label 01>

и

Код: Выделить всё

movlw 0x01
xorwf  <RAM>, F
btfsc    STATUS, Z
goto     <label 01>

? :tea:

Вижу. Команда XOR не "затирает" флаг C (влияет только на флаг Z). Очень часто это бывает нужно для оптимизации кода.
Что касается FSR, особенно когда он один, я им обычно пользуюсь для чтения блоков данных (к примеру, некий буфер или таблицы).
Лишний раз перегружать значение FSR не всегда бывает лучшим решением.
:beer:
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25151
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Сравнение ячейки EEPROM.

Сообщение КРАМ »

Для ТС это не слишком актуально (xor-sub). Ему бы предложенное понять.
Что касается FSR, то когда он единственный, грузить его единственным указателем - сильно плохая идея...
Компиляторы так никогда не делают.
ОФФ. По поводу xor-sub.
Я с трудом себе представляю типичность решения, при котором флаг С "пролетает" над xor...
Вычитание в целом универсальнее.
Ответить

Вернуться в «PIC»