Albert_V писал(а):..."документ"
http://www.microchip.ru/files/d-sheets- ... 29_675.pdf страница 71
Ну, я человек доверчивый, что прочитал, то и сказал
Albert_V писал(а):..."документ"

Возможно.xterro писал(а):...имеется HEX одной прошивки, возможно ли его дизасемблировать и получить ASM...
Именно так.xterro писал(а):...пойди догадайся, что там эта функция делает
Код: Выделить всё
push macro
movwf w_temp
swapf STATUS,w
movwf status_temp
endm
pop macro
swapf status_temp,w
movwf STATUS
swapf w_temp,f
swapf w_temp,w
endm
RESET_VECTOR code 0h
goto Init
ISR code 4h ; Вектор прерывания
push ; Сохраним контекст
btfsc PIR1,SSPIF
call Receive_I2C_Byte
ISR_end
pop ; Восстановим контекст
retfie
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
Это как ?Пока_без_кота писал(а):с разрешением прерываний по приему старт-бита

Код: Выделить всё
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-а на 8-ногих микроконтроллерах (без кварца)....
Пока_без_кота писал(а):П.С. А вообще нагуглил вот такой калькулятор
Albert_V писал(а):... НАХРЕНА? ...
КРАМ писал(а):... Убить время на поиск "калькулятора" вместо чтения даташита с ПРИМИТИВНОЙ формулой в два арифметических действия ...
Код: Выделить всё
#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
PIC16_HW_UART_udata udata_shr
Temp_FSR res 1
PIC16_HW_UART code
UART_Ini
banksel SPBRG
movlw K ; Загружаем коеф. деления частоты
movwf SPBRG


Код: Выделить всё
Send_TX_byte ; Подпрограмма передачи 1 байта
bcf INTCON,GIE ; Запрещаем прерывания
; bsf_TX ; Предварительно установим TX
bsf TX ; Предварительно установим TX
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
Код: Выделить всё
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