Вопросы начинающих PIC ASM

Поклонники продукции Microchip Technology Inc тусуются тут.
Пока_без_кота
Потрогал лапой паяльник
Сообщения: 359
Зарегистрирован: Чт авг 08, 2013 01:06:54

Re: Вопросы начинающих PIC ASM

Сообщение Пока_без_кота »

Albert_V писал(а):..."документ"

http://www.microchip.ru/files/d-sheets- ... 29_675.pdf страница 71
Ну, я человек доверчивый, что прочитал, то и сказал :)))
Аватара пользователя
Albert_V
Друг Кота
Сообщения: 4119
Зарегистрирован: Чт сен 12, 2013 00:54:12
Откуда: ЗаМКАДье. Там, где ЦУП

Re: Вопросы начинающих PIC ASM

Сообщение Albert_V »

Интересно..
В официальном документе PIC16F62x действительно так.
Но в pdf-e на PIC16F628A этот абзац убран (стр. 113).
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15553
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Вопросы начинающих PIC ASM

Сообщение BOB51 »

У семейства ПИКовых надо к каждому конкретному кристаллу подходить с точки зрения именно его даташита и сопутствующих еррат (смотри часть кода REV в считанном из МК DEVICE ID VALUES !!!).
МК "с буковками" могут весьма существенно отличаться "в аппаратных мелочах" (редко используемые нюансы - с весьма обломными последствиями).
Для простых типовых конструкций почти незаметно, но если "использование по-максимуму" -вычитывать документацию необходимо весьма тщательно!
:beer:
Аватара пользователя
xterro
Опытный кот
Сообщения: 873
Зарегистрирован: Чт апр 12, 2012 07:19:59
Откуда: Тюмень

Re: Вопросы начинающих PIC ASM

Сообщение xterro »

Доброго времени суток, имеется HEX одной прошивки, возможно ли его дизасемблировать и получить ASM чтобы можно было её поправить? Из инструментов имеется только MPLABX :)
Аватара пользователя
Albert_V
Друг Кота
Сообщения: 4119
Зарегистрирован: Чт сен 12, 2013 00:54:12
Откуда: ЗаМКАДье. Там, где ЦУП

Re: Вопросы начинающих PIC ASM

Сообщение Albert_V »

xterro писал(а):...имеется HEX одной прошивки, возможно ли его дизасемблировать и получить ASM...
Возможно.
Вариант 1. Создать в MPLAB проект под конкретный контроллер, File>Import *.hex, View>Program Memory.
Вариант 2. Скачать PICDisasm.
Аватара пользователя
xterro
Опытный кот
Сообщения: 873
Зарегистрирован: Чт апр 12, 2012 07:19:59
Откуда: Тюмень

Re: Вопросы начинающих PIC ASM

Сообщение xterro »

Спасибо ) Только я так понял, дизассемблировать это не особо полезно. Меток нет, всё по адресам, пойди догадайся, что там эта функция делает :(
Аватара пользователя
Albert_V
Друг Кота
Сообщения: 4119
Зарегистрирован: Чт сен 12, 2013 00:54:12
Откуда: ЗаМКАДье. Там, где ЦУП

Re: Вопросы начинающих PIC ASM

Сообщение Albert_V »

xterro писал(а):...пойди догадайся, что там эта функция делает :(
Именно так.
Очень часто, бывает проще написать свою программу, ориентируясь на "руководство пользователя" к изделию, чем править чужую программу.
Пока_без_кота
Потрогал лапой паяльник
Сообщения: 359
Зарегистрирован: Чт авг 08, 2013 01:06:54

Re: Вопросы начинающих PIC ASM

Сообщение Пока_без_кота »

Доброго времени суток. Пытаюсь завести модуль SSP на PIC16F73 в режиме I2C (ведомый режим, 7 разрядная адресация с разрешением прерываний по приему старт-бита). Не получается, прошу помощи.
Спойлер

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


push	macro
	movwf	w_temp
	swapf	STATUS,w
	movwf	status_temp
	endm

pop		macro
	swapf	status_temp,w
	movwf	STATUS
	swapf	w_temp,f
	swapf	w_temp,w
	endm

RESET_VECTOR	code	0h
	goto	Init

ISR				code	4h		; Вектор прерывания
	push						; Сохраним контекст
	btfsc	PIR1,SSPIF
	call	Receive_I2C_Byte

ISR_end
	pop							; Восстановим контекст
	retfie

Init							; Предварительная загрузка начальных значений	
	banksel	TRISA				; Банк 1
	movlw	b'00000000'
	movwf	TRISA				; Порт A на вывод
	movwf	TRISB				; Порт В на вывод
	call	SSP_I2C_Ini
	banksel	INTCON				; Банк 0		
	movlw	b'11000000'			; Разрешаем прерывание периферийных модулей и прерывания вообще
	movwf	INTCON
	
Main
;      делаем что-то с полученной по I2C переменной value
	goto	Main

SSP_I2C		code

SSP_I2C_Ini
	banksel	SSPADD				; Вибираем 1 банк

	movlw	I2C_ADDR			; Заносим адрес устройства		
	movwf	SSPADD
	movlw	(1<<SSPIE)			; Разрешем прерывания от модуля SSP
	movwf	PIE1

	banksel	SSPCON				; Вибираем 0 банк
	movlw	(1<<SSPEN)|(1<<SSPM3)|(1<<SSPM2)|(1<<SSPM1) ; Включаем модуль SSP, ведомый режим с 7-разрядной адресацией и разрешением прерываний
	movwf	SSPCON

	return

Receive_I2C_Byte
	btfsc	SSPSTAT,BF			; Ожидаем завершения приема байта адреса
	goto	Receive_I2C_Byte	
	movfw	SSPBUF				; Считаем полученый адрес, чтобы сбросить флаг BF
Wait_Receive_I2C_Byte
	btfsc	SSPSTAT,BF			; Ожидаем завершения приема байта данных
	goto	Wait_Receive_I2C_Byte				
	movfw	SSPBUF				; Считаем полученые данные
	movwf	value
	bcf		PIR1,SSPIF
	return
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы начинающих PIC ASM

Сообщение Аlex »

Пока_без_кота писал(а):с разрешением прерываний по приему старт-бита
Это как ?
SSPIF поднимается по приёму байта, а не по сартовому состоянию.

Изображение
2016-12-23_01-23-26.png
(62.76 КБ) 915 скачиваний
Соответственно и прерывание возникает в этот же момент.

И к чему манипуляции с BF-битом, тоже не понятно ... :dont_know:
Пока_без_кота
Потрогал лапой паяльник
Сообщения: 359
Зарегистрирован: Чт авг 08, 2013 01:06:54

Re: Вопросы начинающих PIC ASM

Сообщение Пока_без_кота »

Там еще есть режим, в котором прерывания возникают по приходу старт/стоп бита. Но я внимательнее вчитался, и понял что мне это не нужно. Переделал без этих прерываний, и лишнего анализа флага BF.
Спойлер

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

SSP_I2C		code
SSP_I2C_Ini
	banksel	SSPADD				; Вибираем 1 банк
	movlw	I2C_ADDR			; Заносим адрес устройства		
	movwf	SSPADD
	movlw	(1<<SSPIE)			; Разрешем прерывания от модуля SSP
	movwf	PIE1
	banksel	SSPCON				; Вибираем 0 банк
	movlw	(1<<SSPEN)|(1<<CKP)|(1<<SSPM2)|(1<<SSPM1); Включаем модуль SSP, ведомый режим с 7-разрядной адресацией, управление SCL отключено
	movwf	SSPCON
	return

Receive_I2C_Byte
	movfw	SSPBUF				; Сразу считаем полученый байт, чтоб сбросить флаг BF
	banksel	SSPSTAT
	btfss	SSPSTAT,D			; Если принятый байт - адрес,
	goto	End_Receive_I2C_Byte; сразу на выход
	banksel	PIR1
	movwf	value			; Иначе обновим соостояние переменной
End_Receive_I2C_Byte
	banksel	PIR1
	bcf		PIR1,SSPIF			; Сбрасываем флаг прерывания от модуля SSP
	return

Все работает, спасибо :beer:
Пока_без_кота
Потрогал лапой паяльник
Сообщения: 359
Зарегистрирован: Чт авг 08, 2013 01:06:54

Re: Вопросы начинающих PIC ASM

Сообщение Пока_без_кота »

Доброго времени суток. Вопрос не совсем по асму, но близко. Когда-то, где-то, мельком видел документ от Микрочипа, в котором для UART указываются погрешности в % при разных номиналах кварцевых резонаторов. Подскажите пожалуйста, как называется сей документ. Для чего необходимо: имеется устройство на ПИКе, в котором стоит кварц на 11,0592 МГц в планарном исполнении. Этот экземпляр кварца нужен для другой поделки на базе MCS51, для которой этот номинал подходит для реализации безпогрешного обмена по UART. Хочу узнать, какие номиналы нужны ПИКу для безпогрешного обмена, может быть удастся совершить подмену :)))
otest
Друг Кота
Сообщения: 7853
Зарегистрирован: Ср фев 11, 2009 20:35:58

Re: Вопросы начинающих PIC ASM

Сообщение otest »

См. даташит на МК
Пока_без_кота
Потрогал лапой паяльник
Сообщения: 359
Зарегистрирован: Чт авг 08, 2013 01:06:54

Re: Вопросы начинающих PIC ASM

Сообщение Пока_без_кота »

Там какая-то слишком скудная таблица. Нет даже того же кварца на 11,0592, который стоит на этой плате с ПИКом. Я думал есть аппноут какой-то расширенный :roll:
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25163
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Вопросы начинающих PIC ASM

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

Пока_без_кота писал(а):Хочу узнать, какие номиналы нужны ПИКу для безпогрешного обмена, может быть удастся совершить подмену :)))
Что за бред? :facepalm:
Какой еще "беспогрешный" обмен?
Скорость обмена может отличаться у передатчика и приемника довольно значительно. Важно лишь, чтобы на одном байте все 8 (или 9) бит попали на выборки приемника. А это допускает отклонение частот аж до 10% БЕЗ ПОТЕРИ ИНФОРМАЦИИ.
Пока_без_кота
Потрогал лапой паяльник
Сообщения: 359
Зарегистрирован: Чт авг 08, 2013 01:06:54

Re: Вопросы начинающих PIC ASM

Сообщение Пока_без_кота »

Под "беспогрешным" я понимаю обмен с ошибкой в пределах 2%. Я для себя макетирую некоторые устройства с приминением софтового UART-а на 8-ногих микроконтроллерах (без кварца). При сильном разбросе температур это все теоретически не очень стабильно себя ведет. Поэтому мне очень желательно свести к минимуму разбежности в обмене хотя бы на стороне контроллера с кварцем. Вот такой бред :)
П.С. А вообще нагуглил вот такой калькулятор (http://www.micromagicsystems.com/#/pic-baud/4523812801), который показывет ошибку при любом кварце - выбирай, какой душа пожелает :tea:
Аватара пользователя
Albert_V
Друг Кота
Сообщения: 4119
Зарегистрирован: Чт сен 12, 2013 00:54:12
Откуда: ЗаМКАДье. Там, где ЦУП

Re: Вопросы начинающих PIC ASM

Сообщение Albert_V »

Пока_без_кота писал(а):...Я для себя макетирую некоторые устройства с приминением софтового UART-а на 8-ногих микроконтроллерах (без кварца)....
Извините за нескромный вопрос: НАХРЕНА?
Сложно выбрать контроллер с аппаратным EUSART (к примеру, PIC12F1840 в SOIC-8)?
Освоить работу с периферией PIC контроллеров 12-ой серии - пару вечеров (с диким количеством перекуров).
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25163
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Вопросы начинающих PIC ASM

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

Пока_без_кота писал(а): П.С. А вообще нагуглил вот такой калькулятор
Поколение "некст"...
Убить время на поиск "калькулятора" вместо чтения даташита с ПРИМИТИВНОЙ формулой в два арифметических действия...
Более того, если применяются два контроллера одной платформы (с одинаковыми модулями UART), то в них вообще не нужно ничего считать. Потому что одинаковые режимы дадут одинаковую скорость.
Пока_без_кота
Потрогал лапой паяльник
Сообщения: 359
Зарегистрирован: Чт авг 08, 2013 01:06:54

Re: Вопросы начинающих PIC ASM

Сообщение Пока_без_кота »

Albert_V писал(а):... НАХРЕНА? ...
Я "вечноначинающий" любитель. Уровень моих поделок - мигание светодиодом во всех возможных проявлениях. Я смог достать небольшую партию PIC12F629 по 0,2 бакса за штучку. Я посчитал это выгодным предложением, тем более что мне нравиться сам процесс ковыряния с мелкими пиками на ассемблере. Теперь свои поделия (выносные датчики) делаю на них.
КРАМ писал(а):... Убить время на поиск "калькулятора" вместо чтения даташита с ПРИМИТИВНОЙ формулой в два арифметических действия ...
Формула давно прочитана и забита в исходник, так что даже считать ничего не надо:
Спойлер

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

#define	yes				1
#define	no				0

#define	f				.8000000
#define	baudrate		.9600
#define	USE_HIGH_SPEED	no

	if	(USE_HIGH_SPEED)
#define	K				(f/(baudrate*.16))-1
	else
#define	K				(f/(baudrate*.64))-1
	endif

PIC16_HW_UART_udata	udata_shr	

Temp_FSR			res	1

PIC16_HW_UART	code

UART_Ini
	banksel	SPBRG
	movlw	K					; Загружаем коеф. деления частоты
	movwf	SPBRG
Просто из этой формулы НАГЛЯДНО НЕ ВИДНО, какой будет % отклонения, высчитывать вручную мне влом. Тем более что это действие возможно пришлось бы повторять в будущем, вот и решил "упростить жизнь" себе, и Вас заодно позадалбывать. Спасибо за внимание :beer:
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15553
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Вопросы начинающих PIC ASM

Сообщение BOB51 »

В даташите конкретного ПИКа, имеющего блок(и) последовательного обмена всегда присутствует соответствующая таблица допусков погрешностей/вероятных ошибок.
Где-то встречался и алгоритм программной обработки приема/передачи....
:roll:
Как вариант, программный передатчик был тут (http://radiokot.ru/forum/viewtopic.php? ... 2#p2593182 http://radiokot.ru/forum/download/file.php?id=236646 )
:beer:
Пока_без_кота
Потрогал лапой паяльник
Сообщения: 359
Зарегистрирован: Чт авг 08, 2013 01:06:54

Re: Вопросы начинающих PIC ASM

Сообщение Пока_без_кота »

С Новым Годом! Прошу помощи в таком вопросе. Есть код:
Спойлер

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

Send_TX_byte							; Подпрограмма передачи 1 байта
	bcf		INTCON,GIE					; Запрещаем прерывания	
;	bsf_TX								; Предварительно установим TX
	bsf		TX							; Предварительно установим TX
	
if	(USE_ONE_PIN)
	banksel	OPTION_REG					; Bank 1
;	bcf_TX								; Настроим TX на выход
	bcf		TX
	banksel	INTCON						; Bank 0
endif

;-----------------------------------------------------------------------------------------------
;	bcf_TX								; Шлем старт бит
	bcf		TX							; Шлем старт бит
	movwf	TX_byte						; Загрузим передавемый байт			
	movlw	.8							; Загрузим количество передаваемых битов
	movwf	UART_counter
	nop
Transmit_Next_Bit
	nop
	call	Delay_1bit					; Длинной 1 бит
	rrf		TX_byte						; Продвигаем в бит переноса все биты, начиная с младшего
	btfsc	STATUS,C					; Проверяем, что выдавилось в бит переноса
;	bsf_TX								; Если 1, выставляем 1 на ТХ - !!! надо будет переделать, макрос занимает 2 команды и прыгнуть через него мы уже не можем
	bsf		TX							; Если 1, выставляем 1 на ТХ
	btfss	STATUS,C
;	bcf_TX								; Если 0, выставляем 0 на ТХ - !!! надо будет переделать, макрос занимает 2 команды и прыгнуть через него мы уже не можем
	bcf		TX							; Если 0, выставляем 0 на ТХ
	decfsz	UART_counter				; Весь байт отослан ?
	goto	Transmit_Next_Bit			; Нет, идем слать следующий бит
	call	Delay_1bit					; Задержка длинной 1 бит
	nop
	nop
	nop
	nop
	nop
	bsf_TX								; Шлем стоп-бит
	call	Delay_1bit					; Задержка длинной 1 бит
;-----------------------------------------------------------------------------------------------
if	(USE_ONE_PIN)	
	banksel	OPTION_REG					; Bank 1
	bsf_TX								; Настроим ножку на вход
	banksel	INTCON						; Вернем Bank 0
endif

if	(USE_T0CKI)
	movlw	.255						; Перезапишем таймер для переполнения при приходе старт-бита
	movwf	TMR0
else
	bcf		INTCON,INTF					; Сбросим флаг внешнего прерывания
endif
	bcf		INTCON,T0IF					; Сбросим флаг переполнения Таймера 0
	bsf		INTCON,GIE					; Разрешаем прерывания
	return
Это кусок моего программного UART (передача байта). Сперва в нем управление ногой ТХ было сделано через bsf/bcf, но так как это неправильно, я решил переделать через битовые маски. И тут меня подстерег северный полярный зверек. В конце кода замена команды установки/сброса бита на операцию по маске прошла успешно, а в других код перестает быть рабочим (шлется мусор вместо байта). Макросы установки/сброса имеют вид:
Спойлер

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

bsf_TX	macro
		movlw	(1<<TX_PIN)
		iorwf	TX_PORT
		endm

bcf_TX	macro
	if	(USE_PIC12)
		movlw	b'111011'
	endif
	if	(!USE_PIC12 & USE_T0CKI)
		movlw	b'01111'
	endif
	if	(!USE_PIC12 & !USE_T0CKI)
		movlw	b'11111110'
	endif		
		andwf	TX_PORT
		endm
Вопрос, почему так происходит, что в одном месте замена проходит нормально, а в другом нет. Сейчас у меня ТХ находиться на ножке RA4, контроллер PIC16F84 (открытый коллектор, есть внешний подтягивающий резистор на 4,7к), если это имеет значение.
Ответить

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