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!
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, 14:21

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.
Wpisanie jedynki do bitu FOCnX natychmiast wymusza włączenie porównania w generatorze sygnału PWM. Wyjścia OCnX zmieniają stan są w zależności od ustawień bitów COMnX1:0.
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).
Wymuszenie porównywania nie ustawia flagi OCF1x oraz nie powoduje przeładowania/wyzerowania licznika, lecz pin OC1x jest ustawiany jak w rzeczywistym trybie porównywania podczas wystąpienia zrównania (ustawienia bitów COM1x1:0 definiują, czy pin ma być ustawiony, wyzerowany czy też ma następować odwrócenie stanu).


Hmmm... Tłumaczenie noty krok po kroku z tego wychodzi...
I jedno mnie martwi w tym temacie - pomału robi się tu czat...

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

Post autor: slawek55 » 05 paź 2006, 15:41

To już nic nie piszę wiecej.
Zawsze myślałem że po to jest forum. aby pogadać, coś sobie wyjaśnić, ale... OK!

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, 18:12

Proszę, nie przejmuj się tym co napisałem...
Masz rację - po to jest forum, by pomagać.

Pisz dalej swoje pytania - nie zniechęcaj się. Nie taki był mój cel...
Dodałem takie trochę nic nie znaczące stwierdzenie (czytaj - myślałem na głos).

Przepraszam i pozdrawiam!

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

Post autor: slawek55 » 05 paź 2006, 19:24

Wisz co właśnie napisałem bardzo długi post ale mi wyparował.
Nie chcę już pisać tego wszystkiego jeszcze raz ale powiem tylko że po dzisiejszej lektyrze postów i DataSheet dla Atmega128 i Atmega8 jestem w punkcie wyjścia.

Chiałbym to zrozumiec najlepiej na przykładzie
Jeżeli możesz mi okazac odrobine litości to opisz mi to jakoś po kolei i co w końcu z tymi bitami.
Dlazcego oni piszą w karcie Note that
the FOCnA/FOCnB/FOCnC bits are implemented as strobes

Jeżeli bity COM ustawiają reakcję wyjścia OC to po co jeszcze te bity,
Wezmę sobie teraz do poduszki jeszzce raz datasheet i poczytam. Rano napisze czy jestem w punkcie wyjscia czy jest krok do przodu?

Sławek.

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, 19:37

Sławku, bity COMnX ustawiają tylko jak ma reagować wyjście na wystąpienie faktu, że akurat nastąpiło zrównanie...
W trybach PWM, gdzie w zasadzie ideą takiej pracy jest ustawianie wyjścia odpowiednio do wartości porównywanej, nie jest potrzebne dodatkowe dołączanie wyjść do rejestru.
W normalnym trybie pracy wyjścia są odłączone od licznika, więc jeśli chce się, by była jakaś "zewnętrzna" reakcja na zrównanie - należy wymusić dołączenie pinów do odpowiednich rejestrów OCR...
I właśnie to robią bity FOC...

Można to porównać do załączania włącznika głównego w jakimś zakładzie - jeżeli zakład pracuje (odpowiednik trybu PWM) włącznik jest zawsze włączony, niezależnie od tego, czy wykorzystuje się jakieś urządzenie.
Ale - w czasie konserwacji zasilanie powinno być (dla bezpieczeństwa) wyłączone... By przetestować instalację musimy wymusić załączenie instalacji - podobnie robią to bity FOC...

Myślę, że rano zrozumiesz więcej ;)
I nie przejmuj się - początki bywają trudne. Szukaj jakiejś analogii działania urządzeń - będzie łatwiej...

Pozdrawiam!

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

Post autor: slawek55 » 06 paź 2006, 7:12

Napiosałem sobie bardzo prosty prgram w C, komilator ICC-AVR i testy w AvrStudio.

Kod: Zaznacz cały

#include "iom8v.h"

#include <macros.h>

#pragma interrupt_handler Degre_:7   //przerwanie od CTC

volatile unsigned char a, b;

/* interrupt handler called every timer1 compare match */

void Degre_(void)
{
PORTC=~PORTC;
}

void main(void)
{
DDRB = 0xff;

/* Timer 1: CTC mode TOP value = OCR1A, no prescaler */
	TCCR1A = 0x40;	
	TCCR1B = 0x09;
/* Timer 1: interrupt every INT_CYCLES cycles */
	OCR1A = 100;
	TIMSK = 0x10;

	SEI();	

while(1){
for(b=0;b<15;b++){a++;}

TCCR1A|=0x0c;

for(b=0;b<20;b++){a++;}
}


}
próbuje zaobserwowac jakąś reakcję bitów FOC ale w tym programie niestety nie ma reakcji.
Czy możesz coś podpowiedzieć jak aobserwować na czym polega dzialanie tych bitów FOC.

tutaj jak FOC jest wyzerowany czy ustawiony to i tak następuje przerwanie i reakcja na wyjsciu OC1A bez względu na stan bitów.

ZbeeGin

Post autor: ZbeeGin » 08 paź 2006, 19:48

slawek55 pisze:próbuje zaobserwowac jakąś reakcję bitów FOC ale w tym programie niestety nie ma reakcji.
Zacytuję fragment z książki "ATMega w praktyce" Rafała Baranowskiego:
Jeśli licznik pracuje w trybie innym niż PWM (np. normalnym), możliwe jest wymuszenie zmiany stanu na wyprowadzeniu OCn (OCnx) tak, jakby wystąpiło zdarzenie zgodności porównania. Dokonuje się tego, zapisując odpowiedni znacznik FOCn (FOCnx) w rejestrze TCCRn (TCCRnx) wysoką wartością logiczną. Operacja ta nie generuje przerwania wynikającego ze zgodnego porównania, a jedynie zmienia stan linii OCnx w sposób zależny od nastawy znaczników COMnx z rejestrów TCCRnx.
Zatem zmieniając stan FOCnx z L -> H, to zgodnie z ustawieniem COMnx, stan OCnx powinien zostać wymuszony w następnym takcie CLKi/o. Jeśli zatem COM1A0:COM1A1 zostanie ustawione w opcji zmiany stanu na przeciwny, to cykliczne ustawianie FOC1A będzie powodować "natychmiastowe" zmiany stanu na linii OC1A.
I jeszcze jedna ważna rzecz - po wpisaniu jedynki do FOCnx stan OCnx się zmienia, a bit FOCnx (ma on status "Tylko zapis") zostaje automatycznie wyzerowany!
slawek55 pisze:Czy możesz coś podpowiedzieć jak aobserwować na czym polega dzialanie tych bitów FOC.
Zatem sprawdzać należy czy zmienia się stan końcówek OCnx podczas ustawiania FOCnx...
W tym oto celu napisałem sobie taki programik w asemblerze w AVR Studio (v4.12). Rozwinąłem sobie gałęzie TIMER_COUNTER_0 oraz PORTB i sprawdziłem czy opcja FOC działa.

Kod: Zaznacz cały

.include "m128def.inc"
      'PB3 jako wyjście
      ldi   r16, 0b00010000
      out   DDRB, r16
      'pozycja startowa licznika
      ldi   r16, 0b00000000
      out   TCNT0, R16
      'porównanie z 127 
      ldi   r16, 0b01111111
      out   OCR0, r16     

      'start preskalera i opcja Toggle OC0
      ldi   r16,(1<<COM00)|(1<<CS01)
      out   TCCR0,R16

petla:
      'tutaj mam pełną swobodę
      rjmp  petla
Niestety, także nie potrafię tego zasymulować. W trakcie pracy licznika próbowałem sobie zmieniać stan FOC0, ale reakcja na porcie nie była odwzorowywana... :( Trzeba wprawdzić w realnym układzie lub wierzyć "na słowo" projektantom.

[ Dodano: 2006-10-08, 22:23 ]
slawek55 pisze:tutaj jak FOC jest wyzerowany czy ustawiony to i tak następuje przerwanie i reakcja na wyjsciu OC1A bez względu na stan bitów.
Dlatego, iż już samo wybranie trybu zmiany stanu koncówki OCnx za pomocą bitów COMnx włącza tryb porównywania z jego przerwaniami. Jeśli zostaną odblokowane, to będą generowane.

[ Dodano: 2006-10-09, 07:06 ]
slawek55 pisze:Wisz co właśnie napisałem bardzo długi post ale mi wyparował.
Jeśli cię w międzyczasie wylogowało, to zrób tak: po naciśnięciu Wyślij forum prosi o zalogowanie, zaloguj się ponownie i gdy pokaże się opcja Napisz odpowiedź z pustą treścią klinij w przeglądarce 2 razy wstecz, a wrócisz do poprzednio napisanej treści i po ponownym kliknięciu Wyślij odpowiedź będzie wysłana.

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

Post autor: slawek55 » 09 paź 2006, 18:50

Cześć
Ja w swoim programie zrobiłem tak, że w przertwaniu INT0 ustawiłem bit FOc mój kod to

Kod: Zaznacz cały

void int_0(void)
{
PORTC&=~1<<6;   //zapal
TCCR1A|=0x0c;  //ustaw FOC
Delay(4);  //1 ms
PORTC|=1<<6;  //ZGAS
TCCR1A&=~0x0c;  //wyzeruj FOC

}
Opóźnienie było abym zobaczył mignięcie diody.
A gdzie znalazłeś coś o tym że te bity po wpisaniu 1 zostają automatycznie wyzerowane. Ja próbowałem sam je wyzerowac, ale po przeczytaniu Twojego postu usunąłem zerowanie i działa tak samo, czyli faktycznie nie trzeba same się zerują. W Datasheet nie mogłem tego znaleśc, więc czy możesz podać źródło swojej informacji. Zależy mi ponieważ chyba cos przegapiłem a długo czytałem.

ZbeeGin

Post autor: ZbeeGin » 09 paź 2006, 20:07

slawek55 pisze:W Datasheet nie mogłem tego znaleśc, więc czy możesz podać źródło swojej informacji.
Nie ma tego w Datasheet. AVR Studio tak to symuluje!

Ale można się domyślić czytając te dwa zdania:
1. "The FOCnA/FOCnB/FOCnB bits are always read as zero."
2. "Note that the FOCnA/FOCnB/FOCnC bits are implemented as strobes."
Zatem bit FOCnx jest traktowany jako element strobe (sygnał strobujący, migotliwy - jak podaje słownik ang-pl) czyli chwilowy impuls powodujący wykonanie jakiejś operacji.

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

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

Cześc.
Możesz mi jeszcze powiedzieć jak zasymulowałeś zerowanie bitów FOC.
W moim AVRStudio nie ma symulacji tego.
PO tym jak ustawię jedynkę na miejscu FOC poprzez

Kod: Zaznacz cały

TCCR1A|=0x0c;  //ustaw FOC
pozostaje on ustawiony aż do czasu wyzerowania poprzez

Kod: Zaznacz cały

TCCR1A&=~(0x0c);  //wyzeruj FOC
Nie wiem dlaczego tak jest że mój Avr Studio nie symujuje zerowania.
Mam najnowszą wersję z SP.
Możesz podesać swoje pliki.

ODPOWIEDZ