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

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

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

Ответ
 
Опции темы Опции просмотра
Старый 01.11.2009, 14:47   #1
Tsimur Smolau
Member
 
Регистрация: 26.08.2007
Возраст: 41
Сообщений: 41
Вес репутации: 123/49
Tsimur Smolau will become famous soon enoughTsimur Smolau will become famous soon enough
По умолчанию MPLAB C18 или Hi-tech PIC18 для PIC18Fxxxx

Помогите, пожалуйста, определиться.

Уж где-то пятый год пишу проги для PIC16 мелкие проги (просто хобби). Набралось порядочное количество маленьких собственных и несобственных библиотек и решений. До сего момента я использовал Hi-tech PICC компилятор. Тут решил собрать проектик на PIC18F4550 с использованием USB. USB буду использовать как USB bootloader и для последующей связи компом для обмена инфой. Собрал макетку. Прошил бутлоадер. Поставил дрова. Все работает - программы можно заливать.
Но столкнулся с одной проблемой:
- все примеры использования PIC18Fxxxx написаны в основном для MPLAB C18. Я его себе установил и понял, что все, что я знал о программировании на C для PIC, здесь не работает и те библиотеки, которые я использую в своих проектах, тоже не идут и нуждаются в ТОТАЛЬНОЙ переработке.
Посему вопрос:
так ли существенно использовать MPLAB C18 для программирования USB интерфейса PIC18Fxxxx (HID, Mass storage и т.д.)? Или можно найти нормальные готовые решения (библиотеки) и для Hitech PIC18?
Второй вопрос:
Дайте plz простой Hitech PIC18 исходник с примером смещения кода под использования его для USB Bootloader. Всё что нахожу - для MPLAB C18.
Третий вопрос:
Я использовал библиотеку задержек от сюда: http://www.microchipc.com/sourcecode...8xxxx_v2-2.zip. Очень хороший сайт готовых решений. Для PIC18Fxxxx так тоже есть библиотека, но возможные частоты для нее ограничены 32Mhz. Хоть PIC18Fxxxx позволяет тактироваться от 48Mhz он все равно использует кварц 20Mhz, а частоту подымает битами конфигурации. Означает ли это, что я могу использовать в этой библиотеке 20Mhz частоту или надо дорабатывать ее до 48Mhz?
Четвертый вопрос:
Есть какие небудь грабли в отладке PIC18Fxxxx (с поддержкой USB Bootloader) для Proteus? Например, какую я должен указывать частоту тактирования в свойствах микросхемы? Кварца (20Mhz) или внутреннию (48Hz)?

Надеюсь на конструктивные грамотные ответы. Заранее спасибо!
Tsimur Smolau вне форума   Ответить с цитированием
Старый 02.11.2009, 10:11   #2
Petr
Senior Member
 
Аватар для Petr
 
Регистрация: 25.02.2007
Возраст: 49
Сообщений: 1,879
Вес репутации: 3760/105
Petr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond repute
По умолчанию Re: MPLAB C18 или Hi-tech PIC18 для PIC18Fxxxx

Цитата:
Сообщение от Tsimur Smolau Посмотреть сообщение
Помогите, пожалуйста, определиться.

Уж где-то пятый год пишу проги для PIC16 мелкие проги (просто хобби). Набралось порядочное количество маленьких собственных и несобственных библиотек и решений. До сего момента я использовал Hi-tech PICC компилятор. Тут решил собрать проектик на PIC18F4550 с использованием USB. USB буду использовать как USB bootloader и для последующей связи компом для обмена инфой. Собрал макетку. Прошил бутлоадер. Поставил дрова. Все работает - программы можно заливать.
Но столкнулся с одной проблемой:
- все примеры использования PIC18Fxxxx написаны в основном для MPLAB C18. Я его себе установил и понял, что все, что я знал о программировании на C для PIC, здесь не работает и те библиотеки, которые я использую в своих проектах, тоже не идут и нуждаются в ТОТАЛЬНОЙ переработке.
Посему вопрос:
так ли существенно использовать MPLAB C18 для программирования USB интерфейса PIC18Fxxxx (HID, Mass storage и т.д.)? Или можно найти нормальные готовые решения (библиотеки) и для Hitech PIC18?
Второй вопрос:
Дайте plz простой Hitech PIC18 исходник с примером смещения кода под использования его для USB Bootloader. Всё что нахожу - для MPLAB C18.
Третий вопрос:
Я использовал библиотеку задержек от сюда: http://www.microchipc.com/sourcecode...8xxxx_v2-2.zip. Очень хороший сайт готовых решений. Для PIC18Fxxxx так тоже есть библиотека, но возможные частоты для нее ограничены 32Mhz. Хоть PIC18Fxxxx позволяет тактироваться от 48Mhz он все равно использует кварц 20Mhz, а частоту подымает битами конфигурации. Означает ли это, что я могу использовать в этой библиотеке 20Mhz частоту или надо дорабатывать ее до 48Mhz?
Четвертый вопрос:
Есть какие небудь грабли в отладке PIC18Fxxxx (с поддержкой USB Bootloader) для Proteus? Например, какую я должен указывать частоту тактирования в свойствах микросхемы? Кварца (20Mhz) или внутреннию (48Hz)?

Надеюсь на конструктивные грамотные ответы. Заранее спасибо!
А вот мне стало интересно:
как надо писать под хайтеч, чтобы при переходе на С18
код нуждался в тотальной переработке.
Можно пару примеров ?
Возможно в них найдется ключ к ответу на все вопросы.

А по существу могу ответить так:
1) Есть готовые примеры для CDC. Но по набору вариантов и примеров нет равных родной либе под С18.
2) Вопрос непонятен, поскольку смещение кода отлично видно
в примере бута из стандартного комплекта Hitech PIC18
3) Задержки настолько мелкий вопрос, что я никогда не искал готовых решений - искать просто дольше, чем сделать.
4) Не верю в полезность как симуляторов, так и даже отладчиков.
Посему ответить не могу.
Petr вне форума   Ответить с цитированием
Старый 04.11.2009, 12:10   #3
Tsimur Smolau
Member
 
Регистрация: 26.08.2007
Возраст: 41
Сообщений: 41
Вес репутации: 123/49
Tsimur Smolau will become famous soon enoughTsimur Smolau will become famous soon enough
По умолчанию Re: MPLAB C18 или Hi-tech PIC18 для PIC18Fxxxx

Прежде всего, за спасибо за ответ.
Извините за долгий ответ. Я просто приболел нынче модной пандемической болезнью. Было не до того.

Цитата:
Сообщение от Petr Посмотреть сообщение
А вот мне стало интересно:
как надо писать под хайтеч, чтобы при переходе на С18
код нуждался в тотальной переработке.
Можно пару примеров ?
Возможно в них найдется ключ к ответу на все вопросы.
В этом куске кода будет не работать почти всё.
Код:
#define DelayDivisor 1
#define WaitFor1Us asm("nop"); asm("nop")
#define Jumpback asm("goto $ - 6")

#define DelayUs(x) { \
			delayus_variable=(unsigned char)(x/DelayDivisor); \
			asm("movlb (_delayus_variable) >> 8"); \
			WaitFor1Us; } \
			asm("decfsz (_delayus_variable)&0ffh,f"); \
			Jumpback;
В принципе, при беглом осмотре я понял, что не будет работать следующее:
1. объявление регистров
2. препроцессорные директивы
3. asm вставки
4. Всё, что не строго описано в ANSI C

Цитата:
Сообщение от Petr Посмотреть сообщение
А по существу могу ответить так:
1) Есть готовые примеры для CDC. Но по набору вариантов и примеров нет равных родной либе под С18.
Я так думаю, что придется переучиваться под C18.
Цитата:
Сообщение от Petr Посмотреть сообщение
2) Вопрос непонятен, поскольку смещение кода отлично видно
в примере бута из стандартного комплекта Hitech PIC18
Если вам несложно, покажите этот кусок кода. Спасибо.
Цитата:
Сообщение от Petr Посмотреть сообщение
3) Задержки настолько мелкий вопрос, что я никогда не искал готовых решений - искать просто дольше, чем сделать.
Согласен, что мелкий. Но каждый раз избретать велосипед не хочется. Лучше это время потратить на основной код устройства.
Tsimur Smolau вне форума   Ответить с цитированием
Старый 04.11.2009, 12:16   #4
vitalka
Super Moderator
 
Аватар для vitalka
 
Регистрация: 19.03.2007
Адрес: Львов
Возраст: 45
Сообщений: 3,334
Вес репутации: 2341/106
vitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond repute
По умолчанию Re: MPLAB C18 или Hi-tech PIC18 для PIC18Fxxxx

Цитата:
Сообщение от Tsimur Smolau Посмотреть сообщение
В этом куске кода будет не работать почти всё.
если писать непереносимый код, то тогда нечему удивляться, что он на другом компиляторе не собирается
vitalka вне форума   Ответить с цитированием
Старый 04.11.2009, 12:37   #5
Tsimur Smolau
Member
 
Регистрация: 26.08.2007
Возраст: 41
Сообщений: 41
Вес репутации: 123/49
Tsimur Smolau will become famous soon enoughTsimur Smolau will become famous soon enough
По умолчанию Re: MPLAB C18 или Hi-tech PIC18 для PIC18Fxxxx

Цитата:
Сообщение от vitalka Посмотреть сообщение
если писать непереносимый код, то тогда нечему удивляться, что он на другом компиляторе не собирается
Согласен. Но я, первое, не планировал переход на другой компилятор. Да, и что, вы предлагаете изучать сразу все компиляторы представленные на рынке только для того чтобы потом код было проще портировать? Вопрос скорее риторический. Второе, почти любой код попадает под следующее:

Код HTML:
В принципе, при беглом осмотре я понял, что не будет работать следующее:
1. объявление регистров
2. препроцессорные директивы
3. asm вставки
4. Всё, что не строго описано в ANSI C
Tsimur Smolau вне форума   Ответить с цитированием
Старый 04.11.2009, 13:41   #6
tester
Super Moderator
 
Аватар для tester
 
Регистрация: 28.02.2007
Возраст: 43
Сообщений: 3,577
Вес репутации: 4386/128
tester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond repute
По умолчанию Re: MPLAB C18 или Hi-tech PIC18 для PIC18Fxxxx

Цитата:
Сообщение от Tsimur Smolau Посмотреть сообщение
Согласен. Но я, первое, не планировал переход на другой компилятор. Да, и что, вы предлагаете изучать сразу все компиляторы представленные на рынке только для того чтобы потом код было проще портировать? Вопрос скорее риторический. Второе, почти любой код попадает под следующее:

Код HTML:
В принципе, при беглом осмотре я понял, что не будет работать следующее:
1. объявление регистров
2. препроцессорные директивы
3. asm вставки
4. Всё, что не строго описано в ANSI C
+ типы данных (особенно целые)
+ приведения типов (некоторые делают автоматом, а некоторые - нет)
+ всякие недокументированные особенности (частое явление - проверка бита CARRY после сдвига)
tester вне форума   Ответить с цитированием
Старый 04.11.2009, 23:46   #7
Tsimur Smolau
Member
 
Регистрация: 26.08.2007
Возраст: 41
Сообщений: 41
Вес репутации: 123/49
Tsimur Smolau will become famous soon enoughTsimur Smolau will become famous soon enough
По умолчанию Re: MPLAB C18 или Hi-tech PIC18 для PIC18Fxxxx

Вот он, первый коварный удар MPLAB C18 компилятора.
Код:
void LCD_Puts(const char * s)
{
	while(*s)
		LCD_Putch(*s++);
}
С точки зрения логики, здравого смысла, языка программирования и Hi-tech PIC18 в этом коде все правильно.
Только вот MPLAB C18 его компилирует, но при запуске никак не хочет запускать LCD_Putch. Кто из Гуру скажет почему?
Tsimur Smolau вне форума   Ответить с цитированием
Старый 04.11.2009, 23:51   #8
tester
Super Moderator
 
Аватар для tester
 
Регистрация: 28.02.2007
Возраст: 43
Сообщений: 3,577
Вес репутации: 4386/128
tester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond reputetester has a reputation beyond repute
По умолчанию Re: MPLAB C18 или Hi-tech PIC18 для PIC18Fxxxx

Код:
void LCD_Puts(const rom char * s)
{
    while(*s)
        LCD_Putch(*s++);
}
В случае с типами и квалификаторами кроссплатформенности можно достичь только с директивами условной компиляции:
Код:
#ifdef __PICC18__
#define ROM_DATA const
#endif

#ifdef __PIC18CXX
#define ROM_DATA const rom 
#endif

void LCD_Puts(ROM_DATA *s)
{
    ...
tester вне форума   Ответить с цитированием
Старый 08.11.2009, 20:26   #9
Tsimur Smolau
Member
 
Регистрация: 26.08.2007
Возраст: 41
Сообщений: 41
Вес репутации: 123/49
Tsimur Smolau will become famous soon enoughTsimur Smolau will become famous soon enough
По умолчанию Re: MPLAB C18 или Hi-tech PIC18 для PIC18Fxxxx

tester, спасибо.

Дальше продолжаю сталкиваться с маленькими вопросами и проблемками при использовании Microchip USB loader + оного же MPLab C18.
1. Как я должен был догадаться или где прочитать, что для того чтобы программа правильно расположилась по адресам необходимо подвязывать rm18f4550.lkr файл, коий сообщает линкеру где расположить программный код? Убил на это день.
2. Каким требованиям должна соответствовать программа при использовании USB bootloader-а. Я знаю:
- 0x0000-0x07ff зарезервировать для bootloader, а программный код располагать с 0x0800.
- биты конфигурации. Но я не знаю, какие из них обязательные, а какие нет.
- что еще?
3. При использовании дефолтовых битов конфигурации, какой частотой тактируется контроллер (кварц 20Mhz)? 20Mhz или 48Mhz? Никак не могу понять.
Заранее спасибо.
Tsimur Smolau вне форума   Ответить с цитированием
Старый 09.11.2009, 11:15   #10
Petr
Senior Member
 
Аватар для Petr
 
Регистрация: 25.02.2007
Возраст: 49
Сообщений: 1,879
Вес репутации: 3760/105
Petr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond reputePetr has a reputation beyond repute
По умолчанию Re: MPLAB C18 или Hi-tech PIC18 для PIC18Fxxxx

Цитата:
Сообщение от Tsimur Smolau Посмотреть сообщение
tester, спасибо.

Дальше продолжаю сталкиваться с маленькими вопросами и проблемками при использовании Microchip USB loader + оного же MPLab C18.
1. Как я должен был догадаться или где прочитать, что для того чтобы программа правильно расположилась по адресам необходимо подвязывать rm18f4550.lkr файл, коий сообщает линкеру где расположить программный код? Убил на это день.
2. Каким требованиям должна соответствовать программа при использовании USB bootloader-а. Я знаю:
- 0x0000-0x07ff зарезервировать для bootloader, а программный код располагать с 0x0800.
- биты конфигурации. Но я не знаю, какие из них обязательные, а какие нет.
- что еще?
3. При использовании дефолтовых битов конфигурации, какой частотой тактируется контроллер (кварц 20Mhz)? 20Mhz или 48Mhz? Никак не могу понять.
Заранее спасибо.
Насчет lkr файла прочитать можно в доке на компилятор.
Но проще просто открыть готовый пример микрочипа с
usb бутом и внимательно посмотреть, как там сделано.
В 18f2550.lkr именуются секции и раскладываются
в адресном пространстве.
Далее действует система фишек типа:
Код:
 
 #if defined(PROGRAMMABLE_WITH_USB_HID_BOOTLOADER)
  #define REMAPPED_RESET_VECTOR_ADDRESS   0x1000
  #define REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS 0x1008
  #define REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS 0x1018
 #elif defined(PROGRAMMABLE_WITH_USB_MCHPUSB_BOOTLOADER) 
  #define REMAPPED_RESET_VECTOR_ADDRESS   0x800
  #define REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS 0x808
  #define REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS 0x818
 #else 
  #define REMAPPED_RESET_VECTOR_ADDRESS   0x00
  #define REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS 0x08
  #define REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS 0x18
 #endif
 
 #if defined(PROGRAMMABLE_WITH_USB_HID_BOOTLOADER)||defined(PROGRAMMABLE_WITH_USB_MCHPUSB_BOOTLOADER)
 extern void _startup (void);        // See c018i.c in your C18 compiler dir
 #pragma code REMAPPED_RESET_VECTOR = REMAPPED_RESET_VECTOR_ADDRESS
 void _reset (void)
 {
     _asm goto _startup _endasm
 }
 #endif
 #pragma code REMAPPED_HIGH_INTERRUPT_VECTOR = REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS
 void Remapped_High_ISR (void)
 {
      _asm goto YourHighPriorityISRCode _endasm
 }
 #pragma code REMAPPED_LOW_INTERRUPT_VECTOR = REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS
 void Remapped_Low_ISR (void)
 {
      _asm goto YourLowPriorityISRCode _endasm
 }
Далее в c018i.c
Код:
 
#pragma code _startup_scn
void
_startup (void)
{
  _asm
    // Initialize the stack pointer
    lfsr 1, _stack
    lfsr 2, _stack
    clrf TBLPTRU, 0 // 1st silicon doesn't do this on POR
    bcf __FPFLAGS,RND,0 // Initialize rounding flag for floating point libs
 
    _endasm 
    _do_cinit ();
loop:
  // If user defined __init is not found, the one in clib.lib will be used
  __init ();
  // Call the user's main routine
  main ();
  goto loop;
}
И тут начинают постепенно всплывать строчки из lkr файла.
Тут по сути 2 пути.
1) Разобраться в взаимосвязях и кардинально упростить,
сделать под себя. Не особо сложно.
2) Использовать готовый пример, найти места:
"тут пиши свой код", "тут пиши код прерывания" и т.д.
Такими местами изобилует USB библиотека.

По частотам и генератору.
Нужно найти страничку с
FIGURE 2-1: PIC18F2455/2550/4455/4550 CLOCK DIAGRAM
Очень многое прояснится.
Для использования USB обязательно:
Clock source from 96MHz PLL/2
Во всех примерах ядро работает на 48 MHz
Для работы USB модуля условие:
4 MHz input only (это про вход PLL) обязательно!
И как обычно, у 18-х пиков 1-ну команду ядро
выполняет за 4 такта (которые 48, допустим)
Изучайте диаграмму. Без этого дело не пойдет.
Petr вне форума   Ответить с цитированием
Старый 09.11.2009, 11:44   #11
Art!P
Senior Member
 
Аватар для Art!P
 
Регистрация: 07.07.2008
Адрес: Татарстан
Возраст: 39
Сообщений: 627
Вес репутации: 175/52
Art!P has a spectacular aura aboutArt!P has a spectacular aura about
Отправить сообщение для Art!P с помощью ICQ
По умолчанию Re: MPLAB C18 или Hi-tech PIC18 для PIC18Fxxxx

Цитата:
Сообщение от Petr Посмотреть сообщение
...
4) Не верю в полезность как симуляторов, так и даже отладчиков.
...
Верьте ) Это экономит время и ресурсы.

Оффтоп: А напомните отладка программ созданные с использованием Си, производится по коду Си или в ассемблированном виде?
Art!P вне форума   Ответить с цитированием
Старый 09.11.2009, 12:59   #12
majorPAE
Super Moderator
 
Аватар для majorPAE
 
Регистрация: 26.02.2007
Возраст: 58
Сообщений: 2,221
Вес репутации: 2214/94
majorPAE has a reputation beyond reputemajorPAE has a reputation beyond reputemajorPAE has a reputation beyond reputemajorPAE has a reputation beyond reputemajorPAE has a reputation beyond reputemajorPAE has a reputation beyond reputemajorPAE has a reputation beyond reputemajorPAE has a reputation beyond reputemajorPAE has a reputation beyond reputemajorPAE has a reputation beyond reputemajorPAE has a reputation beyond repute
Отправить сообщение для majorPAE с помощью ICQ Отправить сообщение для majorPAE с помощью Skype™
По умолчанию Re: MPLAB C18 или Hi-tech PIC18 для PIC18Fxxxx

Цитата:
Сообщение от Art!P Посмотреть сообщение
Оффтоп: А напомните отладка программ созданные с использованием Си, производится по коду Си или в ассемблированном виде?
Можно и так и так...
__________________
ЗАКОH ТРУДHОСТЕЙ БИЛЛИHГСА: Большинство тpyдностей пpоисходит оттого, что мы слишком быстpо говоpим ДА и недостаточно быстpо - НЕТ.(с)
"Очередной шаг вперед, как правило, результат хорошего пинка в зад!"(С)
majorPAE вне форума   Ответить с цитированием
Старый 09.11.2009, 13:15   #13
z0rgvi
Senior Member
 
Регистрация: 03.12.2008
Адрес: РФ, Санкт-Петербург
Возраст: 35
Сообщений: 518
Вес репутации: 242/51
z0rgvi has a spectacular aura aboutz0rgvi has a spectacular aura aboutz0rgvi has a spectacular aura about
По умолчанию Re: MPLAB C18 или Hi-tech PIC18 для PIC18Fxxxx

Цитата:
Сообщение от Art!P Посмотреть сообщение
Верьте ) Это экономит время и ресурсы.

Оффтоп: А напомните отладка программ созданные с использованием Си, производится по коду Си или в ассемблированном виде?
ОФФТОП: Каждой строке на Си сопоставляется откомпилированная программа.
А уж идти по коду построчно или покоммандно, каждый решает сам
z0rgvi вне форума   Ответить с цитированием
Ответ


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

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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос по синтаксису или настройкам Си для PIC. 1977and Продукция MICROCHIP 8 06.08.2010 08:13
MPLAB v8.30 + PIC18 v3.1 - не работают вместе spyrytus Продукция MICROCHIP 9 04.08.2009 08:16
ICD2 VladG Продукция MICROCHIP 25 05.05.2009 11:26
Примеры для PIC24H в MPLAB doc321 Продукция MICROCHIP 4 23.04.2009 20:52
Помогите плизз с PIC16LF628A dbosh Продукция MICROCHIP 49 11.10.2008 01:03


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


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