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

Atmega 1284p czas wpisania do rejestrów ICR1, OCR1B

EE.PW 04 Kwi 2017 19:26 891 3
REKLAMA
  • #1 16392140
    EE.PW
    Poziom 8  
    Witam Szanownych Forumowiczów,
    w aktualnym projekcie muszę wygenerować trzy interwały czasowe z regulowaną długością. Poglądowy rysunek dołączony jest jako załącznik. T1ON powinien mieć regulację 1-100us, T2OFF (możliwie krótko - 5us), T3ON (możliwie krótko - 5us). Wykorzystywana przeze mnie Atmega taktowana jest zewnętrznym zegarem 20MHz. Wynika z tego, iż możliwa regulacja powinna wynosić 50ns. Oczywiście należy uwzględnić tu minimalny czas zmiany wartości w rejestrach ICR1 i OCR1B. Wykorzystuje Timer 1 (16bitowy) w trybie 14 (FastPWM z wartością TOP jako ICR1).
    Pomysł na ten program dodany jest jako załącznik.

    A to kod:

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


    gdy wpiszę w zmienne interwałów czasowych np wartości 20 20 20 program przestaje działać poprawnie. Wydaje mi się, że 20 cykli zegara to dużo, by zmienić wartość rejestru. Zbocza są +1 w stosunku do rysunku, bo inaczej generuje tylko jeden puls/
    Start jest wywoływany przyciskiem (czekam następnie chwilę by nie było drgań) i wywołuję kolejno metody InitTimer1() oraz Timer1ON_dwupulsowy().
    Proszę o pomoc, gdyż siedzę na tym już kilka dni i nie wiem gdzie może być błąd.
  • REKLAMA
  • Pomocny post
    #2 16392612
    dondu
    Moderator na urlopie...
    Analizowałeś plik .lss?
    Sprawdzałeś ilość cykli w symulatorze?:
    EE.PW napisał:
    Wydaje mi się, że 20 cykli zegara to dużo, by zmienić wartość rejestru.

    W którym miejscu programu?

    Timer1OFF_dwupulsowy() zrobiłbym jako inline.
  • REKLAMA
  • #3 16392661
    EE.PW
    Poziom 8  
    W momencie wywołania któregoś z przerwań. Np. COMPB gdzie modyfikuję rejestr OCR1B ...
REKLAMA