Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Продукция MICROCHIP

Продукция MICROCHIP Технические вопросы по всей продукции Microchip

Ответ
 
Опции темы Опции просмотра
Старый 16.09.2017, 01:03   #1
NifelHELL
Junior Member
 
Регистрация: 08.04.2010
Сообщений: 23
Вес репутации: 100/29
NifelHELL will become famous soon enoughNifelHELL will become famous soon enough
По умолчанию Последовательный перебор битов байта PIC16 ASM

Столкнулся с интересной проблемой PIC16F887 вот пример кода
Код:
	MOVLW	0x08
		MOVWF	R_TMP
	CLRF	CUCLE_TMP
	START_CUCLE:
		BSF		PORTD,CUCLE_TMP
		CALL	DELAY_05s
		BCF		PORTD,CUCLE_TMP
		CALL	DELAY_05s
	END_CUCLE:
	INCF	CUCLE_TMP,F
	DECFSZ	R_TMP,F
		GOTO	START_CUCLE
суть проблемы в том что переменная CUCLE_TMP увеличивается но вот биты не переключаются, постоянно горит первый бит, каким способом перебирать биты.

Суть полного кода в том что в зависимости от бита, в УАРТ кидать свою строку.

Код:
	MOVLW	0x08
		MOVWF	R_TMP
	CLRF	CUCLE_TMP
	START_CUCLE:
		BTFSS	T_IN_TMP,CUCLE_TMP
			GOTO	END_CUCLE
		BTFSC	T_IN_DEBOUNCE,CUCLE_TMP
				GOTO	END_CUCLE
			BCF T_IN_TMP, CUCLE_TMP
			BSF T_IN_DEBOUNCE,CUCLE_TMP
			MOVLW high TEXT_TABLE
			MOVWF PCLATH
			MOVF CUCLE_TMP,W
			CALL TEXT_TABLE
			MOVWF C_TMP
			MOLW high T_STRINGS
			MOVWF PCLATH
			MOVF C_TMP,W
			CALL SEND_UART

	END_CUCLE:
	INCF	CUCLE_TMP,F
	DECFSZ	R_TMP,F
		GOTO	START_CUCLE
;some code

ORG 0xE00
TEXT_TABLE:
ADDWF PCL
RETLW low (STR1-1)
RETLW low (STR2-1)
;......
RETLW low (STR8-1)
;больше 8 сюда не прилетит

ORG 0xF00
T_STRINGS:
ADDWF PCL
STR1  dt  "STRING 1"
STR2  dt  "STRING 2"
STR3  dt  "STRING 3"
STR4  dt  "STRING 4"
;и прочие стоки
В итоге работы всего этого кода, в УАРТ прилетает всякая ерунда, но тока не заданные строки. Если ручками просто расписать 8 проверок, то всё работает на ура. Есть подозрение что накосячил с вызовом TEXT_TABLE. Точнее вызов правильный, а вот RETLW по видимому не правильно выполнил.
Но в первую очередь, BTFSS T_IN_TMP,CUCLE_TMP выполняет постоянно проверку тока 0 бита, не зависимо от значения переменной CUCLE_TMP. Если переменной CUCLE_TMP начальное значение присвоить 8, то становиться ещё интереснее, проверяется 4 бит.

Переменная T_IN_DEBOUNCE байт побитово отвечающий за игнорирование сигнала с порта пока идет отсчёт таймера. Проверка пока сделана ручками, проще говоря 8 раз проверенны биты. Этот кусок тоже надо будет переписать.

Переменная T_IN_TMP это результат состояния портаБ
Код:
		MOVF	T_INPUT,W
			COMF	T_INPUT,W
		IORWF	T_IN_TMP,F
		BCF	INTCON,RBIF
Если какой бит и не успели обработать то команда IORWF T_IN_TMP,F должна его сохранить.

И финальный затык
как получить прерывания от всех линий портаБ. Открыл Даташит на PIC16F887 там указанно
переключить режим входов с аналогового на цифровой, установкой соответствующих битов регистра ANSELH в 0, записал в регистр 0х00
прерывание по изменению состояния пина портаБ, установить соответствующие биты регистра IOCB, записал в регистр 0xFF
внутренние подтягивающие резисторы, установка индивидуальных подтягивающих резисторов WPUB, записал 0xFF (длинна проводов на входе от 5 до 40м, поэтому перед входами стоят по 10к подтягивающие резисторы на +5В)и установил бит NOT_RBPU в регистре OPTION
И установил биты
Код:
	BSF		INTCON,RBIE
	BSF		INTCON,T0IE		;enables TMR0 interrupt
	BSF		INTCON,PEIE		;Enaple Peripheral interrupt
	BSF		INTCON,GIE
Прерывание происходит только при изменение портБ,0 или же его ещё зовут INT0

Даташит DS41291D, 2007 года на английском, может что-то там напутано?
NifelHELL вне форума   Ответить с цитированием
Старый 16.09.2017, 05:36   #2
Марк
Senior Member
 
Аватар для Марк
 
Регистрация: 18.08.2007
Адрес: M.O.
Возраст: 58
Сообщений: 2,093
Вес репутации: 2636/84
Марк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond repute
По умолчанию Re: Последовательный перебор битов байта PIC16 ASM

Цитата:
Сообщение от NifelHELL Посмотреть сообщение
Столкнулся с интересной проблемой PIC16F887 вот пример кода
Код:
	MOVLW	0x08
		MOVWF	R_TMP
	CLRF	CUCLE_TMP
	START_CUCLE:
		BSF		PORTD,CUCLE_TMP
		CALL	DELAY_05s
		BCF		PORTD,CUCLE_TMP
		CALL	DELAY_05s
	END_CUCLE:
	INCF	CUCLE_TMP,F
	DECFSZ	R_TMP,F
		GOTO	START_CUCLE
суть проблемы в том что переменная CUCLE_TMP увеличивается но вот биты не переключаются
Команда bcf/bsf (как и все битовые команды) содержат номер бита КАК КОНСТАНТУ.
Мало того, лишь одна команда в 8-разрядных ПИКах (да и та в 18-х) может оперировать сразу с двумя адресами в ОЗУ. Это команда movff. Причем она выполняется в ДВА машинных цикла, поскольку совершенно невозможно за один цикл получить доступ к ОЗУ по единственной шине.
Такшта писать две переменные в одной команде ну никак не катит, даже не зная спецификации команды.
Марк вне форума   Ответить с цитированием
Старый 16.09.2017, 05:46   #3
Марк
Senior Member
 
Аватар для Марк
 
Регистрация: 18.08.2007
Адрес: M.O.
Возраст: 58
Сообщений: 2,093
Вес репутации: 2636/84
Марк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond repute
По умолчанию Re: Последовательный перебор битов байта PIC16 ASM

Цитата:
Сообщение от NifelHELL Посмотреть сообщение
И финальный затык
как получить прерывания от всех линий портаБ. Открыл Даташит на PIC16F887 там указанно
переключить режим входов с аналогового на цифровой, установкой соответствующих битов регистра ANSELH в 0, записал в регистр 0х00
прерывание по изменению состояния пина портаБ, установить соответствующие биты регистра IOCB, записал в регистр 0xFF
внутренние подтягивающие резисторы, установка индивидуальных подтягивающих резисторов WPUB, записал 0xFF (длинна проводов на входе от 5 до 40м, поэтому перед входами стоят по 10к подтягивающие резисторы на +5В)и установил бит NOT_RBPU в регистре OPTION
И установил биты
Код:
	BSF		INTCON,RBIE
	BSF		INTCON,T0IE		;enables TMR0 interrupt
	BSF		INTCON,PEIE		;Enaple Peripheral interrupt
	BSF		INTCON,GIE
Прерывание происходит только при изменение портБ,0 или же его ещё зовут INT0

Даташит DS41291D, 2007 года на английском, может что-то там напутано?
С даташитом все нормально.
1. Прерывания по изменению порта никакого отношения к INT0 не имеют.
2. Это правильное разрешение этих прерываний:
Код:
	BSF		INTCON,RBIE
Эта строка лишняя, хотя и не мешает.
Код:
	BSF		INTCON,PEIE
Бит PEIE управляет групповым разрешением всех прерываний сидящих в регистре PIE1 и с флагами в PIR1. Вы не показали таких в своем коде.
Работа с прерыванием по изменению состояния требует ДО гашения флага в обработчике ПРОЧЕСТЬ ПОРТ. Иначе условие взведения этого флага останется и не даст его сбросить. Сам механизм генерации условия основан на сравнении текущего состояния порта и того, который был ПОСЛЕДНИЙ РАЗ ПРОЧИТАН.
Марк вне форума   Ответить с цитированием
Старый 16.09.2017, 08:44   #4
NifelHELL
Junior Member
 
Регистрация: 08.04.2010
Сообщений: 23
Вес репутации: 100/29
NifelHELL will become famous soon enoughNifelHELL will become famous soon enough
По умолчанию Re: Последовательный перебор битов байта PIC16 ASM

Цитата:
Сообщение от Марк Посмотреть сообщение
Команда bcf/bsf (как и все битовые команды) содержат номер бита КАК КОНСТАНТУ.
1-если он сравнивает с константой, то вопрос почему изменяется CUCLE_TMP и с чем он потом делает сравнение?
2-почему если начальное значение CUCLE_TMP задать 8 и в конце не увеличивать, а уменьшать то моргает только диод на 4 выводе, где тут логика



Цитата:
Сообщение от Марк Посмотреть сообщение
Мало того, лишь одна команда в 8-разрядных ПИКах (да и та в 18-х) может оперировать сразу с двумя адресами в ОЗУ. Это команда movff. Причем она выполняется в ДВА машинных цикла, поскольку совершенно невозможно за один цикл получить доступ к ОЗУ по единственной шине.
Такшта писать две переменные в одной команде ну никак не катит, даже не зная спецификации команды.
Извиняюсь, команда MOVFF, я её ни где не использую. ИЛи мне нужно почитать про неё и использовать? но тогда к которой части кода?

Цитата:
Сообщение от Марк Посмотреть сообщение
Бит PEIE управляет групповым разрешением всех прерываний сидящих в регистре PIE1 и с флагами в PIR1. Вы не показали таких в своем коде.
Цитата:
Сообщение от Марк Посмотреть сообщение
Бит PEIE управляет групповым разрешением всех прерываний сидящих в регистре PIE1 и с флагами в PIR1. Вы не показали таких в своем коде.
Да, не показал, потому как там есть прерывания от УАРТА и АЦП, но это вроде пока как работает, есть кончно проблеы с УАРТом, но пока решаю их таким методом
Код:
	BCF		RCSTA,SPEN
		nop
	BSF		RCSTA,SPEN
NifelHELL вне форума   Ответить с цитированием
Старый 16.09.2017, 08:58   #5
Марк
Senior Member
 
Аватар для Марк
 
Регистрация: 18.08.2007
Адрес: M.O.
Возраст: 58
Сообщений: 2,093
Вес репутации: 2636/84
Марк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond repute
По умолчанию Re: Последовательный перебор битов байта PIC16 ASM

Логика с битовыми командами очень простая. Вместо переменной в номере бита ассемблер подставил АДРЕС этой переменной. Поскольку он уложился в размерность этого поля, ошибки не возникло. А адрес - это константа. Разбирать почему у Вас там как то мигает мне не хочется. Команда movff имеется только в 18х пиках, в 16х ее нет.
Марк вне форума   Ответить с цитированием
Старый 17.09.2017, 01:06   #6
NifelHELL
Junior Member
 
Регистрация: 08.04.2010
Сообщений: 23
Вес репутации: 100/29
NifelHELL will become famous soon enoughNifelHELL will become famous soon enough
По умолчанию Re: Последовательный перебор битов байта PIC16 ASM

Спасибо, Марк, убил пару часов пока понял ваше объяснение, можно было проще сказать, что при выполнении команд BSF/BCF номер бита является константой и задаётся на моменте сборки проекта компилятором, поэтому в цикли исполнения программы там всегда будет проверка одного и того же бита.
Эксперимента ради попробовал поиграться с регистром адреса FSR. В итоге при виде команды вида BSF REGISTER,FSR приводит к не предсказуймому результату, даже зная значение регистра FSR и значение регистра расположенного по этому же адресу оно ни как не соответствует тому что происходит в действительности.

Выходит в пиках невозможно последовательно перебрать биты регистра без его порчи.
По видимому остаётся тока способ со сдвигом регистра.

И ещё вопрос
Корректно ли так вызывать строки
Код:
MOVF CUCLE_TMP,W
;сам вызов строк
			CALL TEXT_TABLE
			MOVWF C_TMP
			MOLW high T_STRINGS
			MOVWF PCLATH
			MOVF C_TMP,W
			CALL SEND_UART
;ещё код

;сами таблицы со строками
ORG 0xE00
TEXT_TABLE:
ADDWF PCL
RETLW low (STR1-1)
RETLW low (STR2-1)
;......
RETLW low (STR8-1)
;больше 8 сюда не прилетит

