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.
Obsługa przerwań (Atmega8)
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)
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)
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
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