Вопрос по TWI
-
Jeka-starik
- Открыл глаза
- Сообщения: 48
- Зарегистрирован: Чт апр 07, 2011 11:57:18
- Откуда: Санкт-Петербург
Re: Вопрос по TWI
у меня там вообще-то зациклено на twi_r1 если приглядишья. Так что второй раз до INIT не дойдёт. То есть по моим прикидкам он должен гонять по кругу старт,адрес, чтение данных и по прерыванию записывать их в порт D. но что то не работаить... 
[color=#FF0000]Хачу фсё знать!!![/color]
- Реклама
- GP1
- Поставщик валерьянки для Кота
- Сообщения: 2401
- Зарегистрирован: Пт май 23, 2008 19:32:22
- Откуда: Россия, Волгоград
- Контактная информация:
Re: Вопрос по TWI
присмотрелся
вообще-то стало еще интересней
1. куда уйдет программа в случае ошибки чтения
2. поскольку "стоп" не формируется никогда, он расположен ниже rjmp twi_r1, до каких пор будут читаться данные?
вообще-то стало еще интересней
1. куда уйдет программа в случае ошибки чтения
2. поскольку "стоп" не формируется никогда, он расположен ниже rjmp twi_r1, до каких пор будут читаться данные?
-
Jeka-starik
- Открыл глаза
- Сообщения: 48
- Зарегистрирован: Чт апр 07, 2011 11:57:18
- Откуда: Санкт-Петербург
Re: Вопрос по TWI
На первый попрос затрудняюсь ответить. Не подумал об этом. Мне казалось что при несовпадении кода регистра статуса с положенным ему он отправляется на обработчик ошибок и далее выход из программы (но может оно так работать не будет - всех ньюансов я пока не знаю)
А по поводу второго вопроса - в теории - пока не вырубят питание. У меня DS-ка измеряет ёмкость аккумулятора (постоянно) и соответственно с определённого регистра надо периодически считывать данные и останавливать этот процесс не собирались. (ну или стоп сделать до rjmp - но не надо ли будет заново весь гемморой с обращением к этой ячейке повторять. Не легче ли просто повстартом)
Если я не прав и так низя - поятсните в чём.
А по поводу второго вопроса - в теории - пока не вырубят питание. У меня DS-ка измеряет ёмкость аккумулятора (постоянно) и соответственно с определённого регистра надо периодически считывать данные и останавливать этот процесс не собирались. (ну или стоп сделать до rjmp - но не надо ли будет заново весь гемморой с обращением к этой ячейке повторять. Не легче ли просто повстартом)
Если я не прав и так низя - поятсните в чём.
[color=#FF0000]Хачу фсё знать!!![/color]
-
Jeka-starik
- Открыл глаза
- Сообщения: 48
- Зарегистрирован: Чт апр 07, 2011 11:57:18
- Откуда: Санкт-Петербург
Re: Вопрос по TWI
Нашёл я кажись ошибку. В регистре TWCR я прерывания разрешил а в купе с флагом I в SREG при установки TWINT чёрте что творится. Но по поводу предыдущего моего поста -таки жду ответа.
[color=#FF0000]Хачу фсё знать!!![/color]
Re: Вопрос по TWI
Маленький совет: в обработчике TIM0_OVF у тебя используется только IN и OUT, которые не затрагивают SREG. Поэтому его сохранять не обязательно, можно только tmp.
- Реклама
- GP1
- Поставщик валерьянки для Кота
- Сообщения: 2401
- Зарегистрирован: Пт май 23, 2008 19:32:22
- Откуда: Россия, Волгоград
- Контактная информация:
Re: Вопрос по TWI
Нда...
чувствуется закоренелая рука мастера
т.е. кроме считывания показаний из некоторой ячейки твоя программа вообще больше ничего делать не будет, ни обрабатывать полученные данные, ни отображать(использовать) нигде не будет, она будет до посинения "пока не вырубят питание" считывать данные, иногда отвлекаясь на обработку прерывания по переполнению таймера, чтобы прочитать значение TWDR и отправить его на выход порта Д
все...
на большее программа, в данном варианте, не способна.
чувствуется закоренелая рука мастера
Jeka-starik писал(а):А по поводу второго вопроса - в теории - пока не вырубят питание. У меня DS-ка измеряет ёмкость аккумулятора (постоянно) и соответственно с определённого регистра надо периодически считывать данные и останавливать этот процесс не собирались. (ну или стоп сделать до rjmp - но не надо ли будет заново весь гемморой с обращением к этой ячейке повторять. Не легче ли просто повстартом)
Если я не прав и так низя - поятсните в чём.
т.е. кроме считывания показаний из некоторой ячейки твоя программа вообще больше ничего делать не будет, ни обрабатывать полученные данные, ни отображать(использовать) нигде не будет, она будет до посинения "пока не вырубят питание" считывать данные, иногда отвлекаясь на обработку прерывания по переполнению таймера, чтобы прочитать значение TWDR и отправить его на выход порта Д
Код: Выделить всё
in tmp,TWDR
out PORTD,tmpвсе...
на большее программа, в данном варианте, не способна.
-
Jeka-starik
- Открыл глаза
- Сообщения: 48
- Зарегистрирован: Чт апр 07, 2011 11:57:18
- Откуда: Санкт-Петербург
Re: Вопрос по TWI
В общем ты меня правильно понял. Тока в будущем это будет не порт D a какой-нить другой регистр с которого мона будет отображать эти данные на компе, например-через com порт.
Вот и ворос. Хватит того что у меня есть для таких целей или надо что-то переделывать?
PS а по поводу мастера зря. Я в этом не разбираюсь почти. (Честно говоря я других вариантов пока не вижу. Сделал всё довольно прямолинейно и без всяких заковырок) И то пока не работает как надо мне.
Вот и ворос. Хватит того что у меня есть для таких целей или надо что-то переделывать?
PS а по поводу мастера зря. Я в этом не разбираюсь почти. (Честно говоря я других вариантов пока не вижу. Сделал всё довольно прямолинейно и без всяких заковырок) И то пока не работает как надо мне.
[color=#FF0000]Хачу фсё знать!!![/color]
-
Jeka-starik
- Открыл глаза
- Сообщения: 48
- Зарегистрирован: Чт апр 07, 2011 11:57:18
- Откуда: Санкт-Петербург
Re: Вопрос по TWI
Ну, в общем добился я работы программы. Пришлось немного поправить. Теперь стоп таки формируется и прерывания работают. В общем, выложу прогу, может кому-то в будущем поможет (
Хотя это врядли - больно ламерская она и не многофункциональная) или если я ещё её модернизировать захочу будет на что ссылаться.
Код: Выделить всё
.include "C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\m8def.inc"
; TWI (I2C) Мастер, приём
;результат выводится в порт D
;Подключние файла, объявление имён регистров ATmega8
.equ TW_START = 0x08
.equ TW_RESTART = 0x10
.equ MT_SLA_ACK = 0x18
.equ MT_DATA_ACK = 0x28
.equ MR_SLA_ACK = 0x40
.equ MR_DATA_ACK = 0x50
.equ MR_DATA_NACK = 0x58
.equ SLA_R = $69
.equ SLA_W = $68
.def tmp = R17
.def tmp1 = R18
.cseg
;---------- Вектора прерываний ----------
.org $00 rjmp INIT
nop
nop
nop
nop
nop
nop
nop
.org $09 rjmp TIM0_OVF
;=============
;Считывание из регистра xx микросхемы DS2782 данных
;=============
twi_r:
; Сформировать старт
ldi tmp,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
out TWCR,tmp
; Ждать окончания операции
rcall wait
; Проверка кода ответа 0x10
cpi tmp,TW_START
brne twi_err
; Если ОК - загрузка и передача адреса
ldi tmp,SLA_W
out TWDR,tmp
ldi tmp,(1<<TWINT)|(1<<TWEN)
out TWCR,tmp
; Ждать окончания операции
rcall wait
; Проверка кода ответа 0x18
cpi tmp,MT_SLA_ACK
brne twi_err
; Если ОК - загрузка указателя адреса
;=============;
; Адрес для считывания!!! ;
;=============;
ldi tmp,$0C
out TWDR,tmp
ldi tmp,(1<<TWINT)|(1<<TWEN)
out TWCR,tmp
; Ждать окончания операции
rcall wait
; Проверка кода ответа 0x28
cpi tmp,MT_DATA_ACK
brne twi_err
; Повторный старт
ldi tmp,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
out TWCR,tmp
; Ждать окончания операции
rcall wait
; Проверка кода ответа 0x10
cpi tmp,TW_RESTART
brne twi_err
; Если ОК - загрузка и передача адреса
ldi tmp,SLA_R
out TWDR,tmp
ldi tmp,(1<<TWINT)|(1<<TWEN)
out TWCR,tmp
; Ждать окончания операции
rcall wait
; Проверка кода ответа 0x18
cpi tmp,MR_SLA_ACK
brne twi_err
; Приём байта c подтверждением
ldi tmp,(1<<TWINT)|(0<<TWEA)|(1<<TWEN)
out TWCR,tmp
; Ждать окончания операции
rcall wait
; Проверка кода 0x58
cpi tmp,MR_DATA_NACK
brne twi_err
; Данные приняты - считать и сохранить.
in tmp1,TWDR
; Сформировать стоп
ldi tmp,(1<<TWINT)|(1<<TWSTO)|(1<<TWEN)
rcall wait
out TWCR,tmp
rjmp twi_r
;Начало программы
INIT: ;PROG
ldi R16,high(RAMEND)
out SPH,R16
ldi R16,low(RAMEND)
out SPL,R16
ldi R16,$FF ;DDRB=$FF
out DDRD,R16
;Инициализация TWI,установка частоты SCL
ldi R16,$20 ;TWI.SCLfreguency=100K(8Mhz)
out TWBR,R16
;Сброс в 0 битов TWPS1:TWPS0 регистра TWSR
in R16,TWSR
andi R16,$FC
out TWSR,R16
sei ; разрешить прерывания
ldi r16,0b00000101 ; загружаем константу
out TCCR0,r16 ; делитель таймера CK/1024
ldi r16,$01
out TIMSK,r16 ; разрешаем прерывание timer0 по переполнению
ldi r16,$00
out TCNT0,r16 ;начальное значение счетчика - 0
rjmp twi_r ; возврат в тело цикла
;========================
; Обработчик ошибок
twi_err:
nop
nop
nop
nop
nop
nop
nop
nop
rjmp twi_end
;========================
; Выход из режима работы с TWI
twi_end:
ldi tmp,0b11100011 ; Произвоьная константа, показывающая что произошёл срыв в программе.
out PORTD,tmp
ret
;========================
; Процедура ожидания завершения операции
;========================
wait:
in tmp,TWCR
sbrs tmp,TWINT
rjmp wait
in tmp,TWSR
andi tmp,0xF8
ret
;========================
; Обработка прерывания
;========================
TIM0_OVF:
out PORTD,tmp1
reti[color=#FF0000]Хачу фсё знать!!![/color]
- GP1
- Поставщик валерьянки для Кота
- Сообщения: 2401
- Зарегистрирован: Пт май 23, 2008 19:32:22
- Откуда: Россия, Волгоград
- Контактная информация:
Re: Вопрос по TWI
Jeka-starik писал(а):...регистр с которого мона будет отображать эти данные на компе, например-через com порт.
если так, тогда мк тебе вообще ненужен, полно схем и софта для подключения устройств подобного типа к компу, а вот если это будет автономное устройство, которое будет получать данные от датчика, обрабатывать их, отображать и управлять чем-либо, вот тогда мк необходим.
так что для начала определись, что за девайс у тебя будет.
-
Jeka-starik
- Открыл глаза
- Сообщения: 48
- Зарегистрирован: Чт апр 07, 2011 11:57:18
- Откуда: Санкт-Петербург
Re: Вопрос по TWI
В конечном итоге устройство будет автономно (в блоке питания георадиолокационного комплекса будет отслеживать текущую ёмкость аккума и отправлять на какой-нибудь индикатор (с ним как раз ещё не определились)). А пока в качестве тестирования буду выводить на комп. Тока у меня тут однобайтный регистр, а мне бы всё-таки двухбайтный нужен. Лан, завтра с ним поработаю. Домой уже пора.
[color=#FF0000]Хачу фсё знать!!![/color]
- GP1
- Поставщик валерьянки для Кота
- Сообщения: 2401
- Зарегистрирован: Пт май 23, 2008 19:32:22
- Откуда: Россия, Волгоград
- Контактная информация:
Re: Вопрос по TWI
а вот в таком разе, применяемый тобой подход к программированию просто не применим.
-
Jeka-starik
- Открыл глаза
- Сообщения: 48
- Зарегистрирован: Чт апр 07, 2011 11:57:18
- Откуда: Санкт-Петербург
- GP1
- Поставщик валерьянки для Кота
- Сообщения: 2401
- Зарегистрирован: Пт май 23, 2008 19:32:22
- Откуда: Россия, Волгоград
- Контактная информация:
Re: Вопрос по TWI
Объясни мне как ты собираешься обрабатывать и выводить на индикацию данные, в каком месте, в бесконечном цикле считывания данных с DS-ки?
-
Jeka-starik
- Открыл глаза
- Сообщения: 48
- Зарегистрирован: Чт апр 07, 2011 11:57:18
- Откуда: Санкт-Петербург
Re: Вопрос по TWI
Я рассчитывал что это можно организовать всё в том же прерывании, ну или в крайнем случае после первого круга после команды стоп до rjmp в начало цикла. Хотя честно говоря, пока даже не знаю как это организовать ибо не работал ещё с этим. Вполне возможно что ты прав и программу переделывать придётся, хотя не хотелось бы... Стока сил на неё и времени угробил.
[color=#FF0000]Хачу фсё знать!!![/color]
-
Jeka-starik
- Открыл глаза
- Сообщения: 48
- Зарегистрирован: Чт апр 07, 2011 11:57:18
- Откуда: Санкт-Петербург
Re: Вопрос по TWI
Всем снова здравствуйте. Вернулся я к TWI.
Возник небольшой вопрос: Программа на TWI вроде бы работает - Регистр TWSR выдаёт нужные результаты (при пошаговой проверке). Проблема в формировании стопа. После него по уму программа отправляется на начало (на формирование старта - ну типа цикл бесконечного считывания с одного и того же регистра) В будущем таймер на прерывания поставлю. Но пока так. Загвоздка в том что после стопа стоит ли вызывать процедуру ожидания (появления флага TWINT)? Или после стопа сразу можно сделать rjmp на начало? У меня просто почему-то дальше прога не работает... Может там камень какой-нить подводный.
P.S. Если требуется - текст программы приведу - он не большой.
P.S. Если требуется - текст программы приведу - он не большой.
[color=#FF0000]Хачу фсё знать!!![/color]
Re: Вопрос по TWI
Здравствуйте. Понадобился аппаратный TWI на меге8, пользуюсь первый раз. Скопировал из даташита пример кода, когда МК - master. Пытался отладить в avrstudio - в четвертой версии регистр состояния TWSR упорно не хочет меняться со значения 0x21, а в шестой - со значения 0xF8. Запустил в протеусе - не работает. Закомментировал проверку регистра TWSR при отправке START (см. третий шаг на скриншоте, в регистре должно быть 0x08) - в протеусе остальная часть заработала
То ли косяки студий, то ли я чего-то не догоняю
Скриншот из даташита под спойлером, START=0x08, MT_SLA_ACK=0x18, MT_DATA_ACK=0x28.

Спойлер
Полный чайник.




