logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Program do obsługi DCF77 i LCD w Bascom dla zegara z Mega8

nouki 01 Lut 2008 23:19 3624 11
REKLAMA
  • #1 4760606
    nouki
    Poziom 25  
    Posty: 1222
    Pomógł: 28
    Ocena: 98
    Cześć.

    Poszukuje przykładowego programu do obsługi dcf77 i obsługującego wyświetlacz lcd w bascomie.
    Szukania nic nie dały.

    jak zmodyfikować układ zegarka na pcf by powiedzmy dwa razy na dobę synchronizował sie?
  • REKLAMA
  • REKLAMA
  • #4 4764847
    nouki
    Poziom 25  
    Posty: 1222
    Pomógł: 28
    Ocena: 98
    program nie jest na mega 8.

    pytanie to:

    jak zmodyfikować układ zegarka na pcf by powiedzmy dwa razy na dobę synchronizował sie.
  • REKLAMA
  • #5 4764850
    snow
    Poziom 31  
    Posty: 1825
    Pomógł: 178
    Ocena: 201
    A w czym problem go przerobić?
  • #6 4764857
    nouki
    Poziom 25  
    Posty: 1222
    Pomógł: 28
    Ocena: 98
    jak zwykle to samo.

    Uklad zegara jest na pcf chce wstawic synchro 2 razy na dobe wiec nie chce przerabiac programu tylko wstawic w niego (w swoj) dane do synchronizacji .
    Moze nie wszyscy maja tyle wiedzy co koledzy sa tez poczatkujacy prawda??

    
    
        $regfile = "m8def.dat"
    
    $crystal = 1000000
    
    Config Lcdbus = 4
    Config Lcd = 20 * 4
    Config Lcdpin = Pin , Db4 = Pb.2 , Db5 = Pb.3 , Db6 = Pb.4 , Db7 = Pb.5 , E = Pb.1 , Rs = Pb.0
    Declare Sub Settime
    Declare Sub Gettime
    Declare Sub Displaytime
    Declare Sub Displaydata
    Declare Sub Zmgodz
    Declare Sub Zmmin
    Declare Sub Ustawczas
    Declare Sub Ustawdata
    Declare Sub Zmdzien
    Declare Sub Zmmies
    Declare Sub Ustawalarm
    Declare Sub Zmmal
    Declare Sub Zmgal
    Config 1wire = Portd.0
    Config 1wire = Portc.2
    Dim Dsid1(8) As Byte
    Dim Dsid2(8) As Byte
    Declare Sub Read18b20
    Dim I1 As Integer , Ss As String * 6 , Sa As String * 6 , A As String * 6
    Dim I2 As Integer
    Config Sda = Portc.3
    Config Scl = Portc.4
    Config I2cdelay = 10
    Waitms 200
    Config Portc = Output
    
    
    Set Portd.7
    Set Pind.3
    Set Pind.4
    Set Pind.5
    Set Pind.6
    I2cinit
    
    
    
    Dim S As Byte , M As Byte , H As Byte , D As Byte           ', Month As Byte
    Dim Wm As Byte , Yd As Byte
    Dim Ma As Byte
    Dim Ha As Byte
    Dim Alarm As Bit
    Dim Al As Bit
    Dim K As Byte
    Deflcdchar 0 , 12 , 18 , 18 , 12 , 32 , 32 , 32 , 32
    Deflcdchar 1 , 32 , 10 , 21 , 17 , 10 , 4 , 32 , 32
    Deflcdchar 2 , 29 , 25 , 21 , 13 , 13 , 21 , 25 , 29
    Deflcdchar 3 , 17 , 10 , 4 , 10 , 17 , 32 , 32 , 32
    Deflcdchar 4 , 31 , 17 , 21 , 19 , 21 , 31 , 31 , 31
    Deflcdchar 5 , 10 , 21 , 10 , 21 , 10 , 21 , 10 , 21
    Cls
    
    
    
    
    1:
    
    
    Sub Displaytime
       Cls
    
       Do
    
       Call Read18b20
       Call Gettime
    
      Home
        Lcd " Czas: " ; Bcd(h) ; ":" ; Bcd(m) ; ":" ; Bcd(s) ; "  " ; A ; " "
        Locate 2 , 1
        Lcd " Data: " ; Bcd(yd) ; "." ; Bcd(wm) ; ".2008"
        Locate 3 , 1
        Lcd "w domu:   " ; Ss ; Chr(0) ; "C"
        Locate 4 , 1
        Lcd "na dworze:" ; Sa ; Chr(0) ; "C"
    
    
    
        If Pind.3 = 0 Then
        Call Ustawczas
        End If
        If Pind.4 = 0 Then
        Call Ustawdata
        End If
        If Pind.6 = 0 Then
        Call Ustawalarm
        End If
        If Pind.5 = 0 Then
        Reset Portd.1
        If Alarm = 1 Then
        Alarm = 0
        A = Chr(3)
        Else
        Alarm = 1
        A = Chr(2)
        End If
    
        Cls
        Goto 1:
        End If
        Loop
    End Sub
    
    
    
    
    
    
    
    
    
    Sub Gettime
        I2cstart                                                'generate start
        I2cwbyte &HA0                                           'write addres of PCF8583
        I2cwbyte 2                                              'select second register
        I2cstart                                                'generate repeated start
        I2cwbyte &HA1                                           'write address for reading info
        I2crbyte S , Ack                                        'read seconds
        I2crbyte M , Ack                                        'read minuts
        I2crbyte H , Ack                                        'read hours
        I2crbyte Yd , Ack                                       'read year and days
        I2crbyte Wm , Nack                                      'read weekday and month
        I2cstop                                                 'generate stop
        I2cstart                                                'generate start
        I2cwbyte &HA0                                           'write addres of PCF8583
        I2cwbyte 100                                            'select second register
        I2cstart                                                'generate repeated start
        I2cwbyte &HA1                                           'write address for reading info
        I2crbyte Ha , Ack                                       'read seconds
        I2crbyte Ma , Nack                                      'read minuts
        I2cstop
        If Ha = H Then
        If Ma = M Then
        If S = 0 Then
        If Alarm = 1 Then
        Set Portd.1
        Wait 1
        End If
        End If
        End If
        End If
        End Sub
    
    
    
    
    Sub Settime(s As Byte , M As Byte , H As Byte , Yd As Byte , Month Wm Byte)
    
    
        I2cstart                                                'generate start
        I2cwbyte &HA0                                           'write address
        I2cwbyte 0                                              'select control register
        I2cwbyte 8                                              'set year and day bit for masking
        I2cstop                                                 'generate stop
    
    
        I2cstart                                                'generate start
        I2cwbyte &HA0                                           'write mode
        I2cwbyte 2                                              'select seconds Register
        I2cwbyte S                                              'write seconds
        I2cwbyte M                                              'write minuts
        I2cwbyte H                                              'Write Hours
        I2cwbyte Yd                                             'write days
        I2cwbyte Wm                                             'write months
        I2cstop
        I2cstart                                                'generate start
        I2cwbyte &HA0                                           'write mode
        I2cwbyte 100                                            'select seconds Register
        I2cwbyte Ha
        I2cwbyte Ma
        I2cstop
    
    
    End Sub
    
    Sub Ustawczas
    Cls
    Wait 1
    Do
    Lcd "Ustaw Czas:" ; Bcd(h) ; " " ; Bcd(m)
    Home
    
    If Pind.3 = 0 Then
    Call Zmgodz
    Waitms 200
    End If
    
    If Pind.4 = 0 Then
    Call Zmmin
    Waitms 200
    End If
    
    If Pind.5 = 0 Then
    S = 0
    Call Settime
    Call Displaytime
    Exit Do
    End If
    
    Loop
    End Sub
    
    Sub Zmdzien
    Yd = Makedec(yd)
    Incr Yd
    If Yd > 31 Then
    Yd = 1
    End If
    Yd = Makebcd(yd)
    End Sub
    
    Sub Zmmies
    Wm = Makedec(wm)
    Incr Wm
    If Wm > 12 Then
    Wm = 1
    End If
    Wm = Makebcd(wm)
    End Sub
    
    Sub Ustawdata
    Cls
    Wait 1
    Do
    
    Lcd "Ustaw Date:" ; Bcd(yd) ; "  " ; Bcd(wm)
    Home
    
    If Pind.3 = 0 Then
    Call Zmdzien
    Waitms 200
    End If
    
    If Pind.4 = 0 Then
    Call Zmmies
    Waitms 200
    End If
    
    If Pind.5 = 0 Then
    Call Settime
    Call Displaytime
    Exit Do
    End If
    
    Loop
    End Sub
    
    Sub Zmgodz
    H = Makedec(h)
    Incr H
    If H > 23 Then
    H = 0
    End If
    H = Makebcd(h)
    End Sub
    
    Sub Zmmin
    M = Makedec(m)
    Incr M
    If M > 59 Then
    M = 0
    End If
    M = Makebcd(m)
    End Sub
    
    Sub Ustawalarm
    Cls
    Wait 1
    Do
    
    Lcd "Ustaw Alarm: " ; Bcd(ha) ; ":" ; Bcd(ma)
    Lowerline
    If Alarm = 1 Then
    Lcd "  Alarm ON "
    Locate 1 , 20
    Lcd "A"
    A = Chr(2)
    Else
    Lcd "  Alarm OFF"
    Locate 1 , 20
    Lcd " "
    A = Chr(3)
    End If
    Home
    
    
    If Pind.3 = 0 Then
    Call Zmgal
    Waitms 200
    End If
    
    If Pind.4 = 0 Then
    Call Zmmal
    Waitms 200
    End If
    
    If Pind.5 = 0 Then
    
    Call Settime
    Call Displaytime
    Exit Do
    End If
    
    If Pind.6 = 0 Then
    Waitms 200
    If Alarm = 1 Then
    Alarm = 0
    Else
    Alarm = 1
    End If
    End If
    
    
    Loop
    End Sub
    
    
    Sub Zmgal
    Ha = Makedec(ha)
    Incr Ha
    If Ha > 23 Then
    Ha = 0
    End If
    Ha = Makebcd(ha)
    End Sub
    
    Sub Zmmal
    Ma = Makedec(ma)
    Incr Ma
    If Ma > 59 Then
    Ma = 0
    End If
    Ma = Makebcd(ma)
    End Sub
    
    Sub Read18b20
    Config 1wire = Pind.0
    1wreset
    1wwrite &HCC
    1wwrite &H44
    Waitms 100
    1wreset
    1wwrite &HCC
    1wwrite &HBE
    I1 = 1wread(2)
     I1 = I1 * 10
       I1 = I1 / 16
       'If I1 > 0 Then Cls
       Ss = Str(i1)
       Ss = Format(ss , " 0.0")
    
    
    Config 1wire = Pinc.2
    1wreset
    1wwrite &HCC
    1wwrite &H44
    Waitms 100
    1wreset
    1wwrite &HCC
    1wwrite &HBE
    I2 = 1wread(2)
       I2 = I2 * 10
       I2 = I2 / 16
       'If I2 > 0 Then Cls
       Sa = Str(i2)
       Sa = Format(sa , " 0.0")
    
    
    End Sub
    
                                                            'end program
    
  • REKLAMA
  • #7 4765103
    gregoorr
    Poziom 18  
    Posty: 232
    Pomógł: 19
    Ocena: 34
    Ciężko wyjaśnić co masz zrobić w kilku zdaniach. Musisz zdekodować sygnał z DCF-a i wpisać do pcf. Dokładnie przeanalizuj soft z linka wyżej, jest trochę pokręcony na pierwszy rzut oka, ale po analizie może coś ci rozjaśni. Na elektrodzie jest link do pdf-a od kitu AVT-5022. Jest to programowalny zegar z dcf. Jest tam tabelka w której jest opisany sposób kodowania sygnału dcf. Po analizie tej tabelki i listingu z linku można coś zacząć kombinować. W sieci jest trochę informacji, również po polsku wystarczy poszukać, np: tu
    http://dhost.info/ky3orr/index.php?dzial=projekty&poddzial=zegar_uniwersalny_dcf77
    " target="_blank" rel="nofollow noopener ugc" class="postlink inline" title="" >
    http://dhost.info/ky3orr/index.php?dzial=projekty&poddzial=zegar_uniwersalny_dcf77

    Pozdrawiam i życzę powodzenia. Ja dokonasz postępów to wrzuć tu, napewno się komuś przydadzą.
  • #8 4765290
    nouki
    Poziom 25  
    Posty: 1222
    Pomógł: 28
    Ocena: 98
    z tego kodu nic nie rozumie
    O wiele prościej by było gdyby były opisu przy poszczególnych liniach.

    
    $crystal = 11059000
    $baud = 9600
    '
    '******************************************************************************
    '
    Dim X As Byte
    Dim C As Byte
    Dim V As Byte
    Dim H As Byte
    Dim Eror As Byte
    Dim Znak As Byte
    '
    Dim M1 As Byte
    Dim M2 As Byte
    Dim H1 As Byte
    Dim H2 As Byte
    Dim D1 As Byte
    Dim D2 As Byte
    Dim Me1 As Byte
    Dim Me2 As Byte
    Dim R1 As Byte
    Dim R2 As Byte
    '
    Dim Dm1 As Byte
    Dim Dm2 As Byte
    Dim Dh1 As Byte
    Dim Dh2 As Byte
    Dim Dd1 As Byte
    Dim Dd2 As Byte
    Dim Dme1 As Byte
    Dim Dme2 As Byte
    Dim Dr1 As Byte
    Dim Dr2 As Byte
    '
    '******************************************************************************
    '
    ' display 2x16
    Config Lcdpin = Pin , Db4 = P1.3 , Db5 = P1.2 , Db6 = P1.1 , Db7 = P1.0 , E = P3.4 , Rs = P3.5
    Config Lcd = 16 * 2
    ' input
    Dcf77 Alias P1.7 'input module DCF-77
    '
    '******************************************************************************
    '
    Inic:
    Eror = 0
    Cls
    Locate 1 , 1
    Lcd "Time Date"
    Cursor Off
    'm1 = 0 : M2 = 0 : H1 = 0 : H2 = 0 : D1 = 0 : D2 = 0
    'Me1 = 0 : Me2 = 0 : R1 = 0 : R2 = 0
    Dm1 = 0 : Dm2 = 0 : Dh1 = 0 : Dh2 = 0 : Dd1 = 0 : Dd2 = 0
    Dme1 = 0 : Dme2 = 0 : Dr1 = 0 : Dr2 = 0
    C = 100
    '
    Zacatek:
    D99:
    X = 0
    If Dcf77 = 1 Then Goto D0
    Goto D99
    '
    D0:
    X = 0
    If Dcf77 = 0 Then Goto D1
    Goto D0
    '
    D1:
    Waitms 10
    X = X + 1
    If Dcf77 = 1 Then Goto D2
    Goto D1
    '
    D2:
    If X < 12 Then Goto S0
    If X > 12 Then Goto S1
    Eror = 1
    S0:
    H = 0
    X = 0
    Goto Vypocet
    S1:
    H = 1
    X = 0
    Goto Vypocet
    '
    D3:
    Waitms 10
    X = X + 1
    If Dcf77 = 0 Then Goto D4
    Goto D3
    '
    D4:
    If X > 150 Then Goto M9
    X = 0
    Goto D1
    '
    M9:
    '
    If H1 > 2 Then Eror = 1
    If H2 > 9 Then Eror = 1
    If M1 > 6 Then Eror = 1
    If M2 > 9 Then Eror = 1
    If Me1 > 1 Then Eror = 1
    If Me2 > 9 Then Eror = 1
    If R1 > 1 Then Eror = 1
    If R2 > 9 Then Eror = 1
    '
    If Eror = 1 Then Goto Nodispl
    '
    Locate 2 , 1
    X = H1 + 48
    Dh1 = X
    Lcd Chr(x);
    X = H2 + 48
    Dh2 = X
    Lcd Chr(x);
    Lcd ":";
    X = M1 + 48
    Dm1 = X
    Lcd Chr(x);
    X = M2 + 48
    Dm2 = X
    Lcd Chr(x);
    Lcd " ";
    X = D1 + 48
    Dd1 = X
    Lcd Chr(x);
    X = D2 + 48
    Dd2 = X
    Lcd Chr(x);
    Lcd ".";
    X = Me1 + 48
    Dme1 = X
    Lcd Chr(x);
    X = Me2 + 48
    Dme2 = X
    Lcd Chr(x);
    Lcd ".20";
    X = R1 + 48
    Dr1 = X
    Lcd Chr(x);
    X = R2 + 48
    Dr2 = X
    Lcd Chr(x)
    '
    Nd1:
    Eror = 1
    '
    Nodispl:
    M1 = 0 : M2 = 0 : H1 = 0 : H2 = 0 : D1 = 0 : D2 = 0
    Me1 = 0 : Me2 = 0 : R1 = 0 : R2 = 0
    X = 0 : C = 1 : Eror = 0
    Goto D1
    '
    Vypocet:
    If C = 21 Then
    If H = 0 Then Eror = 1
    End If
    If C = 22 Then M2 = M2 + H
    If C = 23 Then
    V = H * 2
    M2 = M2 + V
    End If
    If C = 24 Then
    V = H * 4
    M2 = M2 + V
    End If
    If C = 25 Then
    V = H * 8
    M2 = M2 + V
    End If
    If C = 26 Then M1 = H
    If C = 27 Then
    V = H * 2
    M1 = M1 + V
    End If
    If C = 28 Then
    V = H * 4
    M1 = M1 + V
    End If
    If C = 30 Then H2 = H
    If C = 31 Then
    V = H * 2
    H2 = H2 + V
    End If
    If C = 32 Then
    V = H * 4
    H2 = H2 + V
    End If
    If C = 33 Then
    V = H * 8
    H2 = H2 + V
    End If
    If C = 34 Then H1 = H
    If C = 35 Then
    V = H * 2
    H1 = H1 + V
    End If
    If C = 37 Then D2 = H
    If C = 38 Then
    V = H * 2
    D2 = D2 + V
    End If
    If C = 39 Then
    V = H * 4
    D2 = D2 + V
    End If
    If C = 40 Then
    V = H * 8
    D2 = D2 + V
    End If
    If C = 41 Then D1 = H
    If C = 42 Then
    V = H * 2
    D1 = D1 + V
    End If
    If C = 46 Then Me2 = H
    If C = 47 Then
    V = H * 2
    Me2 = Me2 + V
    End If
    If C = 48 Then
    V = H * 4
    Me2 = Me2 + V
    End If
    If C = 49 Then
    V = H * 8
    Me2 = Me2 + V
    End If
    If C = 50 Then Me1 = H
    If C = 51 Then R2 = H
    If C = 52 Then
    V = H * 2
    R2 = R2 + V
    End If
    If C = 53 Then
    V = H * 4
    R2 = R2 + V
    End If
    If C = 54 Then
    V = H * 8
    R2 = R2 + V
    End If
    If C = 55 Then R1 = H
    If C = 56 Then
    V = H * 2
    R1 = R1 + V
    End If
    If C = 57 Then
    V = H * 4
    R1 = R1 + V
    End If
    If C = 58 Then
    V = H * 8
    R1 = R1 + V
    End If
    C = C + 1
    Goto D3
    '
    End
    


    tabela wygląda tak wiec cos tam mi świta

    ale np:
    ...
    If C = 58 Then
    V = H * 8....
    nie wiem o co chodzi

    rozumie ze to: If C = 58 Then.. to odwołanie do nr.impulsu ale mnożenie dodawanie?? nie wiem.

    Tab. 1. Sposób kodowania
    informacji DCF
    Numer
    impulsu
    (numer Znaczenie impulsu
    sekundy)
    0 Początek transmisji. Zawsze = 0.
    1−14 Przerwa, bez znaczenia − wszystkie
    zera.
    15 0− antena normalna;
    1− antena pomocnicza.
    16 0−normalnie;
    1− zapowiedz zmiany czasu
    (przez godzinę przed zmianą).
    17−18 (w kolejności bity 18,17)
    10−czas zimowy; 01−czas letni.
    19 0−normalnie; 1−zapowiedz
    dodatkowej sekundy.
    20 Start informacji czasowej.
    Zawsze = 1.
    21−24 (w kolejności bity 24,23,22,21)
    jednostki minut w BCD.
    25−27 (w kolejności bity 27,26,25)
    dziesiątki minut w BCD.
    28 bit parzystości dla bitów 21−27.
    29−32 (w kolejności bity 32,31,30,29)
    jednostki godzin w BCD.
    33−34 (w kolejności bity 34,33)
    dziesiątki godzin w BCD.
    35 bit parzystości dla bitów 29−34.
    36−39 (w kolejności bity 39,38,37,36)
    jednostki dni miesiąca w BCD.
    40−41 (w kolejności bity 41,40) dziesiątki
    dni miesiąca w BCD.
    42−44 (w kolejności bity 44,43,42)
    dni tygodnia w BCD − 1=Pn; 7=Nd.
    45−48 (w kolejności bity 48,47,46,45)
    jednostki miesiąca w BCD.
    49 dziesiątki miesiąca w BCD.
    50−53 (w kolejności bity 53,52,51,50)
    jednostki lat w BCD.
    54−57 (w kolejności bity 57,56,55,54)
    dziesiątki lat w BCD.
    58 bit parzystości dla bitów 36−57.
    59 brak impulsu.
  • #9 4765623
    gregoorr
    Poziom 18  
    Posty: 232
    Pomógł: 19
    Ocena: 34
    Wszystko masz ładnie opisane tu:
    http://dhost.info/ky3orr/index.php?dzial=arty...echnika_mikroprocesorowa&artykul=dcf77#odbior" target="_blank" rel="nofollow noopener ugc" class="postlink inline" title="" >
    http://dhost.info/ky3orr/index.php?dzial=arty...echnika_mikroprocesorowa&artykul=dcf77#odbior

    W listingu masz:
    
    Dcf77 Alias P1.7 'input module DCF-77
    


    Najprościej ujmując to musisz np: na tym pinie odbierać "zera" i "jedynki", (długość impulsu) i przeliczać sobie na konkretne liczby, czyli minuty, godziny itd. Dochodzi do tego kontrola, czy nie otrzymałeś bzdur, i czy dane są poprawne, czyli że nie masz np: 67 minut, ale to można zostawić na potem, jak uporasz się już z samym odbiorem.
    Bardziej niż w artykule wyżej nie jestem Ci w stanie tego przybliżyć. Najleprzym rozwiązaniem jest chyba uruchomienie odbiornika dcf, obserwacja i stopniowe pisanie softu.
  • #10 4766893
    Michał_z1
    Poziom 16  
    Posty: 190
    Pomógł: 13
    Ocena: 2
    Witam.
    Bardzo czytelny opis jest w EP 6 i 7 z 2001 roku, układ zrobiony na 90S8535 i w Bascomie ale to właściwie bez znaczenia przecież.............
    pozdrawiam
  • #11 4767004
    gregoorr
    Poziom 18  
    Posty: 232
    Pomógł: 19
    Ocena: 34
    Michał_z1 napisał:
    Witam.
    Bardzo czytelny opis jest w EP 6 i 7 z 2001 roku, układ zrobiony na 90S8535 i w Bascomie ale to właściwie bez znaczenia przecież.............
    pozdrawiam


    Do dzisiaj w archiwum jest kod źródłowy w baskomie, i można go pobrać:
    http://www.ep.com.pl/?strona=download.php&sk=dcf

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy poszukiwania przykładowego programu w Bascomie do obsługi sygnału DCF77 oraz wyświetlacza LCD dla mikrokontrolera Atmega8, z dodatkowym pytaniem o modyfikację układu zegara opartego na układzie PCF w celu synchronizacji sygnału DCF77 dwa razy na dobę bez konieczności przerabiania całego programu. Użytkownicy wskazują na konieczność dekodowania sygnału DCF77 poprzez pomiar długości impulsów na dedykowanym pinie, przeliczanie ich na wartości czasu i daty oraz weryfikację poprawności danych. Podano linki do przykładów i artykułów, m.in. do projektu AVT-5022 oraz do polskich źródeł z opisem techniki odbioru DCF77. Wskazano również na dostępność kodów źródłowych w archiwach czasopism Elektronika Praktyczna (EP) z 2001 roku, gdzie zastosowano mikrokontroler 90S8535 i Bascom. W nowszych wersjach Bascoma pojawiła się instrukcja CONFIG Dcf77 ułatwiająca implementację. Dyskusja podkreśla, że modyfikacja synchronizacji w układzie PCF wymaga ingerencji w sposób odbioru i zapisu danych, a nie tylko wstawienia fragmentu kodu, co może być trudne dla początkujących.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA