Сравнение ячейки EEPROM.
Сравнение ячейки EEPROM.
Доброй ночи всем! Нужна помощь чайнику! Есть ячейка EEPROM 0x79 в которой периодически появляются вот такие данные 00, 01, 02, 03. Не знаю как написать кусок программы, чтоб в зависимости от этих вариантов, можно было уйти в разные метки.
Все надо делать с юмором! - сказал палач рубя голову дольками....
Re: Сравнение ячейки EEPROM.
А если язык дольками порубить, чтоб понятней стало? На какой мове ваяем?
Re: Сравнение ячейки EEPROM.
Векторный переход по типу
addwf PCL,f
или чего подобного (предобработка указателя адреса вектора), а по тому адресу сам вектор или короткая программа-исполнитель.
только не забывать, что по факту будет переход на PCLATH:PCL и по исполнении в PCH останется полное значение из PCLATH. Плюс еще нюанс - перенос из старшего разряда PCL не учитывается! Т.е. переход только в пределах текущей страницы.

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

Re: Сравнение ячейки EEPROM.
На ассемблере, забыл указать!
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
Вот пытался, хоть как то ...
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>
............
Это фрагмент, как Вы сами поняли...
Re: Сравнение ячейки EEPROM.
Не доходит до меня, в какое место вставить этот текст...(
Все надо делать с юмором! - сказал палач рубя голову дольками....
- КРАМ
- Друг Кота
- Сообщения: 25151
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Сравнение ячейки EEPROM.
Весь код
PS Исправил на косвенную адресацию, поелику не помню где расположен EEDATA
Код: Выделить всё
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.
Так а что мешает данные из той ячейки EEPROM в акумулятор (W) считать и затем прыгнуть?
В принципе и перебор вариантов с анализом на совпадение проходит - для начинающего он более безопасный.
Все зависит от требований к программе и ресурсов.

В принципе и перебор вариантов с анализом на совпадение проходит - для начинающего он более безопасный.
Все зависит от требований к программе и ресурсов.

- КРАМ
- Друг Кота
- Сообщения: 25151
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Сравнение ячейки EEPROM.
BOB51 писал(а):и затем прыгнуть?
С точки зрения кода выигрыша никакого не будет, потому что СНАЧАЛА нужно прочитать ТАБЛИЦУ переходов, а лишь затем "прыгнуть".
То, что ТС запутается - 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 раз.
Re: Сравнение ячейки EEPROM.
Блиин, да я и так запутался))) не хочет прыгать на метку...
Все надо делать с юмором! - сказал палач рубя голову дольками....
- КРАМ
- Друг Кота
- Сообщения: 25151
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Сравнение ячейки EEPROM.
Я поправил адресацию EEDATA в первом варианте.
Re: Сравнение ячейки EEPROM.
Это если таблица на нулевой странице. - Проще с исходным содержимым PCLATH.
А ежли сразу же за текущим значением счетчика? - там простая подстановка как константы.
Да и в любом случае или три (несколько) сравнений с предварительно записанным в буфер ОЗУ значением или непосредственными данными (у среднемладших нет команд неразрушающего контроля вида CPL/CPI)... Возможен и побитовый перебор - но там данные надо готовить в соответствующем виде
Другое дело было бы исходным условием не "каждому значению свой обработчик", а переход только по аварийному статусу при нескольких нормально завершенных - тогда всё значительно проще будет.
Топикстартеру вопросы для "конкретики выпутывания" :
- а что за ПИК используется? (для конкретного анализа структуры возможных решений) ;
- зачем пересылка через еепромку, когда достаточно ОЗУ? ;
- есть ли смысл в отдельной подпрограмме для каждого состояния или достаточно обработки статуса ошибки? ;
- обязательна ли структура контролируемого значения в виде числовых данных или возможно иное представление данных для анализа? .

А ежли сразу же за текущим значением счетчика? - там простая подстановка как константы.
Да и в любом случае или три (несколько) сравнений с предварительно записанным в буфер ОЗУ значением или непосредственными данными (у среднемладших нет команд неразрушающего контроля вида CPL/CPI)... Возможен и побитовый перебор - но там данные надо готовить в соответствующем виде
Другое дело было бы исходным условием не "каждому значению свой обработчик", а переход только по аварийному статусу при нескольких нормально завершенных - тогда всё значительно проще будет.
Топикстартеру вопросы для "конкретики выпутывания" :
- а что за ПИК используется? (для конкретного анализа структуры возможных решений) ;
- зачем пересылка через еепромку, когда достаточно ОЗУ? ;
- есть ли смысл в отдельной подпрограмме для каждого состояния или достаточно обработки статуса ошибки? ;
- обязательна ли структура контролируемого значения в виде числовых данных или возможно иное представление данных для анализа? .
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
Ну не хочет прыгать на метку, хотя в 0x79 биты записаны... Я точно должен был только метки проставить?
Все надо делать с юмором! - сказал палач рубя голову дольками....
- Albert_V
- Друг Кота
- Сообщения: 4119
- Зарегистрирован: Чт сен 12, 2013 00:54:12
- Откуда: ЗаМКАДье. Там, где ЦУП
Re: Сравнение ячейки EEPROM.
Ничего не забыли?
Есть процедура чтения EEPROM, которая указывается в каждой документации на контроллер в разделе "DATA EEPROM MEMORY".
К примеру, такая:

