аппаратный UART PIC16F628A
Re: аппаратный UART PIC16F628A
КРАМ
спасибо за совет про пины, я совсем не догадался про такое решение. Попробую обязательно. По К-шине,- нет, протокол ISO-14230 аналог UART (во всяком случае анализатор в режиме UART его читает), фиксированная скорость в 10400, уровни +12 и 0 в.
спасибо за совет про пины, я совсем не догадался про такое решение. Попробую обязательно. По К-шине,- нет, протокол ISO-14230 аналог UART (во всяком случае анализатор в режиме UART его читает), фиксированная скорость в 10400, уровни +12 и 0 в.
- Реклама
Re: аппаратный UART PIC16F628A
Поступил по совету Крама, сделал светодиодную индикацию, светодиод гаснет, когда приемник принимает нужное число. Так вот, при этом, если это число сделать равным '1000 0010' (0x82, что и должно прийти), индикации приема нет. А если выставить его равным '0000 0010' (как показывает анализатор), то светодиод гаснет, показывая что приходит именно число '0000 0010' (0x02) При этом в Протеусе все работает. В каком направлении двигаться дальше? Попробовать поменять контроллер? Кстати, пробовал с внешним кварцем на 4.433619, результат тот же.
Re: аппаратный UART PIC16F628A
Сегодня попробовал другой контроллер (покупал в другом магазине, чтобы не попались из одной партии). Результат тот же. 0x02 вместо 0x82. У кого есть мысли на этот счет, очень прошу помочь.
- КРАМ
- Друг Кота
- Сообщения: 25259
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: аппаратный UART PIC16F628A
Последний вариант кода выложите (где эхо-приемник)
Re: аппаратный UART PIC16F628A
вот то, что есть сейчас. Комментарии могут быть некорректны, так как много чего изменял. и еще, здесь идет отправка и прием числа 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
вот скриншот полученной посылки. Отправляется 0101 0010

Добавлено after 3 hours 43 minutes 33 seconds:
Победил свою проблему. Если кому интересно, загвоздка была в том, что для передачи использовал переменную DATA_OUT, которую разместил в ячейке 0x10. В то время как в 0 банке регистры общего назначения начинаются с ячейки 0x20
Добавлено after 3 hours 43 minutes 33 seconds:
Победил свою проблему. Если кому интересно, загвоздка была в том, что для передачи использовал переменную DATA_OUT, которую разместил в ячейке 0x10. В то время как в 0 банке регистры общего назначения начинаются с ячейки 0x20
Re: аппаратный UART PIC16F628A
Kavinsky, вы не пробовали читать мануал на МыПыАСМ ?
Узнаете много нового , например о директиве EQU и определении переменных...
Узнаете много нового , например о директиве EQU и определении переменных...
Re: аппаратный UART PIC16F628A
dosikus
Скажу честно, нет. Мануал не читал. Если вам не трудно, в двух словах объясните. Что преступного в том, что я объявляю, допустим, REG1 equ h'0010'? Регистры в файле .INC объявлены точно таким же образом. То есть, как я понимаю (могу ошибаться) так можно присвоить имена хоть всем регистрам общего назначения.
Скажу честно, нет. Мануал не читал. Если вам не трудно, в двух словах объясните. Что преступного в том, что я объявляю, допустим, REG1 equ h'0010'? Регистры в файле .INC объявлены точно таким же образом. То есть, как я понимаю (могу ошибаться) так можно присвоить имена хоть всем регистрам общего назначения.
Re: аппаратный UART PIC16F628A
Нет ничего преступного в equ, есть очевидные пробелы в знаниях о предметной области. Вот, даже перевод есть:
http://www.microchip.ru/files/d-sheets-rus/mpasm.pdf
Речь-же , по всей видимости, кроме упомянутой equ, шла о директиве cblock :
Т.е. после cblock указывается адрес, откуда начинаются пользовательские данные. У 628-го они начинаются именно с адреса 0x20. Таким образом, ошибиться с адресами, расположив свои данные среди служебных регистров ( как у Вас в данном случае ), будет сложнее. Так-что нужно даташиты нужно до начала работы, в крайнем случае, во время работы, а не до
( для 628-го тоже есть на русском: http://www.microchip.ru/files/d-sheets- ... 16f62x.pdf ), ну и на Си переходить, только абстрагировавшись от асм-стиля написания программ.
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
Re: аппаратный UART PIC16F628A
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
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
У микрочипа есть два варианта написания исходника - для абсолютной и относительной адресации.
Оба варианта для своего стиля правильные, а вот смешивать их нельзя - компилятор пошлет подальше.
В одном случае верно применение cblock, в другом целой группы udata (udata_shr, udata_ovr, udata acs).
equ - одинаково применимо в обеих случаях.

Оба варианта для своего стиля правильные, а вот смешивать их нельзя - компилятор пошлет подальше.
В одном случае верно применение cblock, в другом целой группы udata (udata_shr, udata_ovr, udata acs).
equ - одинаково применимо в обеих случаях.
Re: аппаратный UART PIC16F628A
BOB51 , будьте любезны предоставить документ где вы вычитали подобную чушь.
Каким боком объявление именованных констант и резервирование переменных может влиять на адресацию кода во флеш. Может вы наконец начнёте читать и только после прочтения писать?
Вы вероятно думаете, что нубы проглотят вашу хрень и будут смотреть вам в рот?
Каким боком объявление именованных констант и резервирование переменных может влиять на адресацию кода во флеш. Может вы наконец начнёте читать и только после прочтения писать?
Вы вероятно думаете, что нубы проглотят вашу хрень и будут смотреть вам в рот?
Re: аппаратный UART PIC16F628A
Требуется общение по i2c от PiC16F628. У него встроенный usart, можно ли его использовать для этой цели ?
-
veso74
- Поставщик валерьянки для Кота
- Сообщения: 1907
- Зарегистрирован: Сб май 05, 2012 20:24:52
- Откуда: KN34PC, Болгария
- Контактная информация:
Re: аппаратный UART PIC16F628A
Софтуерное I2C в 16F628A работает к каждому пину, использую I2C в CCS, инициализация и вызов находятся в одной строке. USART в данном случае не имеет значения. Как это организуете с выбранным языком программирования и компилятором, зависит от Вас.
Re: аппаратный UART PIC16F628A
I2C подразумевает определенную последовательность фронтов на выводах SDA и SCL для задания состояний start, stop, restart, режим выхода open drain, а так же особый бит ack/noack, и UART это реализовать не может. Поэтому I2C можете реализовать программным способом, дерганием ног с переключением режимов выход/вход


