logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

ATmega32 - Przerwanie timer0 nie działa z warunkiem Transmit w USART_RXC_vect

mikroice90 03 Sty 2013 16:52 2166 17
REKLAMA
  • #1 11735075
    mikroice90
    Poziom 13  
    Witam,

    pisałem w ostatnim czasie na tym forum wielokrotnie problemy wciąż dotyczą tego samego projektu. Tym razem do przerwania USART_RXC_vect wstawiłem ifa sprawdzającego czy ma transmitować dane czy nie. Bez tego warunku wszystko działa lecz wtedy nie mogę kontrolować startu i końca wysyłania. Poniżej kod przerwania timera i przerwania od USART. Jak widać 0x80 - Transmit =1, 0x81-Transmit=0;

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Diody zaprzątnięte do pracy w mainie miały sygnalizować pracę układu (wysyłanie lub nie) ewidentnie program gdzieś się gubi.
  • REKLAMA
  • #3 11736749
    mikroice90
    Poziom 13  
    Nie działa transmisja czyli to co jest w obsłudze przerwania Timer0.
    Nigdzie nie próbuję wysłać wartości większej niż 255. 0x80 = 128 a 0x81 = 129.
    Wie ktoś dlaczego to nie działa?
  • REKLAMA
  • #4 11737042
    eleproject

    Poziom 17  
    Tutaj wpisujesz liczbę większą niż 255 {UBRRL=416;break;}. Ale to nie problem postu.

    Możesz przedstawić ciało funkcji ustaw_timer()?
    Czy jesteś pewny, że realizowane jest wywołanie funkcji ustaw_timer()? Próbowałeś tam (w okolicy wywołania tej funkcji) wstawić jakąś linię np. negującą stan diody, by mieć pewność, że program tam trafia?
  • #5 11737097
    mikroice90
    Poziom 13  
    Próbowałem ustawiłem tam np wyświetlenie częstotliwości z funkcji przelicz i działa.
    Z moich obserwacji i testów wynika że przed wysłanie ramki częstotliwości układ przyjmuje wszystkie dane a po odebraniu częstotliwości i wyświetleniu jej na LCD już nie przyjmuje.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Dodano po 1 [godziny] 12 [minuty]:

    Kolejne spostrzeżenie - po wykonaniu metody ustaw_timer() przerwanie USART_RXC_vect jakby przestawało działać. Ostatnia linia kodu w metodzie ustaw_timer() powoduje wyświetlenie częstotliwości na LCD ale później układ już nie reaguje na wysyłane informacje. Czym to może być spowodowane?

    Dodano po 9 [minuty]:

    Wnioskuję że skoro przerwanie od Timer0 ma wyższy piorytet niż od USART to przerwanie USART_RXC_vect się nie wykonuje po inicjalizacji timera. Da się jakoś zmienić piorytet przerwania?
  • REKLAMA
  • #7 11738009
    mikroice90
    Poziom 13  
    Nie mogę niczego wywalić. w USART musi być co jest a timer musi zbierać bity z wejścia dosyć dokładnie
  • #8 11738044
    dondu
    Moderator na urlopie...
    Zarżnąłeś mikrokontroler na własne życzenie. Więc przeczytaj dokładnie link który Ci podałem, a później sam zobaczysz swój kod i złapiesz się za głowę. Następnie powywalasz do main() 80% kodu i nagle stwierdzisz, że wszystko działa tip-top.
  • #9 11738058
    mikroice90
    Poziom 13  
    Mógłbyś mi to omłotowo wyłożyć? Przeczytałem Twój link nadal nie widzę nic strasznego, lub nie mam pomysłu jak to zrobić inaczej. Pomożesz mniej doświadczonemu użytkownikowi?
  • REKLAMA
  • #10 11738074
    dondu
    Moderator na urlopie...
    mikroice90 napisał:
    Mógłbyś mi to omłotowo wyłożyć? Przeczytałem Twój link nadal nie widzę nic strasznego, lub nie mam pomysłu jak to zrobić inaczej. Pomożesz mniej doświadczonemu użytkownikowi?

    Do tej pory każdy , kto przeczytał rozumiał, nawet ten który ledwo co zaczął używać przerwania.
    Punkt po punkcie czytaj i patrz na swój kod - tak dojdziesz do właściwych wniosków.
    Wrzuciłeś praktycznie wszystko w przerwania, a ma być dokładnie odwrotnie.
  • #11 11738078
    BlueDraco
    Specjalista - Mikrokontrolery
    Krótko: LCD nie obsługuje się w obsłudze przerwania, a jeśli już się obsługuje, to zupełnie inaczej (i nie jest to wcale proste). W każdym razie nie możesz w obsłudze przerwania wyświetlić na LCD nawet dwóch znaków.
  • #12 11738090
    mikroice90
    Poziom 13  
    LCD był tylko dla debugowania. A wywalenie tego w main spowoduje to że będę musiał kilkanaście flag mieć...

    Dodano po 1 [minuty]:

    W przerwaniu timera jedynie co mogę usunąć to metoda nadaj. Ponieważ timer ustawiony jest po to by co określony czas zbierał mi bit z wejścia ustawianie flagi i potem jej obsługa to za długo.
  • #13 11738098
    dondu
    Moderator na urlopie...
    mikroice90 napisał:
    LCD był tylko dla debugowania. A wywalenie tego w main spowoduje to że będę musiał kilkanaście flag mieć...

    Ile razy na sekundę wykonuje się ustaw_timer()?
    Co jest funkcjach przelicz() oraz nadaj(), których nie pokazałeś?
    Jak często wywoływane jest ISR(TIMER0_COMP_vect)?
  • #14 11738104
    mikroice90
    Poziom 13  
    Już pojazuje. Ustaw_timer() wykonuje się raz, po transmisji częstotliwości do uC z PC. Przy zmianie częstotliwości wykona się ponownie.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Dodano po 9 [minuty]:

    Zmiana maina na taki spowodowała że przelicz i ustaw_timer wykonują sie poprawnie. Flaga transmit też zaczęła reagować jednakże nadaj już nie działa...
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #16 11738135
    mikroice90
    Poziom 13  
    Dobrej nocy, jak napisałem wyżej już wyrzuciłem je z przerwań co poskutkowało tym że już nie ma transmisji.. RXC działa ale teraz transmisji brak... heh

    Dodano po 1 [godziny] 35 [minuty]:

    A po modyfikacjach jak niżej problem znów ten sam. Jeżeli wywołam metodę ustaw_timer() przy fladze Juz_freq to nawet Startu(0x80) już nie dam.
    Gdzie teraz tkwi szczegół? Switcha nie mogę wyrzucić do maina bo do otrzymania kolejnej wartośći UDR przechowuje śmieci a RXC będzie opierać się na jakimś rzadkim start stop.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #17 11741814
    mirekk36
    Poziom 42  
    mikroice90 napisał:
    Czy ktoś ma jakiś pomysł??


    Tak ja mam pomysł - zrobić transmisję UART tak jak się należy czyli z wykorzystaniem buforów cyklicznych zamiast analizą wszystkiego w przerwaniu - co owocuje tylko samymi problemami jak widzisz. Czytałeś kiedyś gdzieś o buforach cyklicznych do obsługi UART'a. Przerwanie tylko napełnia te bufory, a z poziomu programu pięknie odczytujesz gotowe dane które nadleciały do tych buforów. Daje to tę dodatkową zaletę, że nawet jeśli procek będzie chwilę dłużej zajęty - to nadsyłane dane ci nie uciekną, wpadną do bufora cyklicznego - a ty je odczytasz w dogodnej dla ciebie chwili.
  • #18 11741869
    mikroice90
    Poziom 13  
    Nie wiem nic na ten temat. Na tą chwilę wydaje się że funkcja ustaw_timer() powoduje problemy, bo po jej wykonaniu układ nie reaguje na przychodzące dane.

    Dodano po 2 [godziny] 13 [minuty]:

    Po usunięciu z programu funkcji przelicz i ustaw timer i utawianiu timera na sztywno problem wciąż ten sam. Po inicjalizacji timera i rozpoczęciu transmisji zgodnie z przerwaniem TIMER0_COMP_vect brak odpowiedzi układu na wysyłane dane z PC.
REKLAMA