|
Wyjście Spis treści Wstecz Dalej
Autor artykułu |
©2026 mgr Jerzy Wałaszek
|

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:
https://www.microchip.com/about-us/legal-information/copyright-usage-guidelines
JTAG (ang. Joint Test Action Group) to nazwa standardu IEEE 1149.1 definiującego protokół używany do testowania połączeń na płytkach drukowanych, stosowany także do uruchamiania i programowania (strona nie istnieje)" href="https://pl.wikipedia.org/w/index.php?title=Uk%C5%82ad_programowalny&action=edit&redlink=1"> układów programowalnych i systemów mikroprocesorowych. Aby można było wykorzystywać JTAG do wymienionych celów, układy scalone umieszczone w testowanym systemie muszą posiadać wewnątrz odpowiednią warstwę sprzętową tego (urządzenie)" href="https://pl.wikipedia.org/wiki/Interfejs_(urządzenie)"> interfejsu. Jednym z najważniejszych założeń standardu JTAG jest możliwość programowania układu w gotowym urządzeniu, bez konieczności odłączania (ang. In-System Programming, w skrócie ISP).
Zaimplementowany w ATmega128 standard JTAG posiada następujące cechy:
W kolejnych podrozdziałach podano krótki opis. Szczegółowy opis programowania za pomocą JTAG i używania łańcucha skanowania ścieżki krawędziowej znajduje się w rozdziałach "Programowanie poprzez interfejs JTAG".
Poniższy rysunek pokazuje schemat blokowy interfejsu JTAG oraz wbudowanego systemu debugowania.

Kontroler TAP jest pewną maszyną stanów sterowaną sygnałami TCK i TMS. Kontroler TAP wybiera albo rejestr instrukcji JTAG, albo jeden z kilku rejestrów danych jako łańcuch skanowania (rejestr przesuwający) pomiędzy wejściem TDI a wyjściem TDO. Rejestr instrukcji przechowuje instrukcje JTAG kontrolujące zachowanie się rejestru danych.
Rejestr ID, rejestr Bypass i Łańcuch Skanowania Ścieżki Krawędziowej (ang. Boundary-scan Chain) są rejestrami danych używanymi do testowania na poziomie płytki z mikrokontrolerem. Interfejs programowania JTAG (faktycznie składający się z kilku fizycznych i wirtualnych rejestrów danych) używany jest do szeregowego programowania JTAG poprzez interfejs JTAG. Wewnętrzny łańcuch skanowania i łańcuch skanowania punktów wstrzymania używane są jedynie do wewnątrzukładowego debugowania.

W terminologii JTAG końcówki te tworzą port dostępu dla testu (ang. Test Access Port, TAP). Są to:
Standard IEEE 1149.1 określa również opcjonalny sygnał TAP: TRST – Test ReSeT – Reset testu – który nie jest tu dostępny.
Gdy bit bezpiecznikowy JTAGEN nie jest zaprogramowany, to te cztery końcówki TAP są normalnymi końcówkami portu, a kontroler TAP znajduje się w stanie resetu. Gdy bit ten zostanie zaprogramowany i bit JTD w rejestrze MCUCSR jest wyzerowany, to linie sygnałowe TAP zostają podciągnięte wewnętrznie do stanu wysokiego, a JTAG włącza się do skanowania ścieżki krawędziowej i programowania. W tym przypadku końcówka wyjściowa TAP (TDO) staje się wiszącą bez podłączenia w stanach, w których kontroler TAP nie przesuwa danych i z tego powodu musi być podłączona do opornika podciągającego lub innego urządzenia wyposażonego w oporniki podciągające (na przykład wejścia TDI następnego mikrokontrolera w łańcuchu skanowania). Mikrokontroler sprzedawany jest z zaprogramowanym bitem bezpiecznikowym JTAGEN.
Dla wbudowanego systemu debugowania, dodatkowo do końcówek interfejsu JTAG, końcówka RESET jest monitorowana przez debuger w celu możliwości wykrywania zewnętrznych źródeł resetu. Debuger może również wymusić stan niski na końcówce RESET, aby zresetować cały system, zakładając użycie w aplikacji tylko otwartych kolektorów na linii resetowania.
Diagram stanów
kontrolera TAP

Kontroler TAP jest 16-stanowym automatem skończonym, który steruje działaniem obwodu skanowania ścieżki krawędziowej, obwodu programowania JTAG lub wbudowanym systemem debugowania. Przejścia stanów zilustrowane na powyższym rysunku zależą od sygnału obecnego na końcówce TMS (pokazanego obok każdego przejścia stanu) w czasie narastającego zbocza na końcówce TCK. Stanem początkowym po resecie przy włączeniu zasilania (ang. Power-On Reset) jest stan Test-Logic-Reset.
Z definicji w tym dokumencie bit najmniej znaczący LSB jest wsuwany i wysuwany jako pierwszy bit dla wszystkich rejestrów przesuwających. Zakładając, iż bieżącym stanem jest Run-Test/Idle, typowy scenariusz wykorzystania interfejsu JTAG jest następujący:
Jak pokazano na diagramie stanów nie musi występować wejście w stan Run-Test/Idle pomiędzy wybieraniem rejestrów instrukcji JTAG i danych, a niektóre instrukcje JTAG mogą wybierać pewne funkcje do wykonania w stanie Run-Test/Idle, co czyni go nieodpowiednim dla stanu bezczynności (ang. Idle state).
Uwaga: Niezależnie od początkowego stanu kontrolera TAP, zawsze można wejść w stan Test-Logic-Reset przez utrzymanie TMS w stanie wysokim przez pięć taktów zegara TCK.
Szczegółową informację na temat specyfikacji JTAG znajdziesz w literaturze wymienionej w podrozdziale "Biografia".

Jak pokazano na powyższym rysunku wsparcie sprzętowe dla wewnątrzukładowego debugowania składa się głównie z:
Wszystkie operacje odczytu lub modyfikacji/zapisu potrzebne do zaimplementowania debugera są wykonywane przez stosowanie instrukcji AVR poprzez wewnętrzny łańcuch skanowania mikroprocesora AVR. Mikroprocesor przesyła wynik do komórki odwzorowanej w pamięci we/wy, która jest częścią interfejsu komunikacyjnego pomiędzy mikroprocesorem a systemem JTAG.
Moduł punktów wstrzymania (ang. Break Point Unit) implementuje wstrzymanie przy zmianie przepływu programu (ang. Break on Change of Program Flow), wstrzymywanie krokowe (ang. Single Step Break), 2 punkty wstrzymania w pamięci programu (ang. 2 Program Memory Break Points) i 2 połączone punkty wstrzymania. Łącznie można skonfigurować 4 punkty wstrzymania jako:
Debuger, podobnie jak AVR Studio, może jednakże użyć jednego lub więcej z tych zasobów dla swoich wewnętrznych celów, pozostawiając mniej możliwości użytkownikowi końcowemu. Listę specyficznych instrukcji JTAG debugowania wewnętrznego znajdziesz w następnym podrozdziale.
Bit bezpiecznikowy JTAGEN musi zostać zaprogramowany, aby uaktywnić Port JTAG dostępu testowego. Dodatkowo musi być zaprogramowany bit bezpiecznikowy OCDEN i nie może być ustawiony żaden z bitów blokujących, aby wbudowany system debugowania działał. Ze względów bezpieczeństwa system ten jest nieaktywny po ustawieniu dowolnego bitu blokującego. W przeciwnym razie wbudowany system debugowania udostępniałby tylne wejście do zabezpieczonego mikrokontrolera.
AVR JTAG ICE firmy Atmel jest zaawansowanym narzędziem do testowania i uruchamiania wszystkich 8-bitowych mikrokontrolerów RISC AVR posiadających interfej JTAG zgodny ze standardem IEEE 1149.1. JTAG ICE i interfejs AVR Studio dają użytkownikowi zupełną kontrolę nad wewnętrznymi zasobami mikrokontrolera, pomagając zredukować czas projektowania dzięki uproszczeniu debugowania. JTAG ICE wykonuje emulację w czasie rzeczywistym mikrokontrolera, podczas jego pracy w systemie docelowym.
Pełny opis AVR JTEG ICE znajdziesz w Internecie. Stamtąd również możesz pobrać darmowe AVR Studio (obecnie firma Atmel została przejęta przez Microchip i wszelkie narzędzia znajdują się w witrynie tej firmy).
Wszystkie niezbędne rozkazy wykonawcze są dostępne w AVR Studio, zarówno na poziomie źródłowym jak i na poziomie kodu maszynowego. Użytkownik może wykonywać program krokowo albo wchodząc do funkcji, albo przechodząc ponad nimi, wychodząc z funkcji, umieszczając kursor na rozkazie i wykonując program, aż rozkaz ten zostanie osiągnięty, zatrzymywać wykonanie oraz resetować wykonywanie programu na docelowym mikrokontrolerze. Dodatkowo użytkownik może mieć nieograniczoną liczbę programowych punktów wstrzymania (przez użycie instrukcji BREAK) oraz do dwóch punktów wstrzymania w pamięci danych, alternatywnie połączonych w zakresowy punk wstrzymania.
PRIVATE0; 0x8 Prywatna instrukcja JTAG dająca
dostęp do wewnętrznego systemu debugowania.
PRIVATE1; 0x9 Prywatna instrukcja JTAG dająca dostęp do
wewnętrznego systemu debugowania.
PRIVATE2; 0xA Prywatna instrukcja JTAG dająca dostęp do
wewnętrznego systemu debugowania.
PRIVATE3; 0xB Prywatna instrukcja JTAG dająca dostęp do
wewnętrznego systemu debugowania.

Programowanie mikrokontrolera AVR poprzez JTAG wykonywane jest przy pomocy 4-końcówkowego portu JTAG: TCK, TMS, TDI i TDO. Są to jedyne końcówki, które muszą być sterowane przy wykonywaniu programowania JTAG (dodatkowo do końcówek zasilania). Nie ma potrzeby zastosowania zewnętrznie napięcia 12V. Aby uaktywnić port dostępu testowego JTAG (ang. JTAG Test Access Port), bit bezpiecznikowy JTAGEN musi być zaprogramowany oraz należy wyzerować bit JTD w rejestrze MCUCSR.
Programowanie poprzez interfejs JTAG obsługuje:
Zabezpieczenia bitami blokującymi są dokładnie takie same jak w trybie programowania równoległego. Jeśli zostały zaprogramowane bity blokujące LB1 i LB2, to bitu bezpiecznikowego OCDEN nie można zaprogramować bez wcześniejszego wyczyszczenia mikrokontrolera (ang. Chip Erase). Jest to zabezpieczenie uniemożliwiające włamanie się tylnymi drzwiami do zabezpieczonego mikrokontrolera i odczytanie jego zawartości.
Szczegóły na temat programowania przez interfejs JTAG oraz instrukcji JTAG specyficznych dla programowania znajdziesz w podrozdziale "Programowanie poprzez interfejs JTAG".
| Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
| 0x22 (0x42) | MSB/IDRD | LSB | OCDR | ||||||
| Zapis/Odczyt | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | Z/O | |
| Wartość początkowa | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Rejestr OCDR udostępnia kanał komunikacyjny od pracującego programu w mikrokontrolerze do debugera. Mikroprocesor może przesłać jakiś bajt do debugera przez zapis pod ten adres. W tym samym czasie znacznik wewnętrzny zapisu do rejestru we/wy debugowania (ang. I/O Debug Register Dirty, IDRD) zostaje ustawiony, aby poinformować debuger, iż rejestr ten został zapisany. Gdy mikroprocesor odczytuje rejestr OCDR, to 7 młodszych bitów będą pochodziły z rejestru OCDR, podczas gdy najstarszy bit MSB będzie bitem IDRD. Debuger zeruje bit IDRD, gdy odczyta informację z rejestru.
W niektórych mikrokontrolerach AVR rejestr OCDR jest współdzielony ze standardowym rejestrem we/wy. W takim przypadku dostęp do rejestru OCDR staje się możliwy dopiero po zaprogramowaniu bitu bezpiecznikowego OCDEN, a dostęp ten uaktywnia debuger. We wszystkich pozostałych przypadkach dostęp następuje do standardowego rejestru we/wy. Sposób wykorzystywania rejestru OCDR znajdziesz w dokumentacji swojego debugera.
Do testowania płytek drukowanych można używać czterech obowiązkowo zdefiniowanych instrukcji JTAG standardu IEEE 1149.1: IDCODE, BYPASS, SAMPLE/PRELOAD i EXTEST, jak również specyficznej, publicznej instrukcji AVR JTAG: AVR_RESET. Początkowe skanowanie ścieżki rejestru danych pokaże kod identyfikacyjny (ID-code) mikrokontrolera, ponieważ IDCODE jest standardową instrukcją JTAG. Może być pożądane utrzymywanie mikrokontrolera AVR w stanie resetu podczas trybu Testu. Jeśli nie ma resetu, to stany wejść mikrokontrolera mogą być określone za pomocą operacji skanowania, a wewnętrzne oprogramowanie może znaleźć się w stanie nieokreślonym przy wyjściu z trybu testu. Wchodząc w reset, wyjścia każdej końcówki portu natychmiast przejdą w stan wysokiej impedancji, co czyni zbędą instrukcję HIGHZ. Jeśli zajdzie potrzeba, można wysłać instrukcję BYPASS, aby wykonać najkrótszy możliwy łańcuch skanowania poprzez mikrokontroler. Mikrokontroler można ustawić w stan resetu albo przez wymuszenie stanu niskiego na zewnętrznej końcówce RESET, albo przez wysłanie instrukcji AVR_RESET z odpowiednim ustawieniem rejestru danych resetu (ang. Reset Data Register).
Instrukcja EXTEST jest używana do próbkowania zewnętrznych końcówek i ładowania końcówek wyjścia danymi. Dane wyjściowe latch (przerzutniki zatrzaskowe) zostaną wstawione na końcówki, gdy tylko instrukcja EXTEST zostanie załadowana do rejestru JTAG IR. Z tego powodu należy również użyć SAMPLE/PRELOAD do ustawienia początkowych wartości w pierścieniu skanowania, aby zapobiec uszkodzenia płyty z mikroprocesorem przy pierwszym wydawaniu instrukcji EXTEST. SAMPLE/PRELOAD można również używać do szybkich ujęć stanu końcówek podczas normalnej pracy układu.
Bit bezpiecznikowy JTAGEN musi być zaprogramowany oraz bit JTD w rejestrze we/wy MCUCSR musi być wyzerowany, aby uaktywnić port dostępu testowego JTAG.
Gdy używany jest interfejs JTAG do skanowania ścieżki krawędziowej, możliwe jest stosowanie wyższej częstotliwości zegara JTAG TCK od wewnętrznej częstotliwości układu. Zegar układu nie musi pracować.
Rejestr pomijania składa się z pojedynczego stopnia rejestru przesuwającego. Gdy rejestr pomijania zostanie wybrany jako ścieżka pomiędzy TDI i TDO, to jest on resetowany na 0 przy opuszczaniu stanu kontrolnego Capture-DR. Rejestru pomijania można używać do skracania łańcucha skanowania w systemie, gdy inne mikrokontrolery mają być testowane.
Poniższy rysunek przedstawia strukturę rejestru identyfikacyjnego:

Wersja jest 4-bitowym numerem określającym odmianę modelu mikrokontrolera. Numery wersji: 0x0 dla wersji A, 0x1 dla B itd.
Jest to 16-bitowy kod identyfikujący model mikrokontrolera. Dla ATmega64 numer elementu JTAG wynosi 0x9702 (szesnastkowo).
Jest to 11-bitowy kod identyfikujący wytwórcę danego elementu. Dla firmy ATMEL kod ten jest równy 0x01F (szesnastkowo).
Jest to rejestr danych testu (ang. Test Data Register) używany do resetowania mikrokontrolera. Ponieważ w czasie resetu mikroprocesor AVR wprowadza końcówki portów w stan wysokiej impedancji, to rejestr resetowania może również zastąpić działanie opcjonalnej, niezaimplementowanej instrukcji JTAG HIGHZ.
Wysoka wartość w rejestrze resetowania odpowiada wymuszeniu stanu niskiego na zewnętrznej końcówce RESET. Mikrokontroler jest resetowany tak długo, jak wysoka wartość jest obecna w rejestrze resetowania. Zależnie od ustawień bitów bezpiecznikowych mikroprocesor pozostanie w stanie resetu przez okres upływu czasu resetowania (ang. Reset Time-Out Period) (zobacz do podrozdziału "Źródła zegarowe") po zwolnieniu rejestru resetowania. Wyjście z tego rejestru danych nie jest zatrzaskiwane, zatem reset będzie miał miejsce natychmiast, jak pokazano na poniższym rysunku:

Łańcuch skanowania ścieżki krawędziowej posiada możliwość sterowania poziomami logicznymi i obserwowania ich na cyfrowych końcówkach we/wy jak również na granicy pomiędzy logiką cyfrową i analogową dla obwodów analogowych, które posiadają pozaukładowe połączenia.
Pełny opis znajdziesz w podrozdziale "Łańcuch skanowania ścieżki krawędziowej".
Z definicji w tym rozdziale, najmłodszy bit LSB (ang. Least Significant Bit) jest pierwszym wsuwanym i pierwszym wysuwanym dla wszystkich rejestrów przesuwających.
Kod operacyjny każdej instrukcji jest pokazany za jej nazwą w formacie szesnastkowym. Tekst opisuje, który rejestr danych zostaje wybrany jako ścieżka pomiędzy TDI i TDO dla każdej instrukcji.
Obowiązkowa instrukcja JTAG do wyboru łańcucha skanowania ścieżki krawędziowej jako rejestru danych do testowania obwodów zewnętrznych dla obudowy mikrokontrolera AVR. W łańcuchu skanowania dostępne jest dla końcówek portów wyłączanie oporników podciągających, sterowanie wyjściem, dane wyjściowe i wejściowe. Dla obwodów analogowych posiadających połączenia pozaukładowe interfejs pomiędzy logiką analogową a cyfrową znajduje się w łańcuchu skanowania. Zawartości zatrzaśniętych wyjść są wyprowadzane na zewnątrz, gdy tylko rejestr instrukcji JTAG (ang. JTAG IRregister) zostanie załadowany instrukcją EXTEST.
Aktywne stany:
Opcjonalna instrukcja JTAG wybierająca 32-bitowy rejestr identyfikacji jako rejestr danych. Rejestr identyfikacji składa się z numeru wersji, numeru mikrokontrolera oraz kodu producenta wybranego przez JEDEC. Jest to standardowa instrukcja po włączeniu zasilania.
Aktywne stany:
Obowiązkowa instrukcja JTAG do wstępnego załadowania zatrzasków wyjściowych oraz zrobienia ujęcia stanu końcówek we/wy bez wpływania na pracę systemu. Jednakże zatrzaski wyjściowe nie są połączone z końcówkami. Jako rejestr danych zostaje wybrany łańcuch skanowania ścieżki krawędziowej.
Aktywne stany:
Publiczna instrukcja JTAG specyficzna dla AVR wymuszająca stan resetu w mikrokontrolerze AVR lub zwalniająca źródło resetu JTAG. Kontroler TAP nie jest resetowany przez tą instrukcję. Jednobitowy rejestr resetu zostaje wybrany jako rejestr danych. Zwróć uwagę, iż reset ten będzie aktywny tak długo, jak w łańcuchu resetu znajduje się logiczna jedynka. Wyjście z tego łańcucha nie jest przepuszczane przez przerzutnik zatrzaskowy latch.
Aktywne stany:
Obowiązkowa instrukcja JTAG wybierająca rejestr pomijania (ang. Bypass Register) na rejestr danych.
Aktywne stany:
Komórka skanowania ścieżki krawędziowej dla dwukierunkowej końcówki portu z opornikiem podciągającym

Powyższy rysunek pokazuje komórkę skanowania ścieżki krawędziowej dla dwukierunkowej końcówki portu z funkcją podciągania. Komórka składa się ze standardowej komórki skanowania ścieżki krawędziowej dla funkcji włączania podciągania (ang. Pull-up Enable, PUExn) oraz z komórki dwukierunkowej końcówki, która łączy trzy sygnały: Output Control – OCxn (sterowanie wyjściem), Output Data – ODxn (dane wyjściowe) i Input Data – IDxn (dane wejściowe) w dwustopniowy rejestr przesuwający. Indeksy portu i końcówki nie są używane w dalszym opisie.
Logika skanowania ścieżki krawędziowej nie jest pokazana na rysunkach w tym rozdziale. Poniższy rysunek przedstawia prostą końcówkę portu cyfrowego, jak opisano w rozdziale "Porty we/wy".
Schemat ogólnej końcówki portu z
wydzieleniem obszaru skanowania ścieżki krawędziowej

| PUD | Wyłączanie podciągania | WDx | Zapis DDRx | |
| PUExn | Włączanie podciągania dla końcówki Pxn | RDx | Odczyt DDRx | |
| OCxn | Sterowanie wyjściem końcówki Pxn | WPx | Zapis PORTx | |
| ODxn | Dane wyjściowe do końcówki Pxn | RRx | Odczyt rejestru PORTx | |
| IDxn | Dane wejściowe z końcówki Pxn | RPx | Odczyt końcówki PORTx | |
| SLEEP | Sterowanie uśpieniem | CLKI/O | Zegar we/wy |
Obwód skanowania ścieżki krawędziowej z poprzedniego rysunku zastępuje zielony obszar ograniczony kreskowaną linią. Jeśli nie jest obecna żadna alternatywna funkcja portu, to dane wejściowe ID odpowiadają wartości rejestru PINxn (lecz ID nie ma synchronizatora), dane wyjściowe OD odpowiadają rejestrowi PORT, sterowanie wyjściem OC odpowiada rejestrowi kierunku danych DD, a włączanie podciągania POExn odpowiada wyrażeniu logicznemu PUD · DDxn · PORTxn.
Cyfrowe funkcje alternatywne są podłączone poza obszarem zielonym, aby umożliwiać łańcuchowi skanowania odczyt aktualnej wartości końcówki. Przy funkcji analogowej występuje bezpośrednie połączenie od końcówki zewnętrznej do obwodu analogowego, a łańcuch skanowania jest wstawiony w interfejs pomiędzy logiką cyfrową a modułem analogowym.
Końcówki SCL i SDA należące do 2-przewodowego interfejsu posiadają jeden dodatkowy sygnał sterujący w łańcuchu skanowania: włączanie interfejsu 2-przewodowego (ang. Two-wire Interface Enable, TWIEN).
Dodatkowy sygnał dla 2-przewodowego
interfejsu

Jak pokazano na powyższym rysunku sygnał TWIEN włącza trójstanowy bufor z kontrolą szybkości narastania sygnału równolegle ze zwykłą cyfrową końcówką portu. Do sygnału TWIEN dołączona zostaje ogólna komórka skanowania (pokazana dalej).
| Uwagi: | 1. | Nie ma oddzielnej komórki skanowania dla filtru szpilkowego 50 ns na wejściu. Zwykłe wsparcie skanowania dla cyfrowych końcówek portu wystarcza do testów połączeń. Jedynym powodem posiadania TWIEN na ścieżce skanowania jest umożliwienie odłączenia bufora sterowania ograniczeniem szybkości przy wykonywaniu skanowania ścieżki krawędziowej. |
| 2. | Upewnij się, że sygnały OC i TWIEN nie pojawiają się jednocześnie, ponieważ doprowadzi to do sprzeczności sterowania portu. |
Końcówka RESET akceptuje 5V przy aktywności w stanie niskim oraz 12V przy aktywności w stanie wysokim dla równoległego programowania wysokonapięciowego (ang. High Voltage Parallel Programming). Komórka obserwująca, pokazana na rysunku poniżej, jest wstawiona zarówno dla 5V sygnału resetu RSTT jak i dla 12V sygnału resetu RSTHV.
Komórka tylko obserwująca

Mikrokontrolery AVR posiadają wiele opcji zegarowych wybieranych przez bity bezpiecznikowe. Są to: wewnętrzny oscylator RC, zewnętrzny oscylator RC, zewnętrzny zegar, oscylator kwarcowy (wysokiej częstotliwości), oscylator kwarcowy niskiej częstotliwości i rezonator ceramiczny.
Poniższy rysunek pokazuje, jak każdy oscylator z zewnętrznym połączeniem jest wspierany w łańcuchu skanowania.
Komórki skanowania ścieżki krawędziowej dla
oscylatorów i opcji zegarowych

Sygnał włączania (ang. Enable) jest wspierany przez ogólną komórkę skanowania ścieżki krawędziowej, natomiast wyjście oscylatora/zegara (ang. Output) jest podłączone do komórki tylko obserwującej. Oprócz głównego zegara, timer oscylatora jest skanowany w ten sam sposób. Wyjście wewnętrznego oscylatora RC nie jest skanowane, ponieważ ten oscylator nie ma zewnętrznych połączeń.
Poniższa tabelka podsumowuje rejestry skanowania dla zewnętrznej końcówki zegarowej XTAL1, oscylatorów z połączeniami XTAL1/XTAL2 jak również timera oscylatora 32 kHz.
| Sygnał włączania | Skanowana linia zegarowa | Opcja zegarowa | Skanowana linia zegarowa, gdy nie jest używana |
| EXTCLKEN | EXTCLK (XTAL1) | Zegar zewnętrzny | 0 |
| OSCON | OSCCK | Zewnętrzny kwarc Zewnętrzny rezonator ceramiczny |
0 |
| RCOSCEN | RCCK | Zewnętrzny oscylator RC | 1 |
| OSC32EN | OSC32CK | Zewnętrzny kwarc niskiej częstotliwości | 0 |
| TOSKON | TOSCK | Timer oscylatora 32 kHz | 0 |
| Uwagi: | 1. | Nie włączaj na główny zegar więcej niż jednego źródła zegarowego naraz. |
| 2. | Skanowanie wyjścia oscylatora daje nieprzewidywalne wyniki, ponieważ występuje dryft częstotliwości pomiędzy oscylatorem wewnętrznym, a zegarem JTAG TCK. Jeśli jest możliwe, należy raczej skanować zegar zewnętrzny. | |
| 3. | Konfiguracja zegarowa jest programowana za pomocą bitów bezpiecznikowych. Ponieważ bit bezpiecznikowy nie jest zmieniany w trakcie pracy programu, konfigurację zegarową uważa się za ustaloną dla danej aplikacji. Radzi się użytkownikowi skanować tę samą opcję zegarową, jaka będzie używana w ostatecznym systemie. Sygnały włączające są wspierane w łańcuchu skanowania, ponieważ układy logiczne systemu mogą wyłączać opcje zegarowe w trybach uśpienia, odłączając w ten sposób końcówki oscylatora od ścieżki skanowania. Bit bezpiecznikowy INTCAP nie jest wspierany w łańcuchu skanowania, zatem łańcuch skanowania ścieżki krawędziowej nie może uruchamiać oscylatora XTAL wymagającego wewnętrznych kondensatorów, o ile ten bit bezpiecznikowy nie zostanie poprawnie zaprogramowany. |
Istotne sygnały komparatora dotyczące skanowania ścieżki krawędziowej pokazuje poniższy rysunek.

Do każdego z tych sygnałów dołączona jest przedstawiona poniżej komórka skanowania ścieżki krawędziowej.

Sygnały te opisuje poniższa tabelka. Nie ma potrzeby wykorzystywania komparatora do czystych testów połączeń, ponieważ wszystkie jego wejścia analogowe są również współdzielone z końcówkami portu cyfrowego.
| Nazwa sygnału | Kierunek widziany z komparatora | Opis | Zalecane wejście, gdy nieużywane | Wartości wyjściowe, gdy zalecane wejścia są używane |
| AC_IDLE | Wejście | Wyłącza komparator, gdy w stanie 1 | 1 | Zależy od wykonywanego kodu mikroprocesora |
| ACO | Wyjście | Wyjście komparatora analogowego | Stanie się wejściem dla wykonywanego kodu | 0 |
| ACME | Wejście | W stanie 1 używa sygnału wyjścia z multipleksera przetwornika analogowo/cyfrowego | 0 | Zależy od wykonywanego kodu mikroprocesora |
| ACBG | Wejście | Włączanie napięcia odniesienia | 0 | Zależy od wykonywanego kodu mikroprocesora |
Poniżej przedstawiono schemat blokowy przetwornika A/C ze wszystkimi istotnymi sygnałami kontrolnymi i śledzącymi.

Do każdego z tych sygnałów dołączona jest poniższa komórka skanowania ścieżki krawędziowej.

Przetwornik A/C nie musi być używany do czystego testowania połączeń, ponieważ wszystkie wejścia analogowe są również dzielone z końcówkami portu cyfrowego.
Sygnały skanowania ścieżki krawędziowej dla przetwornika A/C
| Nazwa sygnału | Kierunek od strony przetwornika | Opis | Zalecane dane wejściowe, jeśli nieużywane | Wartości wyjściowe, gdy są używane zalecane wejścia, a mikroprocesor nie używa przetwornika |
| COMP | Wyjście | Wyjście komparatora | 0 | 0 |
| ACLK | Wejście | Sygnał zegara do stopni wzmocnienia zaimplementowane jako filtry z przełączanymi pojemnościami | 0 | 0 |
| ACTEN | Wejście | Włączanie ścieżki od stopni wzmacniających do komparatora | 0 | 0 |
| ADCBGEN | Wejście | Włączenie napięcia odniesienia jako wejścia odwracającego dla komparatora | 0 | 0 |
| ADCEN | Wejście | Sygnał włączania przetwornika A/C | 0 | 0 |
| AMPEN | Wejście | Sygnał włączania stopni wzmacniających | 0 | 0 |
| DAC_9 | Wejście | Bit 9 wartości cyfrowej do przetwornika cyfrowo/analogowego | 1 | 1 |
| DAC_8 | Wejście | Bit 8 wartości cyfrowej do przetwornika cyfrowo/analogowego | 0 | 0 |
| DAC_7 | Wejście | Bit 7 wartości cyfrowej do przetwornika cyfrowo/analogowego | 0 | 0 |
| DAC_6 | Wejście | Bit 6 wartości cyfrowej do przetwornika cyfrowo/analogowego | 0 | 0 |
| DAC_5 | Wejście | Bit 5 wartości cyfrowej do przetwornika cyfrowo/analogowego | 0 | 0 |
| DAC_4 | Wejście | Bit 4 wartości cyfrowej do przetwornika cyfrowo/analogowego | 0 | 0 |
| DAC_3 | Wejście | Bit 3 wartości cyfrowej do przetwornika cyfrowo/analogowego | 0 | 0 |
| DAC_2 | Wejście | Bit 2 wartości cyfrowej do przetwornika cyfrowo/analogowego | 0 | 0 |
| DAC_1 | Wejście | Bit 1 wartości cyfrowej do przetwornika cyfrowo/analogowego | 0 | 0 |
| DAC_0 | Wejście | Bit 0 wartości cyfrowej do przetwornika cyfrowo/analogowego | 0 | 0 |
| EXTCH | Wejście | Połączenie kanałów 0 - 3 przetwornika cyfrowo/analogowego do ścieżki omijającej stopnie wzmacniające | 1 | 1 |
| G10 | Wejście | Włączenie wejścia ze wzmocnieniem 10x | 0 | 0 |
| G20 | Wejście | Włączenie wejścia ze wzmocnieniem 20x | 0 | 0 |
| GNDEN | Wejście | Gdy ma stan true, zwiera do masy wejście odwracające komparatora | 0 | 0 |
| HOLD | Wejście | Sygnał próbkowania z podtrzymaniem. Przy stanie niskim próbkuje sygnał analogowy. Podtrzymuje sygnał przy stanie wysokim. Gdy są używane stopnie wzmacniające, sygnał ten musi stać się aktywny, gdy ACLK ma stan wysoki | 1 | 1 |
| IREFEN | Wejście | Włącza napięcie odniesienia jako sygnał AREF do przetwornika cyfrowo/analogowego | 0 | 0 |
| MUXEN_7 | Wejście | Bit 7 multipleksera wejść | 0 | 0 |
| MUXEN_6 | Wejście | Bit 6 multipleksera wejść | 0 | 0 |
| MUXEN_5 | Wejście | Bit 5 multipleksera wejść | 0 | 0 |
| MUXEN_4 | Wejście | Bit 4 multipleksera wejść | 0 | 0 |
| MUXEN_3 | Wejście | Bit 3 multipleksera wejść | 0 | 0 |
| MUXEN_2 | Wejście | Bit 2 multipleksera wejść | 0 | 0 |
| MUXEN_1 | Wejście | Bit 1 multipleksera wejść | 0 | 0 |
| MUXEN_0 | Wejście | Bit 0 multipleksera wejść | 0 | 0 |
| NEGSEL_2 | Wejście | Bit 2 multipleksera wejść dla wejścia odwracającego sygnału różnicowego | 0 | 0 |
| NEGSEL_1 | Wejście | Bit 1 multipleksera wejść dla wejścia odwracającego sygnału różnicowego | 0 | 0 |
| NEGSEL_0 | Wejście | Bit 0 multipleksera wejść dla wejścia odwracającego sygnału różnicowego | 0 | 0 |
| PASSEN | Wejście | Włączenie bramki przepuszczającej stopni wzmacniających | 1 | 1 |
| PRECH | Wejście | Wstępne załadowanie zatrzasku wyjściowego komparatora (aktywne w stanie niskim) | 1 | 1 |
| SCTEST | Wejście | Włączenie TESTU przełączanego kondensatora. Wyjście ze stopnia wzmacniającego 10x wysyłane na końcówkę portu z ADC_4 | 0 | 0 |
| ST | Wejście | Wyjście ze stopni wzmacniających ustali się szybciej, jeśli ten sygnał będzie w stanie wysokim przez pierwsze dwa okresy ACLK po przejściu AMPEN w stan wysoki | 0 | 0 |
| VCCREN | Wejście | Wybiera Vcc jako napięcie odniesienia ACC | 0 | 0 |
| Uwaga: | 1. | Nieprawidłowe ustawienie przełączników pokazanych na schemacie przetwornika spowoduje sprzeczność sygnałów i może uszkodzić mikrokontroler. Istnieje kilka wyborów wejść do obwodu próbkowania i podtrzymania na wejściu odwracającym wyjściowego komparatora. Upewnij się, że jest wybrana tylko jedna ścieżka albo z końcówki ADC, albo ze źródła napięcia odniesienia, albo do masy. |
Jeśli przetwornik A/C nie ma być używany podczas skanu, to należy użyć wartości wejściowe z tabelki powyżej. Nie zaleca się użytkownikom używania stopni wzmocnienia różnicowego w czasie skanowania. Stopnie wzmacniania oparte na przełączanej pojemności wymagają szybkiej pracy i dokładnego taktowania, co trudno uzyskać w łańcuchu skanowania. Dlatego nie dostarczono szczegółów dotyczących działań różnicowego stopnia wzmacniającego.
Przetwornik A/C AVR oparty jest na pokazanym na schemacie obwodzie analogowym pracującym wg algorytmu kolejnych przybliżeń zaimplementowanego w logice cyfrowej. Gdy jest on używany w skanowaniu ścieżki krawędziowej, to problemem jest zwykle zapewnienie, iż przyłożone napięcie analogowe będzie mierzone w pewnych granicach. Można to łatwo wykonać bez uruchamiania algorytmu kolejnych przybliżeń: użyj dolnej granicy na cyfrowych liniach DAC[9:0], upewnij się, iż na wyjściu komparatora jest stan niski, następnie zastosuj górna granicę na cyfrowych liniach DAC[9:0] i zweryfikuj, iż wyjście z komparatora jest w stanie wysokim.
Przetwornik analogowo/cyfrowy nie musi być używany do testowania połączeń, ponieważ wszystkie wejścia analogowe są dzielone również z końcówkami portu cyfrowego.
Gdy używasz przetwornika A/C, pamiętaj o następujących rzeczach:
Jako przykład rozważ zadanie weryfikowania sygnału wejściowego 1,5V ±5% w kanale 3 przetwornika A/C, gdy napięcie zasilania ma wartość 5,0V i AREF jest zewnętrznie połączone z VCC.
Dolna granica:

Górna granica:

Używane są zalecane wartości z wcześniejszej tabelki, o ile inne wartości nie zostaną podane w algorytmie z tabelki poniżej. Pokazane są jedynie wartości łańcucha skanowania dla DAC i końcówek portu. Kolumna "Działania" opisuje, jaka instrukcja JTAG ma być użyta przed wypełnieniem rejestru skanowania ścieżki krawędziowej kolejnymi kolumnami. Weryfikacja powinna być wykonana na wysłanych i odczytanych danych skanowania z tego samego wiersza w tabeli.
Algorytm używania przetwornika A/C
| Krok | Działania | ADCEN | DAC | MUXEN | HOLD | PRECH | Dane PA3 | Sterowanie PA3 | Pullup_Enable PA3 |
| 1 | SAMPLE_PRELOAD | 1 | 0x200 | 0x08 | 1 | 1 | 0 | 0 | 0 |
| 2 | EXTEST | 1 | 0x200 | 0x08 | 0 | 1 | 0 | 0 | 0 |
| 3 | 1 | 0x200 | 0x08 | 1 | 1 | 0 | 0 | 0 | |
| 4 | 1 | 0x123 | 0x08 | 1 | 1 | 0 | 0 | 0 | |
| 5 | 1 | 0x123 | 0x08 | 1 | 0 | 0 | 0 | 0 | |
| 6 | Weryfikuj wyskanowany bit COMP, który ma być 0 | 1 | 0x200 | 0x08 | 1 | 1 | 0 | 0 | 0 |
| 7 | 1 | 0x200 | 0x08 | 0 | 1 | 0 | 0 | 0 | |
| 8 | 1 | 0x200 | 0x08 | 1 | 1 | 0 | 0 | 0 | |
| 9 | 1 | 0x143 | 0x08 | 1 | 1 | 0 | 0 | 0 | |
| 10 | 1 | 0x143 | 0x08 | 1 | 0 | 0 | 0 | 0 | |
| 11 | Weryfikuj wyskanowany bit COMP, który ma być 1 | 1 | 0x200 | 0x08 | 1 | 1 | 0 | 0 | 0 |
Używając tego algorytmu ograniczenie czasowe na sygnał HOLD ogranicza częstotliwość zegarową TCK. Ponieważ algorytm utrzymuje HOLD w stanie wysokim przez pięć kroków, częstotliwość zegarowa TCK musi wynosić co najmniej pięć razy liczba bitów skanowania podzielona przez maksymalny czas podtrzymywania, thold,max.

Na przedstawionym poprzednio rysunku komórki skanowania ścieżki krawędziowej (który umieściliśmy powyżej dla przypomnienia) PXn.Data odpowiada FF0, PXn.Control odpowiada FF1 i PXn.Pullup_Enable odpowiada FF2. Bity 2, 3, 4 i 5 portu C nie występują w łańcuchu skanowania, ponieważ końcówki te tworzą końcówki TAP, gdy JTAG zostaje uaktywniony.
| Numer bitu | Nazwa sygnału | Moduł |
| 204 | AC_IDLE | Komparator |
| 203 | ACO | |
| 202 | ACME | |
| 201 | AINBG | |
| 200 | COMP | Przetwornik A/C |
| 199 | PRIVATE_SIGNAL1(1) | |
| 198 | ACLK | |
| 197 | ACTEN | |
| 196 | PRIVATE_SIGNAL2(2) | |
| 195 | ADCBGEN | |
| 194 | ADCEN | |
| 193 | AMPEN | |
| 192 | DAC_9 | |
| 191 | DAC_8 | |
| 190 | DAC_7 | |
| 189 | DAC_6 | |
| 188 | DAC_5 | |
| 187 | DAC_4 | |
| 186 | DAC_3 | |
| 185 | DAC_2 | |
| 184 | DAC_1 | |
| 183 | DAC_0 | |
| 182 | EXTCH | |
| 181 | G10 | |
| 180 | G20 | |
| 179 | GNDEN | |
| 178 | HOLD | |
| 177 | IREFEN | |
| 176 | MUXEN_7 | |
| 175 | MUXEN_6 | |
| 174 | MUXEN_5 | |
| 173 | MUXEN_4 | |
| 172 | MUXEN_3 | |
| 171 | MUXEN_2 | |
| 170 | MUXEN_1 | |
| 169 | MUXEN_0 | |
| 168 | NEGSEL_2 | |
| 167 | NEGSEL_1 | |
| 166 | NEGSEL_0 | |
| 165 | PASSEN | |
| 164 | PRECH | |
| 163 | SCTEST | |
| 162 | ST | |
| 161 | VCCREN | |
| 160 | PEN | Włączenie programowania (tylko do podglądu) |
| 159 | PE0.Data | Port E |
| 158 | PE0.Control | |
| 157 | PE0.Pullup_Enable | |
| 156 | PE1.Data | |
| 155 | PE1.Control | |
| 154 | PE1.Pullup_Enable | |
| 153 | PE2.Data | |
| 152 | PE2.Control | |
| 151 | PE2.Pullup_Enable | |
| 150 | PE3.Data | |
| 149 | PE3.Control | |
| 148 | PE3.Pullup_Enable | |
| 147 | PE4.Data | |
| 146 | PE4.Control | |
| 145 | PE4.Pullup_Enable | |
| 144 | PE5.Data | |
| 143 | PE5.Control | |
| 142 | PE5.Pullup_Enable | |
| 141 | PE6.Data | |
| 140 | PE6.Control | |
| 139 | PE6.Pullup_Enable | |
| 138 | PE7.Data | |
| 137 | PE7.Control | |
| 136 | PE7.Pullup_Enable | |
| 135 | PB0.Data | Port B |
| 134 | PB0.Control | |
| 133 | PB0.Pullup_Enable | |
| 132 | PB1.Data | |
| 131 | PB1.Control | |
| 130 | PB1.Pullup_Enable | |
| 129 | PB2.Data | |
| 128 | PB2.Control | |
| 127 | PB2.Pullup_Enable | |
| 126 | PB3.Data | |
| 125 | PB3.Control | |
| 124 | PB3.Pullup_Enable | |
| 123 | PB4.Data | |
| 122 | PB4.Control | |
| 121 | PB4.Pullup_Enable | |
| 120 | PB5.Data | |
| 119 | PB5.Control | |
| 118 | PB5.Pullup_Enable | |
| 117 | PB6.Data | |
| 116 | PB6.Control | |
| 115 | PB6.Pullup_Enable | |
| 114 | PB7.Data | |
| 113 | PB7.Control | |
| 112 | PB7.Pullup_Enable | |
| 111 | PG3.Data | Port G |
| 110 | PG3.Control | |
| 109 | PG3.Pullup_Enable | |
| 108 | PG4.Data | |
| 107 | PG4.Control | |
| 106 | PG4.Pullup_Enable | |
| 105 | TOSC | Oscylator timera 32 kHz (tylko do podglądu) |
| 104 | TOSCON | |
| 103 | RSTT | Logika resetu (tylko do podglądu) |
| 102 | RSTHV | |
| 101 | EXTCLKEN | Sygnały włączania głównego zegara/oscylatorów |
| 100 | OSCON | |
| 99 | RCOSCEN | |
| 98 | OSC32EN | |
| 97 | EXTCLK (XTAL1) | Wejście zegarowe i
oscylatory dla głównego zegara (tylko do podglądu) |
| 96 | OSCCK | |
| 95 | RCCK | |
| 94 | OSC32CK | |
| 93 | TWIEN | Interfejs 2-przewodowy |
| 92 | PD0.Data | Port D |
| 91 | PD0.Control | |
| 90 | PD0.Pullup_Enable | |
| 89 | PD1.Data | |
| 88 | PD1.Control | |
| 87 | PD1.Pullup_Enable | |
| 86 | PD2.Data | |
| 85 | PD2.Control | |
| 84 | PD2.Pullup_Enable | |
| 83 | PD3.Data | |
| 82 | PD3.Control | |
| 81 | PD3.Pullup_Enable | |
| 80 | PD4.Data | |
| 79 | PD4.Control | |
| 78 | PD4.Pullup_Enable | |
| 77 | PD5.Data | |
| 76 | PD5.Control | |
| 75 | PD5.Pullup_Enable | |
| 74 | PD6.Data | |
| 73 | PD6.Control | |
| 72 | PD6.Pullup_Enable | |
| 71 | PD7.Data | |
| 70 | PD7.Control | |
| 69 | PD7.Pullup_Enable | |
| 68 | PG0.Data | Port G |
| 67 | PG0.Control | |
| 66 | PG0.Pullup_Enable | |
| 65 | PG1.Data | |
| 64 | PG1.Control | |
| 63 | PG1.Pullup_Enable | |
| 62 | PC0.Data | Port C |
| 61 | PC0.Control | |
| 60 | PC0.Pullup_Enable | |
| 59 | PC1.Data | |
| 58 | PC1.Control | |
| 57 | PC1.Pullup_Enable | |
| 56 | PC2.Data | |
| 55 | PC2.Control | |
| 54 | PC2.Pullup_Enable | |
| 53 | PC3.Data | |
| 52 | PC3.Control | |
| 51 | PC3.Pullup_Enable | |
| 50 | PC4.Data | |
| 49 | PC4.Control | |
| 48 | PC4.Pullup_Enable | |
| 47 | PC5.Data | |
| 46 | PC5.Control | |
| 45 | PC5.Pullup_Enable | |
| 44 | PC6.Data | |
| 43 | PC6.Control | |
| 42 | PC6.Pullup_Enable | |
| 41 | PC7.Data | |
| 40 | PC7.Control | |
| 39 | PC7.Pullup_Enable | |
| 38 | PG2.Data | Port G |
| 37 | PG2.Control | |
| 36 | PG2.Pullup_Enable | |
| 35 | PA7.Data | Port A |
| 34 | PA7.Control | |
| 33 | PA7.Pullup_Enable | |
| 32 | PA6.Data | |
| 31 | PA6.Control | |
| 30 | PA6.Pullup_Enable | |
| 29 | PA5.Data | |
| 28 | PA5.Control | |
| 27 | PA5.Pullup_Enable | |
| 26 | PA4.Data | |
| 25 | PA4.Control | |
| 24 | PA4.Pullup_Enable | |
| 23 | PA3.Data | |
| 22 | PA3.Control | |
| 21 | PA3.Pullup_Enable | |
| 20 | PA2.Data | |
| 19 | PA2.Control | |
| 18 | PA2.Pullup_Enable | |
| 17 | PA1.Data | |
| 16 | PA1.Control | |
| 15 | PA1.Pullup_Enable | |
| 14 | PA0.Data | |
| 13 | PA0.Control | |
| 12 | PA0.Pullup_Enable | |
| 11 | PF3.Data | Port F |
| 10 | PF3.Control | |
| 9 | PF3.Pullup_Enable | |
| 8 | PF2.Data | |
| 7 | PF2.Control | |
| 6 | PF2.Pullup_Enable | |
| 5 | PF1.Data | |
| 4 | PF1.Control | |
| 3 | PF1.Pullup_Enable | |
| 2 | PF0.Data | |
| 1 | PF0.Control | |
| 0 | PF0.Pullup_Enable |
| Uwagi: | 1. | PRIVATE_SIGNAL1 powinien zawsze być wstawiany do łańcucha jako zero. |
| 2. | PRIVATE_SIGNAL2 powinien zawsze być wstawiany do łańcucha jako zero. |
| Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
| 0x34 (0x54) | JTD | – | – | JTRF | WDRF | BORF | EXTRF | PORF | MCUCSR |
| Zapis/Odczyt | Z/O | O | O | Z/O | Z/O | Z/O | Z/O | Z/O | |
| Wartość początkowa | 0 | 0 | 0 | Zobacz na opis bitów | |||||
Gdy ten bit ma stan zero, to interfejs JTAG będzie włączony, jeśli zaprogramowano bit bezpiecznikowy JTAGEN. Jeśli bit ma stan 1, interfejs JTAG jest wyłączony. Aby zapobiec niezamierzonemu włączeniu lub wyłączeniu interfejsu JTAG, zmiana tego bitu wymaga użycia sekwencji czasowej. Aplikacja musi wpisać pożądaną wartość do tego bitu dwukrotnie w ciągu czterech taktów zegara.
Jeśli interfejs JTAG jest pozostawiony bez podłączenia do innego obwodu JTAG, to bit JTD należy ustawić na jeden. Powodem jest unikanie statycznego prądu na końcówce TDO w interfejsie JTAG.
Ten bit jest ustawiany, jeśli reset był spowodowany logiczną jedynką w rejestrze resetu JTAG wybranego przez instrukcję JTAG AVR_RESET. Bit ten jest resetowany przez reset przy włączeniu lub przez zapis w nim logicznego zera.
![]() |
Zespół Przedmiotowy Chemii-Fizyki-Informatyki w I Liceum Ogólnokształcącym im. Kazimierza Brodzińskiego w Tarnowie ul. Piłsudskiego 4 ©2026 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:
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.