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

Bascom - szybkie ściemnianie LED PWM, jak spowolnić?

BIGJack 06 Lis 2012 10:35 5106 18
REKLAMA
  • #1 11494976
    BIGJack
    Poziom 16  
    Posty: 281
    Ocena: 14
    Mam problem ze sterowaniem PWM w moim projekcie.
    Załączam fragment kodu który ma powoli rozjaśniać i ściemniac żarówkę
    led jednak rozjasnienie działa zgodnie z założeniem czyli powoli i płynnie a gaszenie w mgnieniu oka tzn. bardzo szybko.
    Jeżeli te procedurki połącze w jedna to prawidłowo rozjasnia i gasi?
    Jaka jest przyczyna?

    Kod: text
    Zaloguj się, aby zobaczyć kod
    [/code]
  • REKLAMA
  • #2 11495408
    Mundi1970
    Poziom 24  
    Posty: 342
    Pomógł: 96
    Ocena: 133
    Podprogramy wywołuje się instrukcją Gosub, a nie Goto.
  • #3 11495774
    BIGJack
    Poziom 16  
    Posty: 281
    Ocena: 14
    Kolego nowynom Twój poprawiony kod również nie zawiera etykiet :) aczkolwiek wygląda można powiedzieć wzorowo :)

    Cytat:
    A tak nawiasem, czy nie łaska sprawdzić na symulatorze ?

    Napisałem tego posta w akcie desperacji po lekturze helpa, innych postów i
    wygooglowaniu wszystkiego co możliwe. Mam podpięty układ pod kompa i przelewam moje wypociny na bieżąco do procka.

    Cytat:
    O toto Kolega nie wie, co to są ETYKIETY

    Oczywiście że wiem aczkolwiek nie jestem biegły w bascomie i robiąc mój mały bałagan w prostym kodzie etykiety mi tylko przeszkadzają. Oczywiście jak wstawiam fragment kodu na elektrodę to byłyby wskazane aczkolwiek przy tych kilku linijkach chyba się obędziemy bez nich :)

    Jest to fragment kodu celowo zawężony do minimum niezbędnego do analizy moich błędów w pisaniu programu. Celowo zrobiłem nieskończoną pętlę.

    Całość ma sterować iluminacją dekoracyjną i oświetleniem miejsca roboczego w kuchni. Czujnik podczerwieni rozjaśnia w miarę szybko i odlicza czas do wyłączenia jednak jeżeli podczas odliczania wykryje ruch to zeruje czas i odlicza od początku po czym płynnie powoli wygasza światło. Oto kod który napisałem do tej pory.
    Kod: text
    Zaloguj się, aby zobaczyć kod


    ps pomijając fakt że zastosowałem goto zamiast gosub dlaczego jedna procedura jest wykonywana według oczekiwań a druga nie?
    kolego nowynom Twój kod działa ładnie w symulatorze ale w moim układzie brak reakcji. hmmm
  • #4 11496029
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #5 11496213
    BIGJack
    Poziom 16  
    Posty: 281
    Ocena: 14
    Saabotaz ;
    Cytat:
    1) Robisz "Goto Rozjasnij" i "Goto Sciemnij", a potem próbujesz wrócić Returnem. Wywalasz program.

    Wcześniej przed pętlą do-loop dla sprawdzenia ustawiłem aby dioda migała i faktycznie co rozjaśnienie migała - wniosek, masz rację program się wywalał.

    Cytat:
    2) Czemu ci działa Rozjaśnienie, a Ściemnianie nie? No bo skok do rozjasnienia przez Goto, program rozjaśni jak należy, powrót returnem i wywala się program. Cud że po tym ściemnianie jeszcze ci działa

    Racja.

    Cytat:
    3) Już ci poradzili że problem jest z GOTO, a powinieneś wstawić GOSUB, ty jednak znów wklejasz program z GOTO.

    Nie jestem uparty i zrozumiałem mój błąd, wstawiłem po prostu cały kod a nie tylko jego zmodyfikowany fragment. Oczywiście zmienię goto na gosub.

    nowynom, zwłoka to zadeklarowana pozostałość po wcześniejszym podejściu do tego projektu :-) zastąpiona została zmienną czas. Natomiast co do 15 to miał być czas świecenia w tymczasowy czas świecenia led-a. Pętla zaś miała być spowolniona poleceniem wait 1 . Czy jeżeli nie zależy mi na precyzyjnym odmierzaniu czasu muszę opóźnienie robić na timerze?
  • Pomocny post
    #6 11496252
    Konto nie istnieje
    Konto nie istnieje  
  • #7 12045646
    gustawm2
    Poziom 11  
    Posty: 10
    Witam,

    ostatnimi czasy potrzebowałem wykonać projekcik do sterowania jasnością diody.
    Przeczesałem elektrodę, kawałek polskiego internetu i książkę do Bascoma.

    Układ, który wykonałem działa poprawnie, ale gorzej jest z softem.
    Niestety nie bardzo wiem gdzie szukać rozwiązania problemu.

    Attiny2113 działa na wewnętrznym oscylatorze.
    Oto mój kod.

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Jeżeli w ciało ifa if Pind.0/1 = 0 wpiszę kod
    
    For A = 0 To 250 Step 10
        Pwm1a = A
        Waitms 5
    Next I
    


    to ten fragment działa poprawnie.
    W zasadzie zależy mi na zmienianiu Pwm1a w granicach 0 - 250 po naciśnięciu jednego lub drugiego przycisku.

    Wiem, że kod można znacznie uprościć, ale na razie to jestem zamotany najważniejszą na tę chwilę funkcją - zmianą pwm.

    Nie wiem czemu po odpaleniu programu działa tylko jedno naciśnięcie guzika w danym kierunku, drugie naciśnięcie nie powoduje wejścia w ifa - zmianę stanu pb0 i pwm.

    Czy problemem jest typ zadeklarowanej zmiennej A?
  • REKLAMA
  • #8 12045777
    Konto nie istnieje
    Konto nie istnieje  
  • #9 12046663
    gustawm2
    Poziom 11  
    Posty: 10
    Saabotaz napisał:
    Wszystko działa dobrze, dokładnie tak jak napisałeś :-)

    Syfy w programie:

    1) A jako integer, powinno być jako byte (pwm 8 bit) lub word (16 bit). Tutaj to nie powoduje błędu ale dobrze by było nie używać zmiennych mogących być ujemnymi, ponieważ PWM może mieć wartości tylko 0 lub dodatnie.

    2) Enable Timer 1 - nie jest potrzebne bo nie używasz przerwań, raczej przydałoby się Start Timer 1 ale Bascom automatycznie startuje Timer podczas configu

    3) If A < 250, potem robisz A+10 co daje wartość 260 i przekręcenie się wartości. No bo przecież 8 bit nie może mieć więcej niż 255, a zobacz że ty wpisujesz tam max 260. Popraw na If A < 241 (czemu 241, a nie 240? Bo dając 240 uzyskasz max pwm 240, dając 241 max będzie 250, pomyśl czemu)

    4) If A > 0, potem robisz A-10 co ci daje -10 czyli przekręcenie się wartości w pwm (bo on może być tylko 0 lub dodatni). Zmień na If A > 9 (pomyśl czemu >10 nie zadziała zbyt dobrze)

    5) Pamiętaj że program działa błyskawicznie, w ułamku sekundy od przyciśnięcia przycisku, jego if wykona się z pewnością kilka tysięcy razy na sekundę. Dlatego przed każdym end if wstaw np. waitms 200


    Dzięki za podpowiedź.
    Okazało się, że największym problemem jest pkt 5 - niestety zawodowym programistą uC nie zostanę, wolę skrypczenie w mniej wysublimowanych językach.

    Ad. 3 i 4) Jeżeli chodzi o warunki z A to było to pisane na kolanie i rzeczywiście przekręcały się liczniki, ale w pewnym zakresie nie miało to znaczenia - dzięki za wytknięcie

    Ad. 1 - Rzeczywiście Integer tu lekko nie pasuje, ale w tym przypadku nie ma to większego znaczenia gdyż w programie nie ma innych funkcji, które mogłyby operować na tej zmiennej.

    Przerobiłem fragment książki o Bascomie, a wraz z tym program ciut się zmienił,
    w zasadzie robi prawie to samo co wcześniej.

    Generalnie kod zrobił się czytelniejszy i przy testach z diodą i buzzerem wypadł pomyślnie.
    Teraz pozostaje mi zgłębić (czyt. zrozumieć) do końca temat pwm i poprawić program tak, aby zadziałał w "środowisku produkcyjnym".

    Oto obecny kod:

    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #10 12046744
    Konto nie istnieje
    Konto nie istnieje  
  • #11 12047545
    Konto nie istnieje
    Poziom 1  
  • #12 12048489
    gustawm2
    Poziom 11  
    Posty: 10
    Dzięki wielkie za sugestie.
    Program poprawiłem, wszystko działa tak jak chcę.

    Zabrałem się za kolejną rzecz i utknąłem na timerach i książce do bascoma.

    Generalnie to mam problem z PWM - potrzebuję wygenerować impulsy o zadanej długości w taktowaniu pomiędzy x Hz

    Na razie siedzę i próbuję wymyślić jak to zrobić.

    Dodano po 3 [godziny] 4 [minuty]:

    Poczytałem o PWM i nie wiem czy do końca dobrze rozumiem.

    Zakładając, że poterzbuję wygenerować impuls o długości od 1000us do 2000us z częstotliwością dowolną pomiędzy 50Hz a 400Hz to... tak sobie policzyłem
    Przyjąłem częstotliwość 245Hz
    1000000/8/510 =~ 245Hz
    Dalej:
    1sek = 1000000us
    1000000us/245Hz =~ 4018us na okres, w którym będziemy wypełniać PWM

    Jeżeli okres wynosi 4018us, do wygenerowania są impulsy o długości od 1000us do 2000us:
    DC1 = (1000us/4018us)* 100% = 24,88%
    DC2 = (2000us/4018us)* 100% = 49,77%

    zakładając, że nasz rejestr pwm jest 8 bitowy to 25% z 256 = 64 , a 50% = 128
    więc powinienem tak sterować układem, aby zapisując do rejestru pwm1a poruszać się pomiędzy tymi wartościami.

    Proszę o sprostowanie jeżeli coś pominąłem lub coś pokiełbasiłem :-)
  • #13 12053185
    Konto nie istnieje
    Poziom 1  
  • #14 12053304
    gustawm2
    Poziom 11  
    Posty: 10
    Hej.

    Dzięki za odpowiedź.
    Będę musiał jeszcze nad tym przysiedzieć bo coś mi się to wszystko rozjeżdża.

    Ustaliłem częstotliwość PWM z następującego wzoru - częstotliwość rezonatora/preskaler/510(w przypadku pwm 8bit)

    Pogubiłem się totalnie w tych timerach i ustawieniach.
    Jutro po pracy wezmę się jeszcze raz za książkę i poczytam - może się coś rozjaśni; później przeczytam datasheeta i mam nadzieję, że się wszystko wyklaruje.
  • #15 12054325
    Konto nie istnieje
    Konto nie istnieje  
  • #16 12054513
    gustawm2
    Poziom 11  
    Posty: 10
    Witam,

    ale kiedy właśnie zależy mi na tym, żeby to skumać... wynik na oko uzyskałem taki jak oczekiwałęm, teraz chcę iść dalej.
    Potrzebuję wygenerować impulsy o długości od 1000 do 2000us z zadanym taktowaniem - w zasadzie dowolnym pomiędzy 50-400Hz
  • REKLAMA
  • #17 12054906
    Konto nie istnieje
    Poziom 1  
  • #18 12055256
    Konto nie istnieje
    Konto nie istnieje  
  • #19 12055582
    Konto nie istnieje
    Poziom 1  

Podsumowanie tematu

✨ Użytkownik ma problem z implementacją sterowania jasnością diody LED za pomocą PWM w języku Bascom. Kod działa poprawnie przy rozjaśnianiu, ale ściemnianie odbywa się zbyt szybko. Użytkownicy sugerują, aby zamiast instrukcji Goto użyć GOSUB do wywoływania podprogramów, co pozwoli na prawidłowe przejścia między procedurami. Dodatkowo, porady dotyczące poprawy kodu obejmują użycie zmiennych typu Byte lub Word oraz dostosowanie warunków w pętli, aby uniknąć przekroczenia wartości PWM. Wskazówki dotyczą także użycia timerów i trybów pracy, aby uzyskać pożądane częstotliwości PWM oraz kontrolę nad długością impulsów.
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
REKLAMA