Obsługa przerwań (Atmega8)

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
Awatar użytkownika
ChevLucas
-
Posty: 10
Rejestracja: 08 gru 2012, 14:25
Lokalizacja: Nowy Sącz/Kraków

Obsługa przerwań (Atmega8)

Post autor: ChevLucas » 08 gru 2012, 14:37

Cześć, piszę program do linefollowera,który jest wyposażony w 4 czujniki CNY70 (każdy podłączony do innego pinu w Atmedze). Aby sterować tym pojazdem, chcę użyć przerwań. Problem tkwi w tym, że za bardzo nie wiem jak.

Robiłem kiedyś ćwiczenie na laborkach, gdzie jedno przerwanie było aktywowane po naciśnięciu jednego z przycisków, ale nie umiem ustawić, żeby ten przycisk, czy też pin był taki jak ja chcę.
Poza tym wiem, że istnieją przerwania INT0 i INT1, a ja mam 4 czujniki. Może da się takie przerwanie przypisać do całego portu?
Może znacie jakieś dobre poradniki? Albo dajcie jakiś fajny fragment kodu. Czytałem trochę ale póki co za wiele nie rozumiem z tego.

Awatar użytkownika
Ertew
Użytkownik
Posty: 1414
Rejestracja: 03 lip 2005, 10:36
Lokalizacja: Leszno
Kontakt:

Post autor: Ertew » 08 gru 2012, 15:04

Tak, ten procesor ma dwa przerwania zewnętrzne i nie przeskoczysz tego.

Dla robotów tej klasy możesz wywoływać przerwanie co określony odcinek czasu np. 5ms czyli 200 przerwań na sekundę i w przerwaniu sprawdzać czy stany pinów się zmieniły.
Alternatywnie możesz mieć jedną pętlę która ciągle sprawdza stany pinów i upływ czasu (liczony timerem/przerwaniami), by na tej podstawie sterować silnikami robota.

Trzecia opcja jaka mi przychodzi do głowy, to możesz zmienić procesor. Nie znam procesorów z czterema przerwaniami zewnętrznymi typu INT0, INT1 itd, ale niektóre procesory mają jeszcze mechanizm PCINT0 i kolejne. Ten mechanizm monitoruje stan dowolnie wybranych pinów wejściowych w obrębie jednego portu i po zmianie któregoś z nich wywołuje przerwanie. Można go ustawić na pilnowanie tylko jednego pinu i działa wtedy podobnie do typowego przerwania, albo na kilka pinów na raz, wtedy zgłasza zmianę jakiegoś pinu, a procesor już sam musi sprawdzić który pin się zmienił.

Dla przykładu atmega169 ma INT0, PCINT0 i PCINT1
(jedno PCINT wystarczy do obsłużenia wszystkich czujników)
albo atmega162 która ma INT0, INT1, INT2, PCINT0 i PCINT1
(na upartego masz tutaj 5 przerwań zewnętrznych, więc możesz dodać jeszcze jeden czujnik)

Awatar użytkownika
ChevLucas
-
Posty: 10
Rejestracja: 08 gru 2012, 14:25
Lokalizacja: Nowy Sącz/Kraków

Post autor: ChevLucas » 09 gru 2012, 23:00

Dobra, a mógłbyś podać jakiś fragment kodu, albo powiedzieć jak zrobić z tym przerwaniem generowanym przez timer? Bo wiem, że są automatyczne przerwania, gdy np. taki timer się przepełni, ale tak żeby co 5ms to nie wiem :/

Oczywiście jak przychodzi co do czego to nikt nic nie wie... oczywiście sobie żartuję trochę, ale to nie zmienia faktu, że odpowiedzi nie otrzymałem

Awatar użytkownika
matrix
Użytkownik
Posty: 1796
Rejestracja: 15 mar 2006, 5:21
Lokalizacja: Sochaczew
Kontakt:

Post autor: matrix » 09 gru 2012, 23:25

Jak taktujesz zegar 8MHz, do tego wybierzesz timer0, prescaler=256 i wpiszesz do timera liczbę 100 to przerwanie będzie wywoływane co 4,9920ms. Przy liczbie 99 przerwanie następować będzie co 5,0240ms.

ODPOWIEDZ