Всем доброе время суток! У меня проблема с DS1307. Использую Мегу16 После инициализации МК произвожу чтение с этой МС раз в секунду таким способом: Первый байт принимаеться каждый раз с новым значением, а второй - постоянно $FF Как принять последовательность из нескольких байт?
call TWI_init ; инитим I2C МК call TWI_stop call TWI_start ldi r16,0b11010001 call TWI_send_adr ldi r16,0 ; r16 используеться для передачи след. ф.-ии значений call TWI_send_data call get_byte1 ; При приеме первого байта считываеться случаqное число регистра данных TWI call get_byte2 ; При приеме второго байта постоянно принимается $FF call TWI_stop .. .. .. TWI_init: ldi r16,(0<<TWPS0)|(1<<TWPS1) out TWSR,r16 ldi r16,9 ; битрейт при частоте 8МГц меньше 100кГц out TWBR,r16 ldi r16,(1<<TWEA)|(1<<TWEN)|(0<<TWIE); out TWCR,r16 ret ; ; TWI_start:
ldi r16, (1<<TWINT)|(1<<TWSTA)|(1<<TWEN) out TWCR, r16; формирование режима START waitST: in r16,TWCR ; Проверка бита TWINT sbrs r16,TWINT rjmp waitST ; Не получен TWINT - цикл
RETURN: ret
TWI_send_adr:
// проверим, что предидущее состояние было старт // в регистре r16 содержится адрес адрессуемого устройства push r16
in r16,TWSR ; Проверка кода ответа andi r16,0xF8 cpi r16,$08 breq dalee11 cpi r16,$10 breq dalee11 ; Правильный код -выход из подпрограммы brne TWI_error ; Нет - повтор.
dalee11: pop r16 out TWDR, r16 ldi r16, (1<<TWEA)|(1<<TWINT)|(1<<TWEN)|(0<<TWIE) out TWCR, r16
wait2: in r16,TWCR sbrs r16,TWINT rjmp wait2 // передача не происходит? или установка флага не происходит из-за другой причины? in r16,TWSR andi r16, 0xF8 cpi r16, $18 breq tsa_00 cpi r16, $40 brne TWI_ERROR tsa_00: ret ; get_byte1: in r16,TWCR sbrs r16,TWINT rjmp get_byte1 in r16,twdr ldi XH,high(secs_twi1) ldi XL,low(secs_twi1) st x,r16 // Секунды в БЦД формате записали ldi r16,(1<<TWEA)|(1<<TWINT)|(1<<TWEN)|(0<<TWIE) out TWCR,r16 ret ; ; get_byte2: in r16,TWCR sbrs r16,TWINT rjmp get_byte2 in r16,twdr ldi XH,high(secs_twi2) ldi XL,low(secs_twi2) st x,r16 // Секунды в БЦД формате записали ldi r16,(1<<TWEA)|(1<<TWINT)|(1<<TWEN)|(0<<TWIE) out TWCR,r16 ret ; TWI_send_data: out TWDR, r16 ldi r16, (0<<TWEA)|(1<<TWINT)|(1<<TWEN)|(1<<TWIE) out TWCR, r16; wait3: sei nop cli in r16,TWCR sbrs r16,TWINT rjmp wait3 in r16,TWSR andi r16, 0xF8 cpi r16, $28;MT_DATA_ACK breq tsa_01 cpi r16,$58 breq tsa_01 cpi r16,$50 brne TWI_error TSA_01: ret
Сообщение отредактировал AVRdeveloper - Jul 24 2008, 12:44
|