Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Kategoria: Kamery IP / Alarmy / Automatyka Bram
Montersi
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

PIC16F628A, język C, PWM, TIMER2, ustawienie rejestrów CCPR1L i CCP1X i CCP1Y

pisulski 18 Mar 2017 22:00 879 3
  • #1 18 Mar 2017 22:00
    pisulski
    Poziom 9  

    Witam.
    Chciałbym ustawić czas trwania stanu wysokiego w sygnale PWM.
    Mam taki programistyczny problem.
    Otóż "Dudy Cycle" można ustawić z 10 bitową rozdzielczością, a wartość ta jest zapisywana w rejestrze CCPR1L, gdzie zapisane jest 8 bitów a dwa pozostałe w CCP1X i CCP1Y.

    Pytanie brzmi.

    W jaki sposób w języku C można zapisać taką wartość.

    Przykładowo chciałbym aby co 10 sekund zmieniało mi się wypełnienie.

    Chodzi mi tylko o wpisanie do rejestru CCPR1L oraz CCP1X i CCP1Y.
    Coś na zasadzie sklejenia?

    Kolejne pytanie brzmi:
    Jeżeli mamy prosesor operujący na rejestrach 8 bitowych, jak można zapisać 10 bitową wartość? Jaki trik jest potrzebny?

    Proszę o podpowiedź. Może jakiś prosty kod?

    Dodano po 45 [minuty]:

    To może jak się takie operacje na bitach nazywają, to sobie poszukam.

    Dodano po 11 [minuty]:

    Czy struktury są dobrym rozwiązaniem?

  • Pomocny post
    #2 18 Mar 2017 22:17
    Sparrowhawk
    Poziom 21  

    Takie operacje na bitach w strukturach nazywane są polami bitowymi.

    Jeżeli chcesz gdzieś zmieścić wartość 10 bitową, to przecież możesz przechowywać tę wartość w zmiennej o wielkości 16 bitów.

    Co do używania struktur z polami bitowymi i rzutowania na nie innych wartości, to zwróć uwagę, że są to elementy wrażliwe na kolejność przechowywania bajtów w pamięci na danej architekturze (endianess).

    Najprościej do przechowywania wartości wypełnienia możesz użyć zmiennej 16 bitowej. A poszczególne rejestry możesz ustawić korzystając z prostych masek i przesunięć bitowych.

    Kod: c
    Zaloguj się, aby zobaczyć kod

  • Pomocny post
    #3 18 Mar 2017 22:26
    szymonjg
    Poziom 15  

    W kilku operacjach. Najpierw wpisujesz odpowiednią wartość do rejestru CCPR1L a potem ustawiasz osobno 2 dodatkowe bity. Już chyba niedawno ktoś Ci tu podał instrukcję jak dobierać się do bitów. Pamiętaj tylko, że rejestr CCPR1L to 8 najstarszych bitów a te dwa dodatkowe są na najmłodszych miejscach, także wspólnie moduł PWM robi sobie z nich dopiero jedną 10-bitową liczbę.

    Poniżej przykład funkcji którą kiedyś popełniłem w celu ustawiania wypełnienia PWM na jakimś PIC18. Powinna działać też na PIC16F628 a jeśli nie to trzeba tylko nazwy tych bitów poprawić.

    Kod: c
    Zaloguj się, aby zobaczyć kod

  • #4 19 Mar 2017 16:48
    pisulski
    Poziom 9  

    Mógłbyś wyjaśnić ten kod?

    Sparrowhawk napisał:


    Kod: c
    Zaloguj się, aby zobaczyć kod


    Dodano po 1 [godziny] 3 [minuty]:

    Ok, nie trzeba tłumaczyć.
    Problem był w tym, że nie doczytałem, że CCP1X i CCP1Y to bity LSB, a nie MSB.
    Wszystko zrozumiane, przetestowane, działa.

Szybka odpowiedź lub zadaj pytanie
Dziękuję Ci. Ta wiadomość oczekuje na moderatora.
 Szukaj w ofercie
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME