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

Dlaczego PWM na ATmega16 w BASCOM 1.11.7.4 nie działa jak na AT90S8515?

M-Automatyk 23 Lis 2005 09:04 42702 42
Najlepsze odpowiedzi

Dlaczego PWM w BASCOM 1.11.7.4 nie działa na ATmega16 tak jak wcześniej na AT90S8515 i jak to poprawnie skonfigurować?

W BASCOM 1.11.7.4 konfiguracja PWM na ATmega16 potrafi się wysypać przez błąd kompilatora, więc najpewniejszym rozwiązaniem jest aktualizacja do nowszej wersji, w której PWM działa od razu [#4417515], [#2246335] W tej wersji trzeba też wpisywać `Config Timer... , Prescale = ...` w jednej linii, bo rozbicie deklaracji może powodować, że PWM nie ruszy [#2359866] Jeśli chcesz obejść problem całkowicie, ustaw Timer1 bezpośrednio w rejestrach, np. `Tccr1a = &HA3` i `Tccr1b = &H5`, a piny PD5 i PD4 skonfiguruj jako wyjścia [#2040488] Do sterowania wypełnieniem używaj potem `Pwm1a` i `Pwm1b` [#2040488]
REKLAMA
  • #1 2017576
    M-Automatyk
    Poziom 11  
    Posty: 5
    Mam problem z uruchomieniem PWM na ATmega 16 w BASCOM 1.11.7.4

    Program jest napisany prawidłowo - bardzo dobrze działa na procesorze AT90S8515 , jednak przeniesiony w niezmienionej formie na ATmege16 przestaje działać

    Oczywiście przed zaprogramowaniem ATmegi odpowiednio zmieniłem ustawienia BASCOM'A dla tego mikrokontrolera.
    Bity konfiguracyjne są ustawione prawidłowo - inne programy na tym procesorze działają bez zarzutu.

    Mój znajomy miał podobny problem z ATmega32 napisał programowy PWM - ale hyba nie o to chodzi.

    Z góry dziękuję za sugestie. Fragment sprawdzonego kodu mile widziany.
  • REKLAMA
  • #2 2017599
    GienekS
    Poziom 32  
    Posty: 1971
    Pomógł: 139
    Ocena: 15
    A przekompilowałeś go powtórnie dla tego ATmegi 16 ??
  • #3 2017783
    M-Automatyk
    Poziom 11  
    Posty: 5
    Oczywiście że przekompilowałem.
    Jedynym pomysłem, jaki przychodzi mi teraz do głowy jest zmiana kolejności w deklaracji Timer1

    Timer1 = Pwm ,Prescale = 1 , Pwm = 10 , Compare A Pwm = Clear Down

    Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Prescale = 1

    Dla AT90S8515 nie miało to znaczenia, ale może dla ATmegi jest to istotne. Niestety nie mogę teraz tego sprawdzić.
  • #4 2040488
    M-Automatyk
    Poziom 11  
    Posty: 5
    O K
    Widzę,że sam muszę sobie odpowiedzieć.
    Po żmudnych próbach z konfigurowaniem PWM w Bascomie doszedłem do wniosku, że żadna z wersji tego kompilatora nie jest w stanie prawidłowo skonfigurować PWM na procesorze ATMEGA. Trzeba to zrobić przez bezpośrednie oddziaływanie na rejestry. Np.:

    $regfile = "m16def.dat" 'Deklaracja rodzaju procesora
    Ddrd = B00110000 'Porty pełniące funkcję Timera powinny być skonfigurowane jako wyścia
    Tccr1a = &HA3 'Phase correct PWM mode ,PWM = 10 bit
    Tccr1b = &H5 'Prescale 1024
    Do

    Pwm1a = Pwm1a + 1 'Ten program powoduje cykliczną zmianę dlugości
    If Pwm1a = 1000 Then Pwm1a = 0 'impulsów na wyjściach Portd.5

    Waitms 5 '

    Pwm1b = Pwm1b + 1 'I Portd.4
    If Pwm1b = 1000 Then Pwm1b = 0

    Loop
    End
    Pozdrawiam
    Automatyk
  • #5 2046987
    maly35
    Poziom 14  
    Posty: 91
    Pomógł: 6
    Ocena: 2
    Ja mam do Ciebie pytanie bo widzę że dosyć dobrze to rozumiesz:)

    Jak działa sygnał PWM i na jakich końcówkach mogę go otrzymać w Atmega8?

    Z góry dzięki za odpowiedź:)
  • #6 2224420
    M-Automatyk
    Poziom 11  
    Posty: 5
    Przepraszam że odpowiadam tak późno, ale dawno nie było mnie na forum.

    Działanie PWM polega na regulacji wypełnieniem impulsu i najlepiej jest opisane w EdW Wrzesień 2004.

    Niestety nie używałem Atmegi 8, ale z noty katalogowej tego procesora wynika, że sygnały PWM dostępne są na wyjściach PB1 i PB2 - Są oznaczone jako OC1A i OC1B.

    Pozdrawiam.
  • REKLAMA
  • #7 2224981
    adamusx
    Poziom 27  
    Posty: 977
    Pomógł: 94
    Ocena: 28
    Witam
    Ja programowalem ATmege 16 w Bascomie i wykorzystywalem 2 PWMy i wszystko ladnie smigalo tak jak powinno, wiec to raczej nie wina BASCOMA.
  • #8 2236522
    M-Automatyk
    Poziom 11  
    Posty: 5
    Mógłbyś przesłać fragment listingu odpowiedzialny za konfigurację?

    Chciałbym zobaczyć gdzie popełniłem błąd, choć szczerze mówiąc trudno mi w to uwierzyć. Wypróbowałem wszystkie możliwości.

    Dopuszczam jednak błąd kompilatora.
    Zdarzyło mi się kiedyś, że program nie działał z powodu umieszczonego komentarza w linii .
    Ten przypadek był nawet opisany w jednym z kursów BASCOM'a.
  • #9 2236669
    adamusx
    Poziom 27  
    Posty: 977
    Pomógł: 94
    Ocena: 28
    Oto fragment kody ktory ustawial PWMa. Dodam ze testowalem na ATMEGa 16 w Bascomie 3 PWMy i wszystkie dzialaly.

    Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Prescale = 8

    Pwm1a=245; // zapisuje do PWMa A jaka wartosc i rozpoczyna on prace.

    Tak to mniej wiejce wyglada, dziwne ze u Ciebie nie cche ten PWM dzialac.
  • #10 2246335
    mimi1972
    Poziom 13  
    Posty: 41
    Pomógł: 2
    U mnie w ATMega16 wyglądało tak:

    Config Timer1 = Pwm , Pwm = 8 , Prescale = 64 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Down

    Oczywiście działa.
    Mam wersję Bascoma 1.11.7.7

    Pozdrawiam.
  • #11 2279305
    alexiel
    Poziom 15  
    Posty: 211
    Pomógł: 1
    W nocie katalogowej ATmegi32 jest napisane że ma 4 PWM, 2 z nich to OC1B i OC1A, ale nie moge znaleźdź jeszcze dwóch wyjść. Czy może ktoś mi wskazać które to są wyjścia. Z góry dziękuje za odpowiedzi.
  • #12 2280380
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    alexiel napisał:
    W nocie katalogowej ATmegi32 jest napisane że ma 4 PWM, 2 z nich to OC1B i OC1A, ale nie moge znaleźdź jeszcze dwóch wyjść. Czy może ktoś mi wskazać które to są wyjścia. Z góry dziękuje za odpowiedzi.

    O tym nawet nie musisz czytac , wystarczy "oglądać" obrazki ;)
    PB3-OC0,PD7-OC2

    Piotrek
  • #13 2283498
    alexiel
    Poziom 15  
    Posty: 211
    Pomógł: 1
    Troche nie do końca sprecyzowałem swoje pytanie. Doczytałem się w nocie katalogowej o tych wyjściach PWM OC2 i OC0 tylko nie wiem jaką instrukcją w bascomie sie je uruchamia, ponieważ wyjścia OC1A to Pwm1a= zmienna, a OC1B to instrukcja Pwm1b= zmienna, ale nie wiem jak napisać te pozostałe.....
  • #14 2283647
    hunterhouse
    Poziom 26  
    Posty: 893
    Pomógł: 84
    Ocena: 3
    ogólnie żecz biorąc oznaczenia pwm'a same mówią co i jak
    OC - OUTPUT COMPARE czy li wyjście porównania
    1 - liczba oznaczająca z któego timera kożysta ten PWM
    następnie występuje litera lub jej brak jeśli dla daneg otimera jest tylko jeden PWM

    czyli OC1A i OC1B to PWM'y timera1 i ich zmienne nazywają się PWM1A i PWM1B
    OC0 to PWM timera0 zmienna to chyba PWM0a
    OC2 to PWM timera2 zmienna to chyba PWM2a
    kazdy timer należy konfigórować osobno w trybie PWM.

    POZDRAWIAM
  • #15 2284204
    alexiel
    Poziom 15  
    Posty: 211
    Pomógł: 1
    hunterhouse napisał:
    ogólnie żecz biorąc oznaczenia pwm'a same mówią co i jak
    OC - OUTPUT COMPARE czy li wyjście porównania
    1 - liczba oznaczająca z któego timera korzysta ten PWM
    następnie występuje litera lub jej brak jeśli dla daneg otimera jest tylko jeden PWM

    czyli OC1A i OC1B to PWM'y timera1 i ich zmienne nazywają się PWM1A i PWM1B
    OC0 to PWM timera0 zmienna to chyba PWM0a
    OC2 to PWM timera2 zmienna to chyba PWM2a
    kazdy timer należy konfigórować osobno w trybie PWM.

    POZDRAWIAM


    Dziękuje bardzo za wyczerpującą wypowiedź. Teraz wszystko jasne. Jeszcze raz dziękuje i pozdrawiam.

    EDIT:
    Niestety nie bardzo to tak działa, próbuje wszystkiego ale nie moge iruchomić pozostałych kanałów.
  • #16 2285445
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    alexiel napisał:

    ...
    EDIT:
    Niestety nie bardzo to tak działa, próbuje wszystkiego ale nie moge iruchomić pozostałych kanałów.

    PWM-a na Timer0 nie skonfigurujesz dyrektywą Config Timer0 = Pwm ,...
    , bo Bascom nie przewiduje takiego trybu pracy dla Timer0(patrz Help).
    Natomiast PWM dla Timer2 , jak najbardziej tak ;)

    
    Config Pinb.3 = Output 
    'Config Timer0 = Pwm , Prescale = 1 , Compare Pwm = Clear Down
    Set Tccr0.pwm0
    Set Tccr0.com00
    Set Tccr0.com01
    Set Tccr0.cs00
    Ocr0 = 127
    'T2 już normalnie ;)
    Config Timer2 = Pwm , Prescale = 1 , Compare Pwm = Clear Down
    Ocr2 = 127
    ...
    

    I nie pisz , że nie działa ;)

    Piotr

    PS
    Którą wersję Bascoma posiadasz :?:
  • #17 2286385
    alexiel
    Poziom 15  
    Posty: 211
    Pomógł: 1
    Dzięki wielkie za odpowiedź. teraz nie moge sprawdzić bo układ mam w pracy. Spróbuje w poniedziałek i dam znać. Pozdrawiam alexiel
  • REKLAMA
  • #18 2296134
    alexiel
    Poziom 15  
    Posty: 211
    Pomógł: 1
    zumek napisał:

    I nie pisz , że nie działa ;)

    Piotr




    Sprawdziłem, rzeczywiście działa. Jeszcze raz wielkie dzięki......
  • #19 2359866
    titp
    Poziom 12  
    Posty: 22
    Ocena: 3
    Jako młody wiedzą i stary wiekiem chciałem potwierdzić formę zapisu konfiguracji portów PWM w Bascomie .W wersji 1.11.7.4 " config timer ...prescale =1" musi być wpisane w jednej linijce inaczej się nie da. ATmega8 bardzo dobrze sobie poradził z tym przebiegiem.
    Korzystając z okazji znawców tematu zadam pytanie nad którym spędziłem trochę czasu: wjaki sposób powielić dokładny przebieg na innych wyjściach coś w rodzaju pinb.1= pind.1 lub portb.1=portd.1 czy też portd.1=pwm1a ??? w praktyce tak się nie da.Z góry dziękuje za zainteresowanie się moim tematem.
  • #20 3422664
    seradam
    Poziom 17  
    Posty: 297
    Pomógł: 5
    Ocena: 14
    Potrzebuję czterech PWM i dwóch wejść odmierzających długość impulsu o zakresie od 1 do 2 ms. Pytanie czy atmega 8 się wyrobi czy muszę brać 16 . I jak rozumiem z wszystkich postów muszę pwm zrobić programowo bo potrzebuję pozostałych timerów do pomiaru impulsów.
    I pytanie o oscylator wewnętrzny czy mogę go użyć czy lepiej kwarc bo zależy mi na wielkości urządzenia.
  • #21 4258181
    sp5oxv
    Poziom 2  
    Posty: 2
    Jeżeli to jeszcze aktualne to podpowiadam: 1- zastosuj sprzęg wyjście PWM na jeden port i programowo powiel na inne, lub 2- wyjście PWM podaj na dowolny bufor, np. SN74LC244. Otrzymasz jednocześnie 8 jednakowych sygnałów. Programowo rzeczywiście raczej się nie da ale sprzętowo to proste.
  • #22 4364731
    Arutim
    Poziom 20  
    Posty: 347
    Pomógł: 18
    Ocena: 37
    Mozna jeszcze napisac programowy PWM -> w gruncie rzeczy nie jest to trudne. Pozdrowionka
  • #23 4417515
    gapa137
    Poziom 12  
    Posty: 53
    Ocena: 26
    W Bascom 1.11.7.4 nie da się skonfigurować PWM, jest bład. W nowszych wersjach już jest wporządku. W starszej wersji kombinowałem na różne sposoby i nic. Po zainstalowaniu nowszej wersji i wpisaniu konfiguracji PWM od razu ruszył.
  • REKLAMA
  • #24 4956512
    dzarek1
    Poziom 14  
    Posty: 128
    Pomógł: 5
    witam
    czy jest możliwość użyć tylko jednego portu oc1 (atmega16) jako wyjście PWM a drugi wykożystać do czegoś innego ?

    aktualnie na moim "modelu" mam podpięte wyjście PWM do oc1b (silniczek) a oc1a to po prostu dioda, która zapala się gdy podam na nią 1. i jak sterowanie obrotami silnika działa znakomicie, tak dioda ciągle świeci.
    kawałek kodu odpowiedzialnego za wyjścia i pwm
    
    Config Pind.5 = Output
    Config Pind.3 = Output
    Wy1 Alias Portd.5
    Wy2 Alias Portd.3
    Reset Portd.3
    Reset Portd.5
    
    Config Pind.4 = Output
    Config Timer1 = Pwm , Pwm = 8 , Prescale = 64 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Down
    


    nawet jak w trakcie programu chcę wymusić wy1=0 lub pwm1a = 0 nic sie nie dzieje :/
  • #25 4956600
    Balu
    Poziom 38  
    Posty: 4397
    Pomógł: 323
    Ocena: 48
    Wydaje mi się, że mimo wszystko nie masz pełnej konfiguracji PWMu zrobionej była jeszcze jak mnie pamięć nie myli opcja disconnected dla końcówek:>
  • #26 4957019
    dzarek1
    Poziom 14  
    Posty: 128
    Pomógł: 5
    dzięki za podpowiedz
    Config Timer1 = Pwm , Pwm = 8 , Prescale = 64 , Compare A Pwm = Disconnect , Compare B Pwm = Clear Down ,

    i wszystko gra :)
  • #28 5376637
    lukaszzk
    Poziom 14  
    Posty: 137
    Pomógł: 4
    Ocena: 7
    Witam Wszystkich
    Dopiero co zaczynam swoją zabawę z uC, używam Bascoma i Atmegi8, mój poziom zaawansowania to realizacja bramek logicznych i kilka migających diodek więc prosiłbym o wyrozumiałość ;-)

    Mam takie pytanie do kolegów, jak można zrealizować generowanie na jednym z pinów A8 sygnału o częstotliwości 5Hz.

    Prosiłbym też o wyjaśnię komend:
    -Config Timer1 = Pwm
    -Pwm = 8
    -Prescale = 64
    -Compare A Pwm = Disconnect
    -Compare B Pwm = Clear Down

    Czytałem polskiego helpa do Bascoma ale za bardzo nie mogłem zrozumieć pewnych rzeczy, nie chciałbym zakładać nowego tematu i zaśmiecać forum liczę wiec że ktoś z Was zechce odpowiedzieć wyczerpująco na moje pytania :-)
  • #29 5377321
    Balu
    Poziom 38  
    Posty: 4397
    Pomógł: 323
    Ocena: 48
    Jasne...
    Co to a8?
    5Hz a z jaką dokładnością?

    Co do komend są opisane w polskim HELPIE WYCZERPUJĄCO.
    Jak zapytasz co Cię konkretnie trapi - odpowiem.
  • #30 5377713
    lukaszzk
    Poziom 14  
    Posty: 137
    Pomógł: 4
    Ocena: 7
    A8 - to Atmega8 16PU taki skrót myślowy :-)

    Chodzi mi o to żeby na jednym z pinów uC (PB1 lub PB2) wygenerować sygnał PWM.
    Co do dokładności to niestety nie mam specjalnych życzeń choć miło by było gdyby kolega nieco przybliżył ten temat.

    Z tego co dotąd udało mi sie ustalić to do generacji PWM używany jest rejestr który jest "napędzany" częstotliwością taktującą która może być generowana przez wewnętrzny lub zewnętrzny oscylator, chciałbym poznać zależność jak ustawić parametry żeby wygenerować te 5 Hz. Było by fajnie gdybym mógł zobaczyć kawałek kodu wtedy łatwiej może bym to zrozumiał.

    PS: Chciałbym dodać że moja A8 :-) ma nie zmieniony wewnętrzny oscylator, pracuje on przy częstotliwości 1MHz

Podsumowanie tematu

✨ Dyskusja dotyczy problemów z uruchomieniem PWM na mikrokontrolerze ATmega16 w środowisku BASCOM 1.11.7.4, podczas gdy ten sam kod działa poprawnie na AT90S8515. Użytkownicy wskazują, że w starszej wersji BASCOM PWM na ATmega16 może nie działać prawidłowo i konieczne jest bezpośrednie programowanie rejestrów mikrokontrolera, np. konfiguracja rejestrów TCCR1A i TCCR1B oraz ręczne sterowanie wartościami PWM1A i PWM1B. W nowszych wersjach BASCOM problem ten został rozwiązany i konfiguracja PWM działa poprawnie. Poruszono także kwestie konfiguracji timerów i przypisania pinów wyjściowych PWM (OC1A, OC1B, OC0, OC2) oraz różnic w obsłudze PWM na różnych timerach (Timer0, Timer1, Timer2). Zwrócono uwagę, że Timer0 w BASCOM nie obsługuje trybu PWM przez dyrektywę Config Timer0 = Pwm, co wymaga ręcznej konfiguracji rejestrów. Omówiono także problem podwójnego wykorzystania wyjść OC1A i OC1B, gdzie można ustawić jeden kanał jako PWM, a drugi jako zwykły port cyfrowy (np. ustawiając Compare A Pwm = Disconnect). W dyskusji pojawiły się przykłady kodu konfigurującego PWM bezpośrednio przez rejestry oraz przez dyrektywy BASCOM, a także omówiono wpływ częstotliwości oscylatora i preskalera na częstotliwość i rozdzielczość sygnału PWM. Poruszono również temat generowania niskich częstotliwości (np. 5 Hz) za pomocą timerów i różnic między sygnałem prostokątnym a modulacją szerokości impulsu (PWM). Wskazano, że w BASCOM 1.11.7.4 konfiguracja PWM musi być wpisana w jednej linii, a błędy mogą wynikać z nieprawidłowej kolejności parametrów lub komentarzy w kodzie. Ostatecznie potwierdzono, że nowsze wersje BASCOM poprawiły obsługę PWM na ATmega16, a dla Timer0 konieczna jest ręczna konfiguracja rejestrów.
REKLAMA