PWM na Attiny26 i Atmega8 w bascom

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
Awatar użytkownika
M@ciej
Użytkownik
Posty: 736
Rejestracja: 13 sie 2005, 21:38
Lokalizacja: Szczecin

PWM na Attiny26 i Atmega8 w bascom

Post autor: M@ciej » 01 lip 2010, 10:00

Witam.

Chciałem porównać PWMy dla dwóch procków, jak w tytule.

Napisanie linijki w bascom:

Kod: Zaznacz cały

$crystal=4000000 'wewnętrzny
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Disconnect , Prescale = 1
skutkuje dwiema różnymi częstotliwościami na wymienionych prockach.

Na Atmega8 jest to 8 kHz, natomiast na Attiny26 jest to 32 kHz.

Skąd ta różnica w częstotliwościach, skoro żadne dodatkowe ustawienia PWM nie są wykonywane? Jak uzyskać na Atmega8 taką dużż częstotliwość?

kaliska5
Użytkownik
Posty: 348
Rejestracja: 01 maja 2008, 8:24
Lokalizacja: z nienacka
Kontakt:

Post autor: kaliska5 » 01 lip 2010, 10:59

Częstotliwości w fusach ustawione na takie same wartości ?

Awatar użytkownika
M@ciej
Użytkownik
Posty: 736
Rejestracja: 13 sie 2005, 21:38
Lokalizacja: Szczecin

Post autor: M@ciej » 01 lip 2010, 15:20

Tak, są takie same. Zadbałem o to, by warunki "fusebitowe" i programowe były takie same.

Poczytałem trochę w notce Atmega8 i zastanawiam się, dlaczego Timer1 nie może pracować z częstotliwością zegara, czyli nawet 1MHz przy ustawieniu preskalera na 1. Gdzieś musi być jeszcze jakiś inny dzielnik częstotliwości, i czy dałoby się go przestawić?

keruseykaryu

Post autor: keruseykaryu » 01 lip 2010, 17:32

M@ciej pisze:Poczytałem trochę w notce Atmega8 i zastanawiam się, dlaczego Timer1 nie może pracować z częstotliwością zegara, czyli nawet 1MHz przy ustawieniu preskalera na 1.
Otóż może. I żadnego udziwnienia tam nie ma. Rysunek na stronie 75.
Problemem nie jest ATMEGA8 tylko ATTINY26. A tu Ci to udowodnię:
ATMEGA8 -> 4MHz / 1 / 512 = 7,812kHz (miernik Ci zawyża).
ATTINY26 -> 16MHz / 1 / 512 = 31,25kHz (tu też Ci zawyża).
Skąd 16MHz? Z pętli PLL jaką ATTINY26 posiada - strona 25. Masz ją po prostu włączoną na domyślnych ustawieniach: 1MHz -> PLL => 64MHz / 4 -> CK => 16MHz -> TCNT1 - strona 67.
Ostatnio zmieniony 03 lip 2010, 18:21 przez keruseykaryu, łącznie zmieniany 1 raz.

Awatar użytkownika
M@ciej
Użytkownik
Posty: 736
Rejestracja: 13 sie 2005, 21:38
Lokalizacja: Szczecin

Post autor: M@ciej » 01 lip 2010, 17:54

Teraz już rozumiem, tylko jak zmusić Atmege8 do generacji większej częstotliwości? W innym wątku zadałem to pytanie, ale ślęczę już jakiś czas nad notką A8 i ni w ząb wymyślić nie mogę :(

A skąd się w obu równaniach bierze 512 i dlaczego akurat tyle? Gdyby udało się użyć mniejszej wartości, częstotliwość by wzrosła.

keruseykaryu

Post autor: keruseykaryu » 01 lip 2010, 18:49

M@ciej pisze:Teraz już rozumiem, tylko jak zmusić Atmege8 do generacji większej częstotliwości?
Zmień tryb PWM-a. Niestety zrobić to musisz ręcznie. TCCR1A = &Bcośtam, TCCR1B = &Bcośtam. Notka wyjaśni jakie bity trzeba ustawić.
M@ciej pisze:W innym wątku zadałem to pytanie, ale ślęczę już jakiś czas nad notką A8 i ni w ząb wymyślić nie mogę :(
A skąd się w obu równaniach bierze 512 i dlaczego akurat tyle? Gdyby udało się użyć mniejszej wartości, częstotliwość by wzrosła.
To też dowiedziałbyś się z noty katalogowej. Widocznie czytałeś, ale ni w ząb nie rozumiesz. Rysunki trybów działania PWM pokazują wszystko. Podpowiem tylko tyle: Dual Slope Operation i wszystko stanie się jasne.

Awatar użytkownika
M@ciej
Użytkownik
Posty: 736
Rejestracja: 13 sie 2005, 21:38
Lokalizacja: Szczecin

Post autor: M@ciej » 16 lip 2010, 12:41

Poczytałem notke jeszcze i wydawało mi się, że rozumiem. Wpisałem w procka kod:

Kod: Zaznacz cały

$regfile = "m8def.dat"                                      'Pracujemy z Atmega8
$crystal = 4000000                                          'Czŕstotliwoťc zegara 4 MHz

Config Portb = &B11111111                                   'portb wszystkie jako wyjścia
Config Portc = &B1111111                                    'portC wszystkie jako wyjścia
Config Portd = &B11111011                                   'PD.2 jako wejście 

Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Disconnect , Prescale = 1

Tccr1a = &B10000000
Tccr1b = &B00001001                                         'tryb 4 - CTC, OCR1A wyznacza TOP
Ocr1ah = 0
Ocr1al = 100                                                'TOP
Icr1h = 0
Icr1l = 10                                                  'wypelnienie

Do

Loop
End

...i lipa, na OC1A nie ma żadnego przebiegu (sprawdzam oscyloskopem). Nie wiem, co robię źle. Wpisałem tryb 4 -CTC, OCR1A wpisuje TOP, a na ICR1 reguluję wypełnienie. Chcę docelowo uzyskać 32 kHz, ale i mniejsze, wspomniane 5,5kHz.

[ Dodano: 2010-07-16, 17:50 ]
OK, udało się. Zmieniłem tryb z 4 na 10, ICRem ustawiam TOP a OCR1A wypełnienie. Usunąłem także całą Bascomową procedurę konfiguracji Timera1, skoro jest odwołanie do rejesrów. Trochę zachodu jest z podziałem wartości OCR1a i ICR na starsze i młodsze bity, ale w sumie nie sprawia to problemu. Zdziwiło mnie, z jaka dokładnością można ustawić częstotliwość PWM. W trakcie prób udało mi się otrzymać nawet 62 kHz (Top około 85), tak więc pole manewru jest.

Dzięki wszystkim za podpowiedzi i pozdrawiam :)

ODPOWIEDZ