Hallo
Mein asuro (mit 8MHz-Mega
kann es mit deinem minimal veränderten Code:
Code:
#include <avr/io.h>
//#include <avr/delay.h>
#include <avr/interrupt.h>
#define SERVOPIN 4 // Pin6
#define SERVOPORT PORTD
#define DDRSERVO DDRD
uint8_t servopos=150;
volatile uint16_t p=0;
void pause(uint16_t p_dauer)
{
p=p_dauer;
while(p);
}
int main(void)
{
TIMSK|=(1<<OCIE2);
TCCR2 = (1<<WGM21) | (1<<CS20);
OCR2 = 80; // Für 8MHz-Takt, 37 für 3686400Hz
DDRSERVO|=(1<<SERVOPIN);
sei();
while(1)
{
pause(100);
servopos=100;
pause(50);
servopos=200;
pause(50);
servopos=150;
}
return(0);
}
ISR(TIMER2_COMP_vect)
{
static uint16_t count=1;
if(count>servopos) SERVOPORT&=~(1<<SERVOPIN); else SERVOPORT|=(1<<SERVOPIN);
if(count<2000)count++; else { count=1; if(p) p--; }
}
Das hat bei mir erst funktioniert nachdem ich das TCCR2-Register direkt gesetzt hatte (ohne |) (Es kann aber auch sein, das bei meinen ersten Tests die asuro-Lib störte)
Die Positionen stimmen nicht wirklich, aber immerhin bewegt sich was:
Bild hier
http://www.youtube.com/watch?v=VNbpkGiD-YI
Hinweis für asuro-Besitzer: Der verwendete Pin6 (PORTD4) ist beim orginalen asuro belegt, also nicht ohne Anpassung verwenden!
Gruß
mic
Lesezeichen