ORG 0xF00
T_STRINGS:
ADDWF PCL
STR1  dt  "STRING 1"
STR2  dt  "STRING 2"
STR3  dt  "STRING 3"
STR4  dt  "STRING 4"
;и прочие стоки
Почитал
вот этот документик http://www.kaligraf.narod.ru/stati/a...formatting.pdf
Там есть список команд с пояснениями, в частности что можно определить константу с выражением. По факту я мог бы создать массив из 8 байт в оперативе, где лежали бы адреса начала строк, и дя вызова нужной строки достаточно было бы к счётчику прибавить смещение начала массива. Возможно ли задавать такие переменные и как их оформлять. Потому как этим 8 строкам обращение идёт очень часто, и из разных частей кода.

P.S. Если не понятно выразил свои мысли и вопросы, переспросите, постараюсь объяснить.
NifelHELL вне форума   Ответить с цитированием
Старый 17.09.2017, 07:13   #7
Марк
Senior Member
 
Аватар для Марк
 
Регистрация: 18.08.2007
Адрес: M.O.
Возраст: 58
Сообщений: 2,093
Вес репутации: 2636/84
Марк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond repute
По умолчанию Re: Последовательный перебор битов байта PIC16 ASM

Отсутствие адресации бит (именно это Вы пытались сделать изначально) - это не особенность ПИКов, а естественное отсутствие адресного доступа к битам. В старших АРМах есть такая фича, как bit banding, где можно расчитать битовый адрес и получить к нему доступ как к переменной, но и там есть свои особенности.
По поводу строк.
Табличное чтение в МК Микрочипа, где нет возможности читать флеш из программы, сводится к последовательности команд retlw XX, где ХХ - это ОДИН БАЙТ, а не строка.
Чтобы Вам было меня проще понимать, Вам нужно прочитать даташит на МК в разделе системы команд. Там есть полное описание команд, а в начале форма этого описания.
Если у Вас есть проблемы с английским, откройте старый сайт этого форума с доменом ru и в разделе документации найдете перевод типового даташита.
Марк вне форума   Ответить с цитированием
Старый 17.09.2017, 10:01   #8
Марк
Senior Member
 
Аватар для Марк
 
Регистрация: 18.08.2007
Адрес: M.O.
Возраст: 58
Сообщений: 2,093
Вес репутации: 2636/84
Марк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond repute
По умолчанию Re: Последовательный перебор битов байта PIC16 ASM

Цитата:
Сообщение от NifelHELL Посмотреть сообщение
Выходит в пиках невозможно последовательно перебрать биты регистра без его порчи.
По видимому остаётся тока способ со сдвигом регистра.
Почему нельзя?
Сравните две команды:
rrc <reg1>, f
rrc <reg1>, w
Первая команда модифицирует содержимое по адресу reg1, а вторая нет.
Во второй результат окажется в аккумуляторе.
Но в вашем случае гораздо проще преобразовать счетчик разрядов в маску таблицей содержащей бегущую единицу, а затем результат наложить как маску на тестируемый регистр.
То есть примерно так:
Код:
   movf  count_bit, w
   call  TabBits
   andwf  test_reg, w
   btfsc  STATUS, Z
   goto   <тестируемый бит =0>
   .... <тестируемый бит =1>

   ..........
TabBits
   addwf   PCL, f
   retlw b'00000001'
   retlw b'00000010'
   retlw b'00000100'
   retlw b'00001000'
   retlw b'00010000'
   retlw b'00100000'
   retlw b'01000000'
   retlw b'10000000'
Естественно, что нужно отследить положение таблицы по страницам и определить значение PCLATH, если это необходимо.
Марк вне форума   Ответить с цитированием
Старый 18.09.2017, 07:59   #9
NifelHELL
Junior Member
 
Регистрация: 08.04.2010
Сообщений: 23
Вес репутации: 100/29
NifelHELL will become famous soon enoughNifelHELL will become famous soon enough
По умолчанию Re: Последовательный перебор битов байта PIC16 ASM

Марк, если бы мне нужна была бегущая строка, то я бы использовал сдвиг через перенос, да и в пике это делается одной командой, потому как выдвинутый бит попадает в STSTUS,C и задвигается с другой строны.
У меня идёт проверка на состояние бита в регистре, и если он установлен, то отправляем сообщение в УАРТ, сбрасываем этот бит и продолжаем проверку.
Тока за время проверки битов, может произойти прерывание на ПОРТБ, и надо новые биты наложить на старые и проверять, по сути в основном цикле идёт проверка этих самых битов и отправка команд в УАРТ с их соответсвием.
NifelHELL вне форума   Ответить с цитированием
Старый 18.09.2017, 08:48   #10
Марк
Senior Member
 
Аватар для Марк
 
Регистрация: 18.08.2007
Адрес: M.O.
Возраст: 58
Сообщений: 2,093
Вес репутации: 2636/84
Марк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond repute
По умолчанию Re: Последовательный перебор битов байта PIC16 ASM

Причем тут проверка сдвигом?
Я привел Вам код, который проверяет бит МАСКОЙ. Номер проверяемого бита определяется регистром count_bit. Содержимое проверяемого регистра не портится. Если бит надо загасить, это можно сделать той же маской с помощью xorlw/xorwf.
Для исключения конфликта при приеме с УАРТа достаточно в прерывании по УАРТу взводить флаг готовности данных, а сами данные сохранять в буфер. На входе функции проверки бита нужно проверить флаг готовности данных и по его наличию произвести необходимые действия по модификации проверяемого на биты регистра и буфера приема и сбросить флаг. Таким образом, принятые данные никогда не разрушат атомарность обработки при проверке бита.

Последний раз редактировалось Марк; 18.09.2017 в 08:59.
Марк вне форума   Ответить с цитированием
Старый 19.09.2017, 00:22   #11
NifelHELL
Junior Member
 
Регистрация: 08.04.2010
Сообщений: 23
Вес репутации: 100/29
NifelHELL will become famous soon enoughNifelHELL will become famous soon enough
По умолчанию Re: Последовательный перебор битов байта PIC16 ASM

А если у меня сразу в байте 7 битов равны 1 и их надо проверить и дать ответ? при этом таких байтов 3 штуки
1-результат состояния входов ПОРТБ, если было событие оно сохраняется,
2-задержка на проверку входа ПОРТБ, если было событие на входе ПОРТБ и его проанализировали, то возводим 1 в регистре задержки событий от этого порта
3-регистр, если БИТ 0..7 возведен, то если произошло событие на ПОРТБ, то запустить соответсвующее АЦП, то передать не только сообщение о событии ПОРТБ, но и значение АЦП.
4-постоянно тикает таймер(TMR0) с предделителем 1/256 и для задержки выделен массив байтов 8 штук, при каждом переполнении таймера уменьшаем на единицу один из байтиков задержки(по одному байту на вход ПОРТБ). в Итоге получается задежка почти на 10 минут каждого вывода, без особых процессорных затрат.

Весть код представляет из себя нечто следующее
-если Задержка,БИТ_N = 1, то БлокЗадержки-1(команда DECFSZ), если блок задержки =0, то ЗадержкабБИТ_N сбросить в ноль.
-если БокЗадерка,БИТ_N <>0 и ПОРТБ,БИТ_N =1, то послать в уарт СООБЩЕНИЕ_N и проверить если ОЦИФРОВЫВАТЬ,БИТ_N = 1, то оцифровать сигнал с ПОРТА,БИТ_Т и передать значение в уарт. сбросить ПОРТБ,БИТ_N и установить ЗАДЕРЖКА,БИТ_N в 1.

Сейчас это для каждого бита Байта расписанно 8 раз ручками, да оно работает, но это, как по мне, просто дикость, когда как это циклические действия.

И если писать такие маски то это вообще выйдет полная дикость, понадобиться 3 битовых таблицы по 256 байт + разместить их так что начальный код распологался бы чуть раньше таблицы. Это значит что таблицы не могут распологаться последовательно, реально выйдет 5*256 = 1080 байт угроханной памяти, сейчас даже в том виде что у меня написанно это занимает 272байта памяти + 148байт занято строками.

Поэтому ищю способ быстро и с минимальными затратами перебирать биты в байте.
Если я правильно понял, то у всех битовые операции - второй операнд константа?
это относиться и к операциям проверки BTFSC/BTFSS

P.S. до четверга работаю, в пятницу/выходные, попробую всё переписать, сдвигая регист.
NifelHELL вне форума   Ответить с цитированием
Старый 19.09.2017, 01:26   #12
DmitrijVDN
Senior Member
 
