Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить

Re: аппаратный UART PIC16F628A

Чт окт 19, 2017 22:39:11

КРАМ
спасибо за совет про пины, я совсем не догадался про такое решение. Попробую обязательно. По К-шине,- нет, протокол ISO-14230 аналог UART (во всяком случае анализатор в режиме UART его читает), фиксированная скорость в 10400, уровни +12 и 0 в.

Re: аппаратный UART PIC16F628A

Вс окт 22, 2017 16:22:15

Поступил по совету Крама, сделал светодиодную индикацию, светодиод гаснет, когда приемник принимает нужное число. Так вот, при этом, если это число сделать равным '1000 0010' (0x82, что и должно прийти), индикации приема нет. А если выставить его равным '0000 0010' (как показывает анализатор), то светодиод гаснет, показывая что приходит именно число '0000 0010' (0x02) При этом в Протеусе все работает. В каком направлении двигаться дальше? Попробовать поменять контроллер? Кстати, пробовал с внешним кварцем на 4.433619, результат тот же.

Re: аппаратный UART PIC16F628A

Пн окт 23, 2017 16:38:15

Сегодня попробовал другой контроллер (покупал в другом магазине, чтобы не попались из одной партии). Результат тот же. 0x02 вместо 0x82. У кого есть мысли на этот счет, очень прошу помочь.

Re: аппаратный UART PIC16F628A

Пн окт 23, 2017 16:47:59

Последний вариант кода выложите (где эхо-приемник)

Re: аппаратный UART PIC16F628A

Пн окт 23, 2017 16:56:46

вот то, что есть сейчас. Комментарии могут быть некорректны, так как много чего изменял. и еще, здесь идет отправка и прием числа 0x02, а вообще изначально было 0x82

Код:
; контроллер - PIC16F628A
#include "p16f628a.inc"
 __CONFIG _FOSC_INTOSCIO & _WDTE_OFF & _PWRTE_OFF & _MCLRE_OFF & _BOREN_OFF & _LVP_OFF & _CPD_OFF & _CP_OFF ; конфигурация контроллера
; объявление регистров
 Reg_3 equ h'0023'
 DATA_OUT equ h'0010'
 DATA_IN equ h'0020'
 ERR equ h'0021'
 COUNT equ h'0022'
 Reg_1 equ h'0011'
 Reg_2 equ h'0012'
 org 0000h
 goto START ; вектор сброса
 
 org 0004h
 retfie ; вектор прерывания
 
 ;основная программа инициализации контроллера
START
 clrw ; сброс W
 bcf STATUS,RP0
 bcf STATUS,RP1 ; переход в банк 0
 movwf INTCON ; запрет всех прерываний
 movwf PIR1; сброс всех флагов прерываний
 bsf STATUS,RP0 ; переход в банк 1
 movwf PIE1 ; запрет прерываний от периферии
 bcf STATUS,RP0 ; переход в банк 0
 
; отключение неиспользуемых модулей
 movlw 07h
 movwf CMCON ; отключение модуля компараторов
 
 clrf T2CON ; отключение таймера 2
 
 clrf CCP1CON ; отключение ШИМ
 
 bsf STATUS,RP0 ; банк 1
 clrf VRCON ; отключение источника опорного напряжения
 
 bcf OPTION_REG,T0CS ;обнуляем бит T0CS, что соответствует тактированию TMR0 от внутреннего сигнала
 
 bcf STATUS,RP0 ;0-й банк       
 clrf T1CON; отключение таймера 1
 
; настройка модуля USART
 bsf STATUS,RP0 ; банк 1
 movlw b'11111110' ;
 movwf TRISB
 movlw b'00011001'
 movwf SPBRG ; 24. скорость обмена - 10400
 
 movlw b'10000111'
 movwf TXSTA ; внутреннее тактирование, 8 разрядная передача, !передача разрешена, асинхронный режим, высокоскоростной режим
 

 
 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
 
 call DELAY_2
 bcf PORTB,RB0
 return
 
 
 
 
 
 
DELAY
; Задержка 100 000 машинных циклов
; Длительность задержки 100 миллисекунд
; Частота задающего генератора 4 МГц

            movlw       .221
            movwf       Reg_1
            movlw       .130
            movwf       Reg_2
            decfsz      Reg_1,F
            goto        $-1
            decfsz      Reg_2,F
            goto        $-3
            nop
            nop
 return
 
; подпрограмма передачи данных по USART
TRANSFER
 btfss PIR1,TXIF ; пуст ли буфер передатчика?
  goto TRANSFER ; если нет, то повторная проверка
 call DELAY
 movf DATA_OUT,w ; иначе считывание значения и копирование в буфер передатчика
 movwf TXREG
 return
 
DELAY_2
 ; Задержка 10 000 000 машинных циклов
; Длительность задержки 10 секунд
; Частота задающего генератора 4 МГц

            movlw       .223
            movwf       Reg_1
            movlw       .187
            movwf       Reg_2
            movlw       .51
            movwf       Reg_3
            decfsz      Reg_1,F
            goto        $-1
            decfsz      Reg_2,F
            goto        $-3
            decfsz      Reg_3,F
            goto        $-5
            nop
            nop
 return
 

 end

Re: аппаратный UART PIC16F628A

Ср окт 25, 2017 21:23:01

вот скриншот полученной посылки. Отправляется 0101 0010
Изображение

Добавлено after 3 hours 43 minutes 33 seconds:
Победил свою проблему. Если кому интересно, загвоздка была в том, что для передачи использовал переменную DATA_OUT, которую разместил в ячейке 0x10. В то время как в 0 банке регистры общего назначения начинаются с ячейки 0x20

Re: аппаратный UART PIC16F628A

Ср ноя 01, 2017 21:11:20

Kavinsky, вы не пробовали читать мануал на МыПыАСМ ?
Узнаете много нового , например о директиве EQU и определении переменных...

Re: аппаратный UART PIC16F628A

Ср ноя 01, 2017 22:53:48

dosikus
Скажу честно, нет. Мануал не читал. Если вам не трудно, в двух словах объясните. Что преступного в том, что я объявляю, допустим, REG1 equ h'0010'? Регистры в файле .INC объявлены точно таким же образом. То есть, как я понимаю (могу ошибаться) так можно присвоить имена хоть всем регистрам общего назначения.

Re: аппаратный UART PIC16F628A

Чт ноя 02, 2017 08:03:20

Нет ничего преступного в 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 ), ну и на Си переходить, только абстрагировавшись от асм-стиля написания программ.

Re: аппаратный UART PIC16F628A

Пт ноя 03, 2017 13:46:49

EQU и CBLOCK работают с именованными константами. Для GPR и SFR это нормально , адреса их фиксированы.
equ - DEFINE AN ASSEMBLER CONSTANT
cblock - DEFINE A BLOCK OF CONSTANTS
Для переменных есть:
udata что определяет начало секции неинициализированных данных
res резервирует (определяет) память под переменную
set присваивает значение переменной

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

MPASM™ Assembler,
MPLINK™ Object Linker,
MPLIB™ Object Librarian
User’s Guide

Re: аппаратный UART PIC16F628A

Пн ноя 06, 2017 14:29:16

У микрочипа есть два варианта написания исходника - для абсолютной и относительной адресации.
Оба варианта для своего стиля правильные, а вот смешивать их нельзя - компилятор пошлет подальше.
В одном случае верно применение cblock, в другом целой группы udata (udata_shr, udata_ovr, udata acs).
equ - одинаково применимо в обеих случаях.
8)

Re: аппаратный UART PIC16F628A

Пт ноя 10, 2017 18:23:44

BOB51 , будьте любезны предоставить документ где вы вычитали подобную чушь.
Каким боком объявление именованных констант и резервирование переменных может влиять на адресацию кода во флеш. Может вы наконец начнёте читать и только после прочтения писать?
Вы вероятно думаете, что нубы проглотят вашу хрень и будут смотреть вам в рот?

Re: аппаратный UART PIC16F628A

Чт май 05, 2022 16:08:41

Требуется общение по i2c от PiC16F628. У него встроенный usart, можно ли его использовать для этой цели ?

Re: аппаратный UART PIC16F628A

Чт май 05, 2022 16:18:33

Софтуерное I2C в 16F628A работает к каждому пину, использую I2C в CCS, инициализация и вызов находятся в одной строке. USART в данном случае не имеет значения. Как это организуете с выбранным языком программирования и компилятором, зависит от Вас.

Re: аппаратный UART PIC16F628A

Чт май 05, 2022 17:33:04

I2C подразумевает определенную последовательность фронтов на выводах SDA и SCL для задания состояний start, stop, restart, режим выхода open drain, а так же особый бит ack/noack, и UART это реализовать не может. Поэтому I2C можете реализовать программным способом, дерганием ног с переключением режимов выход/вход
Ответить