Skocz do zawartości

[C] Obsługa przerwań - włączanie microswitchem


Pomocna odpowiedź

Napisano

Witam, jestem w trakcie programowania swojego pierwszego LF'a. Mimo paru dni spędzonych nad programem nadal nie wiem w jaki sposób zrealizować uruchomienie robota microswitchem.

Generalnie ma to wyglądać następująco:

Włączam zasilanie >> wykonuje się jakaś nieskończona pętla >> po wciśnięciu tego przycisku przeskakuje to kolejnej pętli.

Wiem, że należy użyć do tego przerwań, ale nie wiem jak to napisać.

Przyciski podłączony jest do INT2 (PB2).

Z góry dzięki za jakiekolwiek sugestie.

Niekoniecznie musisz użyć przerwań.

Podam Ci na przykładzie Bascoma:

Do


Loop Until switch = 0  /pusta pętla do czasu wciśnięcia


Do

Pętla programu głównego

Lopp

W C też na pewno są takie pętle 😉

wersja C

//definicje przed funkcją main
#define WE PINB    //nazwa portu do którego podłączony jest swich - w tym przypadku B
#define SWICH 0         //konkretny numer pinu - w tym przypadku 0
#define FOREVER 1


//wewnątrz funkcji main
{
//pusta pętla czekająca na przycisk
}while(WE & _BV(SWICH))

while(FOREVER)
{
// nieskończona pętla programu

}

Dodatkowa uwaga

Pominąłem konfigurację pinu jako wejście.

O tym należy pamiętać i o pull-up'ie.

wersja asm

.def tmp = r16
.cseg
.org 0
rjmp reset
reset:
eor tmp, tmp
out ddrb, tmp ;jako wyjscia
ser tmp
out portb, tmp ;ustawienie pull-upow
spr_klaw:
sbis pinb, 0 ;jezeli pinb.0 = 1 to pomin nastepna instrukcje
rjmp dalej
rjmp spr_klaw ;sprawdz klawisz ponownie
dalej: ;nieskonczona petla
rjmp dalej

Dzięki wszystkim za odpowiedź.

Niekoniecznie musisz użyć przerwań.

Problem w tym, że buduje tego robota głównie po to, aby nauczyć się czegoś nowego. Myślę, że mój problem jest całkiem dobrym przykładem by nauczyć się na nim właśnie przerwań. Dlatego byłbym wdzięczyny, gdyby ktoś mógł mi pokazać jak się je programuje na tym właśnie przykładzie

🙂

Zgadzam się z Trekerem.

Przerwania zostaw dla bardziej odpowiednich dla nich zadań.

Skoro chcesz się nauczyć czegoś nowego to ucz się od razu

dobrych nawyków i zwyczajów.

Zmarnujesz przerwanie INT na takie zastosowanie to później sobie roboty narobisz

jak będziesz musiał modyfikować cały kod programu, żeby w późniejszym czasie wykorzystać je w bardziej adekwatnym dla niego rozwiązaniu.

Jeśli chcesz w celach czysto edukacyjnych a nie użytkowych to proszę bardzo.

Obsługa przycisku przez przerwanie:

//definicje przed funkcją main
#define WE PINB    //nazwa portu do którego podłączony jest swich - w tym przypadku B
#define SWICH 0         //konkretny numer pinu - w tym przypadku 0
#define FOREVER 1
#defineWYCHODZ 1

volatile uint8_t flaga = 0;     //deklaracja zmiennej 8 bitowej z wylaczeniem jej optymalizacji

ISR(INT0_vect)       //funkcja obslugi przerwania INT0
{
    flaga =WYCHODZ;
}

void INT0_config(void);   //deklaracja funkcji konfiguracyjnej INT0


int main(void)
{
//wewnątrz funkcji main

//konfiguracja, daklaracja zmiennych itp.
    INT0_config();    //konfiguracja INT0
    sei();               //globalne zezwolenie na przerwania


    {
//pusta pętla czekająca na przycisk
    }while(!(flaga))    //lub np. flaga=WYCHODZ <- bardziej czytelne
    flaga=0;
EIMSK &= ~_BV(INT0);   //opcjonalne wyłączenie przerwania INT0


    while(FOREVER)
    {
// nieskończona pętla programu

    } 
}

void INT0_config(void)
{
// detekcja zbocza narastajacego
EICRA |= _BV(ISC00);
EICRA |= _BV(ISC01);

DDRD  |= _BV(2);
PORTD |= _BV(2);

// Uaktywnienie przerwania INT0
EIMSK |= _BV(INT0);
}

Powinno działać. Wszystko, a co najważniejsze to nazwy rejestrów i bitów konfiguracyjnych

są podane w nocie katalogowej. Kod zawiera nazwy z procesora ATmega88.

Ważne.

Jeżeli użyjesz nazw z niewłaściwego procesora masz DUŻE szanse na zablokowanie proca.

  • Pomogłeś! 1

Przekonaliście mnie, że to nie jest dobry pomysł. Nie pomyślałem o tym, że mam ograniczoną ilość przerwań i nie mogę nimi szastać na prawo i lewo;)

Jeżeli chodzi o nazwy rejestrów itd. to nie zaprzyjaźniłem się jeszcze z nimi, ale widzę że to nie uniknione;/

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