КРАМ спасибо за совет про пины, я совсем не догадался про такое решение. Попробую обязательно. По К-шине,- нет, протокол ISO-14230 аналог UART (во всяком случае анализатор в режиме UART его читает), фиксированная скорость в 10400, уровни +12 и 0 в.
Поступил по совету Крама, сделал светодиодную индикацию, светодиод гаснет, когда приемник принимает нужное число. Так вот, при этом, если это число сделать равным '1000 0010' (0x82, что и должно прийти), индикации приема нет. А если выставить его равным '0000 0010' (как показывает анализатор), то светодиод гаснет, показывая что приходит именно число '0000 0010' (0x02) При этом в Протеусе все работает. В каком направлении двигаться дальше? Попробовать поменять контроллер? Кстати, пробовал с внешним кварцем на 4.433619, результат тот же.
Сегодня попробовал другой контроллер (покупал в другом магазине, чтобы не попались из одной партии). Результат тот же. 0x02 вместо 0x82. У кого есть мысли на этот счет, очень прошу помочь.
Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.
вот то, что есть сейчас. Комментарии могут быть некорректны, так как много чего изменял. и еще, здесь идет отправка и прием числа 0x02, а вообще изначально было 0x82
;основная программа инициализации контроллера START clrw ; сброс W bcf STATUS,RP0 bcf STATUS,RP1 ; переход в банк 0 movwf INTCON ; запрет всех прерываний movwf PIR1; сброс всех флагов прерываний bsf STATUS,RP0 ; переход в банк 1 movwf PIE1 ; запрет прерываний от периферии bcf STATUS,RP0 ; переход в банк 0
bcf STATUS,RP0 ; банк 0 movlw b'11111111' movwf PORTB movlw b'10111000' movwf RCSTA ; USART вкл, 8 разрядный прием, прием запрещен bsf STATUS,RP0 ; банк 1 bsf OPTION_REG,NOT_RBPU ; вкл. подтяжку bsf TXSTA,TXEN ; вкл. передачи bcf STATUS,RP0 ; банк 0
; основной цикл MAIN call DELAY ;подпрограмма отправки запроса movlw b'00000010' ; movwf DATA_OUT ; call DELAY call TRANSFER ; передача 0x82 call DELAY call RECIEVE goto MAIN
; подпрограмма приема запроса RECIEVE clrf COUNT clrf ERR ; обнуление признака ошибки btfss PIR1,RCIF ; пришел ли символ? goto RECIEVE ; если нет то повторная проверка btfss RCSTA,FERR ; была ли ошибка кадрирования? goto CHECK_OERR ; если нет, то проверка переполнения movlw -1 ; иначе фиксирование ошибки CHECK_OERR btfss RCSTA,OERR ; было ли переполнение? goto EXIT ; если нет, то завершение обработки ошибок decf ERR,f ; иначе фиксация ошибки decf ERR,f bcf RCSTA,CREN bsf RCSTA,CREN ; и сброс логики приемника EXIT movf RCREG,w movwf DATA_IN IN bcf STATUS,Z ; проверка 82 movlw b'00000010' subwf DATA_IN, w btfss STATUS,Z bsf PORTB,RB0 btfss STATUS,Z return
; подпрограмма передачи данных по USART TRANSFER btfss PIR1,TXIF ; пуст ли буфер передатчика? goto TRANSFER ; если нет, то повторная проверка call DELAY movf DATA_OUT,w ; иначе считывание значения и копирование в буфер передатчика movwf TXREG return
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
вот скриншот полученной посылки. Отправляется 0101 0010
Добавлено after 3 hours 43 minutes 33 seconds: Победил свою проблему. Если кому интересно, загвоздка была в том, что для передачи использовал переменную DATA_OUT, которую разместил в ячейке 0x10. В то время как в 0 банке регистры общего назначения начинаются с ячейки 0x20
dosikus Скажу честно, нет. Мануал не читал. Если вам не трудно, в двух словах объясните. Что преступного в том, что я объявляю, допустим, REG1 equ h'0010'? Регистры в файле .INC объявлены точно таким же образом. То есть, как я понимаю (могу ошибаться) так можно присвоить имена хоть всем регистрам общего назначения.
Нет ничего преступного в equ, есть очевидные пробелы в знаниях о предметной области. Вот, даже перевод есть: http://www.microchip.ru/files/d-sheets-rus/mpasm.pdf Речь-же , по всей видимости, кроме упомянутой equ, шла о директиве cblock :
Код:
cblock 0x20 name_1, ; name_1 будет иметь адрес 20 name_2, ; name_2 будет иметь адрес 21 name_3 ; name_3 будет иметь адрес 22 endc
Т.е. после cblock указывается адрес, откуда начинаются пользовательские данные. У 628-го они начинаются именно с адреса 0x20. Таким образом, ошибиться с адресами, расположив свои данные среди служебных регистров ( как у Вас в данном случае ), будет сложнее. Так-что нужно даташиты нужно до начала работы, в крайнем случае, во время работы, а не до ( для 628-го тоже есть на русском: http://www.microchip.ru/files/d-sheets- ... 16f62x.pdf ), ну и на Си переходить, только абстрагировавшись от асм-стиля написания программ.
EQU и CBLOCK работают с именованными константами. Для GPR и SFR это нормально , адреса их фиксированы. equ - DEFINE AN ASSEMBLER CONSTANT cblock - DEFINE A BLOCK OF CONSTANTS Для переменных есть: udata что определяет начало секции неинициализированных данных res резервирует (определяет) память под переменную set присваивает значение переменной
Есть и определение локальных переменных есть еще масса всего . Потрудитесь хотя бы начать читать...
У микрочипа есть два варианта написания исходника - для абсолютной и относительной адресации. Оба варианта для своего стиля правильные, а вот смешивать их нельзя - компилятор пошлет подальше. В одном случае верно применение cblock, в другом целой группы udata (udata_shr, udata_ovr, udata acs). equ - одинаково применимо в обеих случаях.
BOB51 , будьте любезны предоставить документ где вы вычитали подобную чушь. Каким боком объявление именованных констант и резервирование переменных может влиять на адресацию кода во флеш. Может вы наконец начнёте читать и только после прочтения писать? Вы вероятно думаете, что нубы проглотят вашу хрень и будут смотреть вам в рот?
Софтуерное I2C в 16F628A работает к каждому пину, использую I2C в CCS, инициализация и вызов находятся в одной строке. USART в данном случае не имеет значения. Как это организуете с выбранным языком программирования и компилятором, зависит от Вас.
I2C подразумевает определенную последовательность фронтов на выводах SDA и SCL для задания состояний start, stop, restart, режим выхода open drain, а так же особый бит ack/noack, и UART это реализовать не может. Поэтому I2C можете реализовать программным способом, дерганием ног с переключением режимов выход/вход
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения