Skocz do zawartości

Wyświetlacz 16x2 atmega 8 kwadraty na wyświetlaczu


Kocon

Pomocna odpowiedź

Witam, od wczoraj walczę żeby się połączyć z wyświetlaczem 16x2 jhd162a, niestety mimo wszelkich gróź i próśb na wyświetlaczu widnieją czarne kwadraciki w drugiej linii, w pierwszej nie świeci się nic.

Avr Studio 5.1 + Atmega8 a biblioteki pobrane z strony http://radzio.dxp.pl/hd44780/hd44780_avr_4-bit_norw_c.htm

RW naturalnie zwarty do masy, połączenia sprawdziłem z 10 razy.

Podaję kod, nie dołączałem osobnego pliku .c, dodałem tylko dyrektywy include i pętle main natomiast plik .h wrzuciłem do katalogu programu.

#include <util/delay.h>
#include <avr/HD44780.h>
#include <avr/io.h>
#define F_CPU 1000000UL
//-------------------------------------------------------------------------------------------------
//
// Funkcja wystawiająca półbajt na magistralę danych
//
//-------------------------------------------------------------------------------------------------
void _LCD_OutNibble(unsigned char nibbleToWrite)
{
if(nibbleToWrite & 0x01)
LCD_DB4_PORT |= LCD_DB4;
else
LCD_DB4_PORT  &= ~LCD_DB4;

if(nibbleToWrite & 0x02)
LCD_DB5_PORT |= LCD_DB5;
else
LCD_DB5_PORT  &= ~LCD_DB5;

if(nibbleToWrite & 0x04)
LCD_DB6_PORT |= LCD_DB6;
else
LCD_DB6_PORT  &= ~LCD_DB6;

if(nibbleToWrite & 0x08)
LCD_DB7_PORT |= LCD_DB7;
else
LCD_DB7_PORT  &= ~LCD_DB7;
}
//-------------------------------------------------------------------------------------------------
//
// Funkcja zapisu bajtu do wyświetacza (bez rozróżnienia instrukcja/dane).
//
//-------------------------------------------------------------------------------------------------
void _LCD_Write(unsigned char dataToWrite)
{
LCD_E_PORT |= LCD_E;
_LCD_OutNibble(dataToWrite >> 4);
LCD_E_PORT &= ~LCD_E;
LCD_E_PORT |= LCD_E;
_LCD_OutNibble(dataToWrite);
LCD_E_PORT &= ~LCD_E;
_delay_us(50);
}
//-------------------------------------------------------------------------------------------------
//
// Funkcja zapisu rozkazu do wyświetlacza
//
//-------------------------------------------------------------------------------------------------
void LCD_WriteCommand(unsigned char commandToWrite)
{
LCD_RS_PORT &= ~LCD_RS;
_LCD_Write(commandToWrite);
}
//-------------------------------------------------------------------------------------------------
//
// Funkcja zapisu danych do pamięci wyświetlacza
//
//-------------------------------------------------------------------------------------------------
void LCD_WriteData(unsigned char dataToWrite)
{
LCD_RS_PORT |= LCD_RS;
_LCD_Write(dataToWrite);
}
//-------------------------------------------------------------------------------------------------
//
// Funkcja wyświetlenia napisu na wyswietlaczu.
//
//-------------------------------------------------------------------------------------------------
void LCD_WriteText(char * text)
{
while(*text)
 LCD_WriteData(*text++);
}
//-------------------------------------------------------------------------------------------------
//
// Funkcja ustawienia współrzędnych ekranowych
//
//-------------------------------------------------------------------------------------------------
void LCD_GoTo(unsigned char x, unsigned char y)
{
LCD_WriteCommand(HD44780_DDRAM_SET | (x + (0x40 * y)));
}
//-------------------------------------------------------------------------------------------------
//
// Funkcja czyszczenia ekranu wyświetlacza.
//
//-------------------------------------------------------------------------------------------------
void LCD_Clear(void)
{
LCD_WriteCommand(HD44780_CLEAR);
_delay_ms(2);
}
//-------------------------------------------------------------------------------------------------
//
// Funkcja przywrócenia początkowych współrzędnych wyświetlacza.
//
//-------------------------------------------------------------------------------------------------
void LCD_Home(void)
{
LCD_WriteCommand(HD44780_HOME);
_delay_ms(2);
}
//-------------------------------------------------------------------------------------------------
//
// Procedura inicjalizacji kontrolera HD44780.
//
//-------------------------------------------------------------------------------------------------
void LCD_Initalize(void)
{
unsigned char i;
LCD_DB4_DIR |= LCD_DB4; // Konfiguracja kierunku pracy wyprowadzeń
LCD_DB5_DIR |= LCD_DB5; //
LCD_DB6_DIR |= LCD_DB6; //
LCD_DB7_DIR |= LCD_DB7; //
LCD_E_DIR 	|= LCD_E;   //
LCD_RS_DIR 	|= LCD_RS;  //
_delay_ms(15); // oczekiwanie na ustalibizowanie się napiecia zasilajacego
LCD_RS_PORT &= ~LCD_RS; // wyzerowanie linii RS
LCD_E_PORT &= ~LCD_E;  // wyzerowanie linii E

for(i = 0; i < 3; i++) // trzykrotne powtórzenie bloku instrukcji
 {
 LCD_E_PORT |= LCD_E; //  E = 1
 _LCD_OutNibble(0x03); // tryb 8-bitowy
 LCD_E_PORT &= ~LCD_E; // E = 0
 _delay_ms(5); // czekaj 5ms
 }

LCD_E_PORT |= LCD_E; // E = 1
_LCD_OutNibble(0x02); // tryb 4-bitowy
LCD_E_PORT &= ~LCD_E; // E = 0

_delay_ms(1); // czekaj 1ms 
LCD_WriteCommand(HD44780_FUNCTION_SET | HD44780_FONT5x7 | HD44780_TWO_LINE | HD44780_4_BIT); // interfejs 4-bity, 2-linie, znak 5x7
LCD_WriteCommand(HD44780_DISPLAY_ONOFF | HD44780_DISPLAY_OFF); // wyłączenie wyswietlacza
LCD_WriteCommand(HD44780_CLEAR); // czyszczenie zawartosći pamieci DDRAM
_delay_ms(2);
LCD_WriteCommand(HD44780_ENTRY_MODE | HD44780_EM_SHIFT_CURSOR | HD44780_EM_INCREMENT);// inkrementaja adresu i przesuwanie kursora
LCD_WriteCommand(HD44780_DISPLAY_ONOFF | HD44780_DISPLAY_ON | HD44780_CURSOR_OFF | HD44780_CURSOR_NOBLINK); // włącz LCD, bez kursora i mrugania
}

//-------------------------------------------------------------------------------------------------
//
// Koniec pliku HD44780.c
//
//-------------------------------------------------------------------------------------------------





int main(void) 
{ 
 LCD_Initalize(); 
 LCD_Clear(); 
 LCD_Home(); 

    while(1)
 { 

    LCD_WriteText("test"); 
    _delay_ms(500);

     } 
 } 

Przykładowy wpis z drugiego pliku (.h)

#define LCD_RS_DIR DDRB

#define LCD_RS_PORT PORTB

#define LCD_RS (1 << PB0)

Sam sposób sterowania wydaje mi się jasny natomiast praktyka pokazała co innego 🙁

Program kompiluje się bez najmniejszych problemów, ktoś z szanownych kolegów byłby skłonny wskazać mi błąd ?

Link do komentarza
Share on other sites

niestety mimo wszelkich gróź i próśb na wyświetlaczu widnieją czarne kwadraciki w drugiej linii, w pierwszej nie świeci się nic.

No i bardzo dobrze, skoro masz te kwadraciki TYLKO NA 1 LINII, to znaczy że wyświetlacz jest sprawny, każdy tak ma przy starcie pracy. A teraz jeżeli wysyłasz jakieś komendy do wyświetlacza, to powinny zgasnąć te kwadraciki i zapalić się to, co chcesz.

Tak więc wyświetlacz jest sprawny, teraz sprawdź połączenia uC<=>LCD.

Link do komentarza
Share on other sites

Skoro w jednej linii widzi kwadraciki, a w drugiej nie, znaczy że to raczej nie w kontraście leży problem.

Problem jest albo w połączeniach uC<=>LCD, albo w programie.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Jak zaznaczałem połączenia sprawdzałem kilkukrotnie. Niestety cokolwiek bym wpisał w programie wyświetlacz nie reaguje. Nie ma możliwości go wpiąć do góry nogami, po pierwsze zasilanie a po drugie na laminacie mam wszystko podpisane. Wykluczam tego typu pomyłkę i dziękuję za odpowiedzi

Link do komentarza
Share on other sites

Biblioteka od Radzia działa na 100% pod warunkiem że nie zmieniałeś nic oprócz definicji portów, sam jej kilkukrotnie używałem więc jest to sprawdzone organoleptycznie 😉

Jeżeli się wyświetlają kwadraty tzn że wyświetlacz się nie zainicjalizował, czyli nie ma komunikacji z wyświetlaczem. Połączenia sprawdzałeś wzrokowo czy sprawdziłeś sobie ciągłość miernikiem?

Definicję prędkości zegara proponuję wrzucić przed includy. Poza tym czemu tak dziwnie to złączyłeś? Jeżeli dodajesz hedera to zostaw też normalny plik .c, jeżeli nie chcesz się rozdrabniać to wywal hedera i wrzuć wszystko do main'a. Sprawdź czy działa.

Link do komentarza
Share on other sites

Oczywiście ciągłość sprawdzałem multimetrem, sugestie kolegi niestety nie podziałały.

Wrzucam cały kod, może ktoś coś wypatrzy.

//-------------------------------------------------------------------------------------------------
// Wyświetlacz alfanumeryczny ze sterownikiem HD44780
// Sterowanie w trybie 4-bitowym bez odczytu flagi zajętości
// z dowolnym przypisaniem sygnałów sterujących
// Plik : HD44780.c	
// Mikrokontroler : Atmel AVR
// Kompilator : avr-gcc
// Autor : Radosław Kwiecień
// Źródło : http://radzio.dxp.pl/hd44780/
// Data : 24.03.2007
//-------------------------------------------------------------------------------------------------
#define F_CPU 1000000UL
#include <util/delay.h>
#include <avr/io.h>

//-------------------------------------------------------------------------------------------------
//
// Konfiguracja sygnałów sterujących wyświetlaczem.
// Można zmienić stosownie do potrzeb.
//
//-------------------------------------------------------------------------------------------------
#define LCD_RS_DIR		DDRB
#define LCD_RS_PORT 	PORTB
#define LCD_RS			(1 << PB0)

#define LCD_E_DIR		DDRC
#define LCD_E_PORT		PORTC
#define LCD_E			(1 << PC6)

#define LCD_DB4_DIR		DDRB
#define LCD_DB4_PORT	PORTB
#define LCD_DB4			(1 << PB1)

#define LCD_DB5_DIR		DDRB
#define LCD_DB5_PORT	PORTB
#define LCD_DB5			(1 << PB3)

#define LCD_DB6_DIR		DDRB
#define LCD_DB6_PORT	PORTB
#define LCD_DB6			(1 << PB4)

#define LCD_DB7_DIR		DDRB
#define LCD_DB7_PORT	PORTB
#define LCD_DB7			(1 << PB5)

//-------------------------------------------------------------------------------------------------
//
// Instrukcje kontrolera Hitachi HD44780
//
//-------------------------------------------------------------------------------------------------

#define HD44780_CLEAR					0x01

#define HD44780_HOME					0x02

#define HD44780_ENTRY_MODE				0x04
#define HD44780_EM_SHIFT_CURSOR		0
#define HD44780_EM_SHIFT_DISPLAY	1
#define HD44780_EM_DECREMENT		0
#define HD44780_EM_INCREMENT		2

#define HD44780_DISPLAY_ONOFF			0x08
#define HD44780_DISPLAY_OFF			0
#define HD44780_DISPLAY_ON			4
#define HD44780_CURSOR_OFF			0
#define HD44780_CURSOR_ON			2
#define HD44780_CURSOR_NOBLINK		0
#define HD44780_CURSOR_BLINK		1

#define HD44780_DISPLAY_CURSOR_SHIFT	0x10
#define HD44780_SHIFT_CURSOR		0
#define HD44780_SHIFT_DISPLAY		8
#define HD44780_SHIFT_LEFT			0
#define HD44780_SHIFT_RIGHT			4

#define HD44780_FUNCTION_SET			0x20
#define HD44780_FONT5x7				0
#define HD44780_FONT5x10			4
#define HD44780_ONE_LINE			0
#define HD44780_TWO_LINE			8
#define HD44780_4_BIT				0
#define HD44780_8_BIT				16

#define HD44780_CGRAM_SET				0x40

#define HD44780_DDRAM_SET				0x80

//-------------------------------------------------------------------------------------------------
//
// Deklaracje funkcji
//
//-------------------------------------------------------------------------------------------------

void LCD_WriteCommand(unsigned char);
void LCD_WriteData(unsigned char);
void LCD_WriteText(char *);
void LCD_GoTo(unsigned char, unsigned char);
void LCD_Clear(void);
void LCD_Home(void);
void LCD_Initalize(void);

//-------------------------------------------------------------------------------------------------
//
// Koniec pliku HD44780.h
//
//-------------------------------------------------------------------------------------------------

//-------------------------------------------------------------------------------------------------
//
// Funkcja wystawiająca półbajt na magistralę danych
//
//-------------------------------------------------------------------------------------------------
void _LCD_OutNibble(unsigned char nibbleToWrite)
{
if(nibbleToWrite & 0x01)
LCD_DB4_PORT |= LCD_DB4;
else
LCD_DB4_PORT  &= ~LCD_DB4;

if(nibbleToWrite & 0x02)
LCD_DB5_PORT |= LCD_DB5;
else
LCD_DB5_PORT  &= ~LCD_DB5;

if(nibbleToWrite & 0x04)
LCD_DB6_PORT |= LCD_DB6;
else
LCD_DB6_PORT  &= ~LCD_DB6;

if(nibbleToWrite & 0x08)
LCD_DB7_PORT |= LCD_DB7;
else
LCD_DB7_PORT  &= ~LCD_DB7;
}
//-------------------------------------------------------------------------------------------------
//
// Funkcja zapisu bajtu do wyświetacza (bez rozróżnienia instrukcja/dane).
//
//-------------------------------------------------------------------------------------------------
void _LCD_Write(unsigned char dataToWrite)
{
LCD_E_PORT |= LCD_E;
_LCD_OutNibble(dataToWrite >> 4);
LCD_E_PORT &= ~LCD_E;
LCD_E_PORT |= LCD_E;
_LCD_OutNibble(dataToWrite);
LCD_E_PORT &= ~LCD_E;
_delay_us(50);
}
//-------------------------------------------------------------------------------------------------
//
// Funkcja zapisu rozkazu do wyświetlacza
//
//-------------------------------------------------------------------------------------------------
void LCD_WriteCommand(unsigned char commandToWrite)
{
LCD_RS_PORT &= ~LCD_RS;
_LCD_Write(commandToWrite);
}
//-------------------------------------------------------------------------------------------------
//
// Funkcja zapisu danych do pamięci wyświetlacza
//
//-------------------------------------------------------------------------------------------------
void LCD_WriteData(unsigned char dataToWrite)
{
LCD_RS_PORT |= LCD_RS;
_LCD_Write(dataToWrite);
}
//-------------------------------------------------------------------------------------------------
//
// Funkcja wyświetlenia napisu na wyswietlaczu.
//
//-------------------------------------------------------------------------------------------------
void LCD_WriteText(char * text)
{
while(*text)
 LCD_WriteData(*text++);
}
//-------------------------------------------------------------------------------------------------
//
// Funkcja ustawienia współrzędnych ekranowych
//
//-------------------------------------------------------------------------------------------------
void LCD_GoTo(unsigned char x, unsigned char y)
{
LCD_WriteCommand(HD44780_DDRAM_SET | (x + (0x40 * y)));
}
//-------------------------------------------------------------------------------------------------
//
// Funkcja czyszczenia ekranu wyświetlacza.
//
//-------------------------------------------------------------------------------------------------
void LCD_Clear(void)
{
LCD_WriteCommand(HD44780_CLEAR);
_delay_ms(2);
}
//-------------------------------------------------------------------------------------------------
//
// Funkcja przywrócenia początkowych współrzędnych wyświetlacza.
//
//-------------------------------------------------------------------------------------------------
void LCD_Home(void)
{
LCD_WriteCommand(HD44780_HOME);
_delay_ms(2);
}
//-------------------------------------------------------------------------------------------------
//
// Procedura inicjalizacji kontrolera HD44780.
//
//-------------------------------------------------------------------------------------------------
void LCD_Initalize(void)
{
unsigned char i;
LCD_DB4_DIR |= LCD_DB4; // Konfiguracja kierunku pracy wyprowadzeń
LCD_DB5_DIR |= LCD_DB5; //
LCD_DB6_DIR |= LCD_DB6; //
LCD_DB7_DIR |= LCD_DB7; //
LCD_E_DIR 	|= LCD_E;   //
LCD_RS_DIR 	|= LCD_RS;  //
_delay_ms(15); // oczekiwanie na ustalibizowanie się napiecia zasilajacego
LCD_RS_PORT &= ~LCD_RS; // wyzerowanie linii RS
LCD_E_PORT &= ~LCD_E;  // wyzerowanie linii E

for(i = 0; i < 3; i++) // trzykrotne powtórzenie bloku instrukcji
 {
 LCD_E_PORT |= LCD_E; //  E = 1
 _LCD_OutNibble(0x03); // tryb 8-bitowy
 LCD_E_PORT &= ~LCD_E; // E = 0
 _delay_ms(5); // czekaj 5ms
 }

LCD_E_PORT |= LCD_E; // E = 1
_LCD_OutNibble(0x02); // tryb 4-bitowy
LCD_E_PORT &= ~LCD_E; // E = 0

_delay_ms(1); // czekaj 1ms 
LCD_WriteCommand(HD44780_FUNCTION_SET | HD44780_FONT5x7 | HD44780_TWO_LINE | HD44780_4_BIT); // interfejs 4-bity, 2-linie, znak 5x7
LCD_WriteCommand(HD44780_DISPLAY_ONOFF | HD44780_DISPLAY_OFF); // wyłączenie wyswietlacza
LCD_WriteCommand(HD44780_CLEAR); // czyszczenie zawartosći pamieci DDRAM
_delay_ms(2);
LCD_WriteCommand(HD44780_ENTRY_MODE | HD44780_EM_SHIFT_CURSOR | HD44780_EM_INCREMENT);// inkrementaja adresu i przesuwanie kursora
LCD_WriteCommand(HD44780_DISPLAY_ONOFF | HD44780_DISPLAY_ON | HD44780_CURSOR_OFF | HD44780_CURSOR_NOBLINK); // włącz LCD, bez kursora i mrugania
}

//-------------------------------------------------------------------------------------------------
//
// Koniec pliku HD44780.c
//
//-------------------------------------------------------------------------------------------------





int main(void) 
{ 
 LCD_Initalize(); 
 LCD_Clear(); 
 LCD_Home(); 

    while(1)
 { 

    LCD_WriteText("test"); 
 _delay_ms(500);
     } 
 } 
Link do komentarza
Share on other sites

Na pewno dobrze wpisałeś porty w pliku HD44780.h sprawdź kilka razy może zły port podałeś.

zegar jak masz ustawiony "oryginalnie czy coś zmieniałeś"?

Mi na 8Mhz coś nie chciał działać zwiększyłem czas opóźnienia i teraz działa.

w pliku "makefile" czy jakoś tak ustawiłeś taktowanie?

jeśli wszystko z tego postu zrobiłeś to ściągnij sobie oryginalną bibliotekę i dodaj obydwa pliki a w main aby reset wyświetlacza i zobacz czy znikną te kwadraty.

Piszę z telefonu.

Link do komentarza
Share on other sites

Spróbuj wydłużyć czas pierwszego opóźnienia w inicjalizacji, ten między zaprogramowaniem kierunku portów a wysłaniem czegokolwiek do LCD. To, że procesor ruszył i wykonuje program to wcale nie znaczy, że kontroler LCD zrobił to samo. Mogą np. mieć zupełnie inne progi odpuszczania swoich wewnętrznych RESETów i przez chwilę wysyłasz swoje dane na Berdyczów (bez urazy). Proponuję 200ms na początek. Jeżeli robisz testy bez wyłączania zasilania, to ten pomysł odpada.

Wzorcowa inicjalizacja HD44780 z danych katalogowych jest troszkę inna (patrzyłeś?), ale ta też rzeczywiście działa, mam bardzo podobne u siebie.

Czy zegar 1MHz jest tylko definicją w kodzie (czyli pobożnym życzeniem), czy rzeczywiście masz taki ustawiony na fuse bitach procesora? Przy zegarze 8MHz wystawianie danych tuż przed opadającym zboczem E mogłoby nie zadziałać.

Jak daleko masz od procesora do LCD? Czy to ta sama płytka drukowana czy jakieś kable? Jak długie? Sygnał E jest zegarem, więc musi być dobrze poprowadzony do wyświetlacza. Może jakieś zdjęcie całości?

Czy możesz zrobić test statyczny? Np. tak zmodyfikować funkcję wysyłania 4 bitów, by po każdym wysłaniu czegokolwiek zatrzymywała się i miałbyś szansę sprawdzenia miernikiem wprost na pinach LCD, czy wysyłane dane dochodzą prawidłowo, że nie pomyliłeś kabelków itp - taka" praca krokowa" z wykorzystaniem może jakiegoś przycisku itp. Potem podobna weryfikacja (także na nóżkach LCD) sygnałów E, RS i RW. Gdy nie działa wszystko razem to musisz zacząć rozbijać to na operacje atomowe i każdą weryfikować osobno. Zacznij od samego dołu (4 bity danych, E itp) i jedź w górę hierarchii projektu.

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Ja c się uczę ale ją bym usunął deklaracje funkcji bo pewni kompilator bierze to za funkcję i wchodzi w to i napotyka ";" i wychodzi ale ja się dopiero uczę to weź to w komentarz.

Pisze z telefonu.

Link do komentarza
Share on other sites

Ja c się uczę ale ją bym usunął deklaracje funkcji bo pewni kompilator bierze to za funkcję i wchodzi w to i napotyka ";" i wychodzi ale ja się dopiero uczę to weź to w komentarz.

Pisze z telefonu.

To są jedynie prototypy funkcji, wszystko się zgadza. Kompilator "wie", że ciało funkcji znajduje się w innym miejscu. Więcej: http://pl.wikipedia.org/wiki/Prototyp_(oprogramowanie)

Link do komentarza
Share on other sites

Pan marek1707, chyba ma rację. Mówisz że Twój wyświetlacz jest jhd162a czyli nie do końca zwykły HD44780. Teraz gdzieś wyczytałem, że przy Twoim sterowniku powinno się odczekać co najmniej 30 ms, a przy zwykłym HD44780 wystarczy 15ms, natomiast Ty w kodzie masz:

_delay_ms(15); // oczekiwanie na ustalibizowanie się napiecia zasilajacego 

Więc najprawdopodobniej przy wpisaniu tutaj 30 zamiast 15 powinno śmigać.

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Zegar jest ustawiony w fuse bitach na internal 1Mhz, tak samo jak napisane jest w programie i ustawieniach Avr Studio. Po zwiększeniu wartości opóźnienia całość niestety bez zmian.

Wrzucam zdjęcie, przewody jak widać z skrętki, długość ok 12cm.

Spróbuję się dorwać do analizatora, wtedy dodam przebiegi.

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.