Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 30 sty 2026, o 19:27


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 30 ] 
Autor Wiadomość
PostNapisane: 27 gru 2015, o 08:28 
Offline
Użytkownik

Dołączył(a): 19 gru 2014
Posty: 155
Zbananowany użytkownik

Pomógł: 0

Chciałbym zbudować włącznik czasowy, który sterowałby oświetleniem w ogrodzie, 3 kanały. Włączane i wyłaczane niezależnie o zaprogramowanych czasach, o ile jeżeli włączenie i wyłączenie następuje w ramach jednej doby to ok, ale jak napisać kod który załączy mi oświetlenie np o 23:15, a wyłączy o 4:10 następnego dnia. Sterownik będzie na ATmega 8. Do odmierzania czasu użyję dedykowany układ scalony.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 gru 2015, o 08:54 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 13 maja 2012
Posty: 174
Lokalizacja: Gliwice
Pomógł: 19

Ale co to za różnica czy w przeciągu doby czy nie? Robisz warunek "jeżeli czas==23:15 światło |= PIN_ON, jeżeli czas==4:10 światło &=~PIN_ON. Jeżeli masz większe odstępy czasowe to wprowadź dodatkowo dni tygodnia. "jeżeli czas==23:15 && dzień==wtorek to światło |= PIN_ON itp itp....



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 gru 2015, o 09:11 
Offline
Użytkownik

Dołączył(a): 19 gru 2014
Posty: 155
Zbananowany użytkownik

Pomógł: 0

OK, a jeżeli zabraknie prądu np o 23:20 to podany przez Ciebie program nie zadziała, tu trzeba zastosować inne warunki które dotyczyły by przedziałów czasu odpowiadających za włączenie i wyłączenie.



Ostatnio edytowano 27 gru 2015, o 09:13 przez Hannibal9, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 gru 2015, o 09:13 
Offline
Użytkownik

Dołączył(a): 18 kwi 2013
Posty: 183
Lokalizacja: Kraków
Pomógł: 30

Poczytaj ten wątek:
topic10214.html



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 gru 2015, o 10:46 
Offline
Użytkownik

Dołączył(a): 19 gru 2014
Posty: 155
Zbananowany użytkownik

Pomógł: 0

Dzięki Janusz, teraz jesze się zastanawiam w jaki sposób podać czas w badanych warunkach, czy można godzinę i minuty przedstawić w postaci jednej liczby np pomnożyć godziny razy 60 i dodać minuty, tak aby cały czas był w minutach, czy to może marny pomysł:-?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 gru 2015, o 14:40 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 mar 2014
Posty: 1475
Pomógł: 167

Cytuj:
czy można godzinę i minuty przedstawić w postaci jednej liczby np pomnożyć godziny razy 60 i dodać minut

Pomysł dobry równie jak wiele innych. To co chcesz zrobić, to po prostu nazywa się liczba minut od początku dnia (północy).
Jak to mówi Mirek, program można napisać na 101 sposobów i każdy może być równie dobry.
Dzięki takiemu podejściu przy porównaniach operujesz na jednej wartości 16 bitowej a nie na dwóch niezależnych 8 bitowowych (godzina i minuta). I może być ciutkę łatwiejsze w oprogramowaniu.

--
Pozdrawiam,
Robert

------------------------ [ Dodano po: 3 minutach ]

Dodatkowo dzięki takiemu podejściu bez dużych zmian możesz zaimplementować dodatkowe dodanie dnia tygodnia lub dnia miesiąca (dzień mnożysz przez 24*60), bo nadal mieścisz się tej samej liczbie 16-bitowej :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 gru 2015, o 18:06 
Offline
Użytkownik

Dołączył(a): 19 gru 2014
Posty: 155
Zbananowany użytkownik

Pomógł: 0

Dziękuję, będę walczył. Zaczynam dopiero z C, obsługa zewnętrznego zegara w Bascomie jest prosta w C trochę trudniej to wygląda.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 gru 2015, o 22:40 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 mar 2014
Posty: 1475
Pomógł: 167

Cytuj:
obsługa zewnętrznego zegara w Bascomie jest prosta w C trochę trudniej to wygląda.
Wystarczy obejrzeć Mirkowe poradniki o RTC i będzie znacznie łatwiej :)

http://mirekk36.blogspot.com/2013/11/rtc-ds3231-najdokadniejszy-zegarek-na.html
http://mirekk36.blogspot.com/2015/05/rtc-synchronizacja-czasu-wieczny.html

--
Pozdrawiam,
Robert



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 gru 2015, o 20:27 
Offline
Użytkownik

Dołączył(a): 19 gru 2014
Posty: 155
Zbananowany użytkownik

Pomógł: 0

Obejrzałem poradniki, jest łatwiej, chciałem sobie zrobić obsługę klawiszy za pomocą funkcji z poradnika Pana Mirka.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


z tym, że pomyślałem, że zrobię sobie funkcję z parametrami, tzn, że do funkcji będę sobie wstawiał klawisz i dla próby LED który mam włączać i zrobiłem coś takiego:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

i działa, ale tylko gdy mam użytą funkcję raz z jednym klawiszem, gdy użyję ją w programie np dwa razy z dwoma różnymi klawiszami to niestety ale nie działa należycie raz diodę zapala raz nie, coś mi się wydaje, że to ma związek ze zmienną key_lock, ale nie jestem pewien.

Sprawdziłem jak do obsługi jednego przycisku dam np key_lock a do drugiego dam np key_lock_1 wówczas działa, ale jak bym chciał
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
key_lock wstawić jako argument to już nie dziala.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 31 gru 2015, o 20:01 
Offline
Użytkownik

Dołączył(a): 19 gru 2014
Posty: 155
Zbananowany użytkownik

Pomógł: 0

Jestem na etapie budowania MENU, napisałem taki kod tak dla sprawdzenia i mam taki problem,funkcja menu rozpoczyna się od tego, że x=0 a więc na ekranie wyświetla się napis MENU i wartość X - 0, następnie po wciśnięciu klawisza KEY3 x zwiększa się o 1 czyli wynosi 1 na wyświetlaczu powinna się wyświetlić 1 po następnym wciśnięciu 2 niestety na wyświetlaczu nic się nie pojawia dopiero kiedy x=3 wyświetla się 3, zawsze wyświetla się x z ostatniego case, jeżeli usunę z case 2 instrukcję lcd_cls() wówczas na wyświetlaczu ma same dwójki więc switch działa, a więc to chyba coś z obsługą wyświetlacza jest nie tak :( , wydaje mi się że funkcja lcd_cls() coś nie tak dziala.

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Oczywiście wiem ,że jest SYLWESTER, ale ja siedzę w domu i nadrabiam naukę C dla AVR .

WSZYSTKIEGO NAJLEPSZEGO W NOWYM 2016 ROKU.



Ostatnio edytowano 31 gru 2015, o 20:27 przez Hannibal9, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 31 gru 2015, o 20:19 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 13 maja 2012
Posty: 174
Lokalizacja: Gliwice
Pomógł: 19

Czy po lcd_cls() nie trzeba ustawiać kursora lcd_locate(1,1) ? Nie pamiętam już dokładnie ale może spróbuj ustawić kursor po czyszczeniu ekranu



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 31 gru 2015, o 20:25 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 mar 2014
Posty: 1475
Pomógł: 167

W pętli do {} jak masz wartość pasującą do danego case to czyścisz wyświetlasz i wypisujesz wartość x i tak w kółko. Więc nic nie widzisz, bo czas między kolejnymi wejściami do case i wyczyszczeniem lcd jest bardzo krótki.
Dodaj warunek sprawdzający czy zmieniła się wartość x i dopiero wtedy wchodź do wyświetleń w switch.

--
Pozdrawiam,
Robert



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 31 gru 2015, o 20:29 
Offline
Użytkownik

Dołączył(a): 19 gru 2014
Posty: 155
Zbananowany użytkownik

Pomógł: 0

rskup napisał(a):
W pętli do {} jak masz wartość pasującą do danego case to czyścisz wyświetlasz i wypisujesz wartość x i tak w kółko. Więc nic nie widzisz, bo czas między kolejnymi wejściami do case i wyczyszczeniem lcd jest bardzo krótki.
Dodaj warunek sprawdzający czy zmieniła się wartość x i dopiero wtedy wchodź do wyświetleń w switch.

--
Pozdrawiam,
Robert


OK to dlaczego przy ostatnim warunku case ładnie wyświetla, wszystko jedno czy ostatnim będzie 2, czy 3 czy 4 ?
A jednak masz rację jak dolożę _delay_ms pomiędzy lcd_int a lcd_cls to wszystko jest OK. Jak dodać warynek sprawdzający czy zmienił się x?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 sty 2016, o 03:14 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 mar 2014
Posty: 1475
Pomógł: 167

W przykładzie masz pętle wykonywaną dopóki x < 5. Ostatni case jest dla 3. Dlatego jak zmienisz x z 3 na 4 to zostaje Ci na wyświetlaczu wartość z case 3, bo dla 4 nie wchodzisz do żadnego case i nie czyścisz ekranu.
Teoretycznie powinieneś w przypadkach cyklicznego czyszczenia i wyświetlania wartości widzieć miganie cyfry. Lecz operacja czyszczenia jest dość długa w porównaniu z innymi operacjami w pętli i pewnie wyświetlana informacja jest bardzo słabo lub całkowicie nie widoczna.

Najprostszym rozwiązaniem jest przeniesienie całego switch-a do warunku sprawdzającego naciśnięcie klawisza i umieszczenie od razu po operacji x=x+1; Wtedy gdy zwiększasz x, to od razu wyświetlasz odpowiednie dane na ekranie. I będziesz robił to tylko raz dla danego x.

--
Pozdrawiam,
Robert



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 sty 2016, o 19:58 
Offline
Użytkownik

Dołączył(a): 19 gru 2014
Posty: 155
Zbananowany użytkownik

Pomógł: 0

Dzięki Robert, pomogło. Mam jeszcze pytanie gdzie najlepiej przechowywać godziny załączania i wyłączania, w pamięci flash czy eprom, chodzi aby nie gineły podczas braku zasilania, jaki są polecenia do zapisu i odczytu z tych pamięci?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 sty 2016, o 21:51 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 mar 2014
Posty: 1475
Pomógł: 167

Jak nie zamierzasz nigdy modyfikować, to możesz we flash. Ale takie parametry, to raczej będziesz potrzebował modyfikować. Więc zostaje eeprom.
Jak korzystać z eeprom, to masz dokładnie opowiedziane przez Mirka http://mirekk36.blogspot.com/2012/11/avr-eeprom-struktury-poradnik-do-ksiazek.html.

--
Pozdrawiam,
Robert



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 sty 2016, o 13:13 
Offline
Użytkownik

Dołączył(a): 19 gru 2014
Posty: 155
Zbananowany użytkownik

Pomógł: 0

Poradniki sporo wyjaśniły, ale coś nie mogę przepisać danych z RAM do EEPROM, mam poniższe struktury

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Chcę załadować czasy do zmiennej strukturalnej w RAM
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Funkcja
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


ale nie zapisuje

TCZAS ram_czasy tutaj mam ostrzeżenie przy kompilacji "unsued variable'ram_czasy'[Wunsued-variable]


jeżeli
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
[/syntax]

umieszczę w sekcji int main(void){, wówczas zapisuje do EEPROM :(

------------------------ [ Dodano po: 53 minutyach ]

w załączniku pełny kod

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 sty 2016, o 17:59 
Offline
Użytkownik

Dołączył(a): 19 gru 2014
Posty: 155
Zbananowany użytkownik

Pomógł: 0

kod zapisu zmiennych do struktury działa jak go umieszczę w int main (void)
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


jeżeli umieszczę go gdzie kolwiek indziej czy to w jakiejś funkcji czy w petki głównej, nie działa i wyświetla
wykrzyknik z opisem TCZAS ram_czasy tutaj mam ostrzeżenie przy kompilacji "unsued variable'ram_czasy'[Wunsued-variable]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 sty 2016, o 22:05 
Offline
Użytkownik

Dołączył(a): 19 gru 2014
Posty: 155
Zbananowany użytkownik

Pomógł: 0

w funkcji int main(void) wpisałem:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

w pętli po ustawieniu flagi wpisałem:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


czyli po uruchomieniu urządzenie powinienem mieć zapis z EEPROM do RAM, po ustwieniu flag_zap_eprom, powinno mi zapisać strukturę z RAM do EEPROM, ale nie zapisuje, ponieważ po wyłaczeniu zasilania otrzymuję jaieś dziwne dane, zamiast:
61/60 1 godzina
61%60 1 minuta czyli 01:01

to mi wyświetla 136:36

nie mogę sobie z tym poradzić, czy ktoś mi doradzi co robię nie tak? w bascomie już by było po sprawie.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 sty 2016, o 19:06 
Offline
Użytkownik

Dołączył(a): 19 gru 2014
Posty: 155
Zbananowany użytkownik

Pomógł: 0

Czy funkcja eeprom_write_byte potrafi nadpisać dane w pamieci EEPROM?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 sty 2016, o 22:22 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 mar 2014
Posty: 1475
Pomógł: 167

Cytuj:
Czy funkcja eeprom_write_byte potrafi nadpisać dane w pamieci EEPROM?

Tak. Ta funkcja eeprom_write_byte zapisuje jeden bajt do pamięci EEPROM.

--
Pozdrawiam,
Robert



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 sty 2016, o 12:28 
Offline
Użytkownik

Dołączył(a): 19 gru 2014
Posty: 155
Zbananowany użytkownik

Pomógł: 0

rskup napisał(a):
Cytuj:
Czy funkcja eeprom_write_byte potrafi nadpisać dane w pamieci EEPROM?

Tak. Ta funkcja eeprom_write_byte zapisuje jeden bajt do pamięci EEPROM.

--
Pozdrawiam,
Robert


Ale czy potrafi NADPISAĆ (zastąpić) jedne dane drugimi w EEPROM?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 sty 2016, o 12:31 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 lis 2012
Posty: 298
Pomógł: 13

tak


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 sty 2016, o 16:59 
Offline
Użytkownik

Dołączył(a): 19 gru 2014
Posty: 155
Zbananowany użytkownik

Pomógł: 0

zoom napisał(a):
tak


dziękuję

------------------------ [ Dodano po: 9 minutach ]

Jako, że jestem bliski obłędu, proszę kogoś kto ćwiczył z pamięcią EEPROM o przejżenie kilu poniższych linijek kodu
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


definjuję struktury w RAM i EEPROM
w EEPROM wstawiam dane poczatkowe 1 i 1
kopiuję strukturę z EEPROM do RAM
wyświetlam zmienne z danymi ze struktury z RAM
a mi wyświetla t1= 8196
t2=4366

może mógłby ktoś załadować ten kod u Siebie i sprawdzić?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 sty 2016, o 21:30 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 mar 2014
Posty: 1475
Pomógł: 167

A sprawdź na początek samo zapisywanie i czytanie pojedynczych bajtów z eeprom.
Nigdy nie wierzyłem w zarządzanie pamięcią eeprom przez kompilator gcc i zawsze sam definiowałem pozycje dla danych w eeprom. Dlatego czytałem i zapisywałem następująco:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Wrzuć to i wyświetl sobie wartości zmiennych writeValue i readValue i zobacz czy są identyczne.

--
Pozdrawiam,
Robert



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 sty 2016, o 14:36 
Offline
Użytkownik

Dołączył(a): 19 gru 2014
Posty: 155
Zbananowany użytkownik

Pomógł: 0

sprawdzę, mam tylko pytanie czy zapisując do EEPROM pojedynczo zmienne uint16_t (wg twojej podpowiedzi), muszę zwiększać adres w pamięci EEPROM o 2? tzn pierwsza zmienna pod adres 1 a następna pod 3?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 sty 2016, o 18:44 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 mar 2014
Posty: 1475
Pomógł: 167

eeprom_write_byte() zapisuje jeden bajt pod wskazany adres. Następny bajt zapisujesz do następnej komórki, czyli dodajesz 1. Ale przy pomocy eeprom_write_byte() nie zapiszesz od razu zmiennej uint16_t za jednym wywołaniem. Aby zapisać zmienną dwubajtową to musisz sam zapisać starszy i młodszy bajt takiej zmiennej albo użyć funkcji nie byte a word (eeprom_write_word()).
Jak zapisujesz dwa bajty, a uint16_t, to dwa bajty, to zajmujesz wskazaną komórkę (1) i następną (2). Więc kolejną daną musisz zapisać do kolejnej komórki (3).

--
Pozdrawiam,
Robert



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 sty 2016, o 21:01 
Offline
Użytkownik

Dołączył(a): 19 gru 2014
Posty: 155
Zbananowany użytkownik

Pomógł: 0

Dziękuję.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 sty 2016, o 17:10 
Offline
Użytkownik

Dołączył(a): 19 gru 2014
Posty: 155
Zbananowany użytkownik

Pomógł: 0

posuwam się do przodu z projektem, mam podłączone do wyjść diody sygnalizacyjne w ten sposób, że zapalane są stanem niskim, w momencie resetu urządzenia diody na ułamek sekundy zaświecają się, myślę że dlatego, że zanim na wyjściach pojawi się ustawiony stan wysoki przez chwilę jest tam zero , czy jest jakiś sposób eliminacji tego zjawiska?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 sty 2016, o 23:25 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

Witam
Gdzieś już to było.
O ile dobrze pamiętam to po ustawieniu wyjścia w stan wysoki zrób zwykły _delay_ms(10);
powinno wystarczyć by wyjście się ustawiło zanim ruszy program dalej i przejdzie do głównej pętli.

Pozdrawiam
Darek.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 30 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO