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



Teraz jest 4 mar 2026, o 05:36


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 18 ] 
Autor Wiadomość
PostNapisane: 21 lis 2013, o 00:47 
Offline
Użytkownik

Dołączył(a): 05 lis 2013
Posty: 353
Lokalizacja: Kraków
Pomógł: 6

Witajcie.

Napisałem prosty kod i nie działa tak jak chce.
Czyli ogólnie PWM ma zwiększać wypełnienie jeżeli zmienna Napiecie > Trzymaj a PWM ma zmniejszać wypełnienie kiedy Napiecie < Trzymaj
W przypadku zrównania Napiecie == Trzymaj wypełnienie ma się nie zmieniać.

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


można co prawda dodać 2 warunki, ale to nie jest elegancko - nie da się tego prościej napisać?
Tak działa
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: 21 lis 2013, o 08:22 
Offline
Użytkownik

Dołączył(a): 04 cze 2013
Posty: 517
Pomógł: 26

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


Sory za język C bo jeszcze go nie umiem więc tylko tak poglądowo piszę

_________________
Przewodnik|Sterownik akwariowy



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 lis 2013, o 09:25 
Offline
Użytkownik

Dołączył(a): 05 lis 2013
Posty: 353
Lokalizacja: Kraków
Pomógł: 6

no jak zauważysz to tak jest napisane
z tym, że jeżeli napięcie nie zrówna się a zmienna i dojdzie do granicy uint8_t to zaczyna odliczać od nowa. więc przez pewien czas będzie PWM większe.
Dlatego dołożyłem te 2 dodatkowe warunki.

Ale myślę nad funkcją for
for(wyrażenie_1; wyrażenie_2; wyrażenie_3)
{
/* Instrukcje wykonywane w pętli */
}
ale w ogóle nie działa
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: 21 lis 2013, o 09:30 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

iwi napisał(a):
ale w ogóle nie działa


ale jak może działać ? :( kolega nie rozumie za bardzo jak w ogóle działa pętla :(

na początku pętli jest inicjalizacja zmiennej a nie warunek więc co tam robią warunki

i>=0

albo

i<=255

to totalne nieporozumienie

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 lis 2013, o 09:37 
Offline
Użytkownik

Dołączył(a): 05 lis 2013
Posty: 353
Lokalizacja: Kraków
Pomógł: 6

chyba, że tak to zapisać
Jeżeli napięcie jest większe od napięcia wzorcowego (Trzymaj) to zmniejszaj PWM aż do 0
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 napięcie jest mniejsze od napięcia wzorcowego (Trzymaj) to zwiększaj PWM aż do 255
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

tylko co w sytuacji aż i dojdzie do 0 lub 255?
Czy się zatrzyma na krańcach przedziału?wzorcowego?

------------------------ [ Dodano po: 5 minutach ]

Masz rację Mirku. Nie rozumiem i próbuję to rozgryźć.
Znalazłem taką instrukcję:
Instrukcja for ma postać:

for(wyrażenie_1; wyrażenie_2; wyrażenie_3) instrukcja_w_pętli;

/* LUB */

for(wyrażenie_1; wyrażenie_2; wyrażenie_3)
{
/* Instrukcje wykonywane w pętli */
}
I działa w następujący sposób:

Oblicza wyrażenie_1.
Oblicza wyrażenie_2.
Jeśli wartość liczbowa wyrażenia_2 jest różna od zera (wartość logiczna PRAWDA), wykonuje instrukcję w pętli i przechodzi do punktu 4; w przeciwnym przypadku działanie instrukcji pętli jest zakończone.
Oblicza wyrażenie_3 i przechodzi do punktu 2.
Na przykład, jeśli jest potrzeba, żeby jakiś fragment kodu wykonał się określoną ilość razy, można wtedy zbudować pętlę z użyciem instrukcji for.
z której nijak nie wynika co to jest Oblicza wyrażenie_1



Ostatnio edytowano 21 lis 2013, o 09:47 przez iwi, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 lis 2013, o 09:45 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

iwi ----> to nie jest tak w języku programowania że pewne mechanizmy w nim będą działać tak - jak ty akurat to sobie w danej chwili wyobrazisz i dopiszesz swoją teorię - bo tak to troszkę teraz wygląda :(

ale może też ten przecinek po inicjalizacji zmiennej i, to u ciebie tylko literówka ? - tu musiałby być średnik

poza tym pomyśl masz tam wtedy w warunku pętli && czyli co się stanie gdy napięci będzie < trzymaj ?

poza jak chcesz żeby działała pierwsza pętla skoro inicjalizujesz i=0 a potem w pętli dekrementujesz to i. Przecież to się kupy nie trzyma :( Jeśli i jest zmienną np uint8_t to się przekręci na 255 i cała pętla poleci w dół z i a jest też szansa że znowu się przekręci)

totalnie do góry nogami wszystko a nie tylko pytanie co w sytuacji gdy dojdzie do 0 lub 255

napisz może najpierw czy w ogóle rozumiesz do końca jak działa pętla for ? i co to są typy zmiennych - żeby można było wiedzieć jak ci pomóc bo z pytania wynika że jesteś z tym na razie mocno na bakier i raczej na naukę tego powinieneś zwrócić uwagę. Jakieś proste ćwiczenia na pętlę for sobie porobić - potestować jak ona działa itp ... a jak coś będzie niejasne to dopytać koniecznie.

------------------------ [ Dodano po: 1 minucie ]

iwi napisał(a):
Oblicza wyrażenie_1.
Oblicza wyrażenie_2.
Jeśli wartość liczbowa wyrażenia_2 jest różna od zera (wartość logiczna PRAWDA), wykonuje instrukcję w pętli i przechodzi do punktu 4; w przeciwnym przypadku działanie instrukcji pętli jest zakończone.
Oblicza wyrażenie_3 i przechodzi do punktu 2.
Na przykład, jeśli jest potrzeba, żeby jakiś fragment kodu wykonał się określoną ilość razy, można wtedy zbudować pętlę z użyciem instrukcji for.
z której nijak nie wynika co to jest Oblicza wyrażenie_1


poczekaj poczekaj - masz bluebooka ?

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

a pytam bo u mnie w bluebooku rozdział na temat pętli for zaczyna się tak:

Cytuj:
for( init; wyrażenie_warunkowe; krok) treść_pętli;


więc nie wiem gdzie , co i jak czytałeś o tej pętli ....

owszem init to też wyrażenie - no ale warto sięgnąć do takiego opisu gdzie to jest solidnie pokazane co i jak

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 lis 2013, o 09:53 
Offline
Użytkownik

Dołączył(a): 05 lis 2013
Posty: 353
Lokalizacja: Kraków
Pomógł: 6

mirekk36 napisał(a):

poczekaj poczekaj - masz bluebooka ?

mam - tylko nie przy sobie - zostawiłem w firmie i będę miał po weekendzie a nie ukrywam, że bez książki działam po omacku, a na necie jest mnóstwo przykładów z których nic nie wynika.

Tak jak napisałem - ta funkcja z IF mi działa. Tylko chce zamienić te 20 linijek kodu na jedną (może dwie) czytelną.
Jeżeli zapiszę tak to w chwili kiedy i=0 oraz i=255 wyrażenie ORC1A=i nie dziadziała
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


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

to będzie przechodziło po dojściu do zera na 255 i tak w kółko.

Jak zrobić warunek, żeby i się zwiększał, ale tylko do 255 oraz zmniejszał ale tylko do 0



Ostatnio edytowano 21 lis 2013, o 10:04 przez iwi, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 lis 2013, o 10:03 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

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

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 lis 2013, o 10:08 
Offline
Użytkownik

Dołączył(a): 05 lis 2013
Posty: 353
Lokalizacja: Kraków
Pomógł: 6

a po co jest 10 linijka
i = 255;
nie bardzo rozumiem jej celowości - przecież będize przy każdym obrocie pętli ustawiało i na 255.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 lis 2013, o 10:55 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

Posłuchaj - ja nie wiem co ty chciałeś na końcu uzyskać i ci nie napiszę gotowego programu nie znając założeń ....

pokazałem ci mniej więcej drogę, jeden z tysiąca sposobów jak można podejść do realizacji twojego zadania

i troszkę coś krębasisz pisząc że nie rozumiesz jej celowości - a nie wiszisz funkcji break ? bo jeśli wystąpi to chyba i nie osiągnie 255

z drugiej strony kto to może wiedzieć co i w jaki sposób ty potrzebujesz bo też tego jak na razie nie potrafisz jasno opisać

ja ci podałem tylko alternatywę dla tych dwóch twoich nieszczęsnych pętli for ... a to w jaki sposób ty je wykorzystujesz ? Ba! czy w ogóle je prawidłowo wykorzystujesz do realizacji swojego tam wyższego celu to już CAŁKIEM inna sprawa i z tego co teraz piszesz - to pewnie i na tym wyższym etapie masz pokręcone w założeniach :(

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 lis 2013, o 11:48 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 12 sie 2013
Posty: 230
Lokalizacja: Zabrze
Pomógł: 17

iwi napisał(a):
a po co jest 10 linijka
i = 255;
nie bardzo rozumiem jej celowości - przecież będize przy każdym obrocie pętli ustawiało i na 255.


Której pętli? Bo z tego, co ja widzę to przed pierwszą pętlą i jest zerowane, a przed drugą ustawiane na 255. Te inicjalizacje są poza pętlami.

_________________
40-32:2=4!



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 lis 2013, o 12:02 
Offline
Użytkownik

Dołączył(a): 05 lis 2013
Posty: 353
Lokalizacja: Kraków
Pomógł: 6

Ja to wszystko wrzucałem do pętli głównej

tą deklaracje uint8_t i = 0 dałem na samym początku przy def zmiennych
ale to i=255 stoi w środku pętli while(1) więc nijak to nie może działać - tzn działa, ale przy każdym wywołaniu pętli jest 255.
ale gdyby to stało poza pętlą główną while(1)

tylko teraz pytanie początkującego może głupie, ale nie mogę sobie tego wyobrazić

Będę miał 3 pętle w int main
while( Napiecie<Trzymaj )
while( Napiecie>=Trzymaj )
i główna
while(1)

program idąc od góry napotka pierwszą pętlę i po dojściu do granicy zrobi break i wyjdzie z tej pętli i wejdzie do pętli drugiej. Po przeliczeniach i nie spełnieniu warunku Napiecie>=Trzymaj wyjdzie z pętli i pójdzie do pętli while(1) i tam już będzie działać w kółko aż do resetu procesora chyba że skorzystamy z goto itp.
Ale w takim przypadku jeżeli w głównej pętli jest obsługa przycisków to jak program się zapętli w pętli pierwszej to dopóki nie wróci do głównej pętli to nie zobaczy przycisku.
Mirek ma rację z jednym = jestem początkującym i może jeszcze nie wiem co chcę, ale na tych prostych przykładach chcę poznać tajniki programowania.
Więc rozsądne wydaje się wrzucenie tych pętli do pętli While(1).



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 lis 2013, o 12:10 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

iwi napisał(a):
chyba że skorzystamy z goto itp


panie,..... panie .... o goto to zapomnij ;) zrób sobie coś takiego jak ja - czyli małą lobotomię jeśli chodzi o goto - ;) i będzie po problemie. W C nie używaj tego najlepiej nigdy a już na pewno nie wtedy gdy jesteś początkujący albo tylko średnio zaawansowany.

-------------------------

wiesz ja nie robiłem zarzutu z tego że jesteś początkujący - każdy nim jest w pewnym okresie ;) ... ja też tylko może kilka kroków przed tobą ...

oczwyiście że ćwicz - oczywiście że pętla główna w main

while(1) {

}

ZAWSZE MUSI być

a w niej można umieszczać inne pętle - czemu nie

tyle że ty chcesz zrobić taki od razu siedmiomilowy skok - bo nie rozumiejąc jeszcze podstaw działania różnych pętli od razu chcesz pomieszać mnóstwo rzeczy ....

tzn hmmm z jednej strony dobrze mieć od razu jakiś konkretny cel ... i do niego dążyć ... bo chyba chcesz zrobić jakiś projekt

ale ja na twoim miejscu najpierw bym wziął sobie jakiś albo zestaw uruchomieniowy albo stykówkę do tego 8 diod LED może jakiś klawisz czy klawisze i tym sposobem najpierw poćwiczył pętle do MEGA BÓLU ! ... tak żeby wycisnąć z nich wszystkie soki, zrozumieć do końca - da się tak .... no może nie na 100% ale na 95% napewno

a wtedy dopiero zabierałbym się za dalsze prace nad projektem ....

przynajmniej ja mam takie podejście zawsze jak się czegoś uczę - i staram się to wciąż przekazywać początkującym .... bo to działa

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 lis 2013, o 12:13 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 12 sie 2013
Posty: 230
Lokalizacja: Zabrze
Pomógł: 17

Toż przecież oczywiste, że rozwiązanie Mirka musisz dostosować do swojego projektu, bo nie wiemy jaki masz układ, założenia oraz cel projektu. A z tego co się domyślam, to Mirkowa propozycja powinna być w pętli głównej while(1) - po właściwym "dostrojeniu".

_________________
40-32:2=4!



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 lis 2013, o 12:17 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

PJS napisał(a):
Toż przecież oczywiste, że rozwiązanie Mirka musisz dostosować do swojego projektu, bo nie wiemy jaki masz układ, założenia oraz cel projektu. A z tego co się domyślam, to Mirkowa propozycja powinna być w pętli głównej while(1) - po właściwym "dostrojeniu".


dokładnie - chociaż lepiej byłoby w ogóle wywoływać te pętelki jako funkcje albo jako jedną funkcję - no ale tu tylko można zgadywać - jak się nie zna ogólnych założeń itp

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 lis 2013, o 12:30 
Offline
Użytkownik

Dołączył(a): 05 lis 2013
Posty: 353
Lokalizacja: Kraków
Pomógł: 6

PJS napisał(a):
Której pętli? Bo z tego, co ja widzę to przed pierwszą pętlą i jest zerowane, a przed drugą ustawiane na 255. Te inicjalizacje są poza pętlami.

mam wszystko zrobione na stykówce. diody, przełączniki, RS232 - z tym, że jak zobaczycie pierwszy projekt (specjalnie zamieściłem w całości) to wolę wywalać na ekran po RS232 wszystko niż patrzyć się na diody :) aczkolwiek jedna pokazuje mi częstotliwość PWM a druga stan przycisku, więc wszystko ćwiczę.

Ale wracając do tego i=255;
to i=255 stoi w pętli głównej while(1).
więc przy każdorazowym obrocie jest ustawione na 255.

z tego co zrozumiałem to pętla "while" mi nie podejdzie bo chcę żeby nie zapętlał się program w podpętlach bo stracę przyciski i obsługę wyświetlacza itp Mam If - bezpieczny warunek ale zajmuje dużo linii.
Natomiast na pierwszy rzut for by podeszło, ale nie działa.

Mimo że u Mirka w obsłudze przycisku to działa to nie mogę tego nijak dostosować
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

tzn przy każdorazowym naciśnięciu keylock ustawione jest na 200 i po puszczeniu odlicza sobie do 255 i na tym się zatrzymuje.
Nie wiem dlaczego nie liczy znowu od 0 do 255 i tak w kółko. Liczy tylko jeden raz.
i to samo chcę osiągnąć u siebie - żeby i liczyło od 0 do 255 i tam sobie stało a po zmianie warunku od 255 do 0 i tam znowu sobie stało.
ale nie przez while tylko inaczej zeby nie blokowało pętli głównej.

------------------------ [ Dodano po: 10 minutach ]

Co do założeń - bo nie wspomniałem bo to jest wycinek całego dużego projektu - MPPT do sterowania obciążeniem grzałek w funkcji energii z solarów..

Ale zanim do MPPT trzeba najpierw uporać się z PWM.

Uruchamiamy PWM sterujące Mosfetem
Na ADC mierzymy napięcie na Solarach
W programie mamy zmienną Trzymaj, która mówi nam jakie napięcie ma być to wzorcowe - idealne dla naszego układu.
zmieniając zmienną OCR1A w zakresie od 0 do 255 regulujemy mocą przekazywaną przez solar na obciążenie.
Jeśli teraz zmienna z ADC Napiecie jest wieksza od napięcia wzorcowego Trzymaj to ODC1A (wypełnienie) powinno się zacząc zwiększać, żeby
Napiecie spadało. Jeśli się wyrówna to będzie sobie stał i czekał co się dalej stanie. Jeśli natomiast Napiecie będzie mniejsze od Trzymaj to wypełnienie powinno się zmniejszyć żeby utrzymać to napięcie właściwe.

Za radą Mirka i poradników robię każdy blok osobno i dopiero jak zacznie działać to wstawiam do gotowego projektu.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 lis 2013, o 12:52 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

Cytuj:
Za radą Mirka i poradników robię każdy blok osobno i dopiero jak zacznie działać to wstawiam do gotowego projektu


i to jest BARDZo dobry pomysł

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lis 2013, o 23:20 
Offline
Użytkownik

Dołączył(a): 05 lis 2013
Posty: 353
Lokalizacja: Kraków
Pomógł: 6

Nie udało mi się zmusić funkcji for, while do pracy, natomiast skróciłem kod od IF i tak musi zostać.
Ale nie wytrzymałem i pojechałem po Bluebooka - przez weekend będzie już łatwiej.

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  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 18 ] 

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:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO