AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
31.05.2019, 01:18
|
|
Прохожий
Регистрация: 31.05.2019
Сообщений: 3
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Помогите разобраться с I2C на avr328p
Добрый день! Помогите разобраться с I2C.
Есть вот такой код.
Код:
|
void TWIInit(void)
{
//set SCL to 400kHz
TWSR = 0x00;
TWBR = 0x0C;
//enable TWI
TWCR = (1‹‹TWEN);
}
void TWIStart(void)
{
TWCR = (1‹‹TWINT)|(1‹‹TWSTA)|(1‹‹TWEN);
while ((TWCR & (1‹‹TWINT)) == 0);
}
//send stop signal
void TWIStop(void)
{
TWCR = (1‹‹TWINT)|(1‹‹TWSTO)|(1‹‹TWEN);
} |
Мои вопросы:
1) Зачем в этих функциях устанавливается 1 ‹‹ TWEN, он же разрешает работу TWI модуля, то есть по идее его достаточно установить один раз с помощью функции TWIinit(), или нет?
2) Еще до меня не дойдет значения бита TWINT. Я прочитал что это флаг прерывания и он устанавливается после каждого действия модуля(start последовательность и тому подобное), чтобы его сбросить надо: 1 ‹‹ TWINT и дальше запускается TWI модуль. Зачем нужен цикл в TWIStart и почему этого цикла нет в TWIStop?
Буду рад примерам работы с I2C (на чистом Си) или какой либо инфе.
Моя цель: научиться читать значение регистров датчиков ардуино(в моем случае это BMP180)
P.S. Объясните пожалуйста более подробно, теорию читал, но на практике
|
|
|
|
31.05.2019, 02:43
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,257
Сказал спасибо: 11,170
Сказали Спасибо 3,858 раз(а) в 2,928 сообщении(ях)
|
Re: Помогите разобраться с I2C на avr328p
Danil_2002, поиск по нужному набору ключевых слов приведёт Вас ко множеству кода для изучения.
И сразу уточняйте чем и в какой версии Вы собираетесь с этим камнем работать, с какими библиотеками,…
Чистый C - это без asm или без ++?
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
|
|
|
|
31.05.2019, 03:16
|
|
Прохожий
Регистрация: 31.05.2019
Сообщений: 3
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Я на древней машине с 7 борюсь. Комп менять надо однако.
извиняюсь, не правильно выразился. под чистым си я имел ввиду что не хочу использовать сторонние библиотеки. Хочу более детально изучить I2C, все функции для работы с I2C самому реализовать.
Еще раз выложу код, а то в первый раз как-то криво получилось и не заметил даже
Код:
|
void TWI_init()
{
TWSR = 0; //
TWBR = 72; // 100kHz
TWCR = (1 ‹‹ TWIE); //
}
void TWI_start() //
{
TWCR = (1 ‹‹ TWINT)|(1 ‹‹ TWSTA)|(1 ‹‹ TWEN); //
while(TWCR&(1 ‹‹ TWINT) == 0);
}
void TWI_stop()
{
TWCR = (1‹‹TWINT)|(1‹‹TWSTO)|(1‹‹TWEN);
}
int main()
{
while(1)
{
}
} |
Последний раз редактировалось mike-y-k; 31.05.2019 в 03:32.
|
|
|
|
31.05.2019, 03:32
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,257
Сказал спасибо: 11,170
Сказали Спасибо 3,858 раз(а) в 2,928 сообщении(ях)
|
Re: Помогите разобраться с I2C на avr328p
Danil_2002, таки выкладывать код лучше весь - никто не будет гадать про остатки снизу и сверху. Сам код в копии с расширением .txt через Расширенный режим-›Управление вложениями - в тексте от части глюков даже noparse не помогает.
Ну и про среду и целевое железо подробности пока забыли.
Писать всю программу одним файлом таки совсем не good practice. Библиотеки совсем не зря придумали. Сразу создайте I2C.c и I2C.h для возможности использовать их в будущем.
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
|
|
|
|
31.05.2019, 04:09
|
|
Прохожий
Регистрация: 31.05.2019
Сообщений: 3
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Помогите разобраться с I2C на avr328p
на вашем форуме нельзя толком код выложить.
|
|
|
|
31.05.2019, 09:51
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,257
Сказал спасибо: 11,170
Сказали Спасибо 3,858 раз(а) в 2,928 сообщении(ях)
|
Re: Помогите разобраться с I2C на avr328p
Danil_2002, скопируйте свой код в файл с расширением .тхт
В окне Быстрый ответ нажмите Расширенный режим.
Снизу выберите Управление вложениями.
В верхнем окне выберите файл с текстом кода и с расширением .txt и загрузите его.
После успешной загрузки внизу Закрыть.
Добавьте ответы на вопросы по поводу использованной среды программирования и все.
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
Последний раз редактировалось mike-y-k; 31.05.2019 в 09:53.
|
|
|
|
31.05.2019, 10:09
|
|
Временная регистрация
Регистрация: 10.11.2016
Сообщений: 53
Сказал спасибо: 6
Сказали Спасибо 16 раз(а) в 13 сообщении(ях)
|
Re: Помогите разобраться с I2C на avr328p
Посмотри код для работы через I2C в прошивке для квадрокоптеров Multiwii (Sensors.cpp) 100% рабочий код (сам на ней летаю). + в ней куча примеров работы со всякими датчиками (guro,accel,baro...)
|
|
|
|
31.05.2019, 23:48
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Помогите разобраться с I2C на avr328p
Сообщение от Danil_2002
|
1) Зачем в этих функциях устанавливается 1 ‹‹ TWEN, он же разрешает работу TWI модуля, то есть по идее его достаточно установить один раз с помощью функции TWIinit(), или нет?
|
Потому, что в коде использована конструкция TWCR = , то есть каждый раз регистр загружается полностью. Для установки отдельного бита в Си используется конструкция TWCR |= (1‹‹ bitname), для сброса TWCR &= ~(1‹‹ bitname).
Почитать об этом можно в учебнике, лучше от авторов языка.
Сообщение от Danil_2002
|
2) Еще до меня не дойдет значения бита TWINT. Я прочитал что это флаг прерывания и он устанавливается после каждого действия модуля(start последовательность и тому подобное), чтобы его сбросить надо: 1 ‹‹ TWINT и дальше запускается TWI модуль.
|
Сбрасывать его нужно предварительно проанализировав причину его взвода, не было ли ошибок при передаче какой-либо части пакета. Об этом в секции "2-wire Serial Interface" даташита.
Сообщение от Danil_2002
|
Зачем нужен цикл в TWIStart и почему этого цикла нет в TWIStop?
|
Это и есть цикл ожидания взвода флага.
Есть ли такой цикл в TWIStop мы не видим, ибо TWIStop как-то внезапно закончилась, так и не начавшись...
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 10:16.
|
|