taime, С каким конкретно контроллером вы работаете?
Сравнение чисел, обычно, проще делать через XOR.
Каким образом через FSR вы хотите обратиться к EEPROM???
Берёте данные из EEDATA, загружаете в TEMP и работаете с TEMP-ом.
TEMP, естественно, в SRAM.
Есть процедура чтения EEPROM, которая указывается в каждой документации на контроллер в разделе "DATA EEPROM MEMORY".
К примеру, такая:
taime, С каким конкретно контроллером вы работаете?
Сравнение чисел, обычно, проще делать через XOR.
Каким образом через FSR вы хотите обратиться к EEPROM???
Берёте данные из EEDATA, загружаете в TEMP и работаете с TEMP-ом.
TEMP, естественно, в SRAM.
Re: Сравнение ячейки EEPROM.
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>?
Albert_V писал(а):Каким образом через FSR вы хотите обратиться к EEPROM???
На эту тему есть ограничения?
Разве EEDATA или EEADR не отображены на общее адресное пространство ОЗУ?
Использование FSR-INDF позволяет забыть о расположении используемых SFR в конкретном банке.
Что весьма удобно и устраняет множество ошибок.
А вот управление чтением я действительно пропустил - виноват, забыл...
Любезный ТС, вставьте пожалуйста фрагмент кода:
Код: Выделить всё
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.
taime
Весьма смелое решение внести свои правки в чужой исходник на ассемблере для начинающего
Только тут одной консультацией по подстановке не обойтись - весь исходник и собственно чего от измененного получить хотелось видеть надобно.
Ежли интерес имеется - скинь в личку "на посмотреть" - может чего путнего увидится..

Весьма смелое решение внести свои правки в чужой исходник на ассемблере для начинающего
Только тут одной консультацией по подстановке не обойтись - весь исходник и собственно чего от измененного получить хотелось видеть надобно.
Ежли интерес имеется - скинь в личку "на посмотреть" - может чего путнего увидится..
Re: Сравнение ячейки EEPROM.
Всем спасибо откликнувшимся в особенности КРАМ, теперь работает!!!!)
Все надо делать с юмором! - сказал палач рубя голову дольками....
- Albert_V
- Друг Кота
- Сообщения: 4119
- Зарегистрирован: Чт сен 12, 2013 00:54:12
- Откуда: ЗаМКАДье. Там, где ЦУП
Re: Сравнение ячейки EEPROM.
КРАМ писал(а):Вы видите разницу между:Код: Выделить всё
movlw 0x01
subwf <RAM>, F
btfsc STATUS, Z
goto <label 01>
иКод: Выделить всё
movlw 0x01
xorwf <RAM>, F
btfsc STATUS, Z
goto <label 01>
?![]()
Вижу. Команда XOR не "затирает" флаг C (влияет только на флаг Z). Очень часто это бывает нужно для оптимизации кода.
Что касается FSR, особенно когда он один, я им обычно пользуюсь для чтения блоков данных (к примеру, некий буфер или таблицы).
Лишний раз перегружать значение FSR не всегда бывает лучшим решением.

- КРАМ
- Друг Кота
- Сообщения: 25151
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Сравнение ячейки EEPROM.
Для ТС это не слишком актуально (xor-sub). Ему бы предложенное понять.
Что касается FSR, то когда он единственный, грузить его единственным указателем - сильно плохая идея...
Компиляторы так никогда не делают.
ОФФ. По поводу xor-sub.
Я с трудом себе представляю типичность решения, при котором флаг С "пролетает" над xor...
Вычитание в целом универсальнее.
Что касается FSR, то когда он единственный, грузить его единственным указателем - сильно плохая идея...
Компиляторы так никогда не делают.
ОФФ. По поводу xor-sub.
Я с трудом себе представляю типичность решения, при котором флаг С "пролетает" над xor...
Вычитание в целом универсальнее.