Attiny85, I2C и расширитель портов PCF8574

forfrends
Offline
Зарегистрирован: 24.02.2015

Всем привет! Делаю небольшое устройство на Attiny85. К МК нужно подключить 6 расширителей портов PCF8574. 

Для работы с PCF8574 я установил библиотеку A85_PCF8574: https://github.com/debsahu/A85_PCF8574

Так же я установил зависимую библиотеку TinyWireM: https://github.com/adafruit/TinyWireM

Ядер для Attiny85 есть очень много... вот список: https://github.com/arduino/Arduino/wiki/Unofficial-list-of-3rd-party-boards-support-urls

Я установил 2 ядра:
ATtinyhttps://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json
ATFlashhttps://mesom.de/atflash/package_atflash_index.json

Накидал простой пример:

#include <A85_PCF8574.h>
// SDA - P0 - 0 // CLK - P2 - 2
#define PCF8574_ADDRESS (0x20)
A85_PCF8574 myPCF8574;
 
void setup()
{
  myPCF8574.begin(PCF8574_ADDRESS);
}
 
void loop()
{
    myPCF8574.setBit(0, 0);
    _delay_ms(1000);
    myPCF8574.setBit(0, 1);
    _delay_ms(1000);
}

По сути это простой "Блинк" на пине P0 PCF8574. Компилирую в Ардуино ИДЕ, прошиваю через USBASP.
Настройки Ардуино: Attiny85, Clock: internal 8 Mhz
Фьюзы установлены следующие: High:0xDF; Low: 0xE2
у Attiny85 никакой обвязки нет кроме питания и подключенной PCF8574.

Но не работает. Пробовал оба ядра - результата нет. Посмотрел осциллографом - Сигнал на линиях SDA и SCL отсутствует. 

Распаковал новый МК, прошил - то же самое. При этом если прошить обычный Блинк и подключить светодиод к МК то работает, светодиод мигает. Немного модифицировал пример:

#include <A85_PCF8574.h>
// SDA - P0 - 0 // CLK - P2 - 2
#define PCF8574_ADDRESS (0x20)
A85_PCF8574 myPCF8574;
 
void setup()
{
  myPCF8574.begin(PCF8574_ADDRESS);
  pinMode(1, OUTPUT);
}
 
void loop()
{
    myPCF8574.setBit(0, 0);
    digitalWrite(1, HIGH);   // turn the LED on (HIGH is the voltage level)
    _delay_ms(1000);
    myPCF8574.setBit(0, 1);
    digitalWrite(1, LOW);    // turn the LED off by making the voltage LOW
    _delay_ms(1000);
}

На пине PB1 есть "мигание", а на пинах PB0 и PB2 (SDA и SCL) - тишина... Можете подсказать что я не так делаю? Почему не работает? Как это можно исправить?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

где у тебя SoftWire инициализируется?  Вот это вот хде? 

TinyWireM.begin()

forfrends
Offline
Зарегистрирован: 24.02.2015

Добавлю еще: Может есть способ для подключения "стандартных" библиотек? Так как много раз натыкался на подобные статьи: https://create.arduino.cc/projecthub/Samhain/pcf8574-expander-with-4-inputs-4-outputs-9a80ef

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

А если использовать код "как есть", то получаю много ошибок (ВНИМАНИЕ! большой спойлер!):

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c: In function 'twi_init':

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:88:16: error: 'SDA' undeclared (first use in this function)

   digitalWrite(SDA, 1);

                ^~~

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:88:16: note: each undeclared identifier is reported only once for each function it appears in

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:89:16: error: 'SCL' undeclared (first use in this function); did you mean 'SPL'?

   digitalWrite(SCL, 1);

                ^~~

                SPL

In file included from c:\users\�����\appdata\local\arduino15\packages\arduino\tools\avr-gcc\7.3.0-atmel3.6.1-arduino7\avr\include\avr\io.h:99:0,

                 from C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:26:

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:92:7: error: 'TWSR' undeclared (first use in this function); did you mean 'ACSR'?

   cbi(TWSR, TWPS0);

       ^

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:92:3: note: in expansion of macro 'cbi'

   cbi(TWSR, TWPS0);

   ^~~

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:92:13: error: 'TWPS0' undeclared (first use in this function); did you mean 'TWSR'?

   cbi(TWSR, TWPS0);

             ^

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:92:3: note: in expansion of macro 'cbi'

   cbi(TWSR, TWPS0);

   ^~~

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:93:13: error: 'TWPS1' undeclared (first use in this function); did you mean 'TWPS0'?

   cbi(TWSR, TWPS1);

             ^

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:93:3: note: in expansion of macro 'cbi'

   cbi(TWSR, TWPS1);

   ^~~

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:94:3: error: 'TWBR' undeclared (first use in this function); did you mean 'TWSR'?

   TWBR = ((F_CPU / TWI_FREQ) - 16) / 2;

   ^~~~

   TWSR

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:102:3: error: 'TWCR' undeclared (first use in this function); did you mean 'TWBR'?

   TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA);

   ^~~~

   TWBR

In file included from c:\users\�����\appdata\local\arduino15\packages\arduino\tools\avr-gcc\7.3.0-atmel3.6.1-arduino7\avr\include\avr\io.h:99:0,

                 from C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:26:

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:102:14: error: 'TWEN' undeclared (first use in this function); did you mean 'TWCR'?

   TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA);

              ^

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:102:26: error: 'TWIE' undeclared (first use in this function); did you mean 'TWEN'?

   TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA);

                          ^

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:102:38: error: 'TWEA' undeclared (first use in this function); did you mean 'TWEN'?

   TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA);

                                      ^

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c: In function 'twi_disable':

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:114:3: error: 'TWCR' undeclared (first use in this function); did you mean 'EECR'?

   TWCR &= ~(_BV(TWEN) | _BV(TWIE) | _BV(TWEA));

   ^~~~

   EECR

In file included from c:\users\�����\appdata\local\arduino15\packages\arduino\tools\avr-gcc\7.3.0-atmel3.6.1-arduino7\avr\include\avr\io.h:99:0,

                 from C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:26:

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:114:17: error: 'TWEN' undeclared (first use in this function); did you mean 'TWCR'?

   TWCR &= ~(_BV(TWEN) | _BV(TWIE) | _BV(TWEA));

                 ^

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:114:29: error: 'TWIE' undeclared (first use in this function); did you mean 'TWEN'?

   TWCR &= ~(_BV(TWEN) | _BV(TWIE) | _BV(TWEA));

                             ^

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:114:41: error: 'TWEA' undeclared (first use in this function); did you mean 'TWEN'?

   TWCR &= ~(_BV(TWEN) | _BV(TWIE) | _BV(TWEA));

                                         ^

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:117:16: error: 'SDA' undeclared (first use in this function)

   digitalWrite(SDA, 0);

                ^~~

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:118:16: error: 'SCL' undeclared (first use in this function); did you mean 'SPL'?

   digitalWrite(SCL, 0);

                ^~~

                SPL

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c: In function 'twi_setAddress':

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:130:3: error: 'TWAR' undeclared (first use in this function); did you mean 'TIFR'?

   TWAR = address << 1;

   ^~~~

   TIFR

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c: In function 'twi_setFrequency':

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:141:3: error: 'TWBR' undeclared (first use in this function); did you mean 'TIFR'?

   TWBR = ((F_CPU / frequency) - 16) / 2;

   ^~~~

   TIFR

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c: In function 'twi_readFrom':

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:204:7: error: 'TWDR' undeclared (first use in this function); did you mean 'DWDR'?

       TWDR = twi_slarw;

       ^~~~

       DWDR

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:209:13: error: 'TWCR' undeclared (first use in this function); did you mean 'TWDR'?

     } while(TWCR & _BV(TWWC));

             ^~~~

             TWDR

In file included from c:\users\�����\appdata\local\arduino15\packages\arduino\tools\avr-gcc\7.3.0-atmel3.6.1-arduino7\avr\include\avr\io.h:99:0,

                 from C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:26:

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:209:24: error: 'TWWC' undeclared (first use in this function); did you mean 'TWCR'?

     } while(TWCR & _BV(TWWC));

                        ^

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:210:16: error: 'TWINT' undeclared (first use in this function)

     TWCR = _BV(TWINT) | _BV(TWEA) | _BV(TWEN) | _BV(TWIE); // enable INTs, but not START

                ^

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:210:29: error: 'TWEA' undeclared (first use in this function); did you mean 'TWWC'?

     TWCR = _BV(TWINT) | _BV(TWEA) | _BV(TWEN) | _BV(TWIE); // enable INTs, but not START

                             ^

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:210:41: error: 'TWEN' undeclared (first use in this function); did you mean 'TWEA'?

     TWCR = _BV(TWINT) | _BV(TWEA) | _BV(TWEN) | _BV(TWIE); // enable INTs, but not START

                                         ^

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:210:53: error: 'TWIE' undeclared (first use in this function); did you mean 'TWEN'?

     TWCR = _BV(TWINT) | _BV(TWEA) | _BV(TWEN) | _BV(TWIE); // enable INTs, but not START

                                                     ^

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:213:65: error: 'TWSTA' undeclared (first use in this function); did you mean 'TWEA'?

     TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA) | _BV(TWINT) | _BV(TWSTA);

                                                                 ^

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c: In function 'twi_writeTo':

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:301:7: error: 'TWDR' undeclared (first use in this function); did you mean 'DWDR'?

       TWDR = twi_slarw;

       ^~~~

       DWDR

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:306:13: error: 'TWCR' undeclared (first use in this function); did you mean 'TWDR'?

     } while(TWCR & _BV(TWWC));

             ^~~~

             TWDR

In file included from c:\users\�����\appdata\local\arduino15\packages\arduino\tools\avr-gcc\7.3.0-atmel3.6.1-arduino7\avr\include\avr\io.h:99:0,

                 from C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:26:

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:306:24: error: 'TWWC' undeclared (first use in this function); did you mean 'TWCR'?

     } while(TWCR & _BV(TWWC));

                        ^

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:307:16: error: 'TWINT' undeclared (first use in this function)

     TWCR = _BV(TWINT) | _BV(TWEA) | _BV(TWEN) | _BV(TWIE); // enable INTs, but not START

                ^

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:307:29: error: 'TWEA' undeclared (first use in this function); did you mean 'TWWC'?

     TWCR = _BV(TWINT) | _BV(TWEA) | _BV(TWEN) | _BV(TWIE); // enable INTs, but not START

                             ^

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:307:41: error: 'TWEN' undeclared (first use in this function); did you mean 'TWEA'?

     TWCR = _BV(TWINT) | _BV(TWEA) | _BV(TWEN) | _BV(TWIE); // enable INTs, but not START

                                         ^

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:307:53: error: 'TWIE' undeclared (first use in this function); did you mean 'TWEN'?

     TWCR = _BV(TWINT) | _BV(TWEA) | _BV(TWEN) | _BV(TWIE); // enable INTs, but not START

                                                     ^

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:310:65: error: 'TWSTA' undeclared (first use in this function); did you mean 'TWEA'?

     TWCR = _BV(TWINT) | _BV(TWEA) | _BV(TWEN) | _BV(TWIE) | _BV(TWSTA); // enable INTs

                                                                 ^

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c: In function 'twi_reply':

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:397:5: error: 'TWCR' undeclared (first use in this function); did you mean 'EECR'?

     TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWINT) | _BV(TWEA);

     ^~~~

     EECR

In file included from c:\users\�����\appdata\local\arduino15\packages\arduino\tools\avr-gcc\7.3.0-atmel3.6.1-arduino7\avr\include\avr\io.h:99:0,

                 from C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:26:

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:397:16: error: 'TWEN' undeclared (first use in this function); did you mean 'TWCR'?

     TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWINT) | _BV(TWEA);

                ^

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:397:28: error: 'TWIE' undeclared (first use in this function); did you mean 'TWEN'?

     TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWINT) | _BV(TWEA);

                            ^

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:397:40: error: 'TWINT' undeclared (first use in this function); did you mean 'TWIE'?

     TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWINT) | _BV(TWEA);

                                        ^

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:397:53: error: 'TWEA' undeclared (first use in this function); did you mean 'TWEN'?

     TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWINT) | _BV(TWEA);

                                                     ^

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c: In function 'twi_stop':

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:412:3: error: 'TWCR' undeclared (first use in this function); did you mean 'EECR'?

   TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA) | _BV(TWINT) | _BV(TWSTO);

   ^~~~

   EECR

In file included from c:\users\�����\appdata\local\arduino15\packages\arduino\tools\avr-gcc\7.3.0-atmel3.6.1-arduino7\avr\include\avr\io.h:99:0,

                 from C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:26:

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:412:14: error: 'TWEN' undeclared (first use in this function); did you mean 'TWCR'?

   TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA) | _BV(TWINT) | _BV(TWSTO);

              ^

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:412:26: error: 'TWIE' undeclared (first use in this function); did you mean 'TWEN'?

   TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA) | _BV(TWINT) | _BV(TWSTO);

                          ^

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:412:38: error: 'TWEA' undeclared (first use in this function); did you mean 'TWEN'?

   TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA) | _BV(TWINT) | _BV(TWSTO);

                                      ^

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:412:50: error: 'TWINT' undeclared (first use in this function); did you mean 'TWIE'?

   TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA) | _BV(TWINT) | _BV(TWSTO);

                                                  ^

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:412:63: error: 'TWSTO' undeclared (first use in this function)

   TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA) | _BV(TWINT) | _BV(TWSTO);

                                                               ^

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c: In function 'twi_releaseBus':

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:444:3: error: 'TWCR' undeclared (first use in this function); did you mean 'EECR'?

   TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA) | _BV(TWINT);

   ^~~~

   EECR

In file included from c:\users\�����\appdata\local\arduino15\packages\arduino\tools\avr-gcc\7.3.0-atmel3.6.1-arduino7\avr\include\avr\io.h:99:0,

                 from C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:26:

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:444:14: error: 'TWEN' undeclared (first use in this function); did you mean 'TWCR'?

   TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA) | _BV(TWINT);

              ^

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:444:26: error: 'TWIE' undeclared (first use in this function); did you mean 'TWEN'?

   TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA) | _BV(TWINT);

                          ^

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:444:38: error: 'TWEA' undeclared (first use in this function); did you mean 'TWEN'?

   TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA) | _BV(TWINT);

                                      ^

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:444:50: error: 'TWINT' undeclared (first use in this function); did you mean 'TWIE'?

   TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA) | _BV(TWINT);

                                                  ^

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c: In function 'twi_handleTimeout':

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:475:29: error: 'TWBR' undeclared (first use in this function); did you mean 'TIFR'?

     uint8_t previous_TWBR = TWBR;

                             ^~~~

                             TIFR

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:476:29: error: 'TWAR' undeclared (first use in this function); did you mean 'TWBR'?

     uint8_t previous_TWAR = TWAR;

                             ^~~~

                             TWBR

In file included from c:\users\�����\appdata\local\arduino15\packages\arduino\tools\avr-gcc\7.3.0-atmel3.6.1-arduino7\avr\include\compat\twi.h:36:0,

                 from C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:29:

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c: In function 'TWI_vect':

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:505:10: error: 'TWSR' undeclared (first use in this function); did you mean 'ACSR'?

   switch(TW_STATUS){

          ^

In file included from c:\users\�����\appdata\local\arduino15\packages\arduino\tools\avr-gcc\7.3.0-atmel3.6.1-arduino7\avr\include\avr\io.h:99:0,

                 from C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:26:

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:505:10: error: 'TWS7' undeclared (first use in this function); did you mean 'TWSR'?

   switch(TW_STATUS){

          ^

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:505:10: error: 'TWS6' undeclared (first use in this function); did you mean 'TWS7'?

   switch(TW_STATUS){

          ^

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:505:10: error: 'TWS5' undeclared (first use in this function); did you mean 'TWS6'?

   switch(TW_STATUS){

          ^

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:505:10: error: 'TWS4' undeclared (first use in this function); did you mean 'TWS5'?

   switch(TW_STATUS){

          ^

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:505:10: error: 'TWS3' undeclared (first use in this function); did you mean 'TWS4'?

   switch(TW_STATUS){

          ^

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:510:7: error: 'TWDR' undeclared (first use in this function); did you mean 'TWSR'?

       TWDR = twi_slarw;

       ^~~~

       TWSR

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:530:10: error: 'TWCR' undeclared (first use in this function); did you mean 'TWDR'?

          TWCR = _BV(TWINT) | _BV(TWSTA)| _BV(TWEN) ;

          ^~~~

          TWDR

In file included from c:\users\�����\appdata\local\arduino15\packages\arduino\tools\avr-gcc\7.3.0-atmel3.6.1-arduino7\avr\include\avr\io.h:99:0,

                 from C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:26:

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:530:21: error: 'TWINT' undeclared (first use in this function)

          TWCR = _BV(TWINT) | _BV(TWSTA)| _BV(TWEN) ;

                     ^

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:530:34: error: 'TWSTA' undeclared (first use in this function); did you mean 'TWS3'?

          TWCR = _BV(TWINT) | _BV(TWSTA)| _BV(TWEN) ;

                                  ^

C:\Users\�����\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire\src\utility\twi.c:530:46: error: 'TWEN' undeclared (first use in this function); did you mean 'TWINT'?

          TWCR = _BV(TWINT) | _BV(TWSTA)| _BV(TWEN) ;

                                              ^

exit status 1
Ошибка компиляции для платы ATtiny25/45/85.

 

forfrends
Offline
Зарегистрирован: 24.02.2015

DetSimen, инициализируется в самой библиотеке A85_PCF8574. Если заглянуть в функцию myPCF8574.begin то там есть инициализация TinyWireM. И да, я пробоал выносить инициализацию в основной код:

#include <A85_PCF8574.h>
#include <TinyWireM.h> 
// SDA - P0 - 0 // CLK - P2 - 2
#define PCF8574_ADDRESS (0x20)
A85_PCF8574 myPCF8574;
 
void setup()
{
  TinyWireM.begin();                    // initialize I2C lib
  myPCF8574.begin(PCF8574_ADDRESS);
...

Но результат тот же.

nikolaki
nikolaki аватар
Offline
Зарегистрирован: 14.02.2013

Попробуй  ядро для Тинек от Spence Konde.

 

"I2C support

On the following chips, I2C functionality can be achieved with the hardware USI. As of version 1.1.3 this is handled transparently via the special version of the Wire library included with this core. Be aware that USI-based I2C is not available when USI-based SPI is in use.

  • ATtiny x5 (25/45/85)"
  •  
Kakmyc
Offline
Зарегистрирован: 15.01.2018

Программный I2C те ещё грабли.
Риск попалить порты высокий.
Может уже ?

b707
Offline
Зарегистрирован: 26.05.2017

forfrends пишет:

Всем привет! Делаю небольшое устройство на Attiny85. К МК нужно подключить 6 расширителей портов PCF8574.

каждый расширитель PCF8574. - это 8 GPIO. То есть на "небольшом устройстве" ТС хочет адресовать 48 портов... на тиньке?

"Скажите, а вас уже выпустили из сумасшедшего дома?" (с)

forfrends
Offline
Зарегистрирован: 24.02.2015

Все еще хуже чем вы думаете :))))))

К тиньке будет подключено 6 плат, на каждой по PCF8574, а к каждой PCF8574 подключена матрица из 32 светодиодов (матрица 4х4, светодиоды соединены встречно - параллельно). так что управлять 192 светодиодами..... Одновременно будут работать не больше 30 светодиодов. Двух буферов в 4-5 бай каждый должно хватить. А сам код не большой.

Друзья, проблему решил. Я просто забыл о подтягивающих резисторах на линии I2C. Поставил два резистора к "+" питания, и все заработало. Перепроверил разные примеры и разные ядра - все работает!

 

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Kakmyc пишет:
Программный I2C те ещё грабли. Риск попалить порты высокий. Может уже ?

Поставить токоограничивающие резисторы в линии и всех делов. Все равно на софт I2C большой скорости не получишь.

Kakmyc
Offline
Зарегистрирован: 15.01.2018

asam пишет:

Kakmyc пишет:
Программный I2C те ещё грабли. Риск попалить порты высокий. Может уже ?

Поставить токоограничивающие резисторы в линии и всех делов. Все равно на софт I2C большой скорости не получишь.

Об этом думают обычно тогда, когда уже поздно

Komandir
Offline
Зарегистрирован: 18.08.2018

asam пишет:

Все равно на софт I2C большой скорости не получишь.

Какой например ? Стандартные 400000 при 16 МГц легко получаются !

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Komandir пишет:

asam пишет:

Все равно на софт I2C большой скорости не получишь.

Какой например ? Стандартные 400000 при 16 МГц легко получаются !

Я лично не тестировал, но насколько я помню из прочитанного, реальная максимальноя скорость софт I2C около 100КГц. Но дело даже не в этом. Для предохранения входов/выходов в линии надо ставить резисторы в районе 100ом. Это приводит к затягиванию фронтов. И в итоге, скажем, на 1МГц уже, скорее всего, работать не будет. А для 100КГц и, возможно, и для 400КГц это проблем не должно вызывать.

rkit
Offline
Зарегистрирован: 23.11.2016

Риск подпалить порты есть при любой операции с кривыми руками. Программный i2c в этом никак не выделяется.

Plasteroid
Plasteroid аватар
Offline
Зарегистрирован: 15.07.2020

rkit пишет:

Риск подпалить порты есть при любой операции с кривыми руками. Программный i2c в этом никак не выделяется.

Объясните ваше утверждение... Я за I2C связь между устройствами , питающимися одним напряжением и подключенными правильно.Насколько кривые нужны руки. Приведите пример . Я хочу повторить  и спалить  порты своего МК.

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Plasteroid пишет:

Объясните ваше утверждение... Я за I2C связь между устройствами , питающимися одним напряжением и подключенными правильно.Насколько кривые нужны руки. Приведите пример . Я хочу повторить  и спалить  порты своего МК.

При аппаратном I2C порты не спалить если только кривыми руками не устроить КЗ. А вот при софтверном можно если со сторны МК, по ошибке, выставить в линию HIGH .

Logik
Offline
Зарегистрирован: 05.08.2014

asam пишет:

 выставить в линию HIGH .

Это и кривые руки и дурные мозги. При софтовой реализации HIGH в линию никогда не делается. Либо LOW либо ввод. А высокий уровень на линии формируется за счет резисторов подтяжки при отсутствии LOW от всех устройств. Аппаратная реализация кстати так же делает. Скорость 800-900К делаются софтово без проблем.

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Logik пишет:

asam пишет:
выставить в линию HIGH .
Это и кривые руки и дурные мозги. При софтовой реализации HIGH в линию никогда не делается.

Понятно, что в библиотеке этого не делается. Но юзер может и в сетапе напортачить или где еще. Плюс всегда есть вероятность багов. 

Цитата:
Скорость 800-900К делаются софтово без проблем.

Ох, что-то мне не верится. Можно примерчик скетча,  например обмена с внешним EEPROM? Осциллограф есть - померяю сколько там на самом деле.

Logik
Offline
Зарегистрирован: 05.08.2014

А самому че? не дается такой сложный код ;)

for (byte i=8;i;i--)  { if (v & 0x80)   SDA_HIGHT();  else  SDA_LOW();asm volatile ("nop");asm volatile ("nop");asm volatile ("nop");SCL_HIGHT();asm volatile ("nop");asm volatile ("nop"); v <<=1;  SCL_LOW(); }                
  SDA_HIGHT();  SCL_HIGHT(); WITE_HIGHT_SDA(); SDA_LOW(); SCL_LOW();

функции SDA_... SCL_... расписать или осилишь? там просто переключение порта на вывод и ввод записью напрямую в DDR.  А WITE_HIGHT_SDA() можешь убирать, это ожидание  АСК от приемника, код выдрал из поддержки 24C512, ей нужно это. Оно не всем устройствам нужно, для SSD1306 нет.  asm volatile ("nop"); - тоже можешь убрать если на предельное быстродействие хочешь тестить, это тоже от 24C512.

 

Komandir
Offline
Зарегистрирован: 18.08.2018

Все эти кучи вызовов функций - это куча тактов на вход/выход и сохранение переменных в стеке...

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Если функции inline, то оверхеда быть не должно.

Logik
Offline
Зарегистрирован: 05.08.2014

sadman41 пишет:
Если функции inline, то оверхеда быть не должно.

Разумеется. Только компиляторы нынче шибко умные, они и без указания inline делают его.  Как впрочем могут и не сделать при явно указанном inline.

Сдается мне что я знаю причины сомнения. Смотрим на код if (v & 0x80) ..... v <<=1; Иногда народ реализует это так if (v & (1<<n)) .....; где n от 7 до 0. Но в системе кодов проца нет команды сдвига на произвольное кол-во бит. Потому 1<<n компилится в цикл. А это дико тормозит. Вот и думают гадости о софтовом i2c.

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Меня вообще забавляет, когда в любительской разработке начинают такты считать. Сидят такие два человека с разными настройками компилятора (или вообще версиями) и спорят за быстродействие или степень оптимизации.

Komandir
Offline
Зарегистрирован: 18.08.2018

Там где речь о тактах - нужен ассемблер http://arduino.ru/forum/programmirovanie/assembler-i-sreda-razrabotki-arduino#comment-540650

sadman41
Онлайн
Зарегистрирован: 19.10.2016

ASM - это уже из другой оперы, не про ардуину. Этак можно сразу в шестнадцатеричных кодах лупить и публиковать в 7-м номере журнала "Радио".

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Logik пишет:

А самому че? не дается такой сложный код ;)

for (byte i=8;i;i--)  { if (v & 0x80)   SDA_HIGHT();  else  SDA_LOW();asm volatile ("nop");asm volatile ("nop");asm volatile ("nop");SCL_HIGHT();asm volatile ("nop");asm volatile ("nop"); v <<=1;  SCL_LOW(); }                
  SDA_HIGHT();  SCL_HIGHT(); WITE_HIGHT_SDA(); SDA_LOW(); SCL_LOW();

функции SDA_... SCL_... расписать или осилишь? там просто переключение порта на вывод и ввод записью напрямую в DDR.  А WITE_HIGHT_SDA() можешь убирать, это ожидание  АСК от приемника, код выдрал из поддержки 24C512, ей нужно это. Оно не всем устройствам нужно, для SSD1306 нет.  asm volatile ("nop"); - тоже можешь убрать если на предельное быстродействие хочешь тестить, это тоже от 24C512

 

 

 

 

Вообще-то у ТС речь шла о библиотеке  TinyWireM и вот смотрю я код для i2C (https://github.com/adafruit/TinyWireM/blob/master/USI_TWI_Master.cpp) и не верю что он даст даже 400КГц.

У тебя есть готовая библиотека или ссылка на чужую котороя работает быстрее? Поделись. А писать на ассемблере для каждого конкретного I2C устройства? Ну может и вытянет килогерц 600, но это для avrfreaks а не для ардуиновского форума.