Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Продукция MICROCHIP

Продукция MICROCHIP Технические вопросы по всей продукции Microchip

Ответ
 
Опции темы Опции просмотра
Старый 27.09.2019, 16:05   #1
YBosco
Member
 
Регистрация: 26.11.2013
Адрес: Moscow
Сообщений: 61
Вес репутации: 104/23
YBosco will become famous soon enoughYBosco will become famous soon enough
По умолчанию Как правильно читать флаги в PIR1?

Контроллер PIC18F45K80.
XC8.

Требуется отправлять на UART по-байтно данные. Пытаюсь прочитать состояние регистра PIR1, точнее конкретный бит, вот в такой форме:

while (!PIR1bits.TX1IF) continue;

А компилятор пишет, что не может идентифицировать PIR1bits.TX1IF. Хотя в файле пред-компиляции записано вот это:

extern volatile unsigned char PIR1 __attribute__((address(0xF9E)));

__asm("PIR1 equ 0F9Eh");


typedef union {
struct {
unsigned TMR1IF :1;
unsigned TMR2IF :1;
unsigned TMR1GIF :1;
unsigned SSPIF :1;
unsigned TX1IF :1;
unsigned RC1IF :1;
unsigned ADIF :1;
unsigned PSPIF :1;
};

Ошибки нет, но после компиляции вывод данных идёт через один символ.

Не пойму, в чём проблема.
YBosco вне форума   Ответить с цитированием
Старый 27.09.2019, 19:48   #2
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 32
Сообщений: 2,167
Вес репутации: 4017/88
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: Как правильно читать флаги в PIR1?

YBosco
приведите завязанный на проблему код, если хотите быстро получить ответы на свои вопросы.
besogon вне форума   Ответить с цитированием
Старый 30.09.2019, 09:30   #3
Рак
Senior Member
 
Регистрация: 02.04.2008
Адрес: Кременчуг
Возраст: 33
Сообщений: 1,378
Вес репутации: 2432/80
Рак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond repute
По умолчанию Re: Как правильно читать флаги в PIR1?

Цитата:
Сообщение от YBosco Посмотреть сообщение
Контроллер PIC18F45K80.
XC8.

Требуется отправлять на UART по-байтно данные. Пытаюсь прочитать состояние регистра PIR1, точнее конкретный бит, вот в такой форме:

while (!PIR1bits.TX1IF) continue;

А компилятор пишет, что не может идентифицировать PIR1bits.TX1IF. Хотя в файле пред-компиляции записано вот это:

extern volatile unsigned char PIR1 __attribute__((address(0xF9E)));

__asm("PIR1 equ 0F9Eh");


typedef union {
struct {
unsigned TMR1IF :1;
unsigned TMR2IF :1;
unsigned TMR1GIF :1;
unsigned SSPIF :1;
unsigned TX1IF :1;
unsigned RC1IF :1;
unsigned ADIF :1;
unsigned PSPIF :1;
};

Ошибки нет, но после компиляции вывод данных идёт через один символ.

Не пойму, в чём проблема.
Попробуй так
Код:
while(!(PIR1 & (1 << 4)));
У меня тоже с xc8 v.2.05 случаются такие траблы. Например там вообще не описана часть портов для pi18f25k80, нет битов флагов прирываний от модуля can по приёму сообщений.
Рак вне форума   Ответить с цитированием
Старый 30.09.2019, 10:14   #4
YBosco
Member
 
Регистрация: 26.11.2013
Адрес: Moscow
Сообщений: 61
Вес репутации: 104/23
YBosco will become famous soon enoughYBosco will become famous soon enough
По умолчанию Re: Как правильно читать флаги в PIR1?

Цитата:
Сообщение от Рак Посмотреть сообщение
У меня тоже с xc8 v.2.05 случаются такие траблы. Например там вообще не описана часть портов для pic18f25k80, нет битов флагов прерываний от модуля can по приёму сообщений.
Т.е. это про бесплатный сыр, получается? А в платной версии та же проблема, не в курсе? Или нужно уходить из этой версии С? Что можете посоветовать?

Я на С не писал. Тут нужда заставила, пытаюсь транслировать рабочий код, и вот такие перлы.

А за совет спасибо, попробую. К сожалению, сейчас не могу, но отпишусь.
YBosco вне форума   Ответить с цитированием
Старый 30.09.2019, 10:38   #5
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 32
Сообщений: 2,167
Вес репутации: 4017/88
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: Как правильно читать флаги в PIR1?

YBosco
Или нужно уходить из этой версии С? - непосредственно к компилятору это отношения не имеет: это проблема периферийной библиотеки. у microchip ee лучше не использовать.
besogon вне форума   Ответить с цитированием
Старый 30.09.2019, 10:40   #6
YBosco
Member
 
Регистрация: 26.11.2013
Адрес: Moscow
Сообщений: 61
Вес репутации: 104/23
YBosco will become famous soon enoughYBosco will become famous soon enough
По умолчанию Re: Как правильно читать флаги в PIR1?

Цитата:
Сообщение от besogon Посмотреть сообщение
YBosco
это проблема периферийной библиотеки. у microchip ee лучше не использовать.
Почти как в "Собачьем сердце", но другой ведь нет?
Что имеете ввиду?
YBosco вне форума   Ответить с цитированием
Старый 30.09.2019, 10:40   #7
Рак
Senior Member
 
Регистрация: 02.04.2008
Адрес: Кременчуг
Возраст: 33
Сообщений: 1,378
Вес репутации: 2432/80
Рак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond repute
По умолчанию Re: Как правильно читать флаги в PIR1?

Цитата:
Сообщение от YBosco Посмотреть сообщение
Т.е. это про бесплатный сыр, получается? А в платной версии та же проблема, не в курсе? Или нужно уходить из этой версии С? Что можете посоветовать?

Я на С не писал. Тут нужда заставила, пытаюсь транслировать рабочий код, и вот такие перлы.

А за совет спасибо, попробую. К сожалению, сейчас не могу, но отпишусь.
Хидер файлы там одни для платной и бесплатной версии. Наверное, потихоньку заставляют всех пользоваться битовыми структурами. У меня много кода сейчас портируется с Hitech на XC8, а там почти всё через битовые определения работает. По моему мнению, битами удобнее пользоваться, чем битовыми структурами. Для битовых структур важно помнить имя регистра, в котором данный бит находится, для битового определения не нужно.
Рак вне форума   Ответить с цитированием
Старый 30.09.2019, 10:44   #8
YBosco
Member
 
Регистрация: 26.11.2013
Адрес: Moscow
Сообщений: 61
Вес репутации: 104/23
YBosco will become famous soon enoughYBosco will become famous soon enough
По умолчанию Re: Как правильно читать флаги в PIR1?

Цитата:
Сообщение от Рак Посмотреть сообщение
По моему мнению, битами удобнее пользоваться, чем битовыми структурами. Для битовых структур важно помнить имя регистра, в котором данный бит находится, для битового определения не нужно.
Логично, но компилятор ничего не знает про TX1IF. На это имя ругается.
YBosco вне форума   Ответить с цитированием
Старый 30.09.2019, 11:06   #9
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 32
Сообщений: 2,167
Вес репутации: 4017/88
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: Как правильно читать флаги в PIR1?

YBosco
у Вас есть datasheet и Вы вполне можете составить то, что Вам нужно так, как Вам нужно самостоятельно.
ну или поправить то, что Вам не нравится в заголовке от microchip.

наверняка у каждого из компиляторов для pic14/pic16 свои файлики и вполне может быть, что у какого-то в них ошибок меньше.

Рак
заставляют всех пользоваться битовыми структурами. - приходят с вилами и факелами.

у меня сложилось впечатление, что добрые друзья из microchip хотят чтобы все наконец-то прекратили использовать pic14/pic16.

месяц назад пытался выяснить, осилили ли в конце 2019 в xc8 стандарт с90. не осилили. sdcc пытается как-то в C2X, xc8 пытается осилить c90.
besogon вне форума   Ответить с цитированием
Старый 30.09.2019, 11:28   #10
YBosco
Member
 
Регистрация: 26.11.2013
Адрес: Moscow
Сообщений: 61
Вес репутации: 104/23
YBosco will become famous soon enoughYBosco will become famous soon enough
По умолчанию Re: Как правильно читать флаги в PIR1?

Цитата:
Сообщение от besogon Посмотреть сообщение
YBosco
у меня сложилось впечатление, что добрые друзья из microchip хотят чтобы все наконец-то прекратили использовать pic14/pic16.
При чём тут pic14/pic16? Ясно же написано, о каком контроллере речь.
YBosco вне форума   Ответить с цитированием
Старый 30.09.2019, 12:58   #11
al.kl
Senior Member
 
Регистрация: 11.10.2011
Возраст: 24
Сообщений: 298
Вес репутации: 862/40
al.kl is a splendid one to beholdal.kl is a splendid one to beholdal.kl is a splendid one to beholdal.kl is a splendid one to beholdal.kl is a splendid one to beholdal.kl is a splendid one to beholdal.kl is a splendid one to behold
Отправить сообщение для al.kl с помощью ICQ
По умолчанию Re: Как правильно читать флаги в PIR1?

У человека косяк в программе, а ему полстраницы понаписали про какие-то биты, которые типа кривые у Микрочипа.
Причём тут вообще биты, если программа компилируется и кое-как, но работает ? И, тем более, хидеры Микрочипа ?
Может дело в "руках" ?
al.kl вне форума   Ответить с цитированием
Старый 30.09.2019, 13:01   #12
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 32
Сообщений: 2,167
Вес репутации: 4017/88
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: Как правильно читать флаги в PIR1?

al.kl
чаще прочего в руках.
YBosco
выложите кусок кода в котором сомневаетесь.
besogon вне форума   Ответить с цитированием
Старый 30.09.2019, 13:37   #13
YBosco
Member
 
Регистрация: 26.11.2013
Адрес: Moscow
Сообщений: 61
Вес репутации: 104/23
YBosco will become famous soon enoughYBosco will become famous soon enough
По умолчанию Re: Как правильно читать флаги в PIR1?

Цитата:
Сообщение от besogon Посмотреть сообщение
al.kl
YBosco
выложите кусок кода в котором сомневаетесь.
Да какой там кусок кода?

TXREG1 = 0x39;
while(!PIR1bits.TX1IF)continue;

Всё.

Стоят в тестовом режиме три раза по 2 таких строки. Выводятся 1 и 3 байты. 2-й исчезает. Если добавляю задержку 100 мкс перед следующей записью в регистр TX (без while), то всё работает. Отсюда делаю вывод, что строка "while... " не функционирует вообще. Да и выводятся не строки, а чисто значения от 0 до 255.

Переделку по совету ещё не делал, не до этого. :-(

Я специально игнорируют функции типа printf. Уж больно много жрёт памяти. Есть, чем заполнить и так.
YBosco вне форума   Ответить с цитированием
Старый 30.09.2019, 14:17   #14
Рак
Senior Member
 
Регистрация: 02.04.2008
Адрес: Кременчуг
Возраст: 33
Сообщений: 1,378
Вес репутации: 2432/80
Рак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond repute
По умолчанию Re: Как правильно читать флаги в PIR1?

Цитата:
Сообщение от al.kl Посмотреть сообщение
У человека косяк в программе, а ему полстраницы понаписали про какие-то биты, которые типа кривые у Микрочипа.
Причём тут вообще биты, если программа компилируется и кое-как, но работает ? И, тем более, хидеры Микрочипа ?
Может дело в "руках" ?
Если бит готовности к передаче еще одного байта прописан не там, то он ждать не будет.
Рак вне форума   Ответить с цитированием
Старый 30.09.2019, 14:18   #15
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 32
Сообщений: 2,167
Вес репутации: 4017/88
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: Как правильно читать флаги в PIR1?

Код:
TXREG1 = 0x39;
while(!PIR1bits.TX1IF)continue;
уберите continue и попробуйте.

покажите disasm функции.
besogon вне форума   Ответить с цитированием
Старый 30.09.2019, 14:54   #16
Рак
Senior Member
 
Регистрация: 02.04.2008
Адрес: Кременчуг
Возраст: 33
Сообщений: 1,378
Вес репутации: 2432/80
Рак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond repute
По умолчанию Re: Как правильно читать флаги в PIR1?

Я прозевал момент, TX1IF - это флаг прерывания, а не готовности. Его нужно сбросить после того как он станет в 1.
Рак вне форума   Ответить с цитированием
Старый 30.09.2019, 17:00   #17
Greg
Super Moderator
 
Регистрация: 25.02.2007
Адрес: Moscow, ODBS
Сообщений: 6,885
Вес репутации: 5553/170
Greg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond repute
По умолчанию Re: Как правильно читать флаги в PIR1?

Цитата:
Сообщение от Рак Посмотреть сообщение
Я прозевал момент, TX1IF - это флаг прерывания, а не готовности. Его нужно сбросить после того как он станет в 1.
это же 18 пик
...he UxTXIF bit is read-only and cannot beset or cleared by software...
Greg вне форума   Ответить с цитированием
Старый 30.09.2019, 17:06   #18
YBosco
Member
 
Регистрация: 26.11.2013
Адрес: Moscow
Сообщений: 61
Вес репутации: 104/23
YBosco will become famous soon enoughYBosco will become famous soon enough
По умолчанию Re: Как правильно читать флаги в PIR1?

Цитата:
Сообщение от Рак Посмотреть сообщение
Я прозевал момент, TX1IF - это флаг прерывания, а не готовности. Его нужно сбросить после того как он станет в 1.
Да есть сброс, есть. Я не привёл его.

Мы ушли от темы.

Я задал вопрос, как правильно обращаться к битам регистра PIR1 в C. А начали обсуждать код. Меня в целом вопрос интересует. Я удивился, что в С так странно с этим.
Я писал на таком языке, где запись PIR1.2 означает, обращение ко 2-му биту регистра PIR1, и всё. Очень легко.

Сейчас добрался до MPLABX, и о, чудо! Ругань компилятора исчезла! Ничего не делал, честное слово. Только обсуждал. Странно.

Но изначальный вопрос остался.
YBosco вне форума   Ответить с цитированием
Старый 30.09.2019, 17:09   #19
YBosco
Member
 
Регистрация: 26.11.2013
Адрес: Moscow
Сообщений: 61
Вес репутации: 104/23
YBosco will become famous soon enoughYBosco will become famous soon enough
По умолчанию Re: Как правильно читать флаги в PIR1?

Цитата:
Сообщение от Greg Посмотреть сообщение
это же 18 пик
...he UxTXIF bit is read-only and cannot beset or cleared by software...
Правильно, стоим и ждём, пока он сам встанет в "1".
YBosco вне форума   Ответить с цитированием
Старый 30.09.2019, 17:30   #20
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 32
Сообщений: 2,167
Вес репутации: 4017/88
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: Как правильно читать флаги в PIR1?

YBosco
попробуйте всё же убрать continue и выложить Ваш код со строками и disasm.
besogon вне форума   Ответить с цитированием
Старый 30.09.2019, 17:51   #21
Greg
Super Moderator
 
Регистрация: 25.02.2007
Адрес: Moscow, ODBS
Сообщений: 6,885
Вес репутации: 5553/170
Greg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond repute
По умолчанию Re: Как правильно читать флаги в PIR1?

Цитата:
Сообщение от YBosco Посмотреть сообщение
Да есть сброс, есть. Я не привёл его.
Мы ушли от темы.
чего вы там собрались "приводить"? нету, не бывает никакого сброса этого бита. это невозможно.
Greg вне форума   Ответить с цитированием
Старый 01.10.2019, 10:33   #22
YBosco
Member
 
Регистрация: 26.11.2013
Адрес: Moscow
Сообщений: 61
Вес репутации: 104/23
YBosco will become famous soon enoughYBosco will become famous soon enough
По умолчанию Re: Как правильно читать флаги в PIR1?

Цитата:
Сообщение от Рак Посмотреть сообщение
Попробуй так
Код:
while(!(PIR1 & (1 << 4)));
На такой текст компилятор не ругается, но помогло только введение символической задержки после оператора записи в регистр TX. Тогда работает как должно.

Для заинтересованных привожу исходники. Не уверен, что *.lst, это то, что нужно.
Вложения
Тип файла: rar F45K80_main.rar (7.7 Кб, 11 просмотров)
YBosco вне форума   Ответить с цитированием
Старый 01.10.2019, 14:33   #23
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 32
Сообщений: 2,167
Вес репутации: 4017/88
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: Как правильно читать флаги в PIR1?

YBosco
У Вас же был в целом правильный пример кода передачи.
Код:
void UART_PutC(const char data)
{
    while (TXSTA1bits.TRMT == 0);  // wait for transmit shift register to be empty
    TXREG = data;       // update EUSART transmit data register
}
почему Вы не использовали подход в своем примере?
besogon вне форума   Ответить с цитированием
Старый 01.10.2019, 15:11   #24
DimaS
Senior Member
 
Регистрация: 05.04.2008
Адрес: Israel
Возраст: 46
Сообщений: 1,676
Вес репутации: 2423/83
DimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond reputeDimaS has a reputation beyond repute
По умолчанию Re: Как правильно читать флаги в PIR1?

Моно тупой вопрос - в чем смысл в данном случае const в аргументе функции?
DimaS вне форума   Ответить с цитированием
Старый 01.10.2019, 15:31   #25
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 32
Сообщений: 2,167
Вес репутации: 4017/88
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: Как правильно читать флаги в PIR1?

DimaS
что в области видимости функции ее параметр меняться не будет.

квалификатор const определяет переменные, которые не меняют значения в рамках своей области видимости.
besogon вне форума   Ответить с цитированием
Ответ

Метки
pir1, tx1if


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как правильно назначать входы/выходы в PIC24EP? phase Продукция MICROCHIP 8 06.12.2013 12:30
Господа, научите как правильно реализовывать синхронизацию dynaco Общетехнические вопросы 18 21.07.2007 10:31
как правильно подключить IR21844 ? Stoun Общетехнические вопросы 3 27.06.2007 13:39
Как правильно оформить массив. Andrey Продукция MICROCHIP 11 23.05.2007 09:37
как на ЦАП правильно вывести данные sergikoff Продукция MICROCHIP 18 30.03.2007 16:52


Часовой пояс GMT +3, время: 02:59.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot