Servo Bibliothek: Fehler beim Kompilieren (ATTiny2313)

Ich versuche seit einigen Tagen mit einem ATTiny2313 einen Servo anzusteuern, erhalte jedoch beim Kompilieren von Code, der die Servo Bibliothek nutzt, immer folgende Fehlermeldung, sowohl bei selbst geschriebenem Code als auch bei den Beispielen der ISP (Sweep & Knob). Andere Sketches funktionieren jedoch problemlos. Was muss ich ändern damit es funktioniert?
Bord: ATTiny2313/4313
Chip: ATTiny2313
Clock: 1MHZ, 0.5MHZ oder 8MHZ jeweils internal
Programmer: Arduino UNO mit ArduinoISP

Den Code und die Fehlermeldung nicht geheimhalten könnte helfen.
Setze beide bitte in Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *).

Gruß Tommy

Ich wollte die Fehlermeldung einfügen, habe dabei aber den Post ausversehen abgeschikt.
Hier ist sie:

C:\Users\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.1.5\libraries\Servo\src\avr\Servo.cpp: In function 'void initISR(timer16_Sequence_t)':

C:\Users\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.1.5\libraries\Servo\src\avr\Servo.cpp:136:5: error: 'TIFR1' was not declared in this scope

TIFR1 |= _BV(OCF1A); // clear any pending interrupts;

^

C:\Users\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.1.5\libraries\Servo\src\avr\Servo.cpp:137:5: error: 'TIMSK1' was not declared in this scope

TIMSK1 |= _BV(OCIE1A) ; // enable the output compare interrupt

^

Mehrere Bibliotheken wurden für "Servo.h" gefunden
Benutzt: C:\Users\AppData\Local\Arduino15\packages\ATTinyCore\hardware\avr\1.1.5\libraries\Servo
Nicht benutzt: C:\Program Files (x86)\Arduino\libraries\Servo
exit status 1
Fehler beim Kompilieren für das Board ATtiny2313/4313.

Glaube der Meldung!

error: 'TIFR1' was not declared in this scope
error: 'TIMSK1' was not declared in this scope

Die Lib ist offensichtlich nicht für diesen Tiny geeignet.

Also:

  1. Ändere das, also den Code anpassen.
  2. Andere Servo Lib suchen, welche das schon kann

Hi

Anders ausgedrückt: Die Lib will hier direkt auf Register zugreifen, Die es im ATtiny2313 halt einfach nicht gibt.
Eine Suche nach TIFR1 würde Dir wohl irgendwas mit Dingens-Register-Timer-1 ausspucken.
(jupp, Timer/Counter Interrupt Flag Register)
Hat der ATtiny überhaupt einen 16bit Timer?
(jupp, 1x 8bit, 1x 16bit)
Beim ATtiny heißt das Register nur TFIR, also ohne die 1 - ob der Rest zusammen passt, ist aber noch völlig offen und ein händischer Umbau wohl eine echte Fleißarbeit.
(zumindest würde Es mich arg wundern, wenn Du nur durch das Entfernen der 1 an den angemeckerten Registern - Da werden wohl noch Weitere kommen - zum Ziel kommst)

MfG

Arduino_Railroder:
Was muss ich ändern damit es funktioniert?

Ich habe mal die Bibliothek TinyServo versucht, sieht ganz gut aus. So habe ich getestet:

Bord: ATTiny2313/4313
Chip: ATTiny4313 (ich habe keinen 2313)
Clock: 8MHZ internal
Programmer: Arduino UNO mit ArduinoISP

//
// tylernt@gmail.com's ATTiny Hardware Timer Assisted Servo Library v1.0 20-Nov-13
//
// http://code.google.com/p/arduino-tiny/ pinouts
//
//                    ATtiny2313
//                      +-\/-+
//              RESET  1|    |20  VCC
//                  0  2|    |19  16
//                  1  3|    |18  15
//                  2  4|    |17  14
//                  3  5|    |16  13
//                  4  6|    |15  12
//                  5  7|    |14  11
//                  6  8|    |13  10
//                  7  9|    |12  9
//                GND 10|    |11  8
//                      +----+

#include <TinyServo.h>
const byte SERVOS = 1; // how many servos do you have? up to 5 on ATTiny85 and 8 on ATtiny84/2313
const byte servoPin[SERVOS] = { 2 }; // what pins are your servos on?
// you have the option to give your servos nice names. 0 refers to the first servo pin above, 1 to the second, etc
#define HEADSERVO 0

// ========================================================================================================================
void setup()
{
  pinMode(8, INPUT_PULLUP);
  setupServos();
}

// ========================================================================================================================
void loop()
{
  if (digitalRead(8)) {
    moveServo(HEADSERVO, 45);
  } else {
    moveServo(HEADSERVO, 180);
  }
}

postmaster-ino:
Beim ATtiny heißt das Register nur TFIR, also ohne die 1 - ob der Rest zusammen passt, ist aber noch völlig offen und ein händischer Umbau wohl eine echte Fleißarbeit.
(zumindest würde Es mich arg wundern, wenn Du nur durch das Entfernen der 1 an den angemeckerten Registern - Da werden wohl noch Weitere kommen - zum Ziel kommst)

Du darfst Dich wundern, es ist ganz einfach. In hardware\ATtiny\avr\libraries\Servo\src\avr\Servo.cpp habe ich
|| defined(AVR_ATtinyX313) ergänzt, schon geht es:

#if defined(__AVR_ATmega8__)|| defined(__AVR_ATmega128__) || defined(__AVR_ATtiny1634__) || defined(__AVR_ATtinyX313__)
    TIFR |= _BV(OCF1A);      // clear any pending interrupts;
    TIMSK |=  _BV(OCIE1A) ;  // enable the output compare interrupt

Testsketch:

// Servo Bibliothek: Fehler beim Kompilieren (ATTiny2313)
// https://forum.arduino.cc/index.php?topic=572149.msg3898099#msg3898099
//
// tylernt@gmail.com's ATTiny Hardware Timer Assisted Servo Library v1.0 20-Nov-13
//
// http://code.google.com/p/arduino-tiny/ pinouts
//
//                    ATtiny2313
//                      +-\/-+
//              RESET  1|    |20  VCC
//                  0  2|    |19  16
//                  1  3|    |18  15
//                  2  4|    |17  14
//                  3  5|    |16  13
//                  4  6|    |15  12
//                  5  7|    |14  11
//                  6  8|    |13  10
//                  7  9|    |12  9
//                GND 10|    |11  8
//                      +----+

#include <Servo.h>
Servo myservo;  // create servo object to control a servo

// ========================================================================================================================
void setup()
{
  pinMode(8, INPUT_PULLUP);
  myservo.attach(2);
}

// ========================================================================================================================
void loop()
{
  if (digitalRead(8)) {
    myservo.write(45);
  } else {
    myservo.write(180);
  }
}

Das Leben kann so einfach sein!
(manchmal)