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

Atmega32 - Bascom Generator impulsów Timer1

mrslawcio 13 Cze 2013 23:10 1947 3
  • #1 13 Cze 2013 23:10
    mrslawcio
    Poziom 12  

    Witam.

    Napisałem poniższy program do generowanie impulsów o różnej częstotliwości . Zauważyłem jednak, że przy szybkim zwiększaniu częstotliwości timer1 tak jakby się zacinał na okres około 1s i potem wszystko jest ok. Prośba o informację czy ktoś spotkał się z podobnym zjawiskiem. Regulacja częstotliwości polega na zmianie wartości rejestru ORC1A (rejestr w którym jest przechowywana wartość do której ma zliczać timer1).

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Dodam, że zacina się regularnie przy zwiększaniu częstotliwości, zmiana w drugą stronę jest płynna i nie ma z tym problemów. Co jeszcze bardziej zadziwiające to, że szybciej się zacina zmieniając częstotliwość za pośrednictwem pinb.1 niż za pośrednictwem komend z RS.

    Prośba o jakieś sugestie.

    0 3
  • #2 14 Cze 2013 07:54
    emarcus
    Poziom 34  

    mrslawcio napisał:
    Witam.

    Napisałem poniższy program do generowanie impulsów o różnej częstotliwości . Zauważyłem jednak, że przy szybkim zwiększaniu częstotliwości timer1 tak jakby się zacinał na okres około 1s i potem wszystko jest ok. ........


    Na początek miałbym kilka pytań...
    1. Czy stosujesz podciąganie portów wejściowych?
    2. Czy masz wyłączony JTAG (używasz pin C.5 jako wyjście na którym jest właśnie JTAG).
    3. Skoro konfigurujesz Timer1 w trybie CTC to dlaczego nie korzystasz z tej funkcji dla OC1A na pinie wyjściowym PD.5?; wyeliminowałbyś extra subrutynę "Zmien stan", w której dodatkowo dajesz "Timer1 = 0" - On już jest wyzerowany przez CTC.
    4. W jakim celu 'dublujesz' zmienne o tej samej funkcji? (Ocr1a = Regulacja)
    Możesz bezpośrednio 'operowac' (incrementowac/decrementwac) na OCR1A.

    Koncept pracy timera w trybie CTC ma celu wyelinowanie 'pomocy' processora w obsłudze Timera przez co Timer może pracowac niezależnie od zajętosci processora.
    Wystarczy dodac w konfiguracji portów wyjście na PD.5, oraz w configuracji timera umieścic dodatkowo 'Compare A = Toggle'. (albo ustaw bit 6 w TCCR1A).

    W programie nie widac ustawień:
    $hwstack=
    $swstack =
    $framesize =
    Poza tym obsługa LCD w tej formie nie jest najlepszym rozwiązaniem.

    e marcus

    0
  • #3 14 Cze 2013 17:11
    mrslawcio
    Poziom 12  

    1. Mam podciągnięte porty wejściowe do masy
    2. JTAG jest wyłączony, przy włączonym JTAG dioda świeciła ciągle
    3. Bo taką mam płytkę, wcześniejszy błąd przy projektowaniu
    4. Myślałem że bezpośrednio nie mogę

    Poprawiłem wszystko o czym pisałeś i nadal jest ten sam błąd

    [code]

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Dodano po 22 [minuty]:

    Podłączyłem diodę pod PIND.5 i poprawiłem program i nadal to samo.
    Wydaje mi się że sama idea ciągłej zmiany zawartości rejestru OCR1A wpływa na nieprawidłową pracę. Po ustawieniu konkretnej wartości impulsy generowane są prawidłowo tylko podczas przestrojeń pojawia się błąd. Najgorsze jest to że mi zależy na tej ciągłej zmianie częstotliwości, ponieważ procek miałby sterować sterownikiem silnika krokowego na zasadzie krok, kierunek. Rozpędzanie i hamowanie silnika jest bardzo istotne.

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0
  • #4 02 Lip 2013 08:51
    mrslawcio
    Poziom 12  

    Witam

    Problem rozwiązany.
    W programie zmniejszałem wartość rejestru OCR1A o 100. Podczas takiej dekrementacji mogło dochodzić do przypadku jak niżej
    OCR1A=10000
    wartość timer1=9940
    jeżeli w tym momencie zmniejszyłem wartość OCR1A do 9900 to licznik liczył dalej do wartości 65536 i następowała przerwa na czas około 1-2 sekund

    Wystarczyło przed każdą zmianą OCR1A odczytać Timer1 i pomniejszyć zawartość o 100 + kilka cykli (dałem 20) na operacje na Timer1 (ponowne wgranie itp).
    Pomogło i działa poprawnie.

    Temat można uznać za zamknięty.

    Pozdrawiam
    Sławek

    0