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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Помогите по i2c, вопрос по asm, Подскажите начинающему, не ясны некоторые моменты
ChYM
сообщение Jul 2 2008, 13:51
Сообщение #16


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 9-04-08
Из: Украина, Запорожье
Пользователь №: 36 598



В свое время разбирался с I2C и в атмеловском avr300 нашел ошибку. Точно в каком месте уже не помню. В конце концов все заработало. На шине висели часы DS1307 и AT24C512. Максимальная частота шины для часов 100 кГц, поэтому все устройства на шине работали на 100 кГц.
Пристегиваю кусок ассемблерного кода (почти аналог avr300). Может поможет разобраться.


--------------------
Ковчег был построен дилетантом, профессионалы построили Титаник
Go to the top of the page
 
+Quote Post
Александр Куличо...
сообщение Jul 2 2008, 19:34
Сообщение #17


Местный
***

Группа: Свой
Сообщений: 256
Регистрация: 6-03-06
Из: Украина, г. Винница
Пользователь №: 15 017



Цитата
то получится ожидаемая комбинация 08

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

Цитата
А в чем работаете Вы, в чем моделируете схемы?

JTAG + осциллограф (При написании кода своих ошибок достаточно. А вылавливать глюки еще и симуляторов не охота smile.gif )
Цитата
В свое время разбирался с I2C и в атмеловском avr300 нашел ошибку

Подтверждаю, ошибка была. Тоже исправлял. Правда, давно это было. Позавчера бегло сравнивал авр300 со своим (немного переработанным) кодом - различий с ходу не нашел. Поэтому предположил, что ее исправили. Но на всякий случай еще раз пересмотрю

Добавлено:
Пересмотрел, нашел ошибку в авр300. Она приводит к тому, при чтении что все байты, кроме первого (после адреса слейва) читаются как 0x00. Это связано с тем, что при выдачи мастером ACK в ответ на чтение 1-го байта линия SDA засаживается контроллером на "0" и остается в этом состоянии на протяжении всех последующих чтений.
Для исправления этой ошибки в i2c_read "отпускаю" SDA после спада SCL
Код
  
i2c_read:
    rol    i2cstat; store acknowledge
; (used by i2c_put_ack)
    ldi    i2cdata,0x01; data = 0x01
i2c_read_bit:; do
    sbi    DDRD,SCLP;     force SCL low

;******** Добавлено******************************
    nop; даем время опуститься SCL (300ns)
    nop
    cbi    DDRD,SDAP; отпускаем SDA
;******** ***************************************

    rcall    i2c_hp_delay;    half period delay

    cbi    DDRD,SCLP;    release SCL
    rcall    i2c_hp_delay;    half period delay

    clc;    clear carry flag
    sbic    PIND,SDAP;    if SDA is high
    sec;        set carry flag

    rol    i2cdata;     store data bit
    brcc    i2c_read_bit; while receive register not full


2 V000va:
А почему у Вас над цифрой 1 сигнал SCL "затянут" в сосоянии лог."1"? Вы что, между выдачей на шину адреса slave+i2crd и чтением байта от slave делаете паузу порядка 1/2 такта SCL?
Go to the top of the page
 
+Quote Post
V000va
сообщение Jul 3 2008, 07:15
Сообщение #18


Частый гость
**

Группа: Участник
Сообщений: 87
Регистрация: 23-06-08
Пользователь №: 38 503



Цитата(Александр Куличок @ Jul 2 2008, 22:34) *
А почему у Вас над цифрой 1 сигнал SCL "затянут" в сосоянии лог."1"? Вы что, между выдачей на шину адреса slave+i2crd и чтением байта от slave делаете паузу порядка 1/2 такта SCL?


Нет не далаю я пауз. Это ожидание ack от slave, это он тормозит видимо, а может и Proteus . Nack от master идет без пауз. Спасибо за советы всем откликнувшимся smile.gif . Буду собирать рабочий макет и тестить.
Александр Куличок a14.gif

Сообщение отредактировал V000va - Jul 3 2008, 07:17
Go to the top of the page
 
+Quote Post
Александр Куличо...
сообщение Jul 3 2008, 08:17
Сообщение #19


Местный
***

Группа: Свой
Сообщений: 256
Регистрация: 6-03-06
Из: Украина, г. Винница
Пользователь №: 15 017



Цитата
Это ожидание ack от slave, это он тормозит видимо

Если слейв не успевает (вводит цикл одидания), то он затягивает низкий уровень на сигнале SCK, и мастер должен считывать ACK/NACK только после того, как вырастет сигнал на SCL. То есть, схема чтения ACK/NACK выглядит так:

Мастер
1. садит SCL на "0"
2. отпускает SDA
3. задержка 1/2 периода
4. отпускает SCL
5. ждет, когда состояние пина SCL станет равным 1
6. Считывает SDA (собственно ACK/NACK от слейва)
7. задержка 1/2 периода
Слейв, если не успевает обработать запрос, удерживает сигнал SCL в "0", то есть отпускание мастером SCL на 4 шаге НЕ приводит фронту сигнала на физической линии SCL. Поэтому мастер на 5 шаге и ждет, когда слейв отпустит SCL. Это, кстати, может привести к "зависанию" микроконтроллера на данном участке кода, если по каким-либо причинам линия SCL удерживается в "0"

Дальше вопрос к знающим. Сам не разбирался, а подробно перечитывать документацию от филипса было лень smile.gif :
Слейв в соответствии со стандартом может затягивать SCL только при выдаче ACK/NACK или же когда ему вздумается (например, в процессе чтения из него битов данных)?
Go to the top of the page
 
+Quote Post
V000va
сообщение Jul 3 2008, 09:35
Сообщение #20


Частый гость
**

Группа: Участник
Сообщений: 87
Регистрация: 23-06-08
Пользователь №: 38 503



Спасибо за подробный ответ. smile.gif
Go to the top of the page
 
+Quote Post
V000va
сообщение Jul 25 2008, 12:44
Сообщение #21


Частый гость
**

Группа: Участник
Сообщений: 87
Регистрация: 23-06-08
Пользователь №: 38 503



Подскажите, пишу прогу для работы с ds1307. ПО должно читать время из 1307 и выводить его на дисплей. Собрал аппаратную часть уже. Прогу разбил на 2 части : вывод на дисплей и собственно процедура получения данных по i2c от 1307. Подпрограмму индикации проверил - работает. Добавил туда еще подпрограмму для чтения по i2c - ничего не выодит. Даже подпрограмма индикации не работает. Эмуляция в Proteus кое-как работает, но выводит не понятно что. На аппаратной платформе проверяю - совсем другой результат. Как можно посмотреть чего там по i2c принимается, чего в голове у процессора происходит? Слышал про Jtag, но как и через что его с tiny2313 связать, пока не знаю. Подскажите плз.
Go to the top of the page
 
+Quote Post
MTh
сообщение Jul 25 2008, 14:16
Сообщение #22


Местный
***

Группа: Свой
Сообщений: 234
Регистрация: 28-02-06
Из: Иркутск
Пользователь №: 14 771



Цитата(V000va @ Jul 25 2008, 15:44) *
Подскажите, пишу прогу для работы с ds1307. ПО должно читать время из 1307 и выводить его на дисплей. Собрал аппаратную часть уже. Прогу разбил на 2 части : вывод на дисплей и собственно процедура получения данных по i2c от 1307. Подпрограмму индикации проверил - работает. Добавил туда еще подпрограмму для чтения по i2c - ничего не выодит. Даже подпрограмма индикации не работает. Эмуляция в Proteus кое-как работает, но выводит не понятно что. На аппаратной платформе проверяю - совсем другой результат. Как можно посмотреть чего там по i2c принимается, чего в голове у процессора происходит? Слышал про Jtag, но как и через что его с tiny2313 связать, пока не знаю. Подскажите плз.


С тинькой будут проблемы... Там USI полусофтовый полужелезный монстр. Он не особо хорош в отладке. Рекомендую посмотреть вот этот проект и его исходники: http://ahtoxa.net/micros/tiny/leds/

Там есть "ошибочка"... а потому посмотрите вот тут: http://electronix.ru/forum/index.php?showtopic=50210
Там ведомый но думаю направление будет ясно ))
Также рекомендую сходить на AVRFreaks.net
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jul 25 2008, 14:22
Сообщение #23


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(MTh @ Jul 25 2008, 20:16) *
Там есть "ошибочка"... а потому посмотрите вот тут: http://electronix.ru/forum/index.php?showtopic=50210


Я уже поправилsmile.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
V000va
сообщение Jul 25 2008, 15:10
Сообщение #24


Частый гость
**

Группа: Участник
Сообщений: 87
Регистрация: 23-06-08
Пользователь №: 38 503



Эээ, да мне бы с отладкой разобраться, софт та у меня уже написан. Как можно проверить чего там по i2c передается?
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Jul 25 2008, 15:33
Сообщение #25


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Шина простая до безобразия и, фактически статическая, (если не использовать мультимастер и всё такое что вам не нужно). Наверное поэтому и завоевала такую популярность. Реализовывал на всех процах. Никаких проблем не вызывает. Обычно пишешь - работает.

Если отсутствуют средства отладки, то делашь просто. Паяешь два светодиода, точку останова программную и кнопочку. И пошла родная..... Ещё проще в отладчике - ставишь точку останова и смотришь соответствующие биты порта. Реализация простейшая если программная (аппаратная под AVR фактически не сложнее).

Пишешь Start, Stop, AskW, AskR, ReadB, WriteB + задержку. Далее работа с любым IIC устройством составляется из данных кирпичиков.
Go to the top of the page
 
+Quote Post
MTh
сообщение Jul 27 2008, 23:34
Сообщение #26


Местный
***

Группа: Свой
Сообщений: 234
Регистрация: 28-02-06
Из: Иркутск
Пользователь №: 14 771



Цитата(AHTOXA @ Jul 25 2008, 17:22) *
Я уже поправилsmile.gif


Я для подстраховки smile.gif
Go to the top of the page
 
+Quote Post
V000va
сообщение Jul 29 2008, 07:57
Сообщение #27


Частый гость
**

Группа: Участник
Сообщений: 87
Регистрация: 23-06-08
Пользователь №: 38 503



Все пофиксил, работает. Всем спасибо biggrin.gif
Go to the top of the page
 
+Quote Post

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

 


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


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