Регистрация: 09.04.2010
Сообщений: 725
Вес репутации: 1200/47
DmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud of
По умолчанию Re: Последовательный перебор битов байта PIC16 ASM

Цитата:
Сообщение от NifelHELL Посмотреть сообщение
Это значит что таблицы не могут распологаться последовательно, реально выйдет 5*256 = 1080 байт угроханной памяти,
чушь, могут причем в любом месте памяти
две недели назад http://www.microchip.su/showpost.php...53&postcount=9
DmitrijVDN вне форума   Ответить с цитированием
Старый 19.09.2017, 02:40   #13
Марк
Senior Member
 
Аватар для Марк
 
Регистрация: 18.08.2007
Адрес: M.O.
Возраст: 58
Сообщений: 2,093
Вес репутации: 2636/84
Марк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond repute
По умолчанию Re: Последовательный перебор битов байта PIC16 ASM

Цитата:
Сообщение от NifelHELL Посмотреть сообщение
А если у меня сразу в байте 7 битов равны 1 и их надо проверить и дать ответ? при этом таких байтов 3 штуки
Во первых, дело не в количестве единиц в проверяемом байте. Делается цикл с инкрементом count_bit и проверяются хоть все биты.
Во вторых, таблицы могут быть где угодно и какой угодно длины в пределах имеющегося флеша. Только нужно понимать работу этого механизма, а не тупо повторять чей то код.
В третьих, можно сделать таблицу ФУНКЦИЙ, когда по ПОРЯДКОВОМУ НОМЕРУ будет вызываться функция, а не просто возвращаться некая константа в аккумуляторе. Выглядит это примерно так:
Код:
......
  bcf  STATUS, C
  rlc  num_func, w   ; умножение на 2 номера функции с результатом в W
  call  TabFunc
......
Func_0
  <тело функции>
  return
......
Func_1
  <тело функции>
  return
......
Func_2
  <тело функции>
  return
......
Func_3
  <тело функции>
  return
......
Func_4
  <тело функции>
  return
......
Func_5
  <тело функции>
  return
......
Func_6
  <тело функции>
  return
......
Func_7
  <тело функции>
  return
......
......
TabFunc
  addwf  PCL, f
  goto Func_0
  goto Func_1
  goto Func_2
  goto Func_3
  goto Func_4
  goto Func_5
  goto Func_6
  goto Func_7
......
Все это построено на ВЫЧИСЛЯЕМОМ ПЕРЕХОДЕ.
А совсем не на таблицах. Таблица образуется при следующих подряд переходах.
Обращаю внимание на умноженное на два значение номера функции. Это происходит из-за того, что команда goto занимает ДВА АДРЕСА во флеше.
То есть таблица выглядит как следующая подряд (как будто адреса увеличиваются на 1), на самом деле адреса увеличиваются на 2.
Такой подход позволит избавится от бесконечных btfss/btfsc.
Расположение самих функций произвольно, как и их порядок.
Расположение таблицы относительно кода и функций так же произвольно, лишь бы был учтен старший байт адреса флеша начала таблицы в PCLATH и таблица не пересекала границу страниц, чтобы не усложнять расчет вычисляемого перехода.
И еще. В таблице функции могут, естественно, повторяться. Я привел пример разных, но это частный случай.

Последний раз редактировалось Марк; 19.09.2017 в 02:48.
Марк вне форума   Ответить с цитированием
Старый 19.09.2017, 08:11   #14
DimaS
Senior Member
 
Регистрация: 05.04.2008
Адрес: Israel
Возраст: 44
Сообщений: 1,395
Вес репутации: 2061/68
DimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond repute
По умолчанию Re: Последовательный перебор битов байта PIC16 ASM

Цитата:
Это происходит из-за того, что команда goto занимает ДВА АДРЕСА во флеше.
В 16-х пиках?!
DimaS вне форума   Ответить с цитированием
Старый 19.09.2017, 08:29   #15
Марк
Senior Member
 
Аватар для Марк
 
Регистрация: 18.08.2007
Адрес: M.O.
Возраст: 58
Сообщений: 2,093
Вес репутации: 2636/84
Марк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond repute
По умолчанию Re: Последовательный перебор битов байта PIC16 ASM

Даааа, это я косяк...
И с rlc, кстати, тоже...


Ну оооочень неудачная строка кода.
Выбрасываем вместе со сбросом С.
Код:
......
  movf  num_func, w
  call  TabFunc
......
Func_0
  <тело функции>
  return
......
Func_1
  <тело функции>
  return
......
Func_2
  <тело функции>
  return
......
Func_3
  <тело функции>
  return
......
Func_4
  <тело функции>
  return
......
Func_5
  <тело функции>
  return
......
Func_6
  <тело функции>
  return
......
Func_7
  <тело функции>
  return
......
......
TabFunc
  addwf  PCL, f
  goto Func_0
  goto Func_1
  goto Func_2
  goto Func_3
  goto Func_4
  goto Func_5
  goto Func_6
  goto Func_7
......
Марк вне форума   Ответить с цитированием
Старый 19.09.2017, 20:26   #16
NifelHELL
Junior Member
 
Регистрация: 08.04.2010
Сообщений: 23
Вес репутации: 100/29
NifelHELL will become famous soon enoughNifelHELL will become famous soon enough
По умолчанию Re: Последовательный перебор битов байта PIC16 ASM

Да как же, размещай таблицы где хочешь,

кину таблицу с адреса
ORG 0xC0
ADDWF PCL,F
RETLW 0
.....
RETLW 255
и куда я улечу?

кусок кода
METKA: ;с адресом 0х00
.........
........
много кода
........
.........
MOVLW 0x0F ;с адресом 2049
GOTO METKA

и опять летим чёрт знает куда
с памятью у пиков надо быть аккуратнее, рекурсии вообще опастно делать, по причине отсутствия доступа до стека, да и его размера.

Да я копирую интересующие фрагменты кода, но при этом пытаюсь их понять и разобрать.

Как объяснить что циклически повторяется один и тот же код, но с разными аргументами.
NifelHELL вне форума   Ответить с цитированием
Старый 19.09.2017, 22:00   #17
Guaho
Senior Member
 
Аватар для Guaho
 
Регистрация: 28.06.2013
Возраст: 45
Сообщений: 656
Вес репутации: 1416/36
Guaho has much to be proud ofGuaho has much to be proud ofGuaho has much to be proud ofGuaho has much to be proud ofGuaho has much to be proud ofGuaho has much to be proud ofGuaho has much to be proud ofGuaho has much to be proud ofGuaho has much to be proud ofGuaho has much to be proud of
По умолчанию Re: Последовательный перебор битов байта PIC16 ASM

Невнимательно читаете. Смотрите ссылку в посте №12. Просто "ADDWF PCL,F" - это опасно. Нужно хотя бы так:
Код:
	movlw	HIGH table1
	movwf	PCLATH
	movf	offset,w
	addlw	LOW table1
	skpnc
	incf	PCLATH,f
	movwf	PCL
А ещё лучше - как сказал Марк, сначала вычислять значения, а затем записывать их в PCLATH/PCL.
Доступ к стеку есть в ПИКах старшего подсемейства, благодаря чему можно интересные вещи делать.
Guaho вне форума   Ответить с цитированием
Старый 20.09.2017, 07:01   #18
Марк
Senior Member
 
Аватар для Марк
 
Регистрация: 18.08.2007
Адрес: M.O.
Возраст: 58
Сообщений: 2,093
Вес репутации: 2636/84
Марк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond repute
По умолчанию Re: Последовательный перебор битов байта PIC16 ASM

Цитата:
Сообщение от NifelHELL Посмотреть сообщение
с памятью у пиков надо быть аккуратнее, рекурсии вообще опастно делать, по причине отсутствия доступа до стека, да и его размера.
С какого бока тут рекурсия?
Про таблицы Вам объяснили выше.
Из Ваших сбивчивых объяснений по алгоритму я ничего не понял, поэтому могу говорить лишь о частных вопросах.
Лучше всего, если Вы внятно расскажете самый верхний алгоритм: что зачем и куда не на уровне регистров-команд, а человеческим языком опишите общую идею.
Марк вне форума   Ответить с цитированием
Старый 20.09.2017, 08:00   #19
NifelHELL
Junior Member
 
Регистрация: 08.04.2010
Сообщений: 23
Вес репутации: 100/29
NifelHELL will become famous soon enoughNifelHELL will become famous soon enough
По умолчанию Re: Последовательный перебор битов байта PIC16 ASM

Общая идея состоит в следующем, в зависимости на котором выводе порта Б изменится состояние, в уарт отправиться соответствующее сообщение из таблицы(для первого вывода первое сообщение, для второго второе, и так далее), как только состояние порта обработанно все его состояния игнорятся в течение 7-10минут. И есть третий регистр в котором биты тоже соответствуют выводам порта Б, если этот бит установлен в 1, то помимо того что отправляется соответствующее сообщение, но и после него отправляется значение АЦП с соответствующего вывода.
PORTB, 0 - AN0
PORTB, 1 - AN1
как то вроде так
NifelHELL вне форума   Ответить с цитированием
Старый 20.09.2017, 08:13   #20
Марк
Senior Member
 
Аватар для Марк
 
Регистрация: 18.08.2007
Адрес: M.O.
Возраст: 58
Сообщений: 2,093
Вес репутации: 2636/84
Марк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond repute
По умолчанию Re: Последовательный перебор битов байта PIC16 ASM

Ну и в чем проблема?
Ровно как я с самого начала описал работу с маской по таблице.
Делаете цикл опроса по каждому пину (счетчик count_bit).
Определяете столько программных таймеров (для таймаутов), сколько у Вас пинов.
Заводите буфер очереди УАРТа. Иначе возникнет конфликт - опросы пинов будут происходит чаще, чем УАРТ успеет освободиться.
И все - запускаете эту "машинку".
Марк вне форума   Ответить с цитированием
Старый 20.09.2017, 11:34   #21
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 30
Сообщений: 1,438
Вес репутации: 2927/63
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
Thumbs up Re: Последовательный перебор битов байта PIC16 ASM

Марк
я бы просто функцию написал с логикой аля
не стал бы врезки делать в код для имхо ненужной на данном этапе
производительности решения.
упростил бы себе жизнь.
Код:
b8 pic14_bit_check(u8 byte, u8 bit)
{
	switch(bit){
		case 7:
			return (b8)(byte&(1<<7);
		case 6:
			return (b8)(byte&(1<<6);
		case 5:
			return (b8)(byte&(1<<5);
		case 4:
			return (b8)(byte&(1<<4);
		case 3:
			return (b8)(byte&(1<<3);
		case 2:
			return (b8)(byte&(1<<2);
		case 1:
			return (b8)(byte&(1<<1);
		case 0:
			return (b8)(byte&(1<<0);
	}
	return WRONG_CALL;
}
besogon вне форума   Ответить с цитированием
Старый 20.09.2017, 11:38   #22
Марк
Senior Member
 
Аватар для Марк
 
Регистрация: 18.08.2007
Адрес: M.O.
Возраст: 58
Сообщений: 2,093
Вес репутации: 2636/84
Марк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond repute
По умолчанию Re: Последовательный перебор битов байта PIC16 ASM

В заголовке темы обозначен АСМ.
Я придерживаюсь темы.
Марк вне форума   Ответить с цитированием
Старый 20.09.2017, 11:43   #23
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 30
Сообщений: 1,438
Вес репутации: 2927/63
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: Последовательный перебор битов байта PIC16 ASM

Марк
я написал на С, тк. на С более ясна логика.
переписать на asm знаю не составит труда.
писать на asm не хочу, тк. вспоминать надо - допущу ошибки.
суть в том, чтобы написать функцию, которая будет выполнять то, что вопрошающий хотел реализовать инструкцией.
besogon вне форума   Ответить с цитированием
Старый 20.09.2017, 12:57   #24
Марк
Senior Member
 
Аватар для Марк
 
Регистрация: 18.08.2007
Адрес: M.O.
Возраст: 58
Сообщений: 2,093
Вес репутации: 2636/84
Марк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond repute
По умолчанию Re: Последовательный перебор битов байта PIC16 ASM

Так там почти нет действий. Запуск таймаута и передача в УАРТ.
То есть диаграмма-драйвер важнее самой функции.
Марк вне форума   Ответить с цитированием
Старый 20.09.2017, 13:18   #25
Greg
Super Moderator
 
Регистрация: 25.02.2007
Адрес: Moscow, ODBS
Сообщений: 6,639
Вес репутации: 5137/156
Greg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond repute
По умолчанию Re: Последовательный перебор битов байта PIC16 ASM

Цитата:
Сообщение от besogon Посмотреть сообщение
более ясна логика...
совершенно верно. типичный случай, когда за деревьями не видят леса.
надо добавлять какие-то задержки, но на асме без функций это выглядит сущим кошмаром.
Greg вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +3, время: 17:12.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd. Перевод: zCarot