Отговори на тема  [ 55 мнения ]  Отиди на страница Предишна  1, 2, 3, 4
Zilog - Z8 Encore! F083A Series 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 8:21 pm
Мнения: 27949
Местоположение: София
Мнение Re: Zilog - Z8 Encore! F083A Series
Ако питаш защо така се присвоява, защото на статшия присвояваш горнитв 8 бита, имаш шифт, ана старшия фошните 8, 0хFF е маска, затрива старшия байт на числото. А ако питаш защо зареждаш тази стойност, не знам :=


Нед Дек 02, 2018 3:57 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 26, 2005 1:01 pm
Мнения: 1952
Местоположение: Варна
Мнение Re: Zilog - Z8 Encore! F083A Series
Metyyy написа:
Ще последва серия от глупави въпроси :oops: , но искам първо да си изясня частта с таймера, че малко се пообърках:

Да,
виждам, че нещо бъркаш. Първо оправи сметката за T1PERIOD:
(20000000/16) - честота на която брои таймера в [Hz]
(20000000/16)/1000 - брой "тикове" на таймера за 1 [ms]
20*(20000000/16)/1000 - брой "тикове" на таймера за 20 [ms]
20*(20000000/16)/1000 = 25000, което е 0x61A8
От къде дойде това 38824 в твоите коментари?!?

20 [ms] са сложени на око. Като за първи опит би трябвало да е добре. По важното е че това е дефиниран в програмата параметър. Изнесен е на едно място в тази макродефиниция:
Код:
#define DISPLAY_REFRESH_PERIOD_ms (20)

и когато решиш да го донастроиш, е достатъчно да промениш само нея. С което всички места в сорс кода, които зависят от нея автоматично ще се променят при следващото компилиране.
Понеже програмката е простичко написана има и ограничения - не може да избереш произволно число за DISPLAY_REFRESH_PERIOD
Препоръчително е да е между 5 и 52. Ако сложиш по-голямо число от 52, за T1PERIOD ще получиш число извън обхвата на 16 бита. Т.е. за 16 битов таймер толкова. Но таймера има прескейлър и може да се варира и с него, изнесен е като параметър T1_PRES.
Като за първи опит се довери на това което съм избрал:
Код:
#define DISPLAY_REFRESH_PERIOD_ms (20)
#define T1_PRES (0x04)

Ще ти свършат работа.

Всички тези макродефиниции започващи с #define се измислят от пишещия програмата. Това предполагам го знаеш?
С макродефиници може да си сътвориш нещо като измислен твой простичък език - помощно средство. За това е добре имената в макродефиниициите да са описателни и точни. Да не създават излишни двусмислия.
Ако това е ново за теб прочети за "С препроцесор"-а.

И сега по-важния и по кратък отговор на въпроса защо периода се смята така, а не така както ти предполагаш?
: В микроконтролера времето се брои в "тикове", "клокове". Това е мерната единица. По-описателно би било вместо T1PERIOD макродефинираното име да е: T1PERIOD_in_ticks. Но пък става прекалено дълго.

_________________
Най-опасният враг на истината и свободата е мнозинството.


Нед Дек 02, 2018 5:05 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Съб Ное 22, 2014 6:23 pm
Мнения: 48
Мнение Re: Zilog - Z8 Encore! F083A Series
Zdrav, много ти благодаря ! Така подробно обяснено е много по-ясно :)

Аз си водя записки и го смятах някак си малко по-различно. Описаното по-долу е друг пример, валиден ли е ? :

Системна честота - 20MHz => Честота на таймера - 20MHz / 128 (prescaler) = 156250Hz (156.25KHz) => Периода на таймера - 1 / 156250 = 0.0000064s или 6.4us => Таймера се увеличава с 1 на всеки 6.4us.

Ние имаме 16 битов таймер, който брои до 65535 ---> Максималното време на препълване на таймера е: 65535 * 0.0000064 = 420ms или максималното време за което, може да имаме прекъсване е 420ms (приблизително) т.е.. периодът на правоъгълните импулси ще бъде 420ms * 2 = 840ms (1.2Hz).

За 5s ми трябва число кратно на 5 и по-малко от 420ms (0.42s) => За да получа 200ms, брояча трябва да изброи: 200 000 / 6.4 = 31 250 пъти (периода). Това ми е коефициента на таймера, демек ще брои от 0 до 31 250.

=> За 200ms ---> 25 прекъсвания ---> 5s



Това с define-те го знам, чел съм на тази тема и е доста полезно (все пак ще се върна да си опресня знанията).

Сега, аз отново имам въпроси...сигурно не учудвам никой :D

Код:

Тази функция, честно да си призная не разбирам какво прави - пробвах и с нея и без нея...разлика не виждам.

Виждам, че е цикъл, който следи за индикаторите и не би ли трябвало да изписва "Е" на всеки един от тях, преди да се появи стойността.

Променливата Ind_i не разбирам, за какво служи и защо я нулираме ?



void Display_Init(void)
{
    uint8 i;
   
    for(i = 0; i < INDICATORS_NUM; i++)
    {
        Ind_digit[i] = LED_DIGIT_ERROR;
    }

    Ind_i = 0;
}



Код:

Тук тази функция, изписва числото на дисплея, всъщност за първи път виждам for цикъл, при който имаме разделение със запетайка, явно може - (i++,value /= 10). При мен във функцията, това SendToIndicator3(value / 100 % 10) се дели и на 100, а тук само на 10 ?

void SendToDisplay(uint16 value)
{
    uint8 i;
   
    for(i = 0; i < INDICATORS_NUM; i++,value /= 10)
    {
        Ind_digit[i] = value % 10;
    }
}



Код:

Прав ли съм за описаното по-долу ?

void interrupt Timer1_ISR(void) _At TIMER1
{
    uint8 i;

    PBOUT &= ~((1 << 5) | (1 << 4) | (1 << 3)); /* (Препоръчително) Трябва да изгасим 2 и 3-ти индикатор (4 и 5), а също
   и 1 (3) преди да заредим новата стойност за изобразяване */

    i = Ind_i % INDICATORS_NUM; /* 0 % 3 = 0 - нулевият индикатор, т.е. първият */
    PCOUT = ConvertTo7SegIndValue(Ind_digit[i]); /* Тук изпълни функцията с нулевият елемент, т.е. първият */

    PBOUT |= (1 << (i + 3)); /* За да се появи цифрата на индикатора обаче, е нужно да свържем катода K1 към маса. За целта трябва
   да включим цифровия ключ Q1. */

    Ind_i = i + 1; /* Тук увеличаваме i да премине към следващият индикатор */
}



Код:

Това е целият сорс с малко поправки относно регистрите, като цяло работи, но дори сега мига много повече отколкото преди. Странно...

#include <ez8.h> /* Този хедър позволява да достъпваме вътрешните регистри като всички останали, чрез имената им. */
#include "stdtypes.h"

#define LED_DIGIT_0     (0x3F)
#define LED_DIGIT_1     (0x06)
#define LED_DIGIT_2     (0x5B)
#define LED_DIGIT_3     (0x4F)
#define LED_DIGIT_4     (0x66)
#define LED_DIGIT_5     (0x6D)
#define LED_DIGIT_6     (0x7D)
#define LED_DIGIT_7     (0x07)
#define LED_DIGIT_8     (0x7F)
#define LED_DIGIT_9     (0x6F)
#define LED_DIGIT_DP    (0x80)
#define LED_DIGIT_ERROR (0x79)

#define T0CAP_LOW               (0)
#define T0CAP_HIGH              (1)

#define FIFO_SIZE               (16)
#define Tov                     ((uint16)65535) /* Съдържа времето за препълване на таймера */

#define FSYS                    ((uint32)20000000)
#define T1_PRES  (0x04) /* (0x04) е 0100 = prescaler 16 */
#define T1_CLK   (FSYS / (1 << T1_PRES)) /* Честота на таймера - 20MHz / 16 (prescaler) = 1 250 000Hz (1250KHz) */
#define T1PERIOD (DISPLAY_REFRESH_PERIOD_ms * T1_CLK / 1000) /* Брой "тикове" на таймера за 20 [ms] */

