AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
12.12.2018, 12:01
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 6,953
Сказал спасибо: 2,994
Сказали Спасибо 3,174 раз(а) в 2,154 сообщении(ях)
|
Re: USI - есть проскилованные?
Могу послать ассемблерный код, который крутился на tiny2313. Там даже комментарии кое-где есть.
__________________
Экзорцист 40-го уровня.
|
|
|
|
12.12.2018, 14:31
|
|
Почётный гражданин KAZUS.RU
Регистрация: 15.11.2010
Сообщений: 2,379
Сказал спасибо: 338
Сказали Спасибо 328 раз(а) в 253 сообщении(ях)
|
Re: USI - есть проскилованные?
Сообщение от ForcePoint
|
Могу послать ассемблерный код,
|
Зачем посылать? Может здесь выложить? Нам, как говорится, ничто человеческое ни чуждо=)
Я тут поприкидывал на коленке по энергобюджету для тини 24А/44А/84А. В активном режиме она кушает от 250 uA до 500 uA. Timer0 кушает всего 4.4 uA (странно то, что 16-ти битный Timer1 ест в три раза меньше о_О), модуль USI примерно столько же. Поэтому гораздо выгоднее тактироваться от Timer0, а проц загнать в Idle Mode. И даже без разницы, какая частота получиться - чухаем и чухаем потихонечку =)
|
|
|
|
12.12.2018, 19:35
|
|
Почётный гражданин KAZUS.RU
Регистрация: 15.11.2010
Сообщений: 2,379
Сказал спасибо: 338
Сказали Спасибо 328 раз(а) в 253 сообщении(ях)
|
Re: USI - есть проскилованные?
А вот еще что)))
Про USI очень мало в сети, то в тех исходниках, которые вижу (в том числе и AN 310), прием квитанции осуществляется сдвиговым регистром с переводом последнего на прием. А почему они не хотят принимать квитанцию регистром PIN? И не надо делать туда-сюда )))
|
|
|
|
13.12.2018, 11:52
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 6,953
Сказал спасибо: 2,994
Сказали Спасибо 3,174 раз(а) в 2,154 сообщении(ях)
|
Re: USI - есть проскилованные?
Это что-то типа моста UART-SPI/I2C было... Заголовки:
Код:
|
;**** Позиции флагов в stat ****
.equ SPI = 0 ; SPI / !I2C
;* Имена регистров *
.def temp1 = r17
.def temp2 = r18
.def u_data = r19 ; Данные УАПП
.def usi_data= r24 ; Данные USI (SPI/I2C)
.def usi_stat= r25 ; Регистр статуса USI
.def speed_L = r26 ; Скорость USI
.def speed_H = r27 ; Скорость USI
;* Задействованные выводы *
.equ LED = 0 ; Номер разряда порта, подключенного к СИД
.equ LED_PORT= portb
.equ I2CPORT = portb ; Регистр данных порта, используемого для I2C
; Номера выводов, используемых как:
.equ SCLP = 7 ; SCL
.equ SDAP = 5 ; SDA
.equ CE = 6 ; !CE
.equ OE = 4 ; Reset/!OE
.equ SER_EN = 0 ; !SER_EN
;* Interrupt Vectors *
.CSEG
;.....
;.....
.org USI_OVFaddr
rjmp usi_ovf
;.....
;..... |
Низкоуровневая работа с USI:
Код:
|
;**** Позиции флагов usi_stat ****
.equ i2c_ack_get = 2
.equ i2c_complete = 1
.equ spi_complete = 0 ; Завершена передача 4-х байт
.cseg
usi_ovf: ; Обработчик прерывания "Передача через USI завершена"
sbi usisr,USIOIF ; Сброс флага переполнения USI
sbrc stat,SPI
rjmp usi_spi ; SPI
sbr usi_stat,1 ‹‹ i2c_complete
reti
usi_spi: ; Под спойлером - кусок обработчика для SPI
Нажмите, чтобы открыть спойлер
sei
push temp1
in temp1,SREG
push temp1
;; sbrs stat,SPI
;; rjmp usi_i2c ; I2C
in temp1,usidr ; Считать данные и сохранить
st Y+,temp1
cpi YL,25 ; Счётчик/указатель исчерпан? (17)
brne do_spi
sbr usi_stat,1 ‹‹ spi_complete
end_usi_ovf:
pop temp1
out SREG,temp1
pop temp1
reti
do_spi:
ld temp1,Y
out usidr,temp1 ; Новые данные для передачи (21)
rjmp end_usi_ovf
;* Тактирование USI через таймер0 *
usi_clock:
sbi usicr,USITC ; Тактирование USI
out tcnt0,speed_L
wait_usi_clock:
in temp1,tifr
sbrs temp1,TOV0 ; ПРОИЗОШЛО ПЕРЕПОЛНЕНИЕ?
rjmp wait_usi_clock
out tifr,temp1 ; СБРОС ФЛАГА
ret
;* Настройка порта для обмена по I2C.
seep_init:
ldi temp1,(1 ‹‹ USIWM1)|(1 ‹‹ USICS1)|(1 ‹‹ USIOIE)
out usicr,temp1 ; Разрешение USI/I2C
ldi temp1,0xFF
out usidr,temp1
in temp1,i2cport ; Регистры данных и направления
ori temp1,(1 ‹‹ SDAP)|(1 ‹‹ SCLP)
in temp2,i2cport-1
ori temp2,(1 ‹‹ SDAP)|(1 ‹‹ SCLP)
rcall getc
cpi u_data,2
breq mode_2
cpi u_data,3
breq mode_3
cpi u_data,4
brne set_port ; mode_1, OE, CE = Z
ori temp1,(1 ‹‹ OE) ; mode_4, OE=1, CE=1
mode_3: ori temp1,(1 ‹‹ CE) ; mode_3, OE=0, CE=1
mode_2: ori temp2,(1 ‹‹ OE)+(1 ‹‹ CE) ; OE, CE - выходы
; mode_2, OE=0, CE=0, выходы
set_port:
out i2cport,temp1
out i2cport-1,temp2 ; SDAP,SCLP - ODoutputs
sbi usisr,USISIF ; Release SCL by "Start" detector
rcall put_ret
rjmp waitcmd
;* Ожидание освобождения линии SCL ведомым устройством
wait_SCL_high:
sbis I2CPORT-2,SCLP
rjmp wait_SCL_high
small_delay:
ret
;* Передача повторного условия СТАРТ и адреса ведомого.
i2c_rep_start:
cbi I2CPORT,SCLP ; SCL = 0
sbi I2CPORT,SDAP ; SDA = Z
sbi I2CPORT,SCLP ; SCL = Z
rcall wait_SCL_high ; Ожидание освобождения SCL
rcall small_delay
cbi I2CPORT,SDAP ; SDA = 0 ( старт )
rcall small_delay
;* Передача байта по I2C
i2c_write:
out usidr,usi_data
ldi temp1,0xF0 ; Release SCL by "Start"
out usisr,temp1 ; detector and clear counter
cbr usi_stat,(1 ‹‹ i2c_complete)
i2c_clock:
cbi I2CPORT,SCLP ; Тактирование USI
sbi I2CPORT,SDAP ; Release SDA by port - set data by USIDR
rcall small_delay
sbi I2CPORT,SCLP
rcall wait_SCL_high
sbrs usi_stat,i2c_complete ; Обмен завершён?
rjmp i2c_clock
in usi_data,usidr
i2c_ack:
cbi I2CPORT,SCLP ; SCL = 0
sbrc usi_stat,i2c_ack_get ; Если чтение - выдать
rjmp get_ack ; если передача - получить "ACK"
brcs i2c_put_ack_high ; если C=1
cbi I2CPORT,SDAP ; иначе SDA = 0
get_ack:
i2c_put_ack_high:
ldi temp1,0xFF ; Release SDA by USIDR
out usidr,temp1
rcall small_delay
sbi I2CPORT,SCLP ; SCL = Z
rcall wait_SCL_high ; Ожидание освобождения SCL
clc
sbic I2CPORT-2,SDAP ; если SDA = 1
sec ; установить "С"
ret
;* Передача условия СТОП.
seep_stop:
cbi I2CPORT,SCLP ; SCL = 0
cbi I2CPORT,SDAP ; SDA = 0
rcall small_delay
sbi I2CPORT,SCLP ; SCL = Z
rcall wait_SCL_high ; Ожидание освобождения SCL
rcall small_delay
sbi I2CPORT,SDAP ; SDA = Z
ret
;* Освобождение порта после обмена по I2C.
seep_rel:
ldi temp1,0x0
out usicr,temp1 ; Запрещение USI/I2C
ldi temp1,(1 ‹‹ SER_EN)
out i2cport-1,temp1 ; Отключить все, кроме LED
in temp2,i2cport
and temp2,temp1
out i2cport,temp2 ; Всё, кроме LED, в Z
rcall put_ret
rjmp waitcmd |
Работа с I2C EEPROM:
Код:
|
;* Передача условия СТАРТ и адреса ведомого.
seep_start:
rcall getc ; Получить адрес ведомого
mov usi_data,u_data
sbr usi_stat,1 ‹‹ i2c_ack_get
rcall i2c_rep_start ; Передать "старт" и адрес ведомого
answer: brcs far_answer
rcall put_ret ; КОНЕЦ
rjmp waitcmd
far_answer:
rjmp put_err ; Ошибка
;* Передача данных.
seep_write:
rcall getc ; Получить данные
mov usi_data,u_data
sbr usi_stat,1 ‹‹ i2c_ack_get
rcall i2c_write ; Передать данные
rjmp answer ; КОНЕЦ
;* Чтение данных ( с подтверждением или без него ).
seep_rnack:
sec ; NO_ACK
rjmp far_read
seep_rack:
clc ; ACK
far_read:
ser usi_data
cbr usi_stat,1 ‹‹ i2c_ack_get
rcall i2c_write ; Считать данные
mov u_data,usi_data
rcall putc ; Передать данные
rjmp waitcmd ; КОНЕЦ |
__________________
Экзорцист 40-го уровня.
Последний раз редактировалось ForcePoint; 13.12.2018 в 11:57.
Причина: съезжало форматирование на двойном меньше операции сдвига.
|
|
|
|
13.12.2018, 14:45
|
|
Частый гость
Регистрация: 28.02.2008
Сообщений: 19
Сказал спасибо: 1
Сказали Спасибо 19 раз(а) в 12 сообщении(ях)
|
Re: USI - есть проскилованные?
AVR312_TWI_slave.pdf, AVR310.pdf + Saleae Logic Analyzer
И будет Вам счастье!
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 19:48.
|
|