Witam!
Napisałem w C program do sterowania silnikiem przy pomocy mostka L293D. Docelowo całość będzie pracować w robocie z dwoma silnikami i dyferencjałem, czyli prostym robocie dwukołowym.
Ale do rzeczy... w robocie będzie krańcówka, której wciśnięcie nastąpi po wjechaniu w przeszkodę. W tym momencie zostanie wywołany program do omijania przeszkody. Chciałem zrealizować to w przerwaniu, żeby funkcja omijania była napisana tylko raz i jedynie wywoływana w odpowiednim momencie.
Na razie robię wszystko na płytce testowej, gdzie funkcję zderzaka pełni microswitch.
W programie poniżej w głównej jego pętli jest pewna przykładowa sekwencja ruchów silnika. Wciskam przycisk, wykonuje się przerwanie, które w przykładowym programie ma jedynie zatrzymać silnik. No i w tym momencie pojawia się problem. uC wraca do wykonywania głównego programu, jednak silnik dalej stoi, gdyż ustawiona w przerwaniu wartość PORTC obowiązuje do chwili zmienienia jej w głównej pętli.
Jak temu zaradzić? Czy jest możliwość, aby po powrocie z przerwania na PORTC pojawiła się ostatnia wartość sprzed wywołania tegoż przerwania?
Napisałem w C program do sterowania silnikiem przy pomocy mostka L293D. Docelowo całość będzie pracować w robocie z dwoma silnikami i dyferencjałem, czyli prostym robocie dwukołowym.
Ale do rzeczy... w robocie będzie krańcówka, której wciśnięcie nastąpi po wjechaniu w przeszkodę. W tym momencie zostanie wywołany program do omijania przeszkody. Chciałem zrealizować to w przerwaniu, żeby funkcja omijania była napisana tylko raz i jedynie wywoływana w odpowiednim momencie.
Na razie robię wszystko na płytce testowej, gdzie funkcję zderzaka pełni microswitch.
W programie poniżej w głównej jego pętli jest pewna przykładowa sekwencja ruchów silnika. Wciskam przycisk, wykonuje się przerwanie, które w przykładowym programie ma jedynie zatrzymać silnik. No i w tym momencie pojawia się problem. uC wraca do wykonywania głównego programu, jednak silnik dalej stoi, gdyż ustawiona w przerwaniu wartość PORTC obowiązuje do chwili zmienienia jej w głównej pętli.
Jak temu zaradzić? Czy jest możliwość, aby po powrocie z przerwania na PORTC pojawiła się ostatnia wartość sprzed wywołania tegoż przerwania?
#define F_CPU 1000000L
#define PWM1 PB1
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
SIGNAL (SIG_INTERRUPT0)
{
while(!(PIND & (1<<2))) // zapalenie diody w czasie, gdy wciśnięty jest przycisk
PORTC |= (1<<2);
PORTC &= ~(1<<2);
if(!(PIND & (1<<2)))
{
_delay_ms(20);
PORTC &= ~(_BV(1) | _BV(0)); //ustawienie wartości zatrzymującej silnik
_delay_ms(20);
}
}
int main (void)
{
DDRC |= (1<<0) | (1<<1) | (1<<2); //sterowanie silnikiem i ustawienie wy dla diody
DDRD &= ~(_BV(2)); //przycisk
DDRB |= _BV(PWM1); //pwm
PORTB &= ~ (_BV(PWM1));
PORTD |= _BV(2);
PORTC |= _BV(0) | _BV(1);
/* aktywacja przerwania itp */
GICR = _BV(INT0);
MCUCR &= ~(_BV(ISC00) | _BV(ISC01));
sei();
/* aktywacja pwm */
ICR1 = 495;
OCR1A = 1;
TCCR1A = _BV(WGM11);
TCCR1A |= _BV(COM1A1) | _BV(COM1A0);
TCCR1B |= _BV(CS10); // bez Preskalera
while (1)
{
/* przykładowa sekwencja obrotów */
OCR1A=410;
PORTC |= _BV(0);
PORTC &= ~(_BV(1));
_delay_ms(4000);
OCR1A = 462;
_delay_ms(3000);
PORTC &= ~(_BV(0) | _BV(1));
_delay_ms(3000);
OCR1A = 465;
PORTC &= ~(_BV(0));
PORTC |= _BV(1);
_delay_ms(10000);
}
return 0;
}