Hallo
Ein Bild sagt mehr als tausend Worte:
Bild hier Bild hier Bild hier
Die Videos dazu:
Bild hier Bild hier Bild hier
http://www.youtube.com/watch?v=uL_am_61jfU
http://www.youtube.com/watch?v=KLWulyIWCak
http://www.youtube.com/watch?v=IAP3Z-bAb-g
Die Drähte der Potis sind leider zu kurz und müssen verlängert werden. Viel Spass beim Nachbau.
Beide Servos erhalten das selbe Signal und können deshalb auch parallel angeschlossen werden:
Code:
#include <avr/io.h> // I/O Port definitions
#include <avr/interrupt.h> // Interrupt macros
uint8_t i, x, y, z;
volatile uint8_t p;
void init(void)
{
TCCR0 = (0 << WGM00) | (1 << WGM01); // CTC-Mode
TCCR0 |= (0 << COM00) | (0 << COM01); // ohne OCR-Pin
TCCR0 |= (0 << CS02) | (0 << CS01) | (1 << CS00); // kein prescaler
TIMSK = (1 << OCIE0); // Interrupt ein
OCR0 = 79; // 100kHz
DDRA |= 16; // E_INT1 als Ausgang
DDRC |= 3; // SCL und SDA als Ausgang
sei();
}
void pause(uint8_t dauer)
{
p=dauer;
while(p);
}
int main(void)
{
x=y=z=140;
init();
pause(200);
while(1)
{
x=y=z=60;
pause(100);
x=y=z=220;
pause(100);
}
return(0);
}
ISR(TIMER0_COMP_vect)
{
static uint16_t count;
if(count>x) PORTA &= ~16; // E_INT1 (Pin8)
else PORTA |= 16;
if(count>y) PORTC &= ~1; // SCL (Pin10)
else PORTC |= 1;
if(count>z) PORTC &= ~2; // SDA (Pin12)
else PORTC |= 2;
if(count<2000)count++;
else { count=0; if(p) p--; }
};
(Für einen 8MHz-Mega32)
Gruß
mic
[Edit]
26.03.2016: Bilder neu verlinkt
Lesezeichen