На ассемблере написан пример для работы по интерфейсу 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] - для короткого!!!