Skocz do zawartości

Przerwania PCINT Atmega328P


pawo90

Pomocna odpowiedź

Witam,

Od jakiegoś czasu próbuję się uporać z obsługą przerwania dla procka atmega328.

Interesują mnie przerwania PCINT.

Na początek chciałbym, żeby w momencie pojawienia się 1 na porcie PC0 przerwanie inkrementowało mi zmienna pomocnicza o 1.

Obecnie program wyglada tak:

http://pokazkod.pl/8671105f81794a5b87f242f0f544f246f8126769949f183165

Nie wiem co robię źle... ale kod nie działa 🙁

Proszę o pomoc

Link do komentarza
Share on other sites

A w przerwanie w ogóle wchodzi?

Może daj jakieś miganie diodki żeby wiedzieć czy tam wchodzi czy nie.

Napisz dokładniej co nie działa.

Jeśli nie wchodzi do przerwania to sprawa aktywacji przerwania i ustawienia odpowiednio maski.

Jeśli wchodzi to masz skopane w kodzie. czy "zmienna" jest volatile?

No i nie dawaj opóźnień w przerwaniu

Link do komentarza
Share on other sites

Dzięki za odpowiedź,

W przerwanie już wchodzi, używałem złego vektora przerwań, powinien być PCINT1_vect.

Wtedy w przerwanie wchodzi.

Ale mam inne pytanie, jeśli chcę wykorzystać też przerwania z innych PCINT-ów, za ktore odpowiada PCINT1_vect, to jak zrobić, aby one ze sobą nie kolidowały?

Tzn jesli wcisne przycisk powiedzmy doprowadzony do portu PCINT8 to wykonaj cos tam,

Ale gdy wcisne przycisk doprowadzony do PCINT9 to wskoczy mi do tego samego miejsca i wykona to samo, a tak bym nie chciał 🙁

Link do komentarza
Share on other sites

Przerwanie PCINT1 pochodzi od nóżek 8-14 i nic tu nie zrobisz.

Po prostu w przerwaniu musisz sprawdzić które wystąpiło.

Najlepiej zapamiętać w poprzednim przerwaniu stan i wykonać xor z aktualnym.

To 2-3 linijki kodu

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

Mógbyś mi to napisać? bo szczerze mowiac nie bardzo wiem jak to zrobić.

Ogolnie rzecz biorąc mam kilka przycisków... i chcaiłem to rozwiązać w taki sposób, że 1 wciśnięcie zapala diodę pierwsza, 2 ją gasi, 3 znow zapala itd.

Wciśnięcie drugiego przycisku robi dokladnie to samo ale z drugą diodą.

Link do komentarza
Share on other sites

Mógbyś mi to napisać? bo szczerze mowiac nie bardzo wiem jak to zrobić.

Może jakoś tak

ISR(PCINT1_vect)

{

uint8_t przyciski;

uint8_t pin;

static uint8_t PCintLast;

pin = PINC;

przyciski = pin ^ PCintLast; // tu bedziesz miał zmiany na przyciskach

PCintLast = pin;

.

.

}

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!

Gość
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.