Skocz do zawartości

Przerwania PCINT Atmega328P


Pomocna odpowiedź

Napisano

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

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

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ł 🙁

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

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

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;

.

.

}

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