Elektroda.pl
Elektroda.pl
X
Mitronik
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Przerwania USART po raz kolejny

brzydal91 17 Kwi 2011 17:46 849 4
  • #1 17 Kwi 2011 17:46
    brzydal91
    Poziom 12  

    Witam. Temat wątku wziął się stąd, że na forum znalazłem już kilka o podobnej tematyce jednak żaden nie pomógł mi z tym zagadnieniem.
    Programuję na Linuksie na AtMega8. Napisałem sobie proste biblioteki do obsługi USART oraz TWI jednakże chciałbym teraz spróbować popracować z przerwaniami i tutaj jest problem.
    Mam taki oto kod:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Program ten wysyła poprzez USART odczyt z układu PCF8574. Wszystko to działa, ale jak możecie zauważyć próbowałem zdefiniować dwa przerwania. Oba mają zapalić diodę led podłączoną do jednego z pinów portu C. Niestety dioda się nie zapala. Jeśli chodzi o schemat, połączenia itd. to wszystko jest ok bo mogę diodę zapalić ustawiać PORTC w programie poza przerwaniem.
    Funkcja "uruchamiająca" USART wygląda u mnie tak:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Cały program podzielony mam na moduły. Jest moduł usart oraz twi. Mam nadzieję, że to nie stanowi jakiejś przeszkody w napisaniu takiego kodu.
    Moim drugim problem jest to, że nie wiem jak kompilatorowi wskazać ścieżkę do plików nagłówkowych. Aktualnie muszę dołączać nagłówki w kodzie poprzez pełne ścieżki a tak nie powinno się robić. Na potrzeby projektu napisałem sobie Makefile.
    Kompilator gcc ma coś takiego "-L" i po tym wskazuje się ścieżkę do nagłówków, czy ktoś się już z tym spotkał?
    Z góry dziękuję za wskazanie błędów. Na bieżąco mogę dopisywać potrzebne do rozwiązania informacje. Pozdrawiam

    0 4
  • Mitronik
  • #2 18 Kwi 2011 13:52
    koleszka
    Poziom 24  

    Faktycznie zdefiniowałeś 2 przerwania ale uaktywniłeś tylko jedno:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    aby uaktywnić przerwanie zgłaszane po poprawnym wysłaniu bajtu należy ustawić bit TXCIE czyli:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    W takim przypadku masz uaktywnione oba przerwania. Jeśli nic nie wysyłasz z drugiej strony, tak żeby uC odebrał dane to nie ma możliwości aby diody się zaświeciły.

    Co do twojego problemu z dodawaniem własnych plików nagłówkowych to pamiętasz o cudzysłowu? Napisz dokładniej na czym polega problem.

    0
  • Mitronik
  • #3 18 Kwi 2011 14:10
    brzydal91
    Poziom 12  

    Problem polega na tym że jak tworzy się program w C lub C++ czy obojętnie jakim języku i dzielimy go na moduły to te moduły powinny być samodzielne i przenośne. W tym celu nie uwzględnia się w nich pełnych ścieżek do plików nagłówkowych. Aby program został poprawnie skompilowany dodaje się podczas kompilowania "-L" i ścieżkę do plików nagłówkowych. Tak się to robi w przypadku gcc. Nie wiem natomiast jak to zrobić w przypadku avr-gcc, bo jak zaglądam do help'a to nie ma tam takiej opcji.

    Mam jeszcze takie pytanie. Czy komunikacja poprzez USART powinna działać w oparciu o przerwania czy w oparciu o zwykłe funkcje też może być? Chodzi mi oto czy w bardziej zaawansowanym projekcie nie napotkam później jakiś przeszkód i nie będę musiał przerabiać całości. Pozdrawiam

    0
  • #4 18 Kwi 2011 14:17
    Zbych_
    Poziom 24  

    Ścieżkę poszukiwań dodajesz opcją I, nie L. Spróbuj skorzystać ze standardowych makefile'i dostarczanych z avr-gcc i dopiero jak ci to zadziała, to twórz własny makefile jeśli koniecznie musisz.

    0
  • #5 18 Kwi 2011 17:22
    koleszka
    Poziom 24  

    brzydal91 napisał:
    Mam jeszcze takie pytanie. Czy komunikacja poprzez USART powinna działać w oparciu o przerwania czy w oparciu o zwykłe funkcje też może być? Chodzi mi oto czy w bardziej zaawansowanym projekcie nie napotkam później jakiś przeszkód i nie będę musiał przerabiać całości. Pozdrawiam

    Można zrobić to na oba sposoby z tym że na przerwaniach jest znacznie wygodniej i w bardziej zaawansowanych projektach trudno się obyć bez tego. Nie wykorzystując przerwań sam musisz zadbać aby cyklicznie sprawdzać odpowiednie flagi i obsługiwać komunikacje. Jest to nie wygodnie i przy większych projektach jest trudne do realizacji, jeśli wszystko zaczniemy obsługiwać sami. Ogólnie rzec biorąc osobiście wychodzę z założenia, że w pętli głównej obsługuje mniej istotne rzeczy jak obsługa LCD, przełączanie się pomiędzy kolejnymi poziomami menu itp. Wszystkie pozostałe robię na przerwaniach z tego względu, że nie muszę się nimi zajmować w głównej pętli programu. Dodatkowo mam pewność, że nie utracę danych, bo zbraknie mi czasu na ich odczytanie. Dlatego radze już teraz oswoić się z przerwaniami. Potem jest to bardzo wygodne narzędzie i znacznie ułatwia tworzenie niezawodnego kodu. Warto pamiętać, że przerwanie możemy obsłużyć z możliwością obsługi innych przerwań lub z zablokowanymi przerwaniami.

    Ostatecznie: Nie jest to konieczne aby komunikacja USART była na przerwaniach aczkolwiek bardzo wskazane.

    0