Skocz do zawartości

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


kling

Pomocna odpowiedź

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.

Link do komentarza
Share on other sites

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 😉

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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

🙂

Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

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;/

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.