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

[atmega16] [atmega16][BASCOM] Jak regulować częstotliwość sygnału CLK?

sorex86 14 Cze 2011 20:17 2029 11
REKLAMA
  • #1 9612284
    sorex86
    Poziom 15  
    Posty: 256
    Pomógł: 9
    Ocena: 16
    Witam ;)


    Napisałem sobie prosty programik:

    Kod: text
    Zaloguj się, aby zobaczyć kod



    Gdy nacisne przycisk PinB0 to generuje sobie pseudo-prostokąt zmieniając stan portu B1 na ciąg 01010101... Marzy mi się jednak możliwość regulacji częstotliwości takiego sygnału. Jak się to tego zabrać? Sprzętowo to wiem. Jednak wolałbym zrealizować to przy pomocy odpowiedniego wsadu, programu. Mogą mnie koledzy naprowadzić w jaki sposób to wykonać?

    Ps. Wieeeeeeeem, że można zrealizować to bez funkcji wait ;D (przerwania). Jednak dokładność/stabilność jest najmniej ważny parametrem w moim wypadku.
  • REKLAMA
  • #2 9612309
    tmf
    VIP Zasłużony dla elektroda
    Posty: 14318
    Pomógł: 2090
    Ocena: 2205
    Skoro stabilność jest ważnym parametrem to dlaczego chcesz to zrobić programowo? Od tego są timery w odpowiednim trybie i wyjścia OCx. Programowo w przypadku użycia przerwań, albo w sytuacji w której procesor ma robić cokolwiek innego niż tylko w pętli generować przebieg nie da się tego zrobić stabilnie.
  • #3 9612326
    sorex86
    Poziom 15  
    Posty: 256
    Pomógł: 9
    Ocena: 16
    Yyyy. No właśnie napisałem, że stabilność mnie nie interesuje. Kolega za szybko przeczytał moją wiadomość.

    Interesuje mnie zakres załóżmy od 10Hz - 400Hz, z zastawem regulowanym. Czy będę miał 200 czy 220Hz to mi różnicy nie robi, porostu nie wiem jak ten temat ugryźć. Nie chodzi tu o sama składnie języka ale o pomysł realizacji. O wytłumaczenie, na kierowanie na odpowiednią drogę, a sobie już poradzę :)
  • REKLAMA
  • Pomocny post
    #4 9612667
    nsvinc
    Poziom 35  
    Posty: 2870
    Pomógł: 262
    Ocena: 88
    Aaaale...

    Czy generowanie tego przebiegu ma być jedynym zadaniem twojego mikrokontrolera? Jeśli w pętli głównej będziesz chociażby odczytywać czujnik 1wire lub mocno utylizujesz przerwania, błąd nie będzie rzędu 10% (220Hz zamiast 200Hz), tylko rzędu 50%, a może i nawet 100%. Tego nie wie nikt, i nie ma takiej mocy żeby to policzyć...

    Co tu dużo tłumaczyć?
    Przecież to co ty napisałeś jest bliskie (?) temu co ci potrzeba... Jedyną wskazówką jest to, że stanu z przycisku nie czyta się ot tak, tylko musisz jakoś w zupełnie dowolny zresztą sposób filtrować drganie stykuf. Bascom ma takie coś jak debounce.
    Niestety nie znam bascoma tyle, żeby napisać kod, ale pseudokod powinien wystarczyć:
    
    do
    {
    while(przycisk_jest_wcisniety)
    {
    PIN=PIN xor 1;
    waitms x;
    }
    }
    loop
    


    Stosując takie rozwiązanie musisz pamiętać o tym, że gdy procek będzie właśnie generować przebieg, to nie będzie robił nic innego, i jedyne co będzie mógł obsłużyć poza generowaniem przebiegu to ISRy.
    Tak się ogólnie nie powinno robić; implementacja generowania przebiegów w ten sposób jest niezgodna ze sztuką, i oprócz pozornej prostoty implementacji nie ma żadnych zalet.
  • REKLAMA
  • #5 9613004
    xury
    Specjalista automatyka domowa
    Posty: 7083
    Pomógł: 878
    Ocena: 1497
    Myślę, że kolega tmf źle zrozumiał autora, a kolejne osoby już nie wnikały. Pisząc "programowo" miał na myśli napisanie programu, a nie to że "bez wykorzystania urządzeń mikrokontrolera". Więc jedyna sensowna rada użyć timera w trybie Compare match i zmianą stanu na wyjściu OC Zmieniając wartość rejestru OCRx zmieniamy częstotliwość.
  • #6 9613421
    tmf
    VIP Zasłużony dla elektroda
    Posty: 14318
    Pomógł: 2090
    Ocena: 2205
    Myślę, że jednak dobrze zrozumiałem - "Sprzętowo to wiem. Jednak wolałbym zrealizować to przy pomocy odpowiedniego wsadu, programu.". Jak wie, że sprzętowo można to znaczy, że nie o timery tu chodzi. Ale bardziej niż o co chodzi, ciekami mnie dlaczego nie robić tego jak należy tylko próbować to robić tak jak nie należy.
  • #7 9613547
    sorex86
    Poziom 15  
    Posty: 256
    Pomógł: 9
    Ocena: 16
    No to zagmatwałem. Po prostu lubię sobie poeksperymentować, taki dziwny sposób nauki. Po dłużej lekturze już powoli rozumiem, dlaczego nie należy tak kombinować ...

    To abstrahując od poprzedniego wątku:

    Potrzebowałbym wygenerować 4 przebiegi pseudo-prostokątu do max 1kHz(sygnał CLK) z możliwością przestrajania częstotliwości. Nie muszą one działać równocześnie. Najlepiej to wykonać tak jak kolega xury napisał?
  • #8 9613984
    tmf
    VIP Zasłużony dla elektroda
    Posty: 14318
    Pomógł: 2090
    Ocena: 2205
    Zdecydowanie tak, bo wtedy są one realizowane całkowicie sprzętowo.
  • Pomocny post
    #9 9614511
    lelekx
    Poziom 30  
    Posty: 1220
    Pomógł: 158
    Ocena: 90
    Gdybym to robił bez wykorzystania peryferiów MCU, zrobiłbym to tak (albo podobnie, nie pamiętam czy Bascom pozwala na użycie zmiennej w wyrażeniach wait):
    Kod: text
    Zaloguj się, aby zobaczyć kod


    sorex86 napisał:
    Potrzebowałbym wygenerować 4 przebiegi pseudo-prostokątu do max 1kHz(sygnał CLK) z możliwością przestrajania częstotliwości. Nie muszą one działać równocześnie. Najlepiej to wykonać tak jak kolega xury napisał?


    A jak byś to zrealizował bez mikrokontrolera? Na samych układach cyfrowych i z jednym generatorem stałej częstotliwości? Jak będziesz miał rozwiązanie, to wtedy będziesz też wiedział jak z mikrokontrolerem to ugryźć.
  • REKLAMA
  • #10 9614704
    sorex86
    Poziom 15  
    Posty: 256
    Pomógł: 9
    Ocena: 16
    Bez mikroprocesora to chyba najłatwiej kostka Ne555 pracująca jako generator astabilny oraz kondensator 1uF, potencjometr do 100k ohm.

    Dzięki, zaraz pokombinuje

    Z mikroprocesorem:

    Hm, może tak? Potencjometr na ADC mikroprocesora. Wartość zmiennej 'wait' będzie zależeć od napięcia i dopiero do pętli?
  • Pomocny post
    #11 9615624
    xury
    Specjalista automatyka domowa
    Posty: 7083
    Pomógł: 878
    Ocena: 1497
    A nie lepiej tak ?
    Przykładowa konfiguracja timera1 w trybie CTC i przebiegiem na OC1a

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Potem tylko zmieniać wartość rejestru Compare1a jakimiś przyciskami, pilotem, enkoderem etc.

    ps. Jak nie zadziała to poustawiać bity w rejestrach "na piechotę"
  • Pomocny post
    #12 9639952
    Konto nie istnieje
    Konto nie istnieje  

Podsumowanie tematu

LABEL_AI_GENERATED
W dyskusji poruszono temat regulacji częstotliwości sygnału CLK generowanego przez mikrokontroler ATmega16 przy użyciu języka BASCOM. Użytkownik zaprezentował kod, który generuje pseudo-prostokąt, ale poszukiwał sposobu na regulację częstotliwości w zakresie 10Hz - 400Hz. Odpowiedzi sugerowały wykorzystanie timerów w trybie Compare Match, co pozwala na stabilne generowanie sygnałów. Użytkownicy podkreślili, że programowe podejście może prowadzić do niestabilności, zwłaszcza gdy mikrokontroler wykonuje inne zadania. Proponowano również użycie potencjometru do regulacji wartości opóźnienia oraz konfigurację timerów do generowania sygnałów o różnych częstotliwościach. Wspomniano o książce Piotra Góreckiego jako źródle wiedzy na temat mikrokontrolerów i programowania w BASCOM.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA