Serwis Edukacyjny
w I-LO w Tarnowie
obrazek

Materiały dla uczniów liceum

  Wyjście       Spis treści       Wstecz       Dalej  

obrazek

Autor artykułu: mgr Jerzy Wałaszek
Konsultacje: Wojciech Grodowski, mgr inż. Janusz Wałaszek

©2023 mgr Jerzy Wałaszek
I LO w Tarnowie

obrazek

Mikrokontrolery

ATmega640/1280/1281/2560/2561

USART w trybie SPI

obrazek

Educational and Non-Profit Use of Copyrighted Material:

If you use Microchip copyrighted material solely for educational (non-profit) purposes falling under the “fair use” exception of the U.S. Copyright Act of 1976 then you do not need Microchip’s written permission. For example, Microchip’s permission is not required when using copyrighted material in: (1) an academic report, thesis, or dissertation; (2) classroom handouts or textbook; or (3) a presentation or article that is solely educational in nature (e.g., technical article published in a magazine).

https://www.microchip.com/about-us/legal-information/copyright-usage-guidelines

SPIS TREŚCI
Podrozdziały

obrazek

Przegląd

Uniwersalny synchroniczny i asynchroniczny odbiornik/nadajnik szeregowy (ang. Universal Synchronous and Asynchronous serial Receiver and Transmitter, USART) można skonfigurować do pracy w trybie zgodnym z trybem Master SPI. Ten tryb Master SPI (ang. Master SPI Mode, MSPIM) posiada następujące cechy:

Ustawienie na 1 obu bitów UMSELn1:0 włącza w USARTn logikę MSPIM. W tym trybie pracy logika sterująca master SPI przejmuje bezpośrednią kontrolę nad zasobami USART0. Zasoby te obejmują rejestr przesuwający nadajnika i odbiornika z buforami oraz generator szybkości transmisji. Wyłączone zostają generator parzystości i układ sprawdzania parzystości, logika odtwarzania danych i zegara oraz logika sterowania nadawaniem i odbiorem danych. Logika odbioru i nadawania USARTn zostaje zastąpiona wspólną logiką sterowania transmisją SPI. Jednakże logika sterowania końcówkami i generacją przerwań jest identyczna w obu trybach pracy.

W obu trybach położenie komórek rejestrów we/wy jest takie same. Jednakże funkcje niektórych rejestrów sterujących zmieniają się, gdy jest używany tryb MSPIM

Na początek:  podrozdziału   strony 

Porównanie USART MSPIM z SPI

USART w trybie MSPIM jest w pełni kompatybilny z AVR SPI pod względem:

Jednakże ponieważ USART0 w trybie MSPIM wykorzystuje ponownie zasoby USART0, to użycie USART0 w trybie MSPIM różni się nieco w porównaniu z trybem SPI. Oprócz różnic w bitach rejestrów sterujących oraz obsługi tylko pracy w trybie master przez USART0 w trybie MSPIM, różnice pomiędzy tymi dwoma modułami dotyczą następujących cech:

Poniższa tabelka zawiera porównanie pomiędzy końcówkami w trybie MSPIM i SPI.

USART_MSPIM SPI Komentarz
TxDn MOSI Tylko wyjście master
RxDn MISO Tylko wejście master
XCKn SCK (funkcjonalnie identyczne)
(N/A) SS Nie obsługiwane przez USARTn w trybie MSPIM

Generacja zegara

Logika generacji zegara generuje podstawowy zegar dla nadajnika i odbiornika. W trybie pracy USART MSPIM obsługiwane jest tylko wewnętrzne generowanie zegara (tj. praca master). Z tego powodu bit rejestru kierunku danych dla końcówki XCKn (DDR_XCKn) musi być ustawiony na jeden (tj. jako wyjście), aby moduł USARTn działał prawidłowo w trybie MSPIM. Zaleca się ustawienie bitu DDR_XCKn przed włączeniem trybu USART MSPIM (tj. ustawienie bitu TXENn i RXENn na jeden).

Wewnętrzna generacja zegara w trybie MSPIM jest identyczna jak w synchronicznym trybie USART master. Z tego powodu szybkość transmisji i ustawienia UBRRn można wyliczać z tych samych wzorów:

Tryb pracy Wzór na szybkość transmisji Wzór na wyliczenie wartości UBRR
Tryb synchroniczny master
fT – szybkość transmisji w bitach na sekundę
fOSC – częstotliwość zegarowa oscylatora systemowego
UBRR – zawartość rejestrów UBRRnH i UBRRnL (0...4095)
Na początek:  podrozdziału   strony 

Tryby danych SPI i przebiegi czasowe

W odniesieniu do danych szeregowych są cztery kombinacje fazy i polaryzacji XCKn (SCK), które określane są przez bity sterujące UCPHAn i UCPOLn. Wykresy czasowe przesyłu danych są przedstawione poniżej na rysunku. Bity danych są wysuwane i zatrzaskiwane przy przeciwnych zboczach sygnału XCKn, zapewniając wystarczający czas na ustabilizowanie się sygnałów danych. Funkcje bitów UCPOLn i UCPHAn podsumowuje tabelka. Zapamiętaj, iż zmiana stanu dowolnego z tych bitów zniszczy całą bieżąco wykonywaną transmisję zarówno dla odbiornika jak i dla nadajnika.
UCPOLn UCPHAn Tryb SPI Zbocze początkowe Zbocze końcowe
0 0 0 Próbkowanie (narastające) Ustawianie (opadające)
0 1 1 Ustawianie (narastające) Próbkowanie (opadające)
1 0 2 Próbkowanie (opadające) Ustawianie (narastające)
1 1 3 Ustawianie (opadające) Próbkowanie (narastające)

Na początek:  podrozdziału   strony 

Formaty ramek

Ramka szeregowa dla MSPIM zdefiniowana jest jako jeden znak złożony z 8 bitów danych. USART0 w trybie MSPIM posiada dwa formaty ramek:

Ramka rozpoczyna się od najmniej lub najbardziej znaczącego bitu danych, dalej następują kolejne bity danych aż do całkowitej ich liczby równej osiem, kończąc się odpowiednio najbardziej lub najmniej znaczącym bitem. Gdy pełna ramka zostanie przesłana, to nowa może wystąpić bezpośrednio za nią lub linia transmisyjna może przejść w stan bezczynny.

Bit UDORDn w rejestrze UCSRCn ustawia format ramek używanych przez USART w trybie MSPIM. Odbiornik i nadajnik korzystają z tego samego ustawienia. Zapamiętaj, iż zmiana tego bitu w czasie wykonywania transmisji spowoduje błędy w przesyle zarówno dla nadajnika jak i odbiornika.

16-bitowy przesył danych można zrealizować przez zapis dwóch bajtów danych do rejestru UDRn. Wtedy przerwanie przy zakończeniu transmisji UART zasygnalizuje, że 16-bitowa wartość została przesłana.

Inicjalizacja USART MSPIM

USARTn w trybie MSPIM musi być zainicjowane przed rozpoczęciem jakiejkolwiek wymiany danych. Zwykle proces inicjalizacji składa się z ustawienia szybkości transmisji, ustawienia trybu pracy master (przez ustawienie na jeden bitu XCKn_DDR), ustawienia formatu ramki i włączenia nadajnika i odbiornika. Niezależnie może pracować tylko nadajnik. Przy pracy sterowanej przerwaniami należy wyzerować globalny znacznik przerwań I w rejestrze stanu SREG (blokując w ten sposób globalnie przerwania) na czas wykonywania inicjalizacji.

Aby zapewnić natychmiastową inicjalizację wyjścia XCKn, rejestr szybkości transmisji (ang. Baud-Rate Register, UBRRn) musi zawierać wartość zero w momencie włączenia nadajnika. W przeciwieństwie do normalnego trybu pracy USARTn rejestr UBRRn musi być zapisany pożądaną wartością po włączeniu nadajnika. Ustawienie UBRRn na zero przed włączeniem nadajnika nie jest konieczne, jeśli inicjalizacja jest wykonywana po resecie, ponieważ UBRRn ma już wtedy wartość zero.

Przed wykonaniem ponownej inicjalizacji ze zmienioną szybkością transmisji, trybem danych lub formatem ramki upewnij się, że nie jest prowadzona żadna transmisja w okresie zmiany zawartości rejestrów sterujących. Do sprawdzenia zakończenia transmisji przez nadajnik można wykorzystać znacznik TXCn, natomiast znacznik RXCn może być użyty do sprawdzenia, czy są jakieś nieodczytane jeszcze dane w buforze odbiorczym. Zapamiętaj, iż znacznik TXC musi być wyzerowany przed każdą transmisją (przed zapisem do rejestru UDRn), jeśli jest on wykorzystywany do tego celu.

Poniższe proste kody inicjalizacji USARTn pokazują równoważne sobie funkcje w asemblerze i w języku C. Przykłady zakładają przeglądanie stanu znacznika (bez włączonych przerwań). Szybkość transmisji podana jest jako parametr funkcji. Dla kodu w asemblerze parametr szybkości transmisji powinien być umieszczony w rejestrach r17:r16.

Przykład w kodzie maszynowym
USART_Init:
    clr r18
    sts UBRRnH,r18
    sts UBRRnL,r18
    ; Ustawienie końcówki XCKn portu jako wyjście włącza tryb master.
    sbi XCKn_DDR, XCKn
    ; Ustaw tryb pracy MSPI i tryb danych SPI 0.
    ldi r18, (1<<UMSELn1)|(1<<UMSELn0)|(0<<UCPHAn)|(0<<UCPOLn)
    sts UCSRnC,r18
    ; Włącz odbiornik i nadajnik.
    ldi r18, (1<<RXEN0)|(1<<TXEN0)
    sts UCSRnB,r18
    ; Ustaw szybkość transmisji.
    ; WAŻNE: Szybkość transmisji musi być ustawiona po włączeniu nadajnika!
    sts UBRRnH, r17
    sts UBRRnL, r18
    ret
Przykład w języku C
void USART_Init( unsigned int baud )
{
    UBRRn = 0;
    /* Ustawienie końcówki XCKn portu jako wyjście włącza tryb master. */
    XCKn_DDR |= (1<<XCKn);
    /* Ustaw tryb pracy MSPI i tryb danych SPI 0. */
    UCSRnC = (1<<UMSELn1)|(1<<UMSELn0)|(0<<UCPHAn)|(0<<UCPOLn);
    /* Włącz odbiornik i nadajnik. */
    UCSRnB = (1<<RXENn)|(1<<TXENn);
    /* Ustaw szybkość transmisji. */
    /* WAŻNE: Szybkość transmisji musi być ustawiona po włączeniu nadajnika! */
    UBRRn = baud;
}
Na początek:  podrozdziału   strony 

Przesył danych

Używanie USART w trybie MSPI wymaga włączenia nadajnika, tj. ustawienia na jeden bitu TXENn w rejestrze UCSRnB. Gdy nadajnik zostanie włączony, to normalna praca końcówki TxDn zostaje zmieniona na wyjście szeregowe nadajnika. Włączenie odbiornika jest opcjonalne i wykonuje się je przez ustawienie na jeden bitu RXENn w rejestrze UCSRnB. Gdy zostanie włączony odbiornik normalna praca końcówki RxDn zostaje zmieniona na wejście szeregowe odbiornika.

W obu przypadkach XCKn będzie użyty jako zegar transmisji. Przesył danych jest inicjowany zapisem do komórki we/wy UDRn. Tak jest zarówno dla wysyłania jak i odbioru danych, ponieważ nadajnik kontroluje zegar transmisji. Dane wpisane do UDR0 są przenoszone z bufora nadawczego do rejestru przesuwającego, gdy ten jest gotowy na przesłanie nowej ramki.

Aby utrzymywać bufor wejściowy w synchronizacji z liczbą wysłanych bajtów danych, rejestr UDRn musi być odczytywany raz dla każdego wysłanego bajtu. Działanie bufora wejściowego jest identyczne z normalnym trybem USART, tj. jeśli zdarzy się przepełnienie, to ostatnio odebrany znak zostanie utracony, lecz nie pierwszy w buforze.


Poniższe przykłady kodu pokazują prostą funkcję przesyłu w trybie MSPIM, która jest oparta na sprawdzaniu znacznika opróżnienia rejestru danych (UDREn) oraz znacznika zakończenia odbioru (RXCn). USARTn musi być zainicjowany, zanim będzie można użyć tej funkcji. Dla kodu w asemblerze dane do wysłania mają być umieszczone w rejestrze R16, a dane odebrane będą dostępne w tym samym rejestrze po powrocie z wywołania funkcji.

Funkcja po prostu czeka, aż bufor nadawczy stanie się pusty, co wskaże jej znacznik UDREn, po czym umieszcza w tym buforze nowe dane do nadania. Następnie funkcja czeka na pojawienie się danych w buforze odbiorczym, sprawdzając znacznik RXCn, po czym odczytuje ten bufor i zwraca jego zawartość.

Przykład w kodzie maszynowym
USART_MSPIM_Transfer:
    ; Czekaj, aż bufor nadawczy będzie pusty
    sbis UCSRnA, UDREn
    rjmp USART_MSPIM_Transfer
    ; Umieść dane (r16) w buforze, co wyśle je
    out  UDRn,r16
    ; Czekaj na odbiór danych
USART_MSPIM_Wait_RXC:
    sbis UCSRnA, RXCn
    rjmp USART_MSPIM_Wait_RXC
    ; Pobierz odebrane dane z bufora i powróć z funkcji
    lds  r16, UDRn
    ret
Przykład w języku C
unsigned char USART_Receive( void )
{
    /* Czekaj na pusty bufor nadawczy */
    while ( !( UCSRnA & (1<<UDREn)) );
    /* Umieść dane (r16) w buforze, co wyśle je */
    UDRn = data;
    /* Czekaj na odbiór danych */
    while ( !(UCSRnA & (1<<RXCn)) );
    /* Pobierz i zwróć odebrane dane z bufora */
    return UDRn;
}

Znaczniki nadajnika i odbiornika a przerwania

Znaczniki RXCn, TXCn i UDREn wraz z odpowiednimi przerwaniami w USARTn w trybie MSPIM są identyczne w działaniu jak w normalnej pracy USARTn. Jednakże znaczniki błędów odbiornika (FEn, DORn i PEn) nie są używane i zawsze mają przy odczycie wartość zero.

Wyłączanie nadajnika lub odbiornika

Wyłączanie nadajnika lub odbiornika w USARTn pracującym w trybie MSPIM jest identyczne jak w normalnej pracy USARTn.

 
Na początek:  podrozdziału   strony 

Opis rejestrów USART MSPIM

Ten podrozdział opisuje rejestry używane w czasie pracy SPI z wykorzystaniem USART

UDRn – USARTn MSPIM I/O Data Register – Rejestr danych USARTn w trybie MSPIM

Funkcje i opis bitów rejestru danych USARTn (ang. USARTn Data Register, UDRn) w trybie MSPI są identyczne jak w normalnej pracy USARTn. Zobacz na opis tego rejestru w poprzednim rozdziale.


UCSRnA – USARTn MSPIM Control and Status Register A – Rejestr A sterowania i stanu USART0n w trybie MSPIM

Bit 7 6 5 4 3 2 1 0  
Adresy poniżej RXCn TXCn UDREn UCSR0A
Zapis/Odczyt Z/O Z/O Z/O O O O O O  
Wartość początkowa 0 0 0 0 0 1 1 0  

Adresy rejestru UCSRnA dla poszczególnych modułów USART

USART 0 UCSR0A 0xC0
USART 1 UCSR1A 0xC8
USART 2 UCSR2A 0xD0
USART 3 UCSR3A 0x130

Bit 7 – RXCn: USARTn Receive Complete – Zakończenie odbioru przez USARTn

Ten bit znacznikowy jest ustawiany, gdy w buforze odbiorczym znajdują się nieodczytane dane, a zerowany, gdy bufor odbiorczy jest pusty (tj. nie zawiera żadnych nieodczytanych danych). Jeśli odbiornik zostanie wyłączony, to bufor odbiorczy będzie opróżniony i w konsekwencji bit znacznika RXCn przyjmie stan zero. Znacznik RXCn może być wykorzystywany do generacji przerwania przy zakończeniu odbioru (ang. Receive Complete Interrupt) – zobacz na opis bitu RXCIEn.

Bit 6 – TXCn: USARTn Transmit Complete – Zakończenie nadawania przez USARTn

Ten bit znacznikowy jest ustawiany, gdy cała ramka w nadawczym rejestrze przesuwającym (ang. Transmit Shift Register) została wysunięta na zewnątrz i nie ma w danej chwili nowych danych w buforze nadawczym (UDRn). Bit znacznikowy TXCn jest zerowany automatycznie, gdy zostanie wykonane przerwanie przy zakończeniu przesyłu lub przez zapis logicznej jedynki na pozycji tego bitu. Znacznik TXCn0 może generować przerwanie przy zakończeniu przesyłu (ang. Transmit Complete Interrupt) – zobacz na opis bitu TXCIEn.

Bit 5 – UDREn: USARTn Data Register Empty – Pusty rejestr danych USARTn

Znacznik UDREn wskazuje, iż bufor nadawczy (UDRn) jest gotowy na przyjęcie nowych danych. Jeśli UDREn ma stan jeden, to bufor jest pusty, a zatem gotowy do zapisania. Znacznik UDREn może generować przerwanie przy pustym rejestrze danych (ang. Data Register Empty Interrupt) – zobacz na opis bitu UDRIEn. UDREn jest ustawiany po resecie w celu pokazania, iż nadajnik jest gotowy.

Bit 4:0 – Bity zarezerwowane w trybie MSPI

W czasie pracy modułu USARTn w trybie MSPI bity te są zarezerwowane do przyszłego użytku. Dla kompatybilności z przyszłymi mikrokontrolerami bity te należy zapisywać zerami przy zapisie do rejestru UCSRnA.


UCSRnB – USARTn MSPIM Control and Status Register B – Rejestr B sterowania i stanu USARTn w trybie MSPIM

Bit 7 6 5 4 3 2 1 0  
Adresy poniżej RXCIEn TXCIEn UDRIEn RXENn TXENn UCSRnB
Zapis/Odczyt Z/O Z/O Z/O Z/O Z/O O O O  
Wartość początkowa 0 0 0 0 0 1 1 0  

Adresy rejestru UCSRnB dla poszczególnych modułów USART

USART 0 UCSR0B 0xC1
USART 1 UCSR1B 0xC9
USART 2 UCSR2B 0xD1
USART 3 UCSR3B 0x131

Bit 7 – RXCIEn: RX Complete Interrupt Enable – Włączenie przerwań przy zakończeniu odbioru

Zapis jedynki w tym bicie włącza przerwanie od znacznika RXCn. Przerwanie przy zakończeniu odbioru przez USARTn (ang. USARTn Receive Complete Interrupt) będzie generowane tylko wtedy, gdy bit RXCIEn oraz bit globalnego włączania przerwań I w rejestrze stanu SREG będą ustawione na jeden i znacznik RXCn w UCSRnA przyjmie stan jeden.

Bit 6 – TXCIEn: TX Complete Interrupt Enable – Włączenie przerwań przy zakończeniu nadawania

Zapis jedynki w tym bicie włącza przerwanie od znacznika TXCn. Przerwanie przy zakończeniu nadawania przez USARTn (ang. USARTn Transmit Complete Interrupt) będzie generowane tylko wtedy, gdy bit TXCIEn oraz bit globalnego włączania przerwań I w rejestrze stanu SREG będą ustawione na jeden i znacznik TXCn w UCSRnA przyjmie stan jeden.

Bit 5 – UDRIEn: USARTn Data Register Empty Interrupt Enable – Włączenie przerwań przy pustym rejestrze danych USARTn

Zapis jedynki w tym bicie włącza przerwanie od znacznika UDREn. Przerwanie przy pustym rejestrze danych USARTn (ang. USARTn Data Register Empty Interrupt) będzie generowane tylko wtedy, gdy bit UDRIEn oraz bit globalnego włączania przerwań I w rejestrze stanu SREG będą ustawione na jeden i znacznik UDREn w UCSRnA przyjmie stan jeden.

Bit 4 – RXENn: Receiver Enable – Włączenie odbiornika

Zapisanie jedynki w tym bicie włącza odbiornik USARTn w trybie MSPIM. Po włączeniu odbiornik przejmie normalną pracę portu dla końcówki RxD. Wyłączenie odbiornika wyczyści bufor odbiorczy. Włączenie samego odbiornika w trybie MSPI (tj. ustawienie RXENn=1 and TXENn=0) nie ma żadnego znaczenia, ponieważ to nadajnik steruje zegarem transmisji i tylko tryb master jest obsługiwany.

Bit 3 – TXEN: Transmitter Enable – Włączenie nadajnika

Zapis jedynki do tego bitu włącza nadajnik USARTn. Po włączeniu nadajnik przejmie normalną pracę portu dla końcówki TxD. Wyłączenie nadajnika (wpisanie zera do TXENn) nie odniesie skutku, aż do zakończenia bieżących i oczekujących transmisji, tj. gdy nadawczy rejestr przesuwający (ang. Transmit Shift Register) i rejestr bufora nadawczego (ang. Transmit Buffer Register) nie będą zawierać danych do przesłania. Po wyłączeniu nadajnik nie będzie dalej przechwytywał końcówki TxDn.

Bit 2:0 – Bity zarezerwowane w trybie MSPIM

W trybie MSPI bity te zostały zarezerwowane do użytku w przyszłości. Dla kompatybilności z przyszłymi mikrokontrolerami bity te należy zapisywać zerami przy zapisie do rejestru UCSRnB.


UCSRnC – USARTn MSPIM Control and Status Register C – Rejestr B sterowania i stanu USARTn w trybie MSPIM

Bit 7 6 5 4 3 2 1 0  
Adresy poniżej UMSEn1 UMSELn0 UDORDn UCPHAn UCPOLn UCSRnC
Zapis/Odczyt Z/O Z/O O O O Z/O Z/O Z/O  
Wartość początkowa 0 0 0 0 0 1 1 0  

Adresy rejestru UCSRnC dla poszczególnych modułów USART

USART 0 UCSR0C 0xC2
USART 1 UCSR1C 0xCA
USART 2 UCSR2C 0xD2
USART 3 UCSR3C 0x132

Bity 7:6 – UMSEL0[1:0]: USARTn Mode Select – Wybór trybu USARTn

Te bity wybierają tryb pracy modułu USARTn wg poniższej tabelki. Zobacz do opisu rejestru UCSRnC w poprzednim rozdziale, gdzie podano pełne informacje o normalnej pracy modułu USARTn. Tryb MSPIM jest włączany, gdy oba bity UMSELn zostaną ustawione na jeden. Bity UDORDn, UCPHAn i UCPOLn można ustawić w tej samej operacji zapisu, gdy jest włączany tryb MSPIM.

UMSELn1 UMSELn2 Tryb
0 0 Asynchroniczny USARTn
0 1 Synchroniczny USARTn
0 0 Zarezerwowane
1 1 Master SPI (MSPIM)

Bity 5:3 – Bity zarezerwowane w trybie MSPIM

W trybie MSPI bity te zostały zarezerwowane do użytku w przyszłości. Dla kompatybilności z przyszłymi mikrokontrolerami bity te należy zapisywać zerami przy zapisie do rejestru UCSRnC.

Bit 2 – UDORDn: Data Order – Kolejność danych

Gdy jest ustawiony na 1, to bity są wysyłane w kolejności od najmniej znaczącego (LSB). Gdy jest ustawiony na 0, to bity są wysyłane w kolejności od najbardziej znaczącego (MSB). Więcej znajdziesz w podrozdziale "Formaty ramek".

Bit 1 – UCPHAn Clock Phase – Faza zegara

Ustawienie bitu UCPHAn określa, czy dane będą próbkowane przy pierwszym zboczu lub przy końcowym zboczu sygnału XCKn. Zobacz do podrozdziału "Tryby danych SPI i ich przebiegi czasowe".

Bit 0 – UCPOLn: Clock Polarity – Polaryzacja zegara

Bit UCPOLn  ustawia polaryzację zegara XCKn. Kombinacja ustawień bitów UCPOLn i UCPHAn określa przebieg transmisji danych. Zobacz do podrozdziału "Tryby danych SPI i ich przebiegi czasowe".


UBRRL i UBRRH – USARTn MSPIM Baud Rate Registers – Rejestry szybkości transmisji USARTn w trybie MSPIM

Funkcje i opis bitów w rejestrach szybkości transmisji dla trybu MSPI są identyczne jak w normalnej pracy modułu USARTn. Zobacz do opisu tych rejestrów w poprzednim rozdziale.

Na początek:  podrozdziału   strony 

Zespół Przedmiotowy
Chemii-Fizyki-Informatyki

w I Liceum Ogólnokształcącym
im. Kazimierza Brodzińskiego
w Tarnowie
ul. Piłsudskiego 4
©2023 mgr Jerzy Wałaszek

Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone
pod warunkiem podania źródła oraz niepobierania za to pieniędzy.

Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl

Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.

Informacje dodatkowe.