#define DISPLAY_REFRESH_PERIOD_ms (20)
#define DUTY_VALUE_READING_TIME   (25)

#define INDICATORS_NUM (3)

extern void Display_Init(void);
extern void PortConfig(void);
extern void InterruptConfig(void);
extern void Timer0_Config(void);
extern void Timer1_Config(void);
extern void SendToDisplay(uint16 value);
static uint8 ConvertTo7SegIndValue(uint8 value);

volatile uint8 overflow_count = 0; /* Брояч на препълванията на таймера*/
volatile uint32 t_interval[2][FIFO_SIZE]; /* Двумерен масив - т.е. 2 едномерни масива с по 16 елемента */
volatile uint8 head_i; /* Индекс на масива, който вкарва нови данни */

const uint8 arr7SegIndValues[] =
   {
      LED_DIGIT_0,
      LED_DIGIT_1,
      LED_DIGIT_2,
      LED_DIGIT_3,
      LED_DIGIT_4,
      LED_DIGIT_5,
      LED_DIGIT_6,
      LED_DIGIT_7,
      LED_DIGIT_8,
      LED_DIGIT_9
   };

volatile uint8 Ind_i;
volatile uint8 Ind_digit[INDICATORS_NUM]; /* Едномерен масив с 3 елемента (това са индикаторите на дисплея) */

void interrupt Timer0_ISR(void) _At TIMER0
{
   uint16 Tcap; /* Прехваната стойност */

    if(0 == (T0CTL0 & (1 << 0))) /* Прекъсване от препълване? */
    {/* Да */
        overflow_count ++; /* Увеличаване на брояча на препълванията */
    }
   
    else
    {/* Не,прекъсване от прехващане */
        Tcap = ((uint32)T0PWMH << 8 | T0PWML); /* Прочитаме записаната стойност в (PWMH,PWML) и я присвояваме на Tcap */

        if(0 == (T0CTL1 & (1 << 6))) /* Прекъсване от нарастващ фронт ? */
        {/* Да */
            T0CTL1 |= 1 << 6; /* Превключване към падащ фронт */
         
            t_interval[T0CAP_LOW][head_i % FIFO_SIZE] = Tcap + overflow_count * Tov; /* Изчислената стойност (Tcap + overflow_count * Tov)
         на ниското ниво се записва в първият елемент (с индекс 0) на едномерният масив (T0CAP_LOW) */
         
            head_i++; /* Увеличаваме индекса на масива, който вкарва данните */
        }

        else
        {/* Не, прекъсване от падащ фронт ? */
            T0CTL1 &= ~(1 << 6); /* Превключване към нарастващ фронт */
         
            t_interval[T0CAP_HIGH][head_i % FIFO_SIZE] = Tcap + overflow_count * Tov; /* Изчислената стойност (Tcap + overflow_count * Tov)
         на високото ниво се записва в първият елемент (с индекс 0) на едномерният масив (T0CAP_HIGH) */
        }
      
      overflow_count = 0; /* Нулиране на брояча на препълванията*/
    }
}

void interrupt Timer1_ISR(void) _At TIMER1
{
    uint8 i;

    PBOUT &= ~((1 << 5) | (1 << 4) | (1 << 3)); /* (Препоръчително) Трябва да изгасим 2 и 3-ти индикатор (4 и 5), а също
   и 1 (3) преди да заредим новата стойност за изобразяване */

    i = Ind_i % INDICATORS_NUM;
    PCOUT = ConvertTo7SegIndValue(Ind_digit[i]);

    PBOUT |= (1 << (i + 3)); /* За да се появи цифрата на индикатора обаче, е нужно да свържем катода K1 към маса. За целта трябва
   да включим цифровия ключ Q1. */

    Ind_i = i + 1;
}

int main(void)
{
   uint16 DutyCycle = 0; /* Коефициент на запълване */
   uint8 i = DUTY_VALUE_READING_TIME; /* Време за изчитане на нова стойност на DutyCycle */
   uint32 t_h; /* Високо ниво на сигнала */
    uint32 t_l; /* Ниско ниво на сигнала */
   uint8 tail_i; /* Индекс на масива, който изважда данните */
   uint32 T = 0; /* Период на сигнала */
   
   head_i = 0; /* Нулираме индекса, който вкарва нови данни */
    tail_i = 0; /* Нулираме индекса, който изважда данните */
   
   Display_Init();
   PortConfig();
   InterruptConfig();
   Timer1_Config();
   Timer0_Config();
   
   while(1)
   {
      if(i != 0)
      {
         if(head_i != tail_i) /* Ако стойността на вкараните данни е различна от стойността на извадените */
            {
                t_h = t_interval[T0CAP_HIGH][tail_i % FIFO_SIZE]; /* Стойността, която е в първият елемент (с индекс 0) на едномерният
            масив (T0CAP_LOW) се присвоява на t_h */
                t_l = t_interval[T0CAP_LOW][tail_i % FIFO_SIZE]; /* Стойността, която е в първият елемент (с индекс 0) на едномерният
            масив (T0CAP_LOW) се присвоява на t_h */
            
            tail_i++; /* Увеличаваме индекса на масива, който изважда данните */
         }
         
         i--;
      }
      
      else
      {
         T  = t_h + t_l; /* Изчисляване на периода */
         
         if(0 != T) /* Ако 0 е различно от стойността на периода */
            {
            DutyCycle = (t_h * 100) / T; /* Изчисляване на коефициента на запълване */
         }
         
         SendToDisplay(DutyCycle);

            i = DUTY_VALUE_READING_TIME; /* Презареждане на времето за изчитане на нова стойност на DutyCycle */
      }
   }
}

void PortConfig(void)
{
   PADD |= (1 << 0); /* Таймерният вход T0IN (извод PA0) е свързан към изхода на генератор на правоъгълни импулси. */
   
   PCOUT = 0x00; /* (Препоръчително) Трябва да изгасим сегментите на дисплея, преди да конфигурираме пиновете като изходи */
   PCDD = 0x00; /* (Анодите) Конфигурираме всички пинове на порт C като изходи */
   
   PBOUT &= ~((1 << 3) | (1 << 4) | (1 << 5)); /* (Препоръчително) Трябва да изгасим сегментите на дисплея, преди да
   конфигурираме пиновете като изходи */
   PBDD &= ~((1 << 3) | (1 << 4) | (1 << 5)); /* (Катодите) Конфигурираме 3, 4 и 5-ти пин като изходи */
}

void InterruptConfig(void)
{
   /* Разрешаване на прекъсването от Таймер0 */
   IRQ0ENL |= 1 << 5; /* Т0 софтуерен приоритет - Ниво 3 (високо) */
   IRQ0ENH |= 1 << 5; /* Т0 софтуерен приоритет  - Ниво 3 (високо) */
   
   /* Разрешаване на прекъсването от Таймер1 */
   IRQ0ENH &= ~(1 << 6); /* T1 софтуерен приоритет - Ниво 1 (ниско) */
    IRQ0ENL |= (1 << 6); /* Т1 софтуерен приоритет - Ниво 1 (ниско) */
   
   IRQCTL |= 1 << 7;
}

void Timer0_Config(void)
{
   /* Нулиране на таймерните регистри */
   T0H = 0x00;
   T0L = 0x00;
   
   /* Зареждане на максималната броячна стойност */
   T0RH = 0xFF;
   T0RL = 0xFF;
   
   /*---------------------------------*/
   /* - Прехващане/сравнение */
   /* - Активен нарастващ фронт */
   /* - Коефициент на деление 1 */
   /* - Стартиране на таймера */
   /*---------------------------------*/
   
   T0CTL0 = 0x00; /* Конфигуриране на прекъсването от таймера - Прекъсване при презареждане (препълване), сравнение и прехващане */
   T0CTL1 = 0x87;
}

void Timer1_Config(void)
{
   /* Нулиране на таймерните регистри */
   T1H = 0x00;
   T1L = 0x00;
   
   T1RH = (T1PERIOD >> 8); /* В старшият байт се записва стойността: "61" */
    T1RL = (T1PERIOD & 0xFF); /* В младшият байт се записва стойността: "A8" */
   
    T1CTL0 = (0x03 << 5); /* Конфигуриране на прекъсването от таймера - Прекъсване при презареждане (препълване)/сравнение */
    T1CTL1 = (T1_PRES << 3) | (0x01 << 0) | (1 << 7); /* Коефициент на деление 16 | continuous mode на таймера |
   стартиране на таймера */
}

void SendToDisplay(uint16 value)
{
    uint8 i;
   
    for(i = 0; i < INDICATORS_NUM; i++,value /= 10)
    {
        Ind_digit[i] = value % 10;
    }
}

static uint8 ConvertTo7SegIndValue(uint8 value)
{
   return (value > 9) ? LED_DIGIT_ERROR : arr7SegIndValues[value]; /* Ако параметърът value е по-голям от 9 или по-малък от 0, функцията
   връща код за грешка LED_DIGIT_ERR, в противен случай връща arr7SegIndValues[value] */
}

void Display_Init(void)
{
    uint8 i;
   
    for(i = 0; i < INDICATORS_NUM; i++)
    {
        Ind_digit[i] = LED_DIGIT_ERROR;
    }

    Ind_i = 0;
}



Вто Дек 04, 2018 8:03 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 26, 2005 1:01 pm
Мнения: 1952
Местоположение: Варна
Мнение Re: Zilog - Z8 Encore! F083A Series
То хубаво е да искаш обяснения и коментари на всеки ред, но кой има време за това в днешно време. Да не говорим, че прекаляването с коментарите е нож с две остриета. Сорс кода не се пише с длето върху камък. И при следващата промяна някой ще промени сорса, но ще забрави да промени коментарите. И ще излязат от синхрон. Разбирай няма да са верни. Така че свиквай с малко коментари. И с малко обяснения.
Да не говорим, че не всичко може да се напише със сорс и с коментари. Налага се да четеш и между редовете.

Примера с конфигуриране на таймер за който питаш дали е валиден или не. Аз да те накарам ли да сложиш сега коментари към всеки твой ред обяснения?!? Но да, разбирам с разни подразбирания за какво иде реч - валиден е.

Сега към въпросите:
DisplayInit() бях написал че не е задължително да се ползва. Но е добър навик да мислиш за инициализацията на всички променливи. Задължително е. В случая сорса е написан така, че може и без тази функция. Правилно си забелязал. Но пък едно извикване в самото начало, какво те бърка? Нали не говорим за "оптимизирани върхови постижения", а за "добри практики".

Имам следната молба: намали DISPLAY_REFRESH_PERIOD_ms. Намали го до 1 [ms] дори. И виж и кажи какъв е резултата.
Друга причина да се виждат дефекти по изобразяваната стойност може да е заради липсата на защита за Ind_digit[], знам ли?!?
Ти си моите очи и уши, нямам платка с този процесор. И компилатор нямам дори.
Може да пробваш също така да размениш приоритетите на прекъсванията на двата таймера. T0 да стане "low priority", а Т1 да стане "high priority".
С тези две промени със сигурност ще видиш разлика в качеството на опресняване на индикаторите.

_________________
Най-опасният враг на истината и свободата е мнозинството.


Вто Дек 04, 2018 9:26 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 8:21 pm
Мнения: 27949
Местоположение: София
Мнение Re: Zilog - Z8 Encore! F083A Series
дефектите може да са чисто визуално възприятие, ако негасиш диодите за достатъчно дълго време между две цифри.
За онзи въпрос, защо делиш само на 10, защото го правиш в цикъл а не в линеен код, ако имаш 123 при първото завъртане ще е 123 и долу като имаш модулно делене ще върне 3, при второто оабче вече ще е 12, и след модулното делене ще върне 2 и т.н. ..


Вто Дек 04, 2018 10:24 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Съб Ное 22, 2014 6:23 pm
Мнения: 48
Мнение Re: Zilog - Z8 Encore! F083A Series
Извинявам се за закъснелият reply ! Нямах никакво време да прегледам задачката и да пробвам някои варианти.

Искам да попитам нещо относно Таймер 0:

1. Нали той отговаря за прехващането и ако сменям стойностите на RH и RL, дефакто ще се променя периода на таймера и той ще прекъсва на 3 ms или 10 ms и т.н. и ще = > прехващане. Аз трябва да го определя, но дали случайно има някакъв точен начин или не ?

Zdrav, промених стойността на 1 ms и работи перфектно (няма мигане, няма нищо). Всъщност и на 5 ms работи. Тук имам въпрос - до колкото разбирам честотата трябва да е по малка (затова делим 20 000 000 / 16) и да сложим стойност на тика на таймера също да е по-малка, защото при голяма честота и малка стойност на тика на таймера, нещата не се получават. Това пак азго определям, но има ли точен начин отново или не ? Въпрос на напасване... ?

Тони, благодаря ти за обяснението за цикъла, схванах логиката и си абсолютно прав :)

Последен въпрос: Ind_i, я разбирам като спомагателна променлива, която служи за увеличаване на "i", демек превключване между трите индикатора. Нали така ?

Като цяло, логиката не цялата програмка я схванах, поне така си мисля и ми допада доста като идея за реализиране :)


Съб Дек 08, 2018 7:36 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 26, 2005 1:01 pm
Мнения: 1952
Местоположение: Варна
Мнение Re: Zilog - Z8 Encore! F083A Series
Metyyy написа:
..., но има ли точен начин отново или не ? Въпрос на напасване... ?.

Точен начин има, но когато валидните решения са повече от едно, накрая ти избираш едно от тях според случая. Понякога и с напасване.
В случая правилото е да балансираш между време за препълване на таймера и прецизност на генерирания период или прехваната стойност.
Metyyy написа:
Последен въпрос: Ind_i, я разбирам като спомагателна променлива, която служи за увеличаване на "i", демек превключване между трите индикатора. Нали така ?

По скоро i е спомагателна променлива с цел да се помогне на компилатора, леко да оптимизира точно в тази част на програмата. Защото Ind_i е обявена като volatile, което ще удря през пръстите компилатора, когато се замисли за оптимизиране. В случая тази хватка с i и Ind_i e само демонстрация на финтове. Разбира се ще забележиш разликата само ако разгледаш какъв машинен код е надробил компилатора в тази част.
Между впрочем какъв компилатор ползваш за този микроконтролер?

_________________
Най-опасният враг на истината и свободата е мнозинството.


Съб Дек 08, 2018 9:05 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Съб Ное 22, 2014 6:23 pm
Мнения: 48
Мнение Re: Zilog - Z8 Encore! F083A Series
Zilog предоставя напълно безплатно развойната среда Zilog Developer Studio II (ZDS II) за програмиране на микороконтролерите Z8Encore!. Тази среда предоставя всичко необходимо (текстов редактор, асемблер и С компилатор) за написването, тестването и дебъгването на асемблерни и С програми.

Благодаря, Zdrav ! Сега, мисля да се захващам с разучаване на АЦП. Там май е още по тегаво :))


Съб Дек 08, 2018 10:07 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 26, 2005 1:01 pm
Мнения: 1952
Местоположение: Варна
Мнение Re: Zilog - Z8 Encore! F083A Series
Това Zilog Developer Studio много прилича на KEIL-ското uVision, май KEIL имат пръст тука.
Като за първо пускане, да тръгне някакси, АЦП-то е тривиално. Трябва само да прочетеш документацията на 2-3 паса.
Като почне да се вдига летвата, тогава ще трябва по-подробно четене.

_________________
Най-опасният враг на истината и свободата е мнозинството.


Нед Дек 09, 2018 3:45 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Съб Ное 22, 2014 6:23 pm
Мнения: 48
Мнение Re: Zilog - Z8 Encore! F083A Series
Не бях чувал за uVision, но е сега погледнах какво представлява и си прав, има голяма прилика :)) Относно АЦП-то, вчера му го хвърлих един бърз поглед и ми се струва малко тегавичко, със сигурност пак ще досаждам, но вече в друга тема :)) Благодаря, отново !


Вто Дек 11, 2018 7:39 am
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 55 мнения ]  Отиди на страница Предишна  1, 2, 3, 4

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 2 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни