Witam.
Poraz kolejny proszę o pomoc. Tak to już jest z początkującymi
Napisałem program który ma w prosty sposób sterować serwonapędem.
Oto on:
#include "avr/io.h"
int main()
{
DDRB=0xff;
DDRC=0x00;
PORTC=0xff;
OCR1A=17600;
ICR1=20000;
TCCR1A|=(1<<COM1A1) | (1<<COM1A0) | (1<<WGM11);
TCCR1B|=(1<<CS10) | (1<<WGM13) | (1<<WGM12);
while (1)
{
if((bit_is_clear(PINC,PC2)) && (OCR1A < 19400)) OCR1A+=1;
if((bit_is_clear(PINC,PC3)) && (OCR1A > 17600)) OCR1A-=1;
}
return 0;
}
Program ma po naciśnieciu jednego z przycisków obracać napędem w jedną stronę. Po naciśnieciu drugiego w drugą stronę.
Przyciski są podpięte do portu C i po naciśnieciu zwierają dany pin do masy.
Otoż wszystko jest oki poza jedną rzeczą.
Po naciśnieciu przycisku napęd zaczyna się obrcać ale kiedy przycisk zostaje zwolniony napęd się nie zatrzymujetylko obrca się dalej.
Tak jakby pierwszy warunek if'a był cały czas spełniony.
Proszę o pomoc w czym tkwi błąd i jak go naprawić.
Pozdrawiam
Dodano po 40 [minuty]:
Problem rozwiązałem dosyć łatwo.
#include "avr/io.h"
#include "util/delay.h"
const unsigned int wait=100;
int main()
{
DDRB=0xff;
DDRC=0x00;
PORTC=0xff;
OCR1A=17600;
ICR1=20000;
TCCR1A|=(1<<COM1A1) | (1<<COM1A0) | (1<<WGM11);
TCCR1B|=(1<<CS10) | (1<<WGM13) | (1<<WGM12);
while (1)
{
if((bit_is_clear(PINC,PC2)) && (OCR1A < 19400)) { OCR1A+=1; _delay_us(wait); }
if((bit_is_clear(PINC,PC3)) && (OCR1A > 17600)) { OCR1A-=1; _delay_us(wait); }
}
return 0;
}
Tzn. wstawiając opóźnienie po zainkrementowaniu OCR1A.
Z prób wyszło mi że minimalne opóźnienie ktore rozwiązywało proble to ok 60 us.
Jeżeli ktoś wie dlaczego tak się dzieje to poproszę o krotki komentarz.
Poraz kolejny proszę o pomoc. Tak to już jest z początkującymi
Napisałem program który ma w prosty sposób sterować serwonapędem.
Oto on:
#include "avr/io.h"
int main()
{
DDRB=0xff;
DDRC=0x00;
PORTC=0xff;
OCR1A=17600;
ICR1=20000;
TCCR1A|=(1<<COM1A1) | (1<<COM1A0) | (1<<WGM11);
TCCR1B|=(1<<CS10) | (1<<WGM13) | (1<<WGM12);
while (1)
{
if((bit_is_clear(PINC,PC2)) && (OCR1A < 19400)) OCR1A+=1;
if((bit_is_clear(PINC,PC3)) && (OCR1A > 17600)) OCR1A-=1;
}
return 0;
}
Program ma po naciśnieciu jednego z przycisków obracać napędem w jedną stronę. Po naciśnieciu drugiego w drugą stronę.
Przyciski są podpięte do portu C i po naciśnieciu zwierają dany pin do masy.
Otoż wszystko jest oki poza jedną rzeczą.
Po naciśnieciu przycisku napęd zaczyna się obrcać ale kiedy przycisk zostaje zwolniony napęd się nie zatrzymujetylko obrca się dalej.
Tak jakby pierwszy warunek if'a był cały czas spełniony.
Proszę o pomoc w czym tkwi błąd i jak go naprawić.
Pozdrawiam
Dodano po 40 [minuty]:
Problem rozwiązałem dosyć łatwo.
#include "avr/io.h"
#include "util/delay.h"
const unsigned int wait=100;
int main()
{
DDRB=0xff;
DDRC=0x00;
PORTC=0xff;
OCR1A=17600;
ICR1=20000;
TCCR1A|=(1<<COM1A1) | (1<<COM1A0) | (1<<WGM11);
TCCR1B|=(1<<CS10) | (1<<WGM13) | (1<<WGM12);
while (1)
{
if((bit_is_clear(PINC,PC2)) && (OCR1A < 19400)) { OCR1A+=1; _delay_us(wait); }
if((bit_is_clear(PINC,PC3)) && (OCR1A > 17600)) { OCR1A-=1; _delay_us(wait); }
}
return 0;
}
Tzn. wstawiając opóźnienie po zainkrementowaniu OCR1A.
Z prób wyszło mi że minimalne opóźnienie ktore rozwiązywało proble to ok 60 us.
Jeżeli ktoś wie dlaczego tak się dzieje to poproszę o krotki komentarz.