Примеры Cog-генераторов

Автор: Александр Бельченко
Дата: 20 июня 2005

Генерация таблицы пересчета углов в угловые единицы

На вращающемся колесе имеются отметки, которые формируют специальные синхросигналы для контроллера. На основе этих отметок осуществляется привязка сигналов к углу поворота колеса.

Ниже приведен пример cog-генератора для формирования таблицы пересчета угла поворота в специальные угловые единицы. Для обеспечения точности в 0,1 градуса и для удобства расчетов, в частности для ускорения операций умножения и деления, каждые 6 градусов приравниваются 64 угловым единицам.

Генератор таблицы:

const unsigned short angle_2_unit[60] = { \
//[[[cog for i in range(60): cog.out('%s%4d, ' % ('\n'*(not i%8), i * 64)) ]]]

   0,   64,  128,  192,  256,  320,  384,  448,
 512,  576,  640,  704,  768,  832,  896,  960,
1024, 1088, 1152, 1216, 1280, 1344, 1408, 1472,
1536, 1600, 1664, 1728, 1792, 1856, 1920, 1984,
2048, 2112, 2176, 2240, 2304, 2368, 2432, 2496,
2560, 2624, 2688, 2752, 2816, 2880, 2944, 3008,
3072, 3136, 3200, 3264, 3328, 3392, 3456, 3520,
3584, 3648, 3712, 3776,
//[[[end]]]
};

Изящество этого генератора заключается в том, что он сам формирует переводы строк через каждые 8 значений.

Алгоритм подбора параметров для настройки UART в MCS-51

Алгоритм основан на исходном коде утилиты Baud_TH1. Для удобства использования код генератора выделен в отдельный файл. Расчет значения перезагружаемого таймера производится на основе нескольких входных параметров:

  1. Желаемая скорость обмена;
  2. Частота используемого тактового генератора;
  3. Значение делителя частоты тактового генератора.

Если при расчете обнаруживается, что ошибка установки частоты превышает 5%, то функция возбуждает исключение ValueError и прерывает работу генератора.

Файл uart51.py:

# uart51.py

def baud_th1(baud, quartz=11.0592, div=12):
    """ Calculate value for TH1 register of MCS-51 microcontroller.
    @param baud   desired baud rate.
    @param quartz processor clock frequency (default: 11.0592 MHz).
    @param div    internal divisor of clock frequency (default: 12).
    @return       value for TH1.
    """
    th1 = 256.0 - quartz * 1e6 / div / baud / 16
    TH1 = int(th1 + 0.5)
    baud_real = quartz * 1e6 / 16 / div / (256 - TH1)
    error = 100.0 * abs(baud - baud_real) / baud

    if error > 5.0:
        raise ValueError, "Baud error more than 5%"

    return TH1

#/uart51.py

Использование в cog-генераторе:

/* uart.c */

void    uart_init (void)
{
    PCON |= 0x80;       // удвоенная скорость
    SCON  = 0x50;       // режим 1: 8-битный UART, приемник разрешен
    TMOD |= 0x20;       // таймер 1 режим 2: 8-битный перезагружаемый таймер

    /* [[[cog
    import uart51
    x = uart51.baud_th1(4800)        # расчет для 4800 бит/с,
                                     # тактовая 11,0592МГц, делитель 12.
    cog.outl("TH1 = 0x%02X;" % x)
    ]]] */
    TH1 = 0xF4;
    /* [[[end]]] */

    TR1   = 1;          // запуск таймера 1
    ES    = 1;          // разрешить прерывания от UART
}

/* end of uart.c */

Дополнительные примеры

См. пример использования утилиты state_str.