I succeded to control a servo on an attiny 84 and attiny 85 with the following code
//Tested on attiny 84 with servo towerpro microservo 90 SG90
// 08/jan/2014 servo data on www.servodatabase.com
int servoPin = 6; // servo connected to digital pin 6
void setup()
{
pinMode(servoPin, OUTPUT); // sets the servoPin to be an output
}
void loop() // run over and over again
{
servowrite(servoPin, 0, 500, 2400);
servowrite(servoPin, 90, 500, 2400);
servowrite(servoPin, 180, 500, 2400);
// servotest();
}
void servowrite(int pin, int angle, int microzero, int micro180)
{
// pin for servo, angle to move, microseconds for zero degrees, microseconds for 180 degrees
int microvalue= map(angle, 0, 180, microzero, micro180); //map angle to microseconds
int i;
for (i = 0; i < 50; i++) //Send 50 pwm pulses with width microvalue uS
{
analogWrite(servoPin,255); //Pulse high for microvalue uS
delayMicroseconds(microvalue);
analogWrite(servoPin,0); //Pulse low for 15mS
delay(15);
}
delay(10); //Pause
}
void servotest()
// test servo
{
int i;
for (i = 0; i < 50; i++) //Send 50 pulses with width 500 uS
{
analogWrite(servoPin,255); //Pulse high for 500uS
delayMicroseconds(500);
analogWrite(servoPin,0); //Pulse low for 15mS
delay(15);
}
delay(100); //Pause for 100mS
for (i = 0; i < 50; i++) //Send 50 pulses with width 1.25mS
{
analogWrite(servoPin,255);
//Pulse high for 1.4 mS
delayMicroseconds(1400);
analogWrite(servoPin,0);
delay(15);
}
delay(100);
for (i = 0; i < 50; i++) //Send 50 pulses with width 2.4ms
{
analogWrite(servoPin,255);
delayMicroseconds(2400);
analogWrite(servoPin,0);
delay(15);
}
delay(100);
}