Вопрос по TWI

Здесь принимаются все самые невообразимые вопросы... Главное - не стесняйтесь. Поверьте, у нас поначалу вопросы были еще глупее :)
Jeka-starik
Открыл глаза
Сообщения: 48
Зарегистрирован: Чт апр 07, 2011 11:57:18
Откуда: Санкт-Петербург

Вопрос по TWI

Сообщение Jeka-starik »

Честно говоря не знал в практику или в теорию этот вопрос кидать.
Народ. Я начинающий программист и ламер пока во всём этом деле. Мне поручили освоить этот интерфейс (2-wire) Чтобы наладить связь между Atmega8 и микросхемой DS2782. Плату с микросхемой распаял, подключил к программатору на котором атмега 8 стоит. Закатил программу примерно похожую на то что тут у вас же и прочитал http://www.radiokot.ru/forum/viewtopic.php?f=22&t=43718. Мега у меня мастер и соответственно там тока адрес DS2782 надо было поставить. Но вот воврос. Я когда начинаю ассемблить прогу полученную - у меня в этом месте
;Старт
;TWI.Control=Start
ldi R16,(1<<TWSTA)|(1<<TWINT)|(1<<TWIE)|(1<<TWEN)
out TWCR,R16
;Ожидание выполнения
in R16,TWCR ;TWI.WAIT(TWINT)
sbrs R16,TWINT
rjmp (PC-2)

сначала в R16 заносится 10100101, а потом в регистр TWCR заносится то же число но без единички в бите TWINT и соответственно получается цикл.
Так вот вопрос. Это так и должно быть? И если должно то на каком основании флаг TWINT должен быть сброшен чтоб программа продолжила работу (Моя DS микросхема должна как-то повлиять в соответствии с работой этого интерфейса и всё сработает автоматически или надо в программе писать это). А может атмега микросхему просто не видит...
В общем если навскидку не ответить я могу потом схему и программу свою привести здесь.
[color=#FF0000]Хачу фсё знать!!![/color]
Реклама
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Вопрос по TWI

Сообщение ploop »

И если должно то на каком основании флаг TWINT должен быть сброшен чтоб программа продолжила работу

Она продолжит работу, если бит будет установлен, а не сброшен.
Реклама
Jeka-starik
Открыл глаза
Сообщения: 48
Зарегистрирован: Чт апр 07, 2011 11:57:18
Откуда: Санкт-Петербург

Re: Вопрос по TWI

Сообщение Jeka-starik »

Ну, да - в смысле установлен - очепятка :)
[color=#FF0000]Хачу фсё знать!!![/color]
Jeka-starik
Открыл глаза
Сообщения: 48
Зарегистрирован: Чт апр 07, 2011 11:57:18
Откуда: Санкт-Петербург

Re: Вопрос по TWI

Сообщение Jeka-starik »

В общем так - описываю проблему целиком - может кто поможет...
Есть Атмега8 и Микросхема DS2782 (работающая на интерфейсе 2-wire ) (здесь ссылка на datasheet http://www.maxim-ic.com/datasheet/index ... /4779/t/al ) Распаял я схему на основе эволюшен кита представленного там же. Получилось вот так:
Изображение
Питание подал не от аккума (как потом намереваюсь) а от самой атмеги, стабилитроны пока ставить не стал и сенсорный резистор тоже (так как мерить пока нечего - мне бы связь хотябы организовать). Ну вот.
( Кстати вопрос - в атмеге8 есть подтягивающие резисторы на SDA и SCL ??? Или ставить надо самому)
Текст программы у меня такой:

Код: Выделить всё

; TWI (I2C) Мастер, приём-передача
;результат выводится в порт D
;Подключние файла, объявление имён регистров ATmega8
.include "C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\m8def.inc"
.cseg
.org 0
 ;---------- Вектора прерываний ----------
          rjmp PROG
;----------
;Начало программы
PROG:                          ;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
;Старт
                               ;TWI.Control=Start
   ldi  R16,(1<<TWINT)
   out  TWCR,R16
;ожидание выполнения
   in   R16,TWCR               ;TWI.WAIT(TWINT)
   sbrs R16,TWINT
   rjmp (PC-2)
;Отправка адреса + W
   ldi  R16,$7E               ;TWI.Data=$40
   out  TWDR,R16 
                               ;TWI.Control=DataACK
   ldi  R16,(1<<TWINT)|(1<<TWIE)|(1<<TWEN)|(1<<TWEA)
   out  TWCR,R16
;ожидание выполнения
   in   R16,TWCR               ;TWI.WAIT(TWINT)           
   sbrs R16,TWINT
   rjmp (PC-2)
   ldi  R16,$14                ;TWI.Data=$14
   out  TWDR,R16
                               ;TWI.Control=DataACK
   ldi  R16,(1<<TWINT)|(1<<TWIE)|(1<<TWEN)|(1<<TWEA)
   out  TWCR,R16
;ожидание выполнения
   in   R16,TWCR               ;TWI.WAIT(TWINT)           
   sbrs R16,TWINT
   rjmp (PC-2)
;отправка 1 байта
   ldi  R16,0b10100101                ;TWI.Data=$11
   out  TWDR,R16
                               ;TWI.Control=DataACK
   ldi  R16,(1<<TWINT)|(1<<TWIE)|(1<<TWEN)|(1<<TWEA)
   out  TWCR,R16
;ожидание выполнения 
   in   R16,TWCR               ;TWI.WAIT(TWINT)
   sbrs R16,TWINT
   rjmp (PC-2)
;Стоп
                               ;TWI.Control=Stop
   ldi  R16,(1<<TWSTO)|(1<<TWINT)|(1<<TWIE)|(1<<TWEN)
   out  TWCR,R16
   ldi  R16,$40
   dec  R16
   brne (PC-1)
;Старт
                               ;TWI.Control=Start
   ldi  R16,(1<<TWSTA)|(1<<TWINT)|(1<<TWIE)|(1<<TWEN)
   out  TWCR,R16
   in   R16,TWCR               ;TWI.WAIT(TWINT)
   sbrs R16,TWINT
   rjmp (PC-2)
;Отправка адреса + W
   ldi  R16,$7E                ;TWI.Data=$40
   out  TWDR,R16
                               ;TWI.Control=DataACK
   ldi  R16,(1<<TWINT)|(1<<TWIE)|(1<<TWEN)|(1<<TWEA)
   out  TWCR,R16
;ожидание выполнения
   in   R16,TWCR               ;TWI.WAIT(TWINT)           
   sbrs R16,TWINT
   rjmp (PC-2)
   ldi  R16,$14                ;TWI.Data=$14
   out  TWDR,R16
                               ;TWI.Control=DataACK
   ldi  R16,(1<<TWINT)|(1<<TWIE)|(1<<TWEN)|(1<<TWEA)
   out  TWCR,R16
;ожидание выполнения
   in   R16,TWCR               ;TWI.WAIT(TWINT)           
   sbrs R16,TWINT
   rjmp (PC-2)
;Повстарт
                               ;TWI.Control=Start
   ldi  R16,(1<<TWSTA)|(1<<TWINT)|(1<<TWIE)|(1<<TWEN)
   out  TWCR,R16
   in   R16,TWCR               ;TWI.WAIT(TWINT)
   sbrs R16,TWINT
   rjmp (PC-2)
;Отправка адреса + R
   ldi  R16,$7F                ;TWI.Data=$7F
   out  TWDR,R16
                               ;TWI.Control=DataACK
   ldi  R16,(1<<TWINT)|(1<<TWIE)|(1<<TWEN)|(1<<TWEA)
   out  TWCR,R16
   in   R16,TWCR               ;TWI.WAIT(TWINT)
   sbrs R16,TWINT
   rjmp (PC-2)
;Приём 1 байта (при окончании приёма мастер
;должен выставить на шину NACK)
                               ;TWI.Control=DataNACK
   ldi  R16,(1<<TWINT)|(1<<TWIE)|(1<<TWEN)
   out  TWCR,R16
   in   R16,TWCR               ;TWI.WAIT(TWINT)
   sbrs R16,TWINT
   rjmp (PC-2)
   in   R20,TWDR               ;R20=TWI.Data
   out  PORTD,R20              ;PORTB=R20
;Стоп
                               ;TWI.Control=Stop
   ldi  R16,(1<<TWSTO)|(1<<TWINT)|(1<<TWIE)|(1<<TWEN)
   out  TWCR,R16
   ldi  R16,$40
   dec  R16
   brne (PC-1)
loop: rjmp loop


В общем-то всю мона было не приводить, но на всякий случай написал - мож кто ошибки найдёт серьёзные сразу.

Там в общем я хотел записать в один из регистров микросхемы DS (её slave адрес 7Е, а адрес ячейки в которую хотел сделать запись $14) произвольный байт информации (10100101) а потом считать енго и вывести на индикаторы (Порт D)

В обшем суть проблемы в том что с DS не приходит ответ (прямо с начала программы когда старт формируется). И соответственно флаг TWINT не устанавливается и крутится бесконечный цикл.
Подскажите - мож я схему не так развёл или подозрения на то что DS накрылаь. В общем любая помощь приветствуется.
Последний раз редактировалось Jeka-starik Пн апр 11, 2011 14:46:52, всего редактировалось 1 раз.
[color=#FF0000]Хачу фсё знать!!![/color]
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Вопрос по TWI

Сообщение ploop »

( Кстати вопрос - в атмеге8 есть подтягивающие резисторы на SDA и SCL ??? Или ставить надо самому)

Желательно поставить.

В общем так: надо написать отладочную процедуру, а не зацикливать программу. Есть куда информацию вывести? Табло там, светодиоды, UART?
Возможно не приходит ASK при записи, или частота SCL слишком высока, или еще что-то. Если есть осцилл - вообще замечательно, посмотрите, что на линиях.

Полностью программный TWI мне удалось реализовать за вечер, выводя ошибки на индикатор, аппаратный еще проще. Но с ним правда не работал... Так что ничего там особо сложного нет.
Реклама
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Re: Вопрос по TWI

Сообщение GP1 »

Вот, когда-то делал аппаратный TWI, посмотри может поможет.
Вложения
s16_twi.rar
(911 байт) 257 скачиваний
Чем дальше, тем больше становлюсь занудой...
Изображение
Реклама
Jeka-starik
Открыл глаза
Сообщения: 48
Зарегистрирован: Чт апр 07, 2011 11:57:18
Откуда: Санкт-Петербург

Re: Вопрос по TWI

Сообщение Jeka-starik »

В общем так: надо написать отладочную процедуру

может кто поможет с ней. А то как я писал уже, я пока тока начинаю программировать. А по этому TWI везде всего мало...
[color=#FF0000]Хачу фсё знать!!![/color]
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Вопрос по TWI

Сообщение ploop »

Мало???
Ну хотя-бы это почитай: http://easyelectronics.ru/avr-uchebnyj- ... c-i2c.html
И далее по ссылкам
Jeka-starik
Открыл глаза
Сообщения: 48
Зарегистрирован: Чт апр 07, 2011 11:57:18
Откуда: Санкт-Петербург

Re: Вопрос по TWI

Сообщение Jeka-starik »

Сасибо всем
[color=#FF0000]Хачу фсё знать!!![/color]
Jeka-starik
Открыл глаза
Сообщения: 48
Зарегистрирован: Чт апр 07, 2011 11:57:18
Откуда: Санкт-Петербург

Re: Вопрос по TWI

Сообщение Jeka-starik »

GP1 спасибо за пример. Всё понятно кроме одного момента. Поясни пожалуйста вот это место:

Код: Выделить всё

twi_data:
      ldi   tmp,4
      mov   n0,tmp
      ldi   ZL,low(mls)
      ldi   ZH,high(mls)


Я так понял что Мастер считывает со слейва данные из двухбайтного регистра соответственно low(mls) и High(mls) и пишет их в свой двухбайтный регистр.
Если я не так понял - поправь меня.
[color=#FF0000]Хачу фсё знать!!![/color]
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Вопрос по TWI

Сообщение ploop »

Данные со слейва считываются последовательно, байт за байтом, после приёма каждого байта мастер посылает ASK, либо NASK, если дальше данные не нужны. Эти данные куда-то надо складывать, обычно в буфер в памяти.
ldi ZL,low(mls)
ldi ZH,high(mls)
- эти строки устанавливают указатель на буфер в регистровой паре Z, с которого начинают данные складываться.
Jeka-starik
Открыл глаза
Сообщения: 48
Зарегистрирован: Чт апр 07, 2011 11:57:18
Откуда: Санкт-Петербург

Re: Вопрос по TWI

Сообщение Jeka-starik »

эти строки устанавливают указатель на буфер в регистровой паре Z, с которого начинают данные складываться

В смысле в который они складываются...? Или данные идут через регистр Z транзитом в этот буфер.
Это же буфер в Мастере, я так понял? И вообще Z по моему является индексным регистром... вроде как...
Просто почему спрашиваю - мой компилятор ошибку выдаёт в этом месте - пишет неизвестный символ: mls. Вот и решил поинтересоваться.
[color=#FF0000]Хачу фсё знать!!![/color]
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Вопрос по TWI

Сообщение ploop »

Данные складываются в память. Чтобы их туда сложить, надо знать адрес.
mls - и есть адрес этого блока (задаётся, видимо, в другом файле проекта. Тут только используется). Адрес двухбайтный, поэтому используется регистровая пара. Загружаем в неё адрес

Код: Выделить всё

ldi   ZL,low(mls)
ldi   ZH,high(mls)

Затем читаем или пишем в ячейку по этому адресу
in tmp,TWDR
st Z+,tmp

Z+ означает, что адрес инкрементируется (увеличивается на единицу) после записи в ячейку по этому адресу байта, т.е. значение регистровой пары увеличивается.
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Re: Вопрос по TWI

Сообщение GP1 »

Jeka-starik писал(а):В смысле в который они складываются...? Или данные идут через регистр Z транзитом в этот буфер.
Это же буфер в Мастере, я так понял? И вообще Z по моему является индексным регистром... вроде как...
Просто почему спрашиваю - мой компилятор ошибку выдаёт в этом месте - пишет неизвестный символ: mls. Вот и решил поинтересоваться.

Старик, может ранова-то ты взялся за TWI, может для начала, ну там, про адресацию почитать, что ли, команды ассемблерные посмотреть, ну хотя бы разок, ну хоть одним глазком...
не ... не хочешь? :shock:
а то получается, мы на разных языках разговариваем.

ploop вон уже скоро наизнанку вывернется,пытаясь тебе разъяснить. :)))
Чем дальше, тем больше становлюсь занудой...
Изображение
Jeka-starik
Открыл глаза
Сообщения: 48
Зарегистрирован: Чт апр 07, 2011 11:57:18
Откуда: Санкт-Петербург

Re: Вопрос по TWI

Сообщение Jeka-starik »

Спасибо ещё раз что мне ламеру всё так объяснили. Хотя этот момент я уже сам догнал (со сдвигом адреса). А интересовало что mls не определялось. Но как мне подметили, оно задано, видимо, в другой проге то в принципе задав в начале программы, можно это поправить. Хотя в моём случае такого не надо. у меня всё пока проще. До сих пор не могу организовать обычной связь с микросхемой. Старт формируется (тестером проверял - уровни SDA и SCL падают.) Стоп тоже формируется, а вот дальше после старта, когда в процедуру Wait переходим - там всё циклится. Из-за 0 в бите TWINT. (резюки поставил, всё путём должно быть) но не отзывается слэйв. Вообще этот бит "аппаратно ставиться должен после выполнения очередной операции, когда модуль ожидает отклика со стороны программы" - цитата из учебника. А он не ставится. Вывожу этот регистр WTCR также на индикаторы - не горит ноль в этом бите. Программой его задать не получается...
P.S. Я ещё не достал своими тупыми вопросами?
[color=#FF0000]Хачу фсё знать!!![/color]
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Вопрос по TWI

Сообщение ploop »

P.S. Я ещё не достал своими тупыми вопросами?

Да ладно, все можно подумать с пелёнок на асме пишут :)

Поправь картинку (или во вложение убери), страницу раздвигает.
Jeka-starik
Открыл глаза
Сообщения: 48
Зарегистрирован: Чт апр 07, 2011 11:57:18
Откуда: Санкт-Петербург

Re: Вопрос по TWI

Сообщение Jeka-starik »

Старик, может ранова-то ты взялся за TWI, может для начала, ну там, про адресацию почитать, что ли, команды ассемблерные посмотреть, ну хотя бы разок, ну хоть одним глазком...

Про адресацию читал и основные команды вроде как знаю. Понятно что я не такой ас как вы, поэтому и спрашиваю. Я тут ассемблером неделю тока занимаюсь. До этого вообще к программированию отношения никакого не имел. А поди ты объясни моему начальству что Москва не сразу строилась и программированию за 2 дня научиться тяжело. Им вынь да положь результат. И вот кручусь как могу. Что-то сам допираю, что-то вы мне тут оъясняете. Мне уже по ночам этот TWI снится... :(
Просто у вас тут единственный форум где мне хотябы ответили и помочь пытаются.
[color=#FF0000]Хачу фсё знать!!![/color]
Jeka-starik
Открыл глаза
Сообщения: 48
Зарегистрирован: Чт апр 07, 2011 11:57:18
Откуда: Санкт-Петербург

Re: Вопрос по TWI

Сообщение Jeka-starik »

Уж не знаю, что я там сделал, но флаг в бите TWINT у меня таки после старта втал. :))
Буим работать дальше так как микросхема всё равно не отвечает мне... Ну хоть TWI заработал . уже что-то.
[color=#FF0000]Хачу фсё знать!!![/color]
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Вопрос по TWI

Сообщение ploop »

Много причин может быть, почему слейв не отвечает. Может подвисает при подаче питания, или еще что.
В спецификации IIC (если не ошибаюсь) рекомендуют перед началом работы "подёргать" линией SCL не менее 10 раз, при поднятой SDA. Чтобы привести слейва в чувства.
Например при подаче питания, когда напряжения еще не выровнялись, на перекосы на линиях могут быть расценены как старт или еще что-нибудь подобное...
Jeka-starik
Открыл глаза
Сообщения: 48
Зарегистрирован: Чт апр 07, 2011 11:57:18
Откуда: Санкт-Петербург

Re: Вопрос по TWI

Сообщение Jeka-starik »

Может быть так что он не отвечает потому что я фигово спрашиваю. Подскажите - правильный ли ход моих мыслей - (Слэйв помимо того что имеет свой собственный адрес имеет дофига ячеек со своими адресами) То бишь обращаясь для чтения к одной из ячеек я должен:
1) Сформировать старт
2) Загрузить адрес слэйва с запросом на запись, получить ACK
3) Потом уже непосредственно обратиться к интересующей меня ячейке памяти и вторично получив ACK
4) Сгенерить повстарт
5) Снова загрузить адрес слэйва но уже с запросом на чтение, получить ACK
6) Далее по идее должно начаться чтение с той ячейки которую я указал до повстарта. После приёма каждого байта Мастер отвечает ACK.
7) Приём последнего байта завершаетстя выдачей Мастером NACK.
8) И собсно стоп...
[color=#FF0000]Хачу фсё знать!!![/color]
Ответить

Вернуться в «Теория»