Доброй ночи всем! Нужна помощь чайнику! Есть ячейка EEPROM 0x79 в которой периодически появляются вот такие данные 00, 01, 02, 03. Не знаю как написать кусок программы, чтоб в зависимости от этих вариантов, можно было уйти в разные метки.
_________________ Все надо делать с юмором! - сказал палач рубя голову дольками....
Векторный переход по типу addwf PCL,f или чего подобного (предобработка указателя адреса вектора), а по тому адресу сам вектор или короткая программа-исполнитель. только не забывать, что по факту будет переход на PCLATH:PCL и по исполнении в PCH останется полное значение из PCLATH. Плюс еще нюанс - перенос из старшего разряда PCL не учитывается! Т.е. переход только в пределах текущей страницы.
Так а что мешает данные из той ячейки EEPROM в акумулятор (W) считать и затем прыгнуть? В принципе и перебор вариантов с анализом на совпадение проходит - для начинающего он более безопасный. Все зависит от требований к программе и ресурсов.
С точки зрения кода выигрыша никакого не будет, потому что СНАЧАЛА нужно прочитать ТАБЛИЦУ переходов, а лишь затем "прыгнуть". То, что ТС запутается - 100%. Но можно:
Это если таблица на нулевой странице. - Проще с исходным содержимым PCLATH. А ежли сразу же за текущим значением счетчика? - там простая подстановка как константы. Да и в любом случае или три (несколько) сравнений с предварительно записанным в буфер ОЗУ значением или непосредственными данными (у среднемладших нет команд неразрушающего контроля вида CPL/CPI)... Возможен и побитовый перебор - но там данные надо готовить в соответствующем виде Другое дело было бы исходным условием не "каждому значению свой обработчик", а переход только по аварийному статусу при нескольких нормально завершенных - тогда всё значительно проще будет. Топикстартеру вопросы для "конкретики выпутывания" : - а что за ПИК используется? (для конкретного анализа структуры возможных решений) ; - зачем пересылка через еепромку, когда достаточно ОЗУ? ; - есть ли смысл в отдельной подпрограмме для каждого состояния или достаточно обработки статуса ошибки? ; - обязательна ли структура контролируемого значения в виде числовых данных или возможно иное представление данных для анализа? .
Ничего не забыли? Есть процедура чтения 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.
Тут даже, можно сказать не знал! Работаю с PIC16F628, дело имею с ассемблером можно сказать второй раз, задача поправить один имеющийся чужой исходник и разобраться в нём ) так что сильно меня не ругайте...)
_________________ Все надо делать с юмором! - сказал палач рубя голову дольками....
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>
taime Весьма смелое решение внести свои правки в чужой исходник на ассемблере для начинающего Только тут одной консультацией по подстановке не обойтись - весь исходник и собственно чего от измененного получить хотелось видеть надобно. Ежли интерес имеется - скинь в личку "на посмотреть" - может чего путнего увидится..
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 не всегда бывает лучшим решением.
Для ТС это не слишком актуально (xor-sub). Ему бы предложенное понять. Что касается FSR, то когда он единственный, грузить его единственным указателем - сильно плохая идея... Компиляторы так никогда не делают. ОФФ. По поводу xor-sub. Я с трудом себе представляю типичность решения, при котором флаг С "пролетает" над xor... Вычитание в целом универсальнее.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения