На вращающемся колесе имеются отметки, которые формируют специальные
синхросигналы для контроллера. На основе этих отметок осуществляется
привязка сигналов к углу поворота колеса.
Ниже приведен пример 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 значений.
Алгоритм основан на исходном коде утилиты Baud_TH1.
Для удобства использования код генератора выделен в отдельный файл.
Расчет значения перезагружаемого таймера производится на основе
нескольких входных параметров:
- Желаемая скорость обмена;
- Частота используемого тактового генератора;
- Значение делителя частоты тактового генератора.
Если при расчете обнаруживается, что ошибка установки частоты превышает 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 */