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

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • 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.