Страница 1 из 2

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

Добавлено: Пт июн 26, 2015 23:10:32
taime
Доброй ночи всем! Нужна помощь чайнику! Есть ячейка EEPROM 0x79 в которой периодически появляются вот такие данные 00, 01, 02, 03. Не знаю как написать кусок программы, чтоб в зависимости от этих вариантов, можно было уйти в разные метки.

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

Добавлено: Сб июн 27, 2015 05:12:05
koms48
А если язык дольками порубить, чтоб понятней стало? На какой мове ваяем?

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

Добавлено: Сб июн 27, 2015 05:22:23
BOB51
Векторный переход по типу
addwf PCL,f
или чего подобного (предобработка указателя адреса вектора), а по тому адресу сам вектор или короткая программа-исполнитель.
только не забывать, что по факту будет переход на PCLATH:PCL и по исполнении в PCH останется полное значение из PCLATH. Плюс еще нюанс - перенос из старшего разряда PCL не учитывается! Т.е. переход только в пределах текущей страницы.
:beer:

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

Добавлено: Сб июн 27, 2015 05:38:55
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

Вот пытался, хоть как то ...

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

Добавлено: Сб июн 27, 2015 05:51:46
КРАМ
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>
............

Это фрагмент, как Вы сами поняли...

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

Добавлено: Сб июн 27, 2015 06:09:21
taime
Не доходит до меня, в какое место вставить этот текст...(

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

Добавлено: Сб июн 27, 2015 06:14:19
КРАМ
Весь код

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

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

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

Добавлено: Сб июн 27, 2015 06:52:42
BOB51
Так а что мешает данные из той ячейки EEPROM в акумулятор (W) считать и затем прыгнуть? 8)
В принципе и перебор вариантов с анализом на совпадение проходит - для начинающего он более безопасный.
Все зависит от требований к программе и ресурсов.
:beer:

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

Добавлено: Сб июн 27, 2015 07:30:47
КРАМ
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>

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

Добавлено: Сб июн 27, 2015 07:36:08
taime
Блиин, да я и так запутался))) не хочет прыгать на метку...

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

Добавлено: Сб июн 27, 2015 07:40:28
КРАМ
Я поправил адресацию EEDATA в первом варианте.

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

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

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

Добавлено: Сб июн 27, 2015 22:25:48
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 биты записаны... Я точно должен был только метки проставить?

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

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

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

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

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

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


Тут даже, можно сказать не знал! Работаю с PIC16F628, дело имею с ассемблером можно сказать второй раз, задача поправить один имеющийся чужой исходник и разобраться в нём ) так что сильно меня не ругайте...)

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

Добавлено: Вс июн 28, 2015 05:59:15
КРАМ
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>

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

Добавлено: Вс июн 28, 2015 12:32:14
BOB51
taime
Весьма смелое решение внести свои правки в чужой исходник на ассемблере для начинающего :beer:
Только тут одной консультацией по подстановке не обойтись - весь исходник и собственно чего от измененного получить хотелось видеть надобно.
Ежли интерес имеется - скинь в личку "на посмотреть" - может чего путнего увидится..
:roll:

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

Добавлено: Вс июн 28, 2015 18:49:05
taime
Всем спасибо откликнувшимся в особенности КРАМ, теперь работает!!!!)

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

Добавлено: Вс июн 28, 2015 21:40:07
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:

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

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