Witam, proszę o pomoc, mam sprawę z którą walczę już długo i nie mogę zrozumieć czemu tak jest. Steruję silnikiem krokowym - zmianę stanów taktuję timerem - cewki silnika podpięte są pod porty C0-3. Podłączyłem 2 przyciski pod port PB0-1 - chcę mini zmieniać prędkość silniczka wpisując do rejestru OCR1A wymaganą wartość do przerwania.
Problem jest w tym, że jeżeli naciskam przycisk który ma spowodować zmianę szybkości obrotów - to zdarza się tak, że silnik się zatrzymuje i startuje z nową prędkością dopiero za kilka sekund. Co zrobić, żeby ta zmiana była natychmiastowa??
Proszę o pomoc, jak się pozbyć tego kilkusekundowego opóźnienia przy zmianie prędkości
Z góry dzięki
Przemek
Problem jest w tym, że jeżeli naciskam przycisk który ma spowodować zmianę szybkości obrotów - to zdarza się tak, że silnik się zatrzymuje i startuje z nową prędkością dopiero za kilka sekund. Co zrobić, żeby ta zmiana była natychmiastowa??
volatile int a = 0;
int wektor3[] = {0x01, 0x03, 0x02, 0x06, 0x04, 0x0c, 0x08, 0x09}; //półkroki
int main(void)
{
DDRB = 0x00;
PORTB = 0x03; //
DDRC = 0xFF;
TCCR1B |= (1 << WGM12); // Ustawia timer w tryb CTC
OCR1A = 500; // Ustawia wartość pożądaną na 1Hz dla preskalera 64
TCCR1B |= ((1 << CS10) | (1 << CS11)); // Ustawia timer z preskalerem
TIMSK |= (1 << OCIE1A); // Zezwolenie na przerwania dla CTC
sei(); // Zezwolenie globalne na przerwania
while(1)
{
/* Jeśli pierwszy przycisk wciśnięty */
if(!(PINB & 0x01))
{
OCR1A = 200;
_delay_ms(80); //Opóżnienie (drgania)
while(!(PINB & 0x01)) {} //Oczekiwanie na zwolnienie przycisku
_delay_ms(80); //Opóżnienie (drgania)
}
/* Jeśli drugi przycisk wciśnięty */
if(!(PINB & 0x02))
{
OCR1A = 1000;
_delay_ms(80); //Opóżnienie (drgania)
while(!(PINB & 0x02)) {} //Oczekiwanie na zwolnienie przycisku
_delay_ms(80); //Opóżnienie (drgania)
}
}
}
ISR(TIMER1_COMPA_vect)
{
PORTC = wektor3[a];
a++;
if (a==8) a=0;
}
Proszę o pomoc, jak się pozbyć tego kilkusekundowego opóźnienia przy zmianie prędkości
Z góry dzięki
Przemek
