Oje, das war auch Schwachsinn. Der Timer1 "läuft" beim asuro mit 3,9kHz. Das ist viel zu wenig für eine brauchbare Servoansteuerung.
Besser sieht es mit Timer2 aus. Der läuft mit 36kHz, (wie immer der Hinweis: Bei der orginalen CD-Library sind es 72kHz) und läßt sich ähnlich einfach missbrauchen:
PHP-Code:
#include "asuro.h"
volatile unsigned char servopos=0, p=0; // p dauert ca. 20ms oder 1/50 Sekunde
SIGNAL (SIG_OUTPUT_COMPARE2)
{
static int count = 1;
if(count > servopos) BackLED(OFF,OFF); else BackLED(ON,OFF);
//if(count > servopos) PORTC &= ~(1<<PC4); else PORTC |= (1<<PC4);
if(count < (20*72)) count++; else {count=1; if(p) p--;} // 20ms bei 72kHz-Lib!
}
int main (void)
{
Init();
//DDRC |= (1<<PC4); // Tasteneingang auf Ausgabe setzen
TIMSK |= (1 << OCIE2); // Timer2 CompareMatch-ISR einklinken für Servo
OCR2 = 0x91; // duty cycle for 36kHz vorsichthalber OCR2 belegen
while(1)
{
StatusLED(RED);
servopos=70;
p=50; // eine Sekunde warten
while(p);
StatusLED(GREEN);
servopos=190;
p=50;
while(p);
}
return 0;
}
getestet ;)
Dabei sollten die Werte wie bei der Sleep()-Ansteuerung sein. servopos=0 sendet keinen Impuls zum Servo.
Gruß
mic
[Edit]
Sehr knuffig:
PHP-Code:
#include "asuro.h"
volatile unsigned char servopos=0, p=0; // p dauert ca. 20ms oder 1/50 Sekunde
SIGNAL (SIG_OUTPUT_COMPARE2)
{
static int count = 1;
if(count > servopos) BackLED(OFF,OFF); else BackLED(ON,OFF);
//if(count > servopos) PORTC &= ~(1<<PC4); else PORTC |= (1<<PC4);
if(count < (20*36)) count++; else {count=1; if(p) p--;} // 20ms bei 36kHz-Lib!
}
int main (void)
{
unsigned char l[3];
Init();
//DDRC |= (1<<PC4); // Tasteneingang auf Ausgabe setzen
TIMSK |= (1 << OCIE2); // Timer2 CompareMatch-ISR einklinken für Servo
OCR2 = 0x91; // duty cycle for 36kHz vorsichthalber OCR2 belegen
while(1)
{
SerRead(l,3,0); // drei Ziffern einlesen (blockierend!)
servopos = (l[0] - '0') * 100 + (l[1] - '0') * 10 + (l[2] - '0');
}
return 0;
}
Lesezeichen