Atmega 128 i licznik 1

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!
slawek55
Użytkownik
Posty: 475
Rejestracja: 16 sie 2005, 11:47
Lokalizacja: Szczecin

Atmega 128 i licznik 1

Post autor: slawek55 » 02 paź 2006, 8:55

Witajcie
Potrzebuję zastosować w Timer1 w Atmega 128
Czytałem Datasheet i dla tego licznika jest 3 rejestry OCR1A, OCR1B, i OCR1C. Jak uzyć tych trzech rejestrów, dlaczego jest ich trzy.
Dodatkowo jest rejestr TCCR1C w którym są 3 bity FOC1A, FOC1B, FOC1C do czego one służa i jak je wykorzystać?

Awatar użytkownika
marcing
Użytkownik
Posty: 868
Rejestracja: 14 lut 2006, 14:13
Lokalizacja: z pociągu...
Kontakt:

Post autor: marcing » 02 paź 2006, 12:01

Rejestry OCRxX to rejestry porównania. Podczas zliczania na bieżąco jest sprawdzana zawartość tych rejestrów z aktualną wartością w liczniku. Jeżeli nastąpi zrównanie, procesor może zmienić stan na którejś z odpowiadających rejestrom końcówce (pinie) portu. Wszystko zależy od trybu działania licznika - przede wszystkim rejestry te wykorzystuje się przy pracy PWM...

Bity FOCxX (Force Output Compare) służą do wymuszenia zmiany na porcie (odpowiednich pinach) przy zrównaniu zawartości licznika i odpowiedniego rejestru OCRxX podczas normalnej pracy (bez włączania trybów PWM)...


Rejestr OCR1A można też wykorzystać do skracania cyklu licznika - po zrównaniu się zawartości obu licznik zaczyna liczyć od zera.


A dlaczego są trzy podobne rejestry? Bo możesz zrobić sobie trzy kanały PWM - do sterowania chociażby jasnością trzech żarówek...
Aby skorzystać z takiej możliwości musisz licznik w któryś tryb PWM... A tych jest dwanaście różnych...

slawek55
Użytkownik
Posty: 475
Rejestracja: 16 sie 2005, 11:47
Lokalizacja: Szczecin

Post autor: slawek55 » 02 paź 2006, 12:19

To czym niby różni się to od trybu PWM

Awatar użytkownika
marcing
Użytkownik
Posty: 868
Rejestracja: 14 lut 2006, 14:13
Lokalizacja: z pociągu...
Kontakt:

Post autor: marcing » 02 paź 2006, 12:28

Chodzi o wymuszenie zmiany stanu na wyjściu przy porównaniu?
Różni się tym, że licznik pracuje normalnie - nie ma skróconego cyklu pracy (liczy przy pełnych 16 bitach), nie jest kasowany przy porównaniu (jak w trybie CTC), liczy tylko w górę (w trybie PWM - za wyjątkiem FastPWM - liczy w górę, po osiągnięciu MAX zaczyna zliczać w dół).
W trybie FastPWM licznik pracuje podobnie, ale ma rozdzielczość 8,9 lub 10 bitów - zamiast 16-tu.
Po zrównaniu z wartością w rejestrze OCRxX ustawiany jest odpowiadający temu rejestrowi pin procesora, a po osiągnięciu wartości MAX pin jest zerowany...

Odpowiednie rysunki i tabele znajdują się w datasheet - warto je przejrzeć. Oczywiście - na pytania chętnie odpowiem ;)

slawek55
Użytkownik
Posty: 475
Rejestracja: 16 sie 2005, 11:47
Lokalizacja: Szczecin

Post autor: slawek55 » 02 paź 2006, 12:38

Pytania będą tylko musze się przygotować do nich a mam je w domu.

Chciałbym zrozumieć zaawansowane funkcje liczników, bo mają ich dużo.

A znasz może jakąś strnę z opisem.

Awatar użytkownika
marcing
Użytkownik
Posty: 868
Rejestracja: 14 lut 2006, 14:13
Lokalizacja: z pociągu...
Kontakt:

Post autor: marcing » 02 paź 2006, 12:58

Hmmm... Niestety, nie znam strony z takim opisem...

Jedyne, z czego korzystam to noty katalogowe i aplikacyjne...
Ewentualnie czytanie podobnych tematów w necie....

Ale w razie wątpliwości postaram się pomóc.
Na Forum zagląda też ZbeeGin - wie więcej na temat AVR-ków. Można zawsze zadać pytanie...

slawek55
Użytkownik
Posty: 475
Rejestracja: 16 sie 2005, 11:47
Lokalizacja: Szczecin

Post autor: slawek55 » 04 paź 2006, 6:10

Chcaiłbym wrócic to Timera 1 w Atmega 128.

W trybie CTC licznik zlicza od 0 do wartości która jest w rej. OCR1A i następuje zerowanie rej. TCNT1. teraz można wygenerowac przerwanie.
Mozna sterować wyjsciem OC1A poprzez ustaweenie bitów COM1A1:0 a co w takim razie robi teraz bit FOC1A. A co z rejestrami OCR1B i OCR1C.

Następna rzecz to Fast PWM. Na stronie 125 jest napisane, że rozdzielczośc może być 8, 9, 10 bitów lub określona przez OCR1A, o co tu chodzi? Dlaczego OCR1A. A co teraz z bitem FOC1A i rejestrami OCR1B i oCR1C.

Jak dla mie datasheet trochę słabo to wyjaśnia.
Możecie mi to jakoś wytłumaczyć.

Awatar użytkownika
marcing
Użytkownik
Posty: 868
Rejestracja: 14 lut 2006, 14:13
Lokalizacja: z pociągu...
Kontakt:

Post autor: marcing » 04 paź 2006, 10:46

W trybie pracy normalnej (WGM13:0 = 0000b) bit FOC1A służy do wymuszenia zmiany stanu na pinie oznaczonym jako OC1A podczas zrównania rejestrów OCR1A i licznika. Ustawienie bitów FOC1B i FOC1C spowoduje taką samą reakcję na wyjściach OC1B i OC1C po zrównaniu się rejestrów OCR1B i OCR1C z licznikiem.

W trybie CTC oraz we wszystkich trybach PWM nie powinno się ustawiać tego bitu - nie ma on wtedy żadnego znaczenia, ale czasem może powodować niepoprawną pracę...
Stan wyjścia zależny jest wtedy od bitów COM1A1 i COM1A0.

Rejestr OCR1A jest tak jakby głównym rejestrem porównania - pozostałe dwa są traktowane jako dodatkowe. Jest to dość logiczne, bo gdybyś mógł skracać cykl wszystkimi trzema rejestrami porównania - w pewnej chwili zrobiłby się bałagan.
I dlatego właśnie ten rejestr służy do skracania cyklu pracy licznika w trybie PWM oraz CTC.
Do skracania cyklu pracy - oprócz OCR1A - można wykorzystać również rejestr przechwycenia, ICR1. Nie będzie wtedy możliwe przechwycenie zawartości licznika, ale za to ma się pełną kontrolę nad trzema kanałami PWM bez utraty możliwości skracania cyklu pracy.

slawek55
Użytkownik
Posty: 475
Rejestracja: 16 sie 2005, 11:47
Lokalizacja: Szczecin

Post autor: slawek55 » 04 paź 2006, 11:00

Rozumiem, a co z tym FastPWM i tą rozdzielczością 8, 9, 10 lub określoną przez OCR1A. Jak ma się to do zmainy wypełnienia skoro OCR1A określa max wartość licznika.

Awatar użytkownika
marcing
Użytkownik
Posty: 868
Rejestracja: 14 lut 2006, 14:13
Lokalizacja: z pociągu...
Kontakt:

Post autor: marcing » 04 paź 2006, 11:10

Masz cztery tryby FastPWM: o rozdzielczości 8-, 9- i 10-bit oraz o rozdzielczości określonej zawartością rejestru OCR1A
When using OCRnA as TOP value in a PWM mode, the OCRnA Register can not be
used for generating a PWM output.
Wyraźnie jest więc napisane, że nie da się jednocześnie wykorzystać rejestru OCR1A do skracania cyklu licznika oraz generowania sygnału PWM...

slawek55
Użytkownik
Posty: 475
Rejestracja: 16 sie 2005, 11:47
Lokalizacja: Szczecin

Post autor: slawek55 » 04 paź 2006, 11:21

Faktycznie przeoczyłem, niedoczytałem. Dzięki.

[ Dodano: 2006-10-04, 13:52 ]
Zaczynam ustawiac timer 1 w tryb CTC bez obsługi portu z przerwaniem przy zrównaniu.

na stronie 135 jest taka tabelka i punkcie mode 4 jest napisane Update of
OCRnx at
- Immediate co to znaczy?

Druga rzecz. Powiedzmy timer1 liczy od o do wartosci w OCR1A. Po zrównaniu następuje przerwanie. ale dodatkowo (jeżeli wpisze wartośc początkową do TCNT1 większa niż do OCR1A to doliczy do wartości 0xFFFF i po przepełnieniu nastąpi ustawienie flagi przerwania od przepełnienie, tak?

I teraz jeżelii wpiszę do OCR1B wartośc mniejszą niz do OCR1A to nastąpi porównanie ustawiona zostanie flaga porównania ale licznik liczy dalej do wartosci zawartej w OCR1A.
Jeżeli do rejestru OCR1C wpisze teraz wartośc większą od OCR1C to nigdy nie nastąpi porównanie i nie zostanie zgłoszone przerwanie, bo licznik sie wczesniej wyzeruje.

Jeżeli chcę teraz aby nastąpiła zmaina wyjść OC1A, OC1B i OC1C to nie moge dotykać bitów FOCxn tylko odpowiednio ustawić bitu COMxn1 i COMxn0.
Zakładając sytuacje jak wyżej to nastapi reakcjana OC1A i oC1B natomiast na OC1C nie.


Czy dobrze to zrozumiałem, jeśli nie to proszę popraw.

Awatar użytkownika
marcing
Użytkownik
Posty: 868
Rejestracja: 14 lut 2006, 14:13
Lokalizacja: z pociągu...
Kontakt:

Post autor: marcing » 04 paź 2006, 18:45

Immediate, czyli natychmiast...
Chodzi o to, że w trybach PWM by nie było błędów podczas generowania sygnału zawartość rejestrów jest uaktualniana podczas przepełnienia licznika (gdy osiągnie on górną granicę rozdzielczości i zaczyna liczyć w dół).
Inaczej jest w trybie CTC, gdzie to właśnie rejestr OCR1A wyznacza maksymalną wartość jaką może zliczyć licznik. Tym samym jego zawartość powinna być aktualizowana na bieżąco - istnieje jednak pewne ryzyko: Jeśli wartość w OCR1A jest większa od stanu licznika, i w tym momencie zmienisz ją na mniejszą niż ta w T/C1 - licznik zliczy do maksymalnej swojej wartości i zacznie liczyć od zera...

Jeżeli używasz rejestru OCR1A do określenia maksymalnej rozdzielczości licznika - Twoim obowiązkiem jest zadbać o to, by w pozostałych dwóch rejestrach nie wystąpiły wartości większe niż ta w OCR1A...
Tak więc dobrze rozumiesz dane w karcie katalogowej - warto przeczytać i przeanalizować je dokładnie.

Pozdrawiam!

slawek55
Użytkownik
Posty: 475
Rejestracja: 16 sie 2005, 11:47
Lokalizacja: Szczecin

Post autor: slawek55 » 05 paź 2006, 6:06

Co oznacza zapis non-PWM mode

[ Dodano: 2006-10-05, 07:25 ]
Jeszcze jedno nie daje mi spokoju. Cytat z datasheet:

The FOCnA/FOCnB/FOCnC bits are only active when the WGMn3:0 bits specifies a
non-PWM mode. When writing a logical one to the FOCnA/FOCnB/FOCnC bit, an
immediate compare match is forced on the waveform generation unit. The
OCnA/OCnB/OCnC output is changed according to its COMnx1:0 bits setting. Note that
the FOCnA/FOCnB/FOCnC bits are implemented as strobes. Therefore it is the value
present in the COMnx1:0 bits that determine the effect of the forced compare


Czy ja mam to takk rozumieć, że Bity FOCxn sa aktywne w innym trybe niz PWM.
Ale dlaczego tu pisza że wyjscia OCxn jest zmieniany zgodnie z ustawieniami COMx1:0.

Pytam o to bo ma sie to nijak do tego co napisał wcześniej marcing.
Po prostu nie zabardzo rozumiem znaczenie tych bitów więc proszę o odrobinke cierpliwości dla mnie i wyrozumiałość.

Sławek

[ Dodano: 2006-10-05, 07:30 ]
Jeszcze jedno. zakładając jakąś analogię do innych układów Atmela to w Datasheet dla Atmega8 jest napisane
Force Output Compare
In non-PWM Waveform Generation modes, the match output of the comparator can be
forced by writing a one to the Force Output Compare (FOC1x) bit. Forcing Compare
Match will not set the OCF1x Flag or reload/clear the timer, but the OC1x pin will be
updated as if a real Compare Match had occurred (the COM1x1:0 bits settings define
whether the OC1x pin is set, cleared or toggled).


Czyli jesli bity COM ustawiaja reakcje na poróbnanie to po co są te bity FOC??

[ Dodano: 2006-10-05, 11:13 ]
Czy ja to dobrze rozumiem, ale wynika z tego wszystkiego że po wpisaniu jedynki do bitów FOC następuje od razu reakcja wyjscia OCx zgodnie z bitami COM. I nie ważne czy nastapiło zrównanie licznika z OCRxn, czy nie.
Na dodatek bity te jak pisze działają na zasadzie strobowania i reakcja następuje tylko przy zmaianie L ->H

Awatar użytkownika
marcing
Użytkownik
Posty: 868
Rejestracja: 14 lut 2006, 14:13
Lokalizacja: z pociągu...
Kontakt:

Post autor: marcing » 05 paź 2006, 11:57

Twoje rozumowanie jest błędne...

Bity FOCxX służą do wymuszenia reakcji na wyjściach OCxX w zależności od ustawienia rodzaju tejże w bitach COMxX1:0. Ustawienie FOCxX nie powoduje natychmiastowej reakcji na wyjściu, lecz dopiero po zrównaniu wartości w liczniku z tą w rejestrze OCRxX. Reakcja będzie zależna od ustawienia wyjść zgodnie z tabelą 58 (2467N-AVR-3/06).

Tryby non-PWM to głównie tryb Normal

Przeczytaj ten dokument, powinien Tobie trochę rozjaśnić.

slawek55
Użytkownik
Posty: 475
Rejestracja: 16 sie 2005, 11:47
Lokalizacja: Szczecin

Post autor: slawek55 » 05 paź 2006, 13:57

To jak rozumiesz to co jest wklejone w poprzednim poście

ODPOWIEDZ