Skocz do zawartości

[C] Przerwania i _delay_ms


berbeluh

Pomocna odpowiedź

Witam

Jak zrobić łagodne opóźnienia w programie ktory wykorzystuje przerwania? Jak daje funkcje delay_ms to robot wariuje. Mam program ktory poprzez przerwania mruga diodą o okreslonej czestotliwosc i chcialbym aby jednoczesnie mozliwe było sterownanie silnikami przez czujniki, udało mi sie napisac cos takiego, mruganie diodą działa jednak nie chce to współgrać z opoznieniami ktore są niezbedne do prawidłowego dzialania konstrukcji. Prosze o jakiekolwiek rady.

#define F_CPU 1000000L
#include <util/delay.h> 
#include <avr/interrupt.h>
#include <avr/io.h>

void czekaj(int k){
int i;
for(i=0;i<k;i++)
_delay_ms(100);}

void DoPrzodu(void){
PORTD=0x0a;
}

void DoTylu(void){ 
czekaj(2);
PORTD=0x05;
czekaj(10);
}

void Prawo(void){ // dzialczy lewy silnik ,obrot w prawo
czekaj(2);
PORTD=0x08;
czekaj(10);
}

void Lewo(void){ // dzialczy prawy silnik ,obrot w lewo
czekaj(2);
PORTD=0x02;
czekaj(10);
}

void LewyCzujnik(void){
if(!(PINC & 0x01)){
DoTylu();
Prawo();
DoPrzodu();
}
}

void PrawyCzujnik(void){
if(!(PINC & 0x02)){
DoTylu();
Lewo();
DoPrzodu();
}
}

int main (void)
{
DDRD=0xff; //jako wyjscia
DDRC=0x00; // jako wejścia
PORTC=0xff;
DDRB=0xff; // jako wyjścia

TCCR1B |= (1 << WGM12); // Ustawia timer w tryb CTC
OCR1A = 15625; // Ustawia wartość pożądaną na 1Hz dla preskalera 64
TCCR1B |= ((1 << CS10) | (1 << CS11)); // Ustawia timer z preskalerem Fcpu/64
TIMSK |= (1 << OCIE1A); // Zezwolenie na przerwania dla CTC
sei(); // Zezwolenie globalne na przerwania

while(1)
{
DoPrzodu();
LewyCzujnik();
PrawyCzujnik();

}
}
ISR(TIMER1_COMPA_vect)
{
PORTB ^= (1 << 0); // zmiana stanu diody Led
}
Link do komentarza
Share on other sites

Przerwania nie powinny mieć wpływu na działanie delay_ms().

Może problem jest gdzieś indziej, np. procesor restartuje, gdy zmieniasz sterowanie silnikami?

Proponuję na początku programu dodać pętlę, która np. 3 razy mrugnie diodą z zadaną prędkością - chodzi o możliwość wykrycia początku programu.

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.