[an error occurred while processing this directive]
Фо экзампл:
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Неофит 29 сентября 2005 г. 15:30
В ответ на: да то понятно!!! я пока без прерываний тока по флагам.... у тебя есть кусок исходника? отправлено <font color=gray>Balda</font> 29 сентября 2005 г. 15:02

Адаптация под USI старой атымеловской аппноты по программной реализации I2C (AVR триста какой-то):

[pre]
;*Настройка порта для обмена по I2C.
seep_init:
ldi temp1,(1<out usicr,temp1 ; Разрешение USI/I2C
ldi temp1,0xFF
out usidr,temp1
in temp1,i2cport ; Регистры данных и направления
ori temp1,(1<in temp2,i2cport-1
ori temp2,(1<out i2cport,temp1
out i2cport-1,temp2 ; SDAP,SCLP - ODoutputs
sbi usisr,USISIF ; Release SCL by "Start" detector
ret

;*Ожидание освобождения линии 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_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
ret
[/pre]
ldi temp1,(1< out i2cport-1,temp1 ; Отключить все, кроме LED

in temp2,i2cport
and temp2,temp1
out i2cport,temp2 ; Всё, кроме LED, в Z

rcall put_ret
rjmp waitcmd

.exit

Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа

Имя (обязательно): 
Пароль: 
E-mail: 
NoIX ключ Запомнить

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru