Napisałem program do sterowania serwami z wykorzystaniem PWM oraz wszystkim ma sterować klawiatura podpięta tylko do przerwania INT0 (wciśnięcie klawisza na klawiaturze powoduje odpalenie przerwania oraz zmienia stan jednego portu. Poniżej zamieszczam kod.
Problem tkwi w tym, że w przerwani od INT0 jak wywołuje operacje odrazu po wejściu do przerwania - funkcja open działa dłużej (widać to na serwie - 3,5 obrotu) a funkcja close (uzależniona od przycisku) mimo, że ma podobny czas wykonuje się tylko chwilkę (1,25 obrotu)
jak daje dwa razy wywołanie operacje close w funkcji if to wykonują się w sumie 3,2 obrotu serwa :/
Przyciski reagują na zbocze opadające.
Różnica w funkcjach to szczegół dopasowałem to do układu wykonawczego.
nie mam pojęcia o co chodzi :/ jakieś pomysły ?
PS.
Program jest dedykowany pod konkretne przerobione serwa, oraz układ w jakim mają działać, nastawy "i" i "j" to pomocnicze by wygenerować różne impulsy to działa, bo śmiga na dwóch przerwaniach jedno close a drugie open.
pozdrawiam
#include <avr/io.h>
//#include <avr/signal.h>
#include <avr/interrupt.h>
#define F_CPU 1000000UL
void close()
{
TCCR2 = (1<<WGM20)|(0<<WGM21)|(1<<CS22)|(0<<CS21)|(0<<CS20)|(0<<COM20)|(1<<COM21);
OCR2 = 8;
for(int j=0; j<36; j++)
{
TCNT2 = 0x00;
for(long int i=0; i<873; i++)
asm("nop");
}
TCCR2 = (1<<WGM20)|(0<<WGM21)|(1<<CS22)|(0<<CS21)|(0<<CS20)|(0<<COM20)|(0<<COM21);
}
void open()
{
TCCR2 = (1<<WGM20)|(0<<WGM21)|(1<<CS22)|(0<<CS21)|(0<<CS20)|(0<<COM20)|(1<<COM21);
OCR2 = 16;
for(int j=0; j<37; j++)
{
TCNT2 = 0x00;
for(long int i=0; i<886; i++)
asm("nop");
}
TCCR2 = (1<<WGM20)|(0<<WGM21)|(1<<CS22)|(0<<CS21)|(0<<CS20)|(0<<COM20)|(0<<COM21);
}
--------------------------- PROBLEM
SIGNAL (_VECTOR(1))
{
if(!(PIND&0x01))
{close();}
while(!(PIND & 0x01)) {}
for(int i=0; i < 1000;i++);
//if(!(PIND&0x02))
{open();}
}
SIGNAL (_VECTOR(2))
{
open();
}
int main()
{
PORTD =(1<<PD2)|(1<<PD3)|(1<<PD0)|(1<<PD1);
DDRD = 0x00;
DDRB = (1<<PB3);
PORTB = 0x00;
MCUCR = (1<<ISC11)|(0<<ISC10)|(1<<ISC01)|(0<<ISC00);
GICR = (1<<INT1)|(1<<INT0);
sei();
while(1)
{
asm("nop");
}
}Problem tkwi w tym, że w przerwani od INT0 jak wywołuje operacje odrazu po wejściu do przerwania - funkcja open działa dłużej (widać to na serwie - 3,5 obrotu) a funkcja close (uzależniona od przycisku) mimo, że ma podobny czas wykonuje się tylko chwilkę (1,25 obrotu)
Przyciski reagują na zbocze opadające.
Różnica w funkcjach to szczegół dopasowałem to do układu wykonawczego.
nie mam pojęcia o co chodzi :/ jakieś pomysły ?
PS.
Program jest dedykowany pod konkretne przerobione serwa, oraz układ w jakim mają działać, nastawy "i" i "j" to pomocnicze by wygenerować różne impulsy to działa, bo śmiga na dwóch przerwaniach jedno close a drugie open.
pozdrawiam
