У семейства ПИКовых надо к каждому конкретному кристаллу подходить с точки зрения именно его даташита и сопутствующих еррат (смотри часть кода REV в считанном из МК DEVICE ID VALUES !!!). МК "с буковками" могут весьма существенно отличаться "в аппаратных мелочах" (редко используемые нюансы - с весьма обломными последствиями). Для простых типовых конструкций почти незаметно, но если "использование по-максимуму" -вычитывать документацию необходимо весьма тщательно!
Доброго времени суток, имеется HEX одной прошивки, возможно ли его дизасемблировать и получить ASM чтобы можно было её поправить? Из инструментов имеется только MPLABX
Доброго времени суток. Пытаюсь завести модуль SSP на PIC16F73 в режиме I2C (ведомый режим, 7 разрядная адресация с разрешением прерываний по приему старт-бита). Не получается, прошу помощи. Спойлер
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
Там еще есть режим, в котором прерывания возникают по приходу старт/стоп бита. Но я внимательнее вчитался, и понял что мне это не нужно. Переделал без этих прерываний, и лишнего анализа флага 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
Доброго времени суток. Вопрос не совсем по асму, но близко. Когда-то, где-то, мельком видел документ от Микрочипа, в котором для UART указываются погрешности в % при разных номиналах кварцевых резонаторов. Подскажите пожалуйста, как называется сей документ. Для чего необходимо: имеется устройство на ПИКе, в котором стоит кварц на 11,0592 МГц в планарном исполнении. Этот экземпляр кварца нужен для другой поделки на базе MCS51, для которой этот номинал подходит для реализации безпогрешного обмена по UART. Хочу узнать, какие номиналы нужны ПИКу для безпогрешного обмена, может быть удастся совершить подмену
Там какая-то слишком скудная таблица. Нет даже того же кварца на 11,0592, который стоит на этой плате с ПИКом. Я думал есть аппноут какой-то расширенный
Хочу узнать, какие номиналы нужны ПИКу для безпогрешного обмена, может быть удастся совершить подмену
Что за бред? Какой еще "беспогрешный" обмен? Скорость обмена может отличаться у передатчика и приемника довольно значительно. Важно лишь, чтобы на одном байте все 8 (или 9) бит попали на выборки приемника. А это допускает отклонение частот аж до 10% БЕЗ ПОТЕРИ ИНФОРМАЦИИ.
Под "беспогрешным" я понимаю обмен с ошибкой в пределах 2%. Я для себя макетирую некоторые устройства с приминением софтового UART-а на 8-ногих микроконтроллерах (без кварца). При сильном разбросе температур это все теоретически не очень стабильно себя ведет. Поэтому мне очень желательно свести к минимуму разбежности в обмене хотя бы на стороне контроллера с кварцем. Вот такой бред П.С. А вообще нагуглил вот такой калькулятор (http://www.micromagicsystems.com/#/pic-baud/4523812801), который показывет ошибку при любом кварце - выбирай, какой душа пожелает
...Я для себя макетирую некоторые устройства с приминением софтового UART-а на 8-ногих микроконтроллерах (без кварца)....
Извините за нескромный вопрос: НАХРЕНА? Сложно выбрать контроллер с аппаратным EUSART (к примеру, PIC12F1840 в SOIC-8)? Освоить работу с периферией PIC контроллеров 12-ой серии - пару вечеров (с диким количеством перекуров).
Поколение "некст"... Убить время на поиск "калькулятора" вместо чтения даташита с ПРИМИТИВНОЙ формулой в два арифметических действия... Более того, если применяются два контроллера одной платформы (с одинаковыми модулями UART), то в них вообще не нужно ничего считать. Потому что одинаковые режимы дадут одинаковую скорость.
Я "вечноначинающий" любитель. Уровень моих поделок - мигание светодиодом во всех возможных проявлениях. Я смог достать небольшую партию 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
Просто из этой формулы НАГЛЯДНО НЕ ВИДНО, какой будет % отклонения, высчитывать вручную мне влом. Тем более что это действие возможно пришлось бы повторять в будущем, вот и решил "упростить жизнь" себе, и Вас заодно позадалбывать. Спасибо за внимание
В даташите конкретного ПИКа, имеющего блок(и) последовательного обмена всегда присутствует соответствующая таблица допусков погрешностей/вероятных ошибок. Где-то встречался и алгоритм программной обработки приема/передачи.... Как вариант, программный передатчик был тут (viewtopic.php?p=2593182#p2593182download/file.php?id=236646 )
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к), если это имеет значение.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения