Jump to content

    

Косяки PIC-контроллеров

здравствуйте!

после очередного долгого отлаживания крайне простого куска программы решил поделиться, вдруг кому поможет чем то

за время работы с пиками выявил 3 особенности их работы

 

1 работа с еепром, бит EECON1|WR

 WR: Write Control bit 1 = Initiates a write cycle (The bit is cleared by hardware once write is complete. The WR bit can only be set, not cleared, in software.) 0 = Write cycle to the data EEPROM is complete

описано предельно ясно, но по факту если использовать контроль этого бита для начала записи следующего байта данных, то они не запишутся

проверено на разных пиках, результат одинаков

при контроле аналогичного бита прерывания в INTCON всё работает корректно

 

2 обработка прерывания по внешнему сигналу на RB0/INT

если при выполнении программы присутствует участок кода с запретом прерываний, ограниченный командами "bcf INTCON|GIE .......... bsf INTCON|GIE", то событие возникшее в этом месте будет пропущено, хотя в даташите указано, что оно запоминается и флаг прерывания надо будет сбрасывать программно, по факту флаг либо не устанавливается, либо сам сбрасывается (именно с этим копался на днях, обработчик прерывания вычислял и заносил в память 2 переменных, поэтому при их считывании для рассчетов приходилось на всего 3 команды запрещать прерывание, но этого хватало для хаотичных пропусков и кипения мозга откуда идёт ошибка в данных, решилось введением доп. программного флага в обработчик)

 

3 выполнение перехода по таблице, типа ADDWF PCL,F GOTO m1 GOTOm2 ...

команда сложения в этом случае занимает 2 такта, а не 1

описание данной особенности может где то и есть, специально не искал, всё логично и возникает из-за сбоя конвеера, но в даташите это не отмечено (тоже довольно долго искалась ошибка в куске кода, точно рассчитанному по времени)

 

вот как-то так ...

Share this post


Link to post
Share on other sites

4й косяк вспомнил

при отправке потока данных через UART, бит занятости устанавливается с задержкой на 1 команду, так что его нельзя контролировать прямо сразу, надо хотя бы 1 NOP воткнуть

Share this post


Link to post
Share on other sites

Если не учить химию, физику, математику, ...даташиты, ....  то  весь мир наполнится магией и чудесами.   

Первые года  два работы с PIC я тоже думал,  что  они  все,  как один,  с косяками. 

PS.

Всю  жизнь  анализирую  EECON1|WR от  PIC12 до  dsPIC  -  все работает.

PS2

Про  косяки надо  писать  в Microchip,  и если  они там есть,  то  они будут  в  Silicon Errata. И так об этом узнают  все.

Share this post


Link to post
Share on other sites
6 hours ago, Driver_GV said:

Всю  жизнь  анализирую  EECON1|WR от  PIC12 до  dsPIC  -  все работает.

у меня почему то при этом всегда только первый байт записывается, а остальные в никуда

если анализировать EEIF бит, то тогда работает нормально

может это как то связано с написанием программы просто в виде тхт-файла в виндос-блокноте без всяких библиотек и прочих сред разработки?

тут то ведь ни одной лишней команды компилятор не додумывает

по сути как бы и фиг с ним, работает и ладно

но косяк с битом EECON1|WR точно есть, как и косяк с битом занятости UART

а вот потеря прерывания как то уже перебор ...

ладно тут это залечилось доп. программным флагом, а если лезть в еепром, например, то там без временного запрета прерываний не обойтись

 

по прерыванию, кстати, не нашел никаких аппнот дополнительных, очень хотелось бы почитать

причем если GIE бит не сбрасывать\восстанавливать самому, а его блокирует обработчик до выполнения RETFIE, то факт события нормально запоминается и обрабатывается

 

 

Edited by ddd-ekb

Share this post


Link to post
Share on other sites
В 25.05.2019 в 22:18, ddd-ekb сказал:

по прерыванию, кстати, не нашел

Это не оно?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now