timer2 jako PWM w Atmedze8- problem [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
Jasam
Użytkownik
Posty: 422
Rejestracja: 27 mar 2007, 21:09

timer2 jako PWM w Atmedze8- problem [Bascom]

Post autor: Jasam » 16 cze 2008, 14:22

Potrzebuję skonfigurować licznik timer2 jako generator PWM w atmedze8 i pojawia się problem. Dla porównania skonfigurowałem sobie też timer1 jako PWM i on działa. Kompilator nawet nie podświetla komendy compare2. Słyszałem, że są jakieś problemy, ale w najnowszej wersji demo podobno zostały wyeliminowane (jak pisali niektórzy uzytkownicy). Jak to więc rozwiązać?

Kod: Zaznacz cały

$regfile = "m8def.dat"
$crystal = 8000000

Config Adc = Single , Prescaler = Auto , Reference = Avcc
Config Timer2 = Pwm , Pwm = On , Prescale = 1 , Compare Pwm = Clear Down
Config Timer1 = Pwm , Pwm = 10 , Prescale = 1 , Compare B Pwm = Clear Down


Start Adc
Dim Wynik1 As Word , Wynik2 As Word , Jasnosc As Byte
Do
Wynik1 = Getadc(3)
Wynik2 = Getadc(2)
Lcd Wynik1 ; "--" ; Wynik2
Jasnosc = Wynik2 / 4   ' ta zmienna bedzie potrzebna w poxniejszych pracach
Compare2 = 200        ' tu występuje problem
Compare1b = Wynik2
Waitms 5
Cls
Loop


[ Dodano: 2008-06-16, 18:24 ]
I co to jest jeszcze tryb Fast PWM? Jak go włączyć?

ZbeeGin

Post autor: ZbeeGin » 16 cze 2008, 17:30

I co to jest jeszcze tryb Fast PWM? Jak go włączyć?
Można go włączyć tylko modyfikując ręcznie stan bitów WGM21:WGM20 jako &B11.

A cały problem polega na?

Jasam
Użytkownik
Posty: 422
Rejestracja: 27 mar 2007, 21:09

Post autor: Jasam » 16 cze 2008, 17:44

Przecież napisałem w poscie, że nie mogę zmusić do działania compare2. A co do tego ręcznego modyfikowania tych bitów to pokaż mi bardziej na przykładzie jeśli mozesz bo na razie nie mam pomyslu jak to działa.

ZbeeGin

Post autor: ZbeeGin » 16 cze 2008, 18:09

Jasam pisze:Przecież napisałem w poscie, że nie mogę zmusić do działania compare2
Jest taka zmiennea jak Compare2 w obu najnowszych wersjach. Jeśli nie działa trzeba wpisać bezpośrednio do rejestru OCR2.
Aha! Symulator z BASCOM nie obsługuje TIMER2 z fikuśnymi opcjami jak PWM. To samo się dzieje jak Prescale będzie większe niż 128 :(
Jasam pisze:A co do tego ręcznego modyfikowania tych bitów to pokaż mi bardziej na przykładzie jeśli mozesz bo na razie nie mam pomyslu jak to działa.
Wziąłbyś otworzył dokumentację ATMega8 i znalazłbyś, że bity WGM20 i WGM21 są w rejestrze TCCR2.

TCCR2 = &B01111001

czyli nic innego jak:

CONFIG TIMER2 = FastPWM, PMW = On, Prescale = 1, Compare PWM = Set Match
p.s. Oczywiście taka forma instrukcji CONFIG nie istnieje zatem nie próbuj jej wpisywać

Jasam
Użytkownik
Posty: 422
Rejestracja: 27 mar 2007, 21:09

Post autor: Jasam » 16 cze 2008, 21:17

Dzięki. Jeszcze pytanko. Ile maksymalnie wynosi częstotliwośc nośna PWM i od czego zalezy?

Kod: Zaznacz cały

$regfile = "m8def.dat"
$crystal = 8000000

Config Adc = Single , Prescaler = Auto , Reference = Internal
Config Timer1 = Pwm , Pwm = 10 , Prescale = 1 , Compare B Pwm = Clear Down


Start Adc
Dim Wynik1 As Word , Wynik2 As Word
Do
Wynik1 = Getadc(3)
Wynik2 = Getadc(2)
Lcd Wynik1 ; "--" ; Wynik2

Waitms 1
Compare1b = Wynik2
Cls
Loop
tutaj do wysjcia compare1b jest podłaczona dioda led oraz klucz tranzystorowy sterujący głosniczkiem. Przy prescale=1 i srodkowych wartościach Wynik2 slyszę częstotliwośc nośną PWM. Da się zrobić bvy była ona wyższa (np w zakresie trochę ponad pasmem słyszalnym)? Jak zmodyfikowac ten program by ta częstotliwośc była wyższa?

[ Dodano: 2008-06-17, 09:28 ]
Może przyda się konfiguracja timera1 jako fastPWM. Ale w helpie polskim do bascoma nic na ten temat nie widzę i nie wiem jak to dobrze skonfigurować. Mówiłeś, że bascom dla timer2 nie obsluguje fikuśnych funkcji. Więc dla timer1 w takim razie jak to wygląda? Który kolega ma jakiś pomysł? Proszę o pomoc bo datasheet jest akurat jeśli o to chodzi bardzo mętny.

ZbeeGin

Post autor: ZbeeGin » 17 cze 2008, 20:00

Dzięki. Jeszcze pytanko. Ile maksymalnie wynosi częstotliwośc nośna PWM i od czego zalezy?
Hmmmm. Maksymalnie to będzie fosc/4 (ze skróconym licznikiem do 2, prescalerem = 1, tryb FastPWM). Ale PWM będzie miał rozdzielczość... jednego bitu.
Zależy ona od trzech rzeczy: częstotliwości taktowania licznika - czyli w domyśle taktowania procesora; jego rodzielczości - można ją zmieniać od 1 do 16 bitów dla licznika Timer1; oraz trybu pracy - Fast lub Normal.
Jasam pisze:Da się zrobić by była ona wyższa (np w zakresie trochę ponad pasmem słyszalnym)? Jak zmodyfikowac ten program by ta częstotliwośc była wyższa?
Jesteś pewien, że procesor pracuje z częstotliwościa 8MHz jaką zakładasz? Jeśli nie zmieniałeś fuse-bitów to pracuje on z fosc = 1000000Hz. Tego nie zauważysz bo opóźnienia LCD są dość krótkie i jak się wydłużą osiem razy to i tak LCD będzie działał.
Zmniejsz też rozdzielczość PWM do 8bitów - a nie jak masz wpisane 10bitów.
Jasam pisze:Może przyda się konfiguracja Timera1 jako fastPWM. Ale w helpie polskim do bascoma nic na ten temat nie widzę i nie wiem jak to dobrze skonfigurować.
Trzeba zmienić stan paru bitów w TCCR1A i TCCR1B. Zajrzyj do dokumentacji bo możliwych opcji jest 5 (Ostatnia tabelka przy opisie rejestru TCCR1A). Już chyba wiesz jak szukać...
Jasam pisze:Ale w helpie polskim do bascoma nic na ten temat nie widzę i nie wiem jak to dobrze skonfigurować.
Nie ma, gdyż BASCOM domyslnie używa Phase Correct PWM. Po co miałem opisywać coś czego nie można skonfigurować z odpowiedniego polecenia CONFIG TIMER? Ponadto jak powstał opis i składnia języka to FastPWM nie było jeszcze dostępne.
Jasam pisze:Więc dla timer1 w takim razie jak to wygląda?
Niestety prawie tak samo. Symulacja działania PWM jest niemożliwa, gdyż licznik startuje i to można zobaczyć, ale nie zmienia on kierunku liczenia co normalnie ma miejsce. Dlatego takie rzeczy symuluję w AVR Studio.
Jasam pisze:Proszę o pomoc bo datasheet jest akurat jeśli o to chodzi bardzo mętny.
Datasheety ATMEL-a dość wyczerpująco opisują wszystkie bity i tryby pracy licznika TIMER1 po koleii. Zatem nie wiem skąd taki osąd.

Jasam
Użytkownik
Posty: 422
Rejestracja: 27 mar 2007, 21:09

Post autor: Jasam » 18 cze 2008, 9:56

Jestem pewny, że częstotliwośc taktowania to 8MHz ponieważ procesor jest taktowany wewnetrznym układem rc. Ustawienia bitów konfiguracyjnych są dobre. Udało mi się już wystarczająco zwiększyć częstotliwość PWM zmniejszając rozdzielczość. Mniejsza rozdzielczość jest dla mnie do przyjęcia.

[ Dodano: 2008-06-18, 10:58 ]
Inne pytanie. Jak maksymalnie często da się dokonywać pomiarów za pomocą adc w tym procesorze? Chciałbym zmierzyć około2 do 4 tysięcy próbek na sekunde. Da się zrobić? Czy trzeba stosować zewnetrzny konwerter? W tym programiku co napisałem częstotliwośc pomiarów wydaje się niewielka niestety.

ZbeeGin

Post autor: ZbeeGin » 18 cze 2008, 18:11

No to otwórzymy naszego datashheta na stronie 198. Zalecana maksymalna prędkość pracy przetwornika to 200kHz. Od niej zacznijmy. Pierwsza konwersja będzie trwać 25 taktów zegara przetwornika, zatem pomińmy ją jako nieistotny szczegół i przyjmijmy, że każda konwersja będzie trwać tak jak każda następna - czyli 14 taktów zegara przetwornika.

f=200kHz => t=0.000005s
14 * t = 0.00007s
1s / 0.00007s = 14286 próbki/s

Teoretycznie. Do tego trzeba dodać czas jaki trwać będzie cała procedura odczytu próbki, jej katalogowanie i tym podobne rzeczy. Zatem połowa tej wartości jest łatwo osiągalna. Ale nie z BASCOMa!

Jak to sprawdzić naprawdę? Uruchom symulator AVR Studio ustaw co trzeba (Mega8, taktowanie). Ustaw pułapkę na pierwszej instrukcji GETADC i następną na następnej instrukcji GETADC. Po uruchomieniu jak symulator się zatrzyma zapisz czas jaki pojawił się w polu Stop Watch. Kliknij Run i znów zapisz czas jaki się pojawił przy następnej pułapce. Odejmij. Teraz już wiesz jaki dokładnie czas trwa GETADC. Podziel 1s przez niego i masz ilość samych próbek na sekundę.
A teraz zmierz ile będzie z całym programem...

MYŚLCIE LUDZIE!

ODPOWIEDZ