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

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

Сообщение taime »

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

Сообщение koms48 »

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

Сообщение BOB51 »

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

Сообщение 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

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

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

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>
............
Это фрагмент, как Вы сами поняли...
Реклама
Открыл глаза
Сообщения: 70
Зарегистрирован: Пн сен 22, 2008 14:19:27
Откуда: Челябинск

Сообщение taime »

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

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

Весь код

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

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
Друг Кота
Аватара пользователя
Сообщения: 15615
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

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

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

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 раз.
Открыл глаза
Сообщения: 70
Зарегистрирован: Пн сен 22, 2008 14:19:27
Откуда: Челябинск

Сообщение taime »

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

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

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

Сообщение BOB51 »

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

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

Сообщение Albert_V »

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

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

Сообщение taime »

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

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

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

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>
Друг Кота
Аватара пользователя
Сообщения: 15615
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

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

Сообщение taime »

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

Сообщение 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:
Друг Кота
Аватара пользователя
Сообщения: 25447
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

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

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

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