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

[Rozwiązano] ATtiny13 - Timer CTC, preskaler 1024, nie reaguje po dodaniu kodu

Drobny1995 28 Gru 2019 22:39 501 9
  • #1 18365919
    Drobny1995
    Poziom 8  
    Witam.

    Piszę mały program na ATetiny 13. Program ma wyglądać tak że po każdej 1 sek ma sprawdzać ilość przerwań o ile zliczanie przerwań działa to niestety gdy dodałem do tego Timer przestało cokolwiek reagować.

    taktowanie procka to 9,6 MHz
    Jak chciałem ustawić timer:

    tryb CTC
    preskaler 1024
    wychodzi wtedy 9375 cyki nadal za dużo do wpisania więc po podzieleniu przez 75 daje 125 i tyle wpisałem do OCR0A a brakującą ilość cykli nadrabiam w przerwaniu gdzie ma wykonać się to 75 razy aby ruszyło dalej.

    jeśli ktoś zna odpowiedz co mogłem źle wpisać prosił bym o małą podpowiedz gdzie powinienem szukać błędu w ustawieniu timera.

    Poniżej cały kod programu
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #2 18366079
    excray
    Poziom 41  
    Uruchomiłeś:
    Drobny1995 napisał:
    TIMSK0 |= (1<<OCIE0A);

    przerwanie od porównania a obsługujesz:
    Drobny1995 napisał:
    ISR(TIM0_OVF_vect)

    przerwanie od przepełnienia.
    A tak przy okazji:
    - zmienne zsyp1 i 2 to gdzieś zerujesz? Czy tylko je inkrementujesz aż się przekręcą?
    - zmienna "CZAS_NA_test" jest niepotrzebna. Równie dobrze mógłbyś w main sprawdzać czy zmienna i>=75 a w przerwaniu ograniczyć się do inkrementowania.
    - zapis do rejestru TCCR0B lepiej zrobić w jednym podejściu i bez OR. To samo tyczy się każdego innego rejestru.
    - nie stosuj typów int tam gdzie wystarczy unsigned char czyli praktycznie wszędzie
  • #3 18366131
    Drobny1995
    Poziom 8  
    Pomogła zmiana na ISR(TIM0_COMPA_vect) program zaczął odpowiadać niestety liczba cykli niezbyt się zgadzała chodzi o te 75 musiałem dać 8 wtedy jest mniej więcej 1 sek.

    excray napisał:
    - zmienne zsyp1 i 2 to gdzieś zerujesz? Czy tylko je inkrementujesz aż się przekręcą?

    wiem dodałem je właśnie po karzdym sprawdzeniu

    excray napisał:
    - zmienna "CZAS_NA_test" jest niepotrzebna. Równie dobrze mógłbyś w main sprawdzać czy zmienna i>=75 a w przerwaniu ograniczyć się do inkrementowania.

    usunąłem tą zmienną i robię wszystko od razu w przerwaniu a pętle while mam pustą.

    excray napisał:
    - zapis do rejestru TCCR0B lepiej zrobić w jednym podejściu i bez OR. To samo tyczy się każdego innego rejestru.

    W jaki sposób? korzystałem z poradników mirekk36 i widziałem że on w taki sposób wpisuje te wartości do rejestru więc uznałem że jest to prawidłowe .
  • Pomocny post
    #4 18366249
    LChucki
    Poziom 31  
    Drobny1995 napisał:

    excray napisał:
    - zapis do rejestru TCCR0B lepiej zrobić w jednym podejściu i bez OR. To samo tyczy się każdego innego rejestru.

    W jaki sposób?

    "=" zamiast "|=".

    Drobny1995 napisał:

    korzystałem z poradników mirekk36

    Dlaczego więc tam nie założyłeś tematu? Ban za złe przekonania, spojrzenie lub inny banał?

    W przypadku TCCR i nie tylko "=" zamiast "|=" daje krótszy i pewniejszy kod. Co innego rejestry zezwolenia na przerwanie.

    Drobny1995 napisał:
    Pomogła zmiana na ISR(TIM0_COMPA_vect)

    Dodaj w kodzie funkcję ISR(BAD_ISR) a w niej np NOP i ustaw break point. Jak program tam wskoczy to znaczy, że masz zdefiniowane przerwanie, którego nie obsługujesz ale tiny13 nie ma interfejsu do debugowania :-(
    Gdy miałem stworzyć coś na ren uC, to pisałem na tiny25 jak wszystko ok dostosowywałem do tiny13. Teraz to chyba różnicy w cenie pomiędzy 13 a 25 dużej nie ma więc lepiej od razu przesiąść się na 25 (o stm32g031 nie wspomnę).
  • #5 18366274
    StaryVirus_e_Wiarus
    Poziom 21  
    Cześć
    Do osiągnięcia 1 sekundy zastosowałbym timer 1 (16-bit). Wartość OCR1A ustawiłbym 9,6MHz/1024 = 9375 i otrzymam bardzo blisko 1 sekundy. Bez zbędnych kombinacji
  • #6 18366445
    LChucki
    Poziom 31  
    StaryVirus_e_Wiarus napisał:
    Cześć
    Do osiągnięcia 1 sekundy zastosowałbym timer 1 (16-bit). Wartość OCR1A ustawiłbym 9,6MHz/1024 = 9375 i otrzymam bardzo blisko 1 sekundy. Bez zbędnych kombinacji

    1) Skąd niby wziąć w tiny13 timer 16-bit? To nie tiny25.
    2) Jeśli już miałby 16-bit, to nie blisko sekundy ale dokładnie (na ile pozwala dokładność generatora) sekundę uzyska dla prekskanera 256 i podział przez 37500.
    3) Dokładnie sekundę uzyska na 8-bit ale zamiast
    Drobny1995 napisał:
    tryb CTC
    preskaler 1024
    wychodzi wtedy 9375 cyki nadal za dużo do wpisania więc po podzieleniu przez 75 daje 125 i tyle wpisałem do OCR0A

    trzeba dać preskaler 256, sprzętowy podział przez 250 i programowy przez 150.
  • #7 18366635
    StaryVirus_e_Wiarus
    Poziom 21  
    Przepraszam za wprowadzenie w błąd. Nie sprawdziłem noty. Wybaczcie.
  • #8 18366730
    Drobny1995
    Poziom 8  
    LChucki napisał:
    Dlaczego więc tam nie założyłeś tematu? Ban za złe przekonania, spojrzenie lub inny banał?

    Korzystałem tylko z poradników na YT, na tamtym forum jeszcze nie byłem.

    LChucki napisał:
    "=" zamiast "|=".

    Pozmieniane, program działa jedynie zostawiłem "|=" w rejestrze PCMSK
  • #9 18366872
    LChucki
    Poziom 31  
    Drobny1995 napisał:
    LChucki napisał:
    Dlaczego więc tam nie założyłeś tematu? Ban za złe przekonania, spojrzenie lub inny banał?

    Korzystałem tylko z poradników na YT, na tamtym forum jeszcze nie byłem.

    Nie ma czego żałować. Niewiele osób jest na tamtym forum, jeszcze mniej takich co się znają na AVR (większość dostała bana). W poradach często odsyłają do książek publikowanych przez Atnel. Bana można dostać za wszystko (tam nie ma czegoś takiego jak ostrzeżenia).
    Co ciekawe, często "szcześliwi" posiadacze drogiej literatury i jeszcze droższych zestawów Atnela, szukają pomocy na Elektrodzie a nie tamtejszym "przyjaznym" forum.
    Dlatego pytałem czy odwiedzałeś forum Atnela bo być może jesteś kolejnych "szczęśliwym" posiadaczem książki lub zestawu czy też płatnych bibliotek/programów, których lepsze wersje można za darmo znaleźć w Internecie.

    Ayny13 ma jeden timer, z reguły potrzeba jakiegoś timera systemowego, co zauważyli to projektanci ARM, gdzie taki prosty timer jest w architekturze CPU a nie peryferii. Dlatego gdy ARM ma 4 timery, to tak naprawdę jest ich 5.
    Zrób sobie na T0 timer 1ms ewentualnie 10 jak nie potrzebujesz rozdzielczości 1ms i w przerwaniu 1ms realizuje odmierzanie potrzebnych czasów. To rozwiązanie używałem na AVR, 8051 (tyle, że 10, czasem 4ms) i innych mikroprocesorach, teraz używam na ARM.
  • #10 18366953
    Drobny1995
    Poziom 8  
    Po modyfikacji kodu zgodnie z poradami excray oraz LChucki wszystko zaczęło działać poprawnie
REKLAMA