реклама на сайте
подробности

 
 
> AVR atmel studio 6.0, в симуляторе не работает интерфейс TWI
Valentin_U
сообщение Jan 24 2015, 04:19
Сообщение #1





Группа: Новичок
Сообщений: 3
Регистрация: 24-01-15
Пользователь №: 84 744



На ассемблере написан пример для работы по интерфейсу TWI.
В atmel Studio 6.0, при выполнении кода в симуляторе, данные в регистры TWI загружаются, как указано в описании. После записи команды “старт” в регистр TWI,
состояние на выходах порта D не меняется, и прерывание не выполняется.
Подозрение, что в atmel studio 6.0 (6.2) не работает симуляция данного протокола.
В чем причина данной ситуации. Как решить данную проблему?

CODE
/*
* i2c_new.asm
*
* Created: 18.01.2015 17:08:02
* Author: Admin
*/
.DEVICE ATMEGA2560

.CSEG
.ORG 0000
JMP start

.CSEG
.ORG 0x004e
rjmp Int_TWI

nop
.CSEG
.ORG 0x0100
start:
cli ; запретить прерывания
ldi r16, high(RAMEND) ; конечный адр ОЗУ
out SPH, r16 ; загрузить регистр H стека
ldi r16, low(RAMEND) ; конечный адр ОЗУ
out SPL, r16 ; загрузить регистр L стека
;========================== ========================
startt_1:
rcall TWI_init_100 //Инициализируем интерфейс TWI на 100 000

rcall TWI_start // разреш прерыв и посылаем стоп
ttt: nop
sei ; разрешить все прерывания
nop
nop
nop
rjmp ttt
;----------------------------------------
; ======== обработка прерывания от TWI ==============
Int_TWI: ; Прерыв_39, 0x04E, прерывание от TWI
.def temp17 = r17
.def temp16 = r16
cli ; запретить прерывания
Int_twi_1:
lds temp17, TWSR ; регистр статуса TWI
nop
rjmp Int_twi_1
;----------------------------
; ПРОЦЕДУРЫ РАБОТЫ С TWI

TWI_init_100: //Инициализация TWI на скорости 100 000 б/сек
; TWBR =((Fcpu/Fi2c)-16)/(2*4^twps)
; TWBR =((16000000/100000)-16)/(2*4^0)=72 (0x48) (0b0100 1000)
cli
ldi temp16, 0x12 ; 2 мл бита в TWSR 0b01 0010,2бита в рег TWSR
sts TWBR, temp16 ;адр 0xB8 рег скорости
ldi temp16,(0<<TWPS1)|(0<<TWPS0)
sts TWSR,temp16 ;адр 0xB9, 2 бита рег скорости
ret
; ------------------------------------------------
TWI_start: //Передача стартовой посылки
ldi temp16,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)|(1<<TWIE)
; сброс | уст стоп | раз.раб | раз прерыв
sts TWCR, temp16 ; рег управл адр 0хBC
ret
;----------------------------------------------------
TWI_stop: //Отправляет стоповую посылку
ldi temp16, (1<<TWINT)|(1<<TWEN)|(1<<TWSTO)|(1<<TWIE)
sts TWCR, temp16 ;адр 0xBC
ret


Сообщение отредактировал IgorKossak - Jan 24 2015, 20:42
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 21:25
Рейтинг@Mail.ru


Страница сгенерированна за 0.01347 секунд с 7
ELECTRONIX ©2004-2016