I2C-Deklaration funktioniert bei Attiny nicht

Hallo zusammen, ich habe folgendes Anliegen:
Ich möchte ein Relais mithilfe eines RTC-Moduls und eines ATtiny ansteuern, dafür hab ich einen Code im Internet gefunden, den ich für mich adaptiert habe. Dieser ist für Arduino ausgelegt wo er auch einwandfrei funktioniert.
Da ich aber einen ATtiny45 benutzen möchte, hab ich für I2C die TinyWireM lib installiert. Jedoch bekomme ich dann beim Hochladen auf den ATtiny folgende Fehlermeldung:

Bewaesserungssteuerung:5:13: error: 'SDA' was not declared in this scope
DS3231 rtc(SDA,SCL);
^~~
Bewaesserungssteuerung:5:17: error: 'SCL' was not declared in this scope
DS3231 rtc(SDA,SCL);
^~~
C:\Users\user\Documents\Arduino\Bewaesserungssteuerung\Bewaesserungssteuerung.ino:5:17: note: suggested alternative: 'SPL'
DS3231 rtc(SDA,SCL);
^~~
SPL
exit status 1
'SDA' was not declared in this scope

Hier ist der Code:

#include <DS3231.h>
#include <TinyWireM.h>


DS3231  rtc(SDA,SCL);
Time t;


byte duration = 13; //[Pumpdauer]

//[Einschalten]
const byte pump_hour_ON = 22; //[Stunde]
const byte pump_min_ON = 37;  //[Minute]
const int pump_sec_ON = 5;    //[Sekunde]

//[Ausschalten]
const byte pump_hour_OFF = pump_hour_ON;//[Stunde]
const byte pump_min_OFF = pump_min_ON; //[Minute]
const byte pump_sec_OFF = pump_sec_ON + duration;

byte Relay = 8;

void setup() {
  
  rtc.begin();
  pinMode(Relay, OUTPUT);
  digitalWrite(Relay, LOW);
}

void loop() {
  t = rtc.getTime();
  delay (1000);
  
  if(t.hour == pump_hour_ON && t.min == pump_min_ON && t.sec == pump_sec_ON)
  {
    digitalWrite(Relay,HIGH);
  }
    
    else if(t.hour == pump_hour_OFF && t.min == pump_min_OFF && t.sec == pump_sec_OFF)
    {
      digitalWrite(Relay,LOW);
    }
}

Versuche mal, statt SDA und SCL, die GPIOs des Busses eintragen.

Oder du erstellst Konstanten mit den Namen SDA und SCL, und weist ihnen die GPIOs zu.

Hallo,

die TinyWire Lib hat nichts mit dem Tiny in ATtiny zu tun. Nur so wie kleine Wire Lib. Dir fehlt das Core Package für deinen fremden Controller in der IDE. Das kannst du mittels Boards Manager der IDE nachinstallieren.
ATtinyCore Package
Lesen und machen, ist alles beschrieben inkl. Pinout usw.

Dann solltest Du sparsam mit dem Speicher sein. Das Lesen von drei Registern geht auch ohne Bibliothek.

Um die Zeit der RTC überprüfen zu können, verwende ich SoftwareSerial, was ich mit dem UNO, der als Programmiergerät dient, verbunden habe. Durch eine angepaßte ArduinoISP.ino werden die Ausgaben des ATtiny auf dem seriellen Monitor der IDE angezeigt. Mit der Option DEBUG kann man das einschalten.

Getestet mit ATtiny85, kompiliert aber auch für ATtiny45:

// ATMEL ATtiny45/85
//
//                +-\/-+
//        Reset  1|    |8  Vcc
// A3 (D 3) PB3  2|    |7  PB2 (D 2) A1 SCL
// A2 (D 4) PB4  3|    |6  PB1 (D 1) pwm1
//          GND  4|    |5  PB0 (D 0) pwm0 SDA
//                +----+

//#define DEBUG  // zum Verwenden der seriellen Ausgabe Kommentar entfernen
#ifdef DEBUG
#include <SoftwareSerial.h>
SoftwareSerial softSerial(99, 3); // RX, TX
#endif

#include "Wire.h"
#define DS3231_I2C_ADDRESS 0x68

byte duration = 13; //[Pumpdauer]

//[Einschalten]
const byte pump_hour_ON = 16; //[Stunde]
const byte pump_min_ON = 20;  //[Minute]
const int pump_sec_ON = 00;    //[Sekunde]

//[Ausschalten]
const byte pump_hour_OFF = pump_hour_ON;//[Stunde]
const byte pump_min_OFF = pump_min_ON; //[Minute]
const byte pump_sec_OFF = pump_sec_ON + duration;

const byte relayPin = PB1;

void setup()
{
  Wire.begin();
  pinMode(relayPin, OUTPUT);
  digitalWrite(relayPin, LOW);
#ifdef DEBUG
  softSerial.begin(9600);
#endif
}

void loop()
{
  byte sekunde, minute, stunde;
  // retrieve data from DS3231
  readDS3231time(&sekunde, &minute, &stunde);

  if (stunde == pump_hour_ON && minute == pump_min_ON && sekunde == pump_sec_ON)
  {
    digitalWrite(relayPin, HIGH);
  }

  else if (stunde == pump_hour_OFF && minute == pump_min_OFF && sekunde == pump_sec_OFF)
  {
    digitalWrite(relayPin, LOW);
  }
#ifdef DEBUG
  displayTime(); // display the real-time clock data on the Serial Monitor,
#endif
  delay(1000);
}

byte bcdToDec(byte val)
{
  return ( (val / 16 * 10) + (val % 16) );
}

void readDS3231time(byte *second, byte *minute, byte *hour)
{
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0); // set DS3231 register pointer to 00h
  Wire.endTransmission();
  Wire.requestFrom(DS3231_I2C_ADDRESS, 3);
  // request seven bytes of data from DS3231 starting from register 00h
  *second = bcdToDec(Wire.read() & 0x7f);
  *minute = bcdToDec(Wire.read());
  *hour = bcdToDec(Wire.read() & 0x3f);
}

#ifdef DEBUG
void displayTime()
{
  byte second, minute, hour;
  // retrieve data from DS3231
  readDS3231time(&second, &minute, &hour);
  // send it to the serial monitor
  softSerial.print(hour, DEC);
  // convert the byte variable to a decimal number when displayed
  softSerial.print(":");
  if (minute < 10)
  {
    softSerial.print("0");
  }
  softSerial.print(minute, DEC);
  softSerial.print(":");
  if (second < 10)
  {
    softSerial.print("0");
  }
  softSerial.print(second, DEC);
  softSerial.println();
}
#endif

Das hat nicht funktioniert

Ich habe das mal probiert, in Kombination mit dem ATtinyCore Package von @Doc_Arduino, aber beim Hochladen kommt immer die Fehlermeldung "arduino programmer is not responding".

was meinst du damit? Wie hast du das gemacht?

Und es gibt auch keine Fehlermeldung ?

Welchen Programmer verwendest du und welchen hast du eingestellt ?

Als Programmer verwende ich UNO as ISP
Und die Fehlermeldung ist folgende:






















In file included from c:\users\lukas\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\lukas\appdata\local\arduino15\packages\arduino\tools\avr-gcc\7.3.0-atmel3.6.1-arduino7\avr\include\avr\pgmspace.h:90,

                 from C:\Users\lukas\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.5.2\cores\tiny/Arduino.h:9,

                 from C:\Users\lukas\Documents\Arduino\libraries\DS3231\DS3231.h:26,

                 from C:\Users\lukas\Documents\Arduino\libraries\DS3231\DS3231.cpp:22:

C:\Users\lukas\Documents\Arduino\libraries\DS3231\hardware/avr/HW_AVR.h: In member function 'void DS3231::begin()':

C:\Users\lukas\Documents\Arduino\libraries\DS3231\hardware/avr/HW_AVR.h:12:7: error: 'TWSR' was not declared in this scope

   cbi(TWSR, TWPS0);

       ^

C:\Users\lukas\Documents\Arduino\libraries\DS3231\hardware/avr/HW_AVR.h:12:3: note: in expansion of macro 'cbi'

   cbi(TWSR, TWPS0);

   ^~~

C:\Users\lukas\Documents\Arduino\libraries\DS3231\hardware/avr/HW_AVR.h:12:7: note: suggested alternative: 'ACSR'

   cbi(TWSR, TWPS0);

       ^

C:\Users\lukas\Documents\Arduino\libraries\DS3231\hardware/avr/HW_AVR.h:12:3: note: in expansion of macro 'cbi'

   cbi(TWSR, TWPS0);

   ^~~

C:\Users\lukas\Documents\Arduino\libraries\DS3231\hardware/avr/HW_AVR.h:12:13: error: 'TWPS0' was not declared in this scope

   cbi(TWSR, TWPS0);

             ^

C:\Users\lukas\Documents\Arduino\libraries\DS3231\hardware/avr/HW_AVR.h:12:3: note: in expansion of macro 'cbi'

   cbi(TWSR, TWPS0);

   ^~~

C:\Users\lukas\Documents\Arduino\libraries\DS3231\hardware/avr/HW_AVR.h:12:13: note: suggested alternative: 'ADPS0'

   cbi(TWSR, TWPS0);

             ^

C:\Users\lukas\Documents\Arduino\libraries\DS3231\hardware/avr/HW_AVR.h:12:3: note: in expansion of macro 'cbi'

   cbi(TWSR, TWPS0);

   ^~~

C:\Users\lukas\Documents\Arduino\libraries\DS3231\hardware/avr/HW_AVR.h:13:13: error: 'TWPS1' was not declared in this scope

   cbi(TWSR, TWPS1);

             ^

C:\Users\lukas\Documents\Arduino\libraries\DS3231\hardware/avr/HW_AVR.h:13:3: note: in expansion of macro 'cbi'

   cbi(TWSR, TWPS1);

   ^~~

C:\Users\lukas\Documents\Arduino\libraries\DS3231\hardware/avr/HW_AVR.h:13:13: note: suggested alternative: 'ADPS1'

   cbi(TWSR, TWPS1);

             ^

C:\Users\lukas\Documents\Arduino\libraries\DS3231\hardware/avr/HW_AVR.h:13:3: note: in expansion of macro 'cbi'

   cbi(TWSR, TWPS1);

   ^~~

In file included from C:\Users\lukas\Documents\Arduino\libraries\DS3231\DS3231.cpp:26:0:

C:\Users\lukas\Documents\Arduino\libraries\DS3231\hardware/avr/HW_AVR.h:14:3: error: 'TWBR' was not declared in this scope

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

   ^~~~

C:\Users\lukas\Documents\Arduino\libraries\DS3231\hardware/avr/HW_AVR.h:14:3: note: suggested alternative: 'TIFR'

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

   ^~~~

   TIFR

C:\Users\lukas\Documents\Arduino\libraries\DS3231\hardware/avr/HW_AVR.h:17:3: error: 'TWCR' was not declared in this scope

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

   ^~~~

C:\Users\lukas\Documents\Arduino\libraries\DS3231\hardware/avr/HW_AVR.h:17:3: note: suggested alternative: 'EECR'

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

   ^~~~

   EECR

In file included from c:\users\lukas\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\lukas\appdata\local\arduino15\packages\arduino\tools\avr-gcc\7.3.0-atmel3.6.1-arduino7\avr\include\avr\pgmspace.h:90,

                 from C:\Users\lukas\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.5.2\cores\tiny/Arduino.h:9,

                 from C:\Users\lukas\Documents\Arduino\libraries\DS3231\DS3231.h:26,

                 from C:\Users\lukas\Documents\Arduino\libraries\DS3231\DS3231.cpp:22:

C:\Users\lukas\Documents\Arduino\libraries\DS3231\hardware/avr/HW_AVR.h:17:14: error: 'TWEN' was not declared in this scope

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

              ^

C:\Users\lukas\Documents\Arduino\libraries\DS3231\hardware/avr/HW_AVR.h:17:14: note: suggested alternative: 'ADEN'

C:\Users\lukas\Documents\Arduino\libraries\DS3231\hardware/avr/HW_AVR.h:17:26: error: 'TWIE' was not declared in this scope

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

                          ^

C:\Users\lukas\Documents\Arduino\libraries\DS3231\hardware/avr/HW_AVR.h:17:26: note: suggested alternative: 'ACIE'

In file included from C:\Users\lukas\Documents\Arduino\libraries\DS3231\DS3231.cpp:26:0:

C:\Users\lukas\Documents\Arduino\libraries\DS3231\hardware/avr/HW_AVR.h: In member function 'void DS3231::_burstRead()':

C:\Users\lukas\Documents\Arduino\libraries\DS3231\hardware/avr/HW_AVR.h:31:3: error: 'TWCR' was not declared in this scope

   TWCR = _BV(TWEN) | _BV(TWEA) | _BV(TWINT) | _BV(TWSTA);      // Send START

   ^~~~

C:\Users\lukas\Documents\Arduino\libraries\DS3231\hardware/avr/HW_AVR.h:31:3: note: suggested alternative: 'EECR'

   TWCR = _BV(TWEN) | _BV(TWEA) | _BV(TWINT) | _BV(TWSTA);      // Send START

   ^~~~

   EECR

In file included from c:\users\lukas\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\lukas\appdata\local\arduino15\packages\arduino\tools\avr-gcc\7.3.0-atmel3.6.1-arduino7\avr\include\avr\pgmspace.h:90,

                 from C:\Users\lukas\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.5.2\cores\tiny/Arduino.h:9,

                 from C:\Users\lukas\Documents\Arduino\libraries\DS3231\DS3231.h:26,

                 from C:\Users\lukas\Documents\Arduino\libraries\DS3231\DS3231.cpp:22:

C:\Users\lukas\Documents\Arduino\libraries\DS3231\hardware/avr/HW_AVR.h:31:14: error: 'TWEN' was not declared in this scope

   TWCR = _BV(TWEN) | _BV(TWEA) | _BV(TWINT) | _BV(TWSTA);      // Send START

              ^

C:\Users\lukas\Documents\Arduino\libraries\DS3231\hardware/avr/HW_AVR.h:31:14: note: suggested alternative: 'ADEN'

C:\Users\lukas\Documents\Arduino\libraries\DS3231\hardware/avr/HW_AVR.h:31:26: error: 'TWEA' was not declared in this scope

   TWCR = _BV(TWEN) | _BV(TWEA) | _BV(TWINT) | _BV(TWSTA);      // Send START

                          ^

C:\Users\lukas\Documents\Arduino\libraries\DS3231\hardware/avr/HW_AVR.h:31:38: error: 'TWINT' was not declared in this scope

   TWCR = _BV(TWEN) | _BV(TWEA) | _BV(TWINT) | _BV(TWSTA);      // Send START

                                      ^

C:\Users\lukas\Documents\Arduino\libraries\DS3231\hardware/avr/HW_AVR.h:31:51: error: 'TWSTA' was not declared in this scope

   TWCR = _BV(TWEN) | _BV(TWEA) | _BV(TWINT) | _BV(TWSTA);      // Send START

                                                   ^

In file included from C:\Users\lukas\Documents\Arduino\libraries\DS3231\DS3231.cpp:26:0:

C:\Users\lukas\Documents\Arduino\libraries\DS3231\hardware/avr/HW_AVR.h:33:3: error: 'TWDR' was not declared in this scope

   TWDR = DS3231_ADDR_W;

   ^~~~

C:\Users\lukas\Documents\Arduino\libraries\DS3231\hardware/avr/HW_AVR.h:33:3: note: suggested alternative: 'DWDR'

   TWDR = DS3231_ADDR_W;

   ^~~~

   DWDR

In file included from c:\users\lukas\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\lukas\appdata\local\arduino15\packages\arduino\tools\avr-gcc\7.3.0-atmel3.6.1-arduino7\avr\include\avr\pgmspace.h:90,

                 from C:\Users\lukas\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.5.2\cores\tiny/Arduino.h:9,

                 from C:\Users\lukas\Documents\Arduino\libraries\DS3231\DS3231.h:26,

                 from C:\Users\lukas\Documents\Arduino\libraries\DS3231\DS3231.cpp:22:

C:\Users\lukas\Documents\Arduino\libraries\DS3231\hardware/avr/HW_AVR.h:55:38: error: 'TWSTO' was not declared in this scope

   TWCR = _BV(TWEN)| _BV(TWINT) | _BV(TWSTO);         // Send STOP

                                      ^

In file included from C:\Users\lukas\Documents\Arduino\libraries\DS3231\DS3231.cpp:26:0:

C:\Users\lukas\Documents\Arduino\libraries\DS3231\hardware/avr/HW_AVR.h: In member function 'uint8_t DS3231::_readRegister(uint8_t)':

C:\Users\lukas\Documents\Arduino\libraries\DS3231\hardware/avr/HW_AVR.h:85:3: error: 'TWCR' was not declared in this scope

   TWCR = _BV(TWEN) | _BV(TWEA) | _BV(TWINT) | _BV(TWSTA);      // Send START

   ^~~~

C:\Users\lukas\Documents\Arduino\libraries\DS3231\hardware/avr/HW_AVR.h:85:3: note: suggested alternative: 'EECR'

   TWCR = _BV(TWEN) | _BV(TWEA) | _BV(TWINT) | _BV(TWSTA);      // Send START

   ^~~~

   EECR

In file included from c:\users\lukas\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\lukas\appdata\local\arduino15\packages\arduino\tools\avr-gcc\7.3.0-atmel3.6.1-arduino7\avr\include\avr\pgmspace.h:90,

                 from C:\Users\lukas\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.5.2\cores\tiny/Arduino.h:9,

                 from C:\Users\lukas\Documents\Arduino\libraries\DS3231\DS3231.h:26,

                 from C:\Users\lukas\Documents\Arduino\libraries\DS3231\DS3231.cpp:22:

C:\Users\lukas\Documents\Arduino\libraries\DS3231\hardware/avr/HW_AVR.h:85:14: error: 'TWEN' was not declared in this scope

   TWCR = _BV(TWEN) | _BV(TWEA) | _BV(TWINT) | _BV(TWSTA);      // Send START

              ^

C:\Users\lukas\Documents\Arduino\libraries\DS3231\hardware/avr/HW_AVR.h:85:14: note: suggested alternative: 'ADEN'

C:\Users\lukas\Documents\Arduino\libraries\DS3231\hardware/avr/HW_AVR.h:85:26: error: 'TWEA' was not declared in this scope

   TWCR = _BV(TWEN) | _BV(TWEA) | _BV(TWINT) | _BV(TWSTA);      // Send START

                          ^

C:\Users\lukas\Documents\Arduino\libraries\DS3231\hardware/avr/HW_AVR.h:85:38: error: 'TWINT' was not declared in this scope

   TWCR = _BV(TWEN) | _BV(TWEA) | _BV(TWINT) | _BV(TWSTA);      // Send START

                                      ^

C:\Users\lukas\Documents\Arduino\libraries\DS3231\hardware/avr/HW_AVR.h:85:51: error: 'TWSTA' was not declared in this scope

   TWCR = _BV(TWEN) | _BV(TWEA) | _BV(TWINT) | _BV(TWSTA);      // Send START

                                                   ^

In file included from C:\Users\lukas\Documents\Arduino\libraries\DS3231\DS3231.cpp:26:0:

C:\Users\lukas\Documents\Arduino\libraries\DS3231\hardware/avr/HW_AVR.h:87:3: error: 'TWDR' was not declared in this scope

   TWDR = DS3231_ADDR_W;

   ^~~~

C:\Users\lukas\Documents\Arduino\libraries\DS3231\hardware/avr/HW_AVR.h:87:3: note: suggested alternative: 'DWDR'

   TWDR = DS3231_ADDR_W;

   ^~~~

   DWDR

In file included from c:\users\lukas\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\lukas\appdata\local\arduino15\packages\arduino\tools\avr-gcc\7.3.0-atmel3.6.1-arduino7\avr\include\avr\pgmspace.h:90,

                 from C:\Users\lukas\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.5.2\cores\tiny/Arduino.h:9,

                 from C:\Users\lukas\Documents\Arduino\libraries\DS3231\DS3231.h:26,

                 from C:\Users\lukas\Documents\Arduino\libraries\DS3231\DS3231.cpp:22:

C:\Users\lukas\Documents\Arduino\libraries\DS3231\hardware/avr/HW_AVR.h:106:38: error: 'TWSTO' was not declared in this scope

   TWCR = _BV(TWEN)| _BV(TWINT) | _BV(TWSTO);         // Send STOP

                                      ^

In file included from C:\Users\lukas\Documents\Arduino\libraries\DS3231\DS3231.cpp:26:0:

C:\Users\lukas\Documents\Arduino\libraries\DS3231\hardware/avr/HW_AVR.h: In member function 'void DS3231::_writeRegister(uint8_t, uint8_t)':

C:\Users\lukas\Documents\Arduino\libraries\DS3231\hardware/avr/HW_AVR.h:128:3: error: 'TWCR' was not declared in this scope

   TWCR = _BV(TWEN) | _BV(TWEA) | _BV(TWINT) | _BV(TWSTA);      // Send START

   ^~~~

C:\Users\lukas\Documents\Arduino\libraries\DS3231\hardware/avr/HW_AVR.h:128:3: note: suggested alternative: 'EECR'

   TWCR = _BV(TWEN) | _BV(TWEA) | _BV(TWINT) | _BV(TWSTA);      // Send START

   ^~~~

   EECR

In file included from c:\users\lukas\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\lukas\appdata\local\arduino15\packages\arduino\tools\avr-gcc\7.3.0-atmel3.6.1-arduino7\avr\include\avr\pgmspace.h:90,

                 from C:\Users\lukas\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.5.2\cores\tiny/Arduino.h:9,

                 from C:\Users\lukas\Documents\Arduino\libraries\DS3231\DS3231.h:26,

                 from C:\Users\lukas\Documents\Arduino\libraries\DS3231\DS3231.cpp:22:

C:\Users\lukas\Documents\Arduino\libraries\DS3231\hardware/avr/HW_AVR.h:128:14: error: 'TWEN' was not declared in this scope

   TWCR = _BV(TWEN) | _BV(TWEA) | _BV(TWINT) | _BV(TWSTA);      // Send START

              ^

C:\Users\lukas\Documents\Arduino\libraries\DS3231\hardware/avr/HW_AVR.h:128:14: note: suggested alternative: 'ADEN'

C:\Users\lukas\Documents\Arduino\libraries\DS3231\hardware/avr/HW_AVR.h:128:26: error: 'TWEA' was not declared in this scope

   TWCR = _BV(TWEN) | _BV(TWEA) | _BV(TWINT) | _BV(TWSTA);      // Send START

                          ^

C:\Users\lukas\Documents\Arduino\libraries\DS3231\hardware/avr/HW_AVR.h:128:38: error: 'TWINT' was not declared in this scope

   TWCR = _BV(TWEN) | _BV(TWEA) | _BV(TWINT) | _BV(TWSTA);      // Send START

                                      ^

C:\Users\lukas\Documents\Arduino\libraries\DS3231\hardware/avr/HW_AVR.h:128:51: error: 'TWSTA' was not declared in this scope

   TWCR = _BV(TWEN) | _BV(TWEA) | _BV(TWINT) | _BV(TWSTA);      // Send START

                                                   ^

In file included from C:\Users\lukas\Documents\Arduino\libraries\DS3231\DS3231.cpp:26:0:

C:\Users\lukas\Documents\Arduino\libraries\DS3231\hardware/avr/HW_AVR.h:130:3: error: 'TWDR' was not declared in this scope

   TWDR = DS3231_ADDR_W;

   ^~~~

C:\Users\lukas\Documents\Arduino\libraries\DS3231\hardware/avr/HW_AVR.h:130:3: note: suggested alternative: 'DWDR'

   TWDR = DS3231_ADDR_W;

   ^~~~

   DWDR

In file included from c:\users\lukas\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\lukas\appdata\local\arduino15\packages\arduino\tools\avr-gcc\7.3.0-atmel3.6.1-arduino7\avr\include\avr\pgmspace.h:90,

                 from C:\Users\lukas\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.5.2\cores\tiny/Arduino.h:9,

                 from C:\Users\lukas\Documents\Arduino\libraries\DS3231\DS3231.h:26,

                 from C:\Users\lukas\Documents\Arduino\libraries\DS3231\DS3231.cpp:22:

C:\Users\lukas\Documents\Arduino\libraries\DS3231\hardware/avr/HW_AVR.h:140:38: error: 'TWSTO' was not declared in this scope

   TWCR = _BV(TWEN)| _BV(TWINT) | _BV(TWSTO);         // Send STOP

                                      ^

exit status 1

Fehler beim Kompilieren für das Board ATtiny25/45/85 (No bootloader).```

Unterstützt die DS3231 Bibliothek überhaupt deinen ATTiny?

Mit hoher Wahrscheinlichkeit nicht, aber man kann die DS3231 problemlos ohne DS3231-Lib, nur mit I2C, nutzen. Der Code stand auch schon mehrmals hier im Forum.

Gruß Tommy

Ja, siehe #4.

Hallo,

ich befürchte deine Libs unterstützen solche Controller wie den ATtiny45 nicht. Der hat keine "normale" I2C Einheit. Der eine Universal Serial Unit. Das heißt u.a. die verwendeten Register gibt es schlicht weg nicht. Mach es wie agmue zeigt direkt. Das installierte Core Package brauchste trotzdem, richtig einstellen im Menü musste das auch.

Schaust Du hier
Folge dem Link für I2C. Schau, wie die DS dort angebunden ist.
Die 1307 ist auf den Zeitregistern mit der 3231 gleich. - Datenblätter lesen.

Ich verwende auch öfter ATtinys, häufig ATtiny45 und 85. Hab bisher aber noch nie ein I2C Device daran angeschlossen.
Diesen Thread hab ich zum Anlass genommen das mal auszuprobieren und eine RTC mit einem ATtiny45 auszulesen.

Ausgangspunkt war dieser Beitrag von @agmue:

Den Code habe ich ein wenig modifiziert und die Ausgabe auf (Software-)Serial umgestellt.

/*
  Ein ATtiny45 oder 85 (1 MHz) als Master liest jede Sekunde die Uhrzeit von einem DS3231 Uhrenmodul.
  Ausgangspunkt:
  http://forum.arduino.cc/index.php?topic=330723.msg2284601#msg2284601

    ATTiny-Core von Spence Konde:
    https://github.com/SpenceKonde/ATTinyCore

    TinyWireM:
    https://github.com/adafruit/TinyWireM 
*/

/*  ATtiny 25/45/85 Pinout:
                     ------
              Reset |1    8| Vcc
          ADC3, PB3 |2    7| PB2, SCL, ADC1         <<<---- SCL
     PWM, ADC2, PB4 |3    6| PB1, MISO, PWM
                GND |4    5| PB0, MOSI, PWM, SDA    <<<---- SDA
                     ------ 
*/


#include <SoftwareSerial.h>
SoftwareSerial softSerial(99, 4);   // RX (Dummy), TX

#include "TinyWireM.h"
#define DS3231_I2C_ADDRESS 0x68

unsigned long prevMillis;

// Convert normal decimal numbers to binary coded decimal
byte decToBcd(byte val) {
  return ( (val / 10 * 16) + (val % 10) );
}

// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val) {
  return ( (val / 16 * 10) + (val % 16) );
}

void readDS3231time(byte *second, byte *minute, byte *hour, byte *dayOfWeek, byte *dayOfMonth, byte *month, byte *year) {
  TinyWireM.beginTransmission(DS3231_I2C_ADDRESS);
  TinyWireM.send(0);               // set DS3231 register pointer to 00h
  TinyWireM.endTransmission();
  TinyWireM.requestFrom(DS3231_I2C_ADDRESS, 7);
  // request seven bytes of data from DS3231 starting from register 00h
  *second = bcdToDec(TinyWireM.receive() & 0x7f);
  *minute = bcdToDec(TinyWireM.receive());
  *hour = bcdToDec(TinyWireM.receive() & 0x3f);
  *dayOfWeek = bcdToDec(TinyWireM.receive());
  *dayOfMonth = bcdToDec(TinyWireM.receive());
  *month = bcdToDec(TinyWireM.receive());
  *year = bcdToDec(TinyWireM.receive());
}

void displayTime() {
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
  readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);    // retrieve data from DS3231

  softSerial.print("20");
  softSerial.print(year, DEC);
  softSerial.print('-');
  softSerial.print(month, DEC);
  softSerial.print('-');
  softSerial.print(dayOfMonth, DEC);
  
  softSerial.print("  ");
  softSerial.print(hour, DEC);  // send it to the serial monitor
  softSerial.print(':');
  if (minute < 10) {
    softSerial.print('0');
  }
  softSerial.print(minute, DEC);
  softSerial.print(':');
  if (second < 10) {
    softSerial.print('0');
  }
  softSerial.print(second, DEC);
  
  softSerial.print("  DOW: ");
  switch (dayOfWeek) {
    case 1:
      softSerial.print("SU");
      break;
    case 2:
      softSerial.print("MO");
      break;
    case 3:
      softSerial.print("TU");
      break;
    case 4:
      softSerial.print("WE");
      break;
    case 5:
      softSerial.print("TH");
      break;
    case 6:
      softSerial.print("FR");
      break;
    case 7:
      softSerial.print("SA");
      break;
  }
  softSerial.println();
}

void setup() {
  softSerial.begin(9600);
  TinyWireM.begin();
}

void loop() {
  if (millis() - prevMillis >= 1000) {
    displayTime();      // display the real-time clock data on the Serial Monitor
    prevMillis = millis();
  }
}

Verwendete Teile:
ATtiny45, interner Takt 1MHz
RTC DS3231
Core und I2C Lib stehen im Code

Hat gut funktioniert.
Ein ATtiny45 hat natürlich nicht viel Speicher und man kommt recht bald an die Grenzen.

1 Like

Freut mich, wenn so alte Beiträge noch helfen können :slightly_smiling_face:

1 Like

Nachtrag:
Die RTC (DS3231) habe ich zuvor mal auf aktuelle Werte gestellt (der Einfachheit wegen war da ein UNO beteiligt). :slight_smile:

Die Seriellen Ausgaben des ATtiny wurden (ebenfalls) mit einem UNO "aufgefangen" und am Seriellen Monitor ausgegeben.

Die Ausgabe war z.B. so:

2022-5-22  21:12:55  DOW: SU
2022-5-22  21:12:56  DOW: SU
2022-5-22  21:12:57  DOW: SU
2022-5-22  21:12:58  DOW: SU
2022-5-22  21:12:59  DOW: SU
2022-5-22  21:13:00  DOW: SU
2022-5-22  21:13:01  DOW: SU

Hallo,

um die Funktionalität habe ich mir nie Sorgen gemacht, wenn man das passende Core Package und die Standard Wire Lib verwendet, denn das Core Package stellt Wire angepasst zur Verfügung. Die Lib vom TO funktioniert nicht, weil sie an Wire vorbei direkte Registernamen verwendet. Will man innerhalb Arduino kompatibel bleiben muss man die Standard Wire verwenden. Nur der Core Package Schreiber muss für die Anpassungen unter der Haube Sorgen.

Dein Programm aus #14 mit 8 MHz intern:

2022-5-23  11:25:29  DOW: MO
2022-5-23  11:25:30  DOW: MO
2022-5-23  11:25:31  DOW: MO
2022-5-23  11:25:32  DOW: MO
2022-5-23  11:25:33  DOW: MO
2022-5-23  11:25:34  DOW: MO
2022-5-23  11:25:35  DOW: MO
2022-5-23  11:25:36  DOW: MO

Baudrate verringern oder Takt von 1 MHz auf 8 MHz raufsetzen könnte helfen.

Die kurze deutsche Variante mit führenden Nullen benötigt mehr Speicher, zu viel für den ATtiny45, aber eventuell für einen ATtiny85 aufwärts interessant:

void displayTime() {
  const char * DOW[] = {"Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"};
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
  readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);    // retrieve data from DS3231
  softSerial.printf("%02u:%02u:%02u %02u.%02u.20%02u %s\n", hour, minute, second, dayOfMonth, month, year, DOW[dayOfWeek-1]);
}

Ausgabe:

12:17:03 23.05.2022 Montag
12:17:04 23.05.2022 Montag
12:17:05 23.05.2022 Montag
12:17:06 23.05.2022 Montag

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.