Первая моя тема В общем я ещё новичек, поигрался с ардуиной и для себя решил начать изучать МК с самого младшего семейства аттини, установил AVR studio 6, ну и как любой новичек сразу уперся в камень)) не могу найти готовую библиотеку для attiny85 для работы с шиной I2C (он же TWI) в режиме мастера. МК мне нужно связать с PCF8574 к которой в свою очередь подключен 7-сегментный индикатор. Знаю что в данном МК нет аппаратной реализации этого интерфейса, поэтому ищу программную, т.e. готовую библиотеку. Нашел либу для ардуины https://github.com/adafruit/TinyWireM , но столкнулся с проблемой компиляции
Error 3 unknown type name 'USI_TWI'
Error 1 unknown type name 'class'
Error 2 expected '=', ',', ';', 'asm' or '__attribute__' before '{' token
я так понимаю эта проблема связана с языками C и С++. т.к. в архиве исходники идут с разрешением .cpp. а в самой avr studio компилируется на С.
есть ли у кого готовая библиотека? или пример реализации подключения по i2c.
З.Ы. Литературы массы перечитал в т.ч. и на данном сайте по данному вопросу, но ещё по уровню не дотягиваю
Пользуюсь сам и могу рекомендовать вам библиотеки Peter Fleury: http://homepage.hispeed.ch/peterfleury/ ... tware.html
Имейте ввиду, что его библиотеки не содержат таймаутов ожидания, поэтому в случае проблем с аппаратурой (неисправность чипов, обрыв проводников и т.п.) могут зависать. В 99.9% случаев это не критично, но иметь ввиду стоит. Да и доделать таймауты не сложно - не так много там циклов "тупого" оджидания битика...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
ARV писал(а):Пользуюсь сам и могу рекомендовать вам библиотеки Peter Fleury: http://homepage.hispeed.ch/peterfleury/ ... tware.html
Имейте ввиду, что его библиотеки не содержат таймаутов ожидания, поэтому в случае проблем с аппаратурой (неисправность чипов, обрыв проводников и т.п.) могут зависать. В 99.9% случаев это не критично, но иметь ввиду стоит. Да и доделать таймауты не сложно - не так много там циклов "тупого" оджидания битика...
Там в описании написано
This I2c library is implemented as a compact assembler software implementation of the I2C protocol
which runs on any AVR (i2cmaster.S) and as a TWI hardware interface for all AVR with built-in TWI hardware (twimaster.c).
В аттини85 ток USI есть с помощью которого можно реализовать TWI, аппаратного TWI в нем нету.
В общем недолго я радовался. в протеусе с микросхемой памяти 24c02 все четко работает, посмотрел как ячейки перезаписваются. А вот с PCF8574 никак не могу заставить работать.A0, A1, A2 подтянуты к земле, адрес микрухи 0х20 получается, но такое ощущение что МК не видит её. На осцилографе все как надо выдается. В чем может быть подвох, никак не могу понять?
Почитайте в инете внимательно, что такое TWI (она же I2C) шина. После этого отпадут многие вопросы. Какой адрес у микросхемы, как шина вообще работает.
[uquote="Demiurg",url="/forum/viewtopic.php?p=3183509#p3183509"]Почитайте в инете внимательно, что такое TWI (она же I2C) шина. После этого отпадут многие вопросы. Какой адрес у микросхемы, как шина вообще работает.[/uquote]
Да я её уже на сто рядов всю перечитал. Товарищ ARV рабочую бибилиотеку посоветовал, она на ассемблере написана, в котором я не особо силен. Так вот там пример есть с микросхемой памяти 24с02, с ней все работает, но на этот же адрес вешаю PCF8574 и тишина.
Неважно, ассемблер или какой другой язык, когда обращаешься к устройству на TWI шине, в функции обращения к устройству как параметр задание адреса устройства. И он задается как есть, то есть, если по даташиту адрес 0b01000000, 0x40, он не может быть другим.
#include <avr/io.h>
#include "i2cmaster.h"
#define PCF8574 0x40 // адрес PCF8574 01000000
int main(void)
{
unsigned char ret;
DDRB = 0xff; // PORTB на выход
i2c_init(); //Инициализируем I2C
ret = i2c_start(PCF8574+I2C_WRITE); // отправляем побитно в SDA 0b01000000+1 режим записи
if ( ret ) {
i2c_stop();
/* не удалось запустить условие запуска, возможно, не найдено ни одного устройства */
}else {
i2c_write(0x46);
i2c_stop();
}
for(;;);