Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 1 cze 2025, o 02:19


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 8 ] 
    Autor Wiadomość
    PostNapisane: 29 lis 2017, o 10:16 
    Offline
    Użytkownik

    Dołączył(a): 09 wrz 2015
    Posty: 44
    Pomógł: 0

    Witam
    Mam pytanie związane z uruchomieniem PWM w mikrokontrolerze ATTINY26.
    Zgodnie z dokumentacją tryb generowania sygnału PWM można uzyskać za pośrednictwem Timer/Counter1. I tak też robię ustawiając bit PWM1A (chcę generować przebieg na wyjściu OC1A (PB0)). Timer1 jest ustawiony w trybie synchronicznym czyli nie ustawiam bitu PCKE w rejestrze PLLCSR (jest wyzerowany).
    Następnie ustawiam w rejestrze TCCR1A bity COM1A i COM1B zgodnie z tabelą

    Obrazek

    Aby uruchomić ostatni tryb z tej tabeli.
    I teraz za pomocą bitów CS13, CS12, CS11, CS10 ustawiam dzielnik dla Timer/Counter1. Chcę uzyskać częstotliwość ok. 1,5kHz. To zgodnie z tabelą 34 na str. 72 w nocie ustawiam preskaler na 1024:
    TCCR1B |= (1<<CS13) | (1<<CS11) | | (1<<CS10)
    Przy takim ustawieniu bitów preskalera i częstotliwości kwarcu 8MHz licznik Timer1 jest taktowany z częstotliwością 7812,5Hz. Zgodnie ze wzorem:
    Fpwm = ftck1/(OCRC1 + 1)
    Zapisuję do OCR1C wartość 4 i wtedy powinienem uzyskać częstotliwość Fpwm = 1562,5Hz.
    Z opisu wynika, że zawartość licznika Timer1 jest porównywana z wartością w rejestrze OCR1C i wyjście OC1A jest ustawiane w stan wysoki, gdy OCR1C = TCNT1, a ustawiane w stan niski gdy TCNT1 = 0.
    Włączam zezwolenie na przerwanie od Timer1:
    TIMSK |= (1<<OCIE1A);
    Kod programu:
    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Niestety w ten sposób to nie działa :( Proszę o podpowiedz co robię zle?
    W BlueBook'u jest opisane dla ATMEGA32, ale mam potrzebę uruchomienia PWM sprzętowych na ATTINY26 i lipa.

    I jeszcze jedno pytanie, dlaczego w Eclipse nie rozpoznaje mi niektórych rejestrów, np. OCR1C, TCCR1B? Jak wciskam Ctrl i klikam myszką np. na rejestr TCCR1B to otwiera mi się plik nagłówkowy dla ATMEGA16. We właściwościach projektu jest ustawiony ATTINY26. Kompilacja przebiega pomyślnie.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 29 lis 2017, o 11:36 
    Offline
    Użytkownik

    Dołączył(a): 07 cze 2016
    Posty: 563
    Pomógł: 143

    kosta napisał(a):
    Z opisu wynika, że zawartość licznika Timer1 jest porównywana z wartością w rejestrze OCR1C i wyjście OC1A jest ustawiane w stan wysoki, gdy OCR1C = TCNT1, a ustawiane w stan niski gdy TCNT1 = 0.

    To chyba raczej źle zrozumiałeś.
    Wyjście OC1A zostanie ustawione, gdy wartość TCNT1 osiągnie wartość zapisaną w OCR1A, a wyzerowane, gdy TCNT1 się wyzeruje.

    Z kolei wartość rejestru TCNT1 w trybie PWM zostanie wyzerowana w momencie przekroczenia przez niego wartości rejestru OCR1C.

    Wartość OCR1A służy do ustalenia wypełnienia i powinna się zawierać w zakresie od 0 do wartości rejestru OCR1C.

    Wydaje mi się, że wartość częstotliwości PWM policzyłeś dobrze, jednak weź pod uwagę, że wartość OCR1C determinuje rozdzielczość PWM, czyli przy wartości OCR1C równej 5 masz do ustawienia tylko 6 możliwych poziomów wypełnienia. Należałoby raczej dobrać mniejszą wartość preskalera (CS13:0) tak, by wartość OCR1C była jak największa.

    Do samego generowania PWM nie potrzebujesz włączać obsługi przerwań timera, chyba że będziesz tam coś konkretnego robił.


    Autor postu otrzymał pochwałę


    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 29 lis 2017, o 12:47 
    Offline
    Użytkownik

    Dołączył(a): 09 wrz 2015
    Posty: 44
    Pomógł: 0

    Dzięki za podpowiedz.
    Spróbuję wieczorem podziałać.
    Czyli z tego co piszesz te linie są zbędne, bo nic nie muszę działać w procedurze obsługi przerwania po zgłoszeniu przerwania:

    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Wystarczy, że włączę PWM i załaduję zgodnie z żądaną częstotliwością rejestry OCR1A oraz OCR1C?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 29 lis 2017, o 13:47 
    Offline
    Użytkownik

    Dołączył(a): 07 cze 2016
    Posty: 563
    Pomógł: 143

    kosta napisał(a):
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    W tej formie to raczej i tak nie zadziała, bo teraz to pomyliłeś przerwania ;)
    Zezwolenie masz dla przerwania od porównania, a procedurę od przepełnienia.
    Ale tak, te linie są zbędne.
    sei(); jest zbędne tylko wtedy, gdy nie korzystasz z innych przerwań.

    kosta napisał(a):
    Wystarczy, że włączę PWM i załaduję zgodnie z żądaną częstotliwością rejestry OCR1A oraz OCR1C?


    Oczywiście jeszcze trzeba ustawić preskaler timera i tryb pracy pinu OC1A, jednak przerwania są zbędne. Zmianę wypełnienia możesz realizować w pętli głównej programu wpisując odpowiednią wartość do rejestru OCR1A.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 29 lis 2017, o 14:31 
    Offline
    Użytkownik

    Dołączył(a): 09 wrz 2015
    Posty: 44
    Pomógł: 0

    Ok, dzięki.
    Podziała wieczorem i dam znać.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 29 lis 2017, o 21:57 
    Offline
    Użytkownik

    Dołączył(a): 09 wrz 2015
    Posty: 44
    Pomógł: 0

    Uruchomiłem ten PWM. Dzięki za podpowiedzi.
    Tylko mam taką zagwostkę jeszcze, że wszystkie częstotliwości, które obliczam dla PWM w rzeczywistości są 2 razy większe niż wychodzi z obliczeń wg noty katalogowej.
    Sprawdzam za pomocą oscyloskopu przebieg i wypełnienie zmienia się płynnie (w dwoch petlach jest zwiekszanie i zmniejszanie zrobione), a częstotliwość jest x2.
    Czy czegoś jeszcze nie doczytałem w nocie? Obliczyłem już interesującą mnie częstotliwość i wszystko działa ok, ale pytam po prostu aby się upewnić.
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    I jeszcze jedno. Pisałem, że Eclipse mi podkreśla nazwy niektórych rejestrów (na czerwono). Wszystko się kompiluje ok. W zakładce Console żadnych błędów ani ostrzeżeń brak. I co ciekawe jak wcisnę Ctrl i najadę myszką na podkreślony rejestr kliknę i otwiera mi plik nagłówkowy dla ATmega16 zamiast ATtiny26. We właściwościach projektu wybrany jest właśnie ten procek. Już próbowałem to naprawić, ale bezskutecznie. Co może być powodem?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 30 lis 2017, o 11:16 
    Offline
    Użytkownik

    Dołączył(a): 07 cze 2016
    Posty: 563
    Pomógł: 143

    kosta napisał(a):
    Tylko mam taką zagwostkę jeszcze, że wszystkie częstotliwości, które obliczam dla PWM w rzeczywistości są 2 razy większe niż wychodzi z obliczeń wg noty katalogowej.


    Nie napisałeś jak to liczysz. Powinno to wyglądać tak:

    f_pwm = (T1CK/prescaler) / (OCR1C+1)

    gdzie:
    f_pwm - częstotliwość PWM,
    T1CK - częstotliwość taktowania timera 1 zależna od ustawień fusebit'ów CKSEL3:0 i PLLCK, a także bitów PLLE i PCKE w rejestrze PLLCSR,
    prescaler - podział częstotliwości ustalony bitami CS13:0 w rejestrze TCCR1B,
    OCR1C - wartość wpisana do rejestru OCR1C.

    Czyli przy założeniu T1CK=F_CPU=8MHz (jak informowałeś w pierwszym poście) i Twoich aktualnych ustawień rejestrów TCCR1B i OCR1C, f_pwm powinna wynosić 1250Hz.
    Jeśli jest inna, to należałoby sprawdzić dokładnie ustawienia taktowania, szczególnie PLL. Jeśli korzystasz z PLL, to częstotliwość PCK będzie wynosić 64MHz, a częstotliwość CK będzie wynosić 64MHz/4=16MHz, a nie 8MHz (patrz rys. 21 na stronie 24 oraz rys. 37 na stronie 65), więc nawet przy ustawieniu bitu PCKE=0 częstotliwość taktowania timera będzie dwukrotnie większa niż przypuszczasz.
    Zakładam, że wartości rejestru OSCCAL nie zmieniasz.

    Jako IDE dla programowania AVR używam Atmel Studio 7, więc w kwestii Eclipse nie pomogę. Może trzeba zmienić typ mikrokontrolera na inny, a później z powrotem na ATtiny26, zrobić clean projektu, ale to może ktoś inny się wypowie.


    Autor postu otrzymał pochwałę


    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 1 gru 2017, o 18:41 
    Offline
    Użytkownik

    Dołączył(a): 09 wrz 2015
    Posty: 44
    Pomógł: 0

    Obliczam dokładnie wg tego wzoru:
    Cytuj:
    f_pwm = (T1CK/prescaler) / (OCR1C+1)


    i wg obliczeń częstotliwość f_pwm powinna wynosić 1250Hz a wynosi 2500Hz sprawdzając oscyloskopem.
    Ustawiałem bit PCKE na 0 i na 1 i efekt jest ten sam, ale już przeanalizowałem te rysunki z noty i wiem, że częstotliwość taktowania timera jest 2 x większa. Najważniejsze, że działa.

    A odnośnie podkreślania nazw rejestrów to rzeczywiście pomogła zmiana procka na ATMega16 - clean - kompilacja - zmiana na ATTiny26 - clean - kompilacja i teraz nie podkreśla nazw rejestrów, a klikając na nazwę rejestru (CTRL) otwiera się już właściwy plik nagłówkowy.

    Dzięki za podpowiedź.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    Wyświetl posty nie starsze niż:  Sortuj wg  
    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 8 ] 

    Strefa czasowa: UTC + 1


    Kto przegląda forum

    Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość


    Nie możesz rozpoczynać nowych wątków
    Nie możesz odpowiadać w wątkach
    Nie możesz edytować swoich postów
    Nie możesz usuwać swoich postów
    Nie możesz dodawać załączników

    Szukaj:
    Skocz do:  
    cron
    Sitemap
    Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
    phpBB SEO