Чтобы протестировать работу COM-порта, иногда полезно соединить линию RXD с линией TXD. Если разъем типа «папа», то соединить линии можно с помощью обыкновенного джампера, благо контакты в разъеме расположены рядом.

Реклама

Интерсвязь: безлимитные тарифы

Источник

Сравнение тарифов U-tel для местной телефонной связи Челябинской области

Тариф Стоимость предоставления абонентской линии на месяц, руб Абонентская плата, руб/мес Объем бесплатных соединений, мин Стоимость минуты соединения, руб
Абонентский 170 210 Не ограничено 0
Комбинированный 170 110 280 0,30
Повременный 170 0 0 0,40
Дополнительный 170 30 120 0,44

Графики ниже показывают месячные начисления по тарифам в зависимости от проговоренных минут.

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

Минут в месяц Наиболее выгодный тариф
до 75 Повременный
от 75 до 350 Дополнительный
от 350 до 615 Комбинированный
от 615 Абоненский

P. S. Если кому-то интересен математический аппарат, говорите. С радостью поделюсь.

Почему чип-конденсаторы и индуктивности не маркируют так же, как резисторы цифрами и буквами?

Вычисление тактовых частот в STM32F10x

Микроконтроллеры серии STM32F10x содержат богатую периферию, которая тактируется с разными частотами. Вычислить тактовые частоты можно с помощью функции RCC_GetClocksFreq(), которая содержится в модуле RCC библиотеки STM32F10x SPL.

Функция производит вычисления на основе данных в регистрах RCC.

Прототип функции:

void RCC_GetClocksFreq(RCC_ClocksTypeDef * RCC_Clocks)

Функция заполняет структуру типа RCC_ClocksTypeDef, указатель на которую передается в функцию в качестве аргумента. Структура содержит следующие поля:

uint32_t ADCCLK_Frequency Тактовая частота АЦП в Гц
uint32_t HCLK_Frequency Тактовая частота шины AHB в Гц
uint32_t PCLK1_Frequency Тактовая частота периферии APB1 в Гц
uint32_t PCLK2_Frequency Тактовая частота периферии APB2 в Гц
uint32_t SYSCLK_Frequency Системная тактовая частота в Гц

Если используется внешнее тактирование, то функция должна знать частоту этого тактирования. Частота задается константой HSE_VALUE.

Лучше всего, определить константу опцией -D компилятора:

-DHSE_VALUE=4000000

В этом примере задается частота 4 МГц.

Если не определить константу в опциях компилятора, то она определится в файле stm32f10x.h и ей присвоится значение по умолчанию: 8000000 (8 МГц). Это значение можно отредактировать, прописав свою частоту.

Еще один способ задать собственное значение частоты: прописать в файле stm32f10x_conf.h следующие строки:

#if defined HSE_VALUE
  #undef HSE_VALUE
#endif
#define HSE_VALUE ((uint32_t)4000000) // 4 МГц

Во всех способах частота задается целым числом Герц.

Пример вызова функции RCC_GetClocksFreq():

RCC_ClocksTypeDef clocks;
RCC_GetClocksFreq(&clocks);

Кроме того, чтобы узнать источник системного тактирования микроконтроллера, можно воспользоваться функцией RCC_GetSYSCLKSource().

Прототип функции:

uint8_t RCC_GetSYSCLKSource(void)

Функция возвращает одно из значений:

  • 0x00: внутренний тактовый генератор (HSI)
  • 0x04: внешний тактовый источник (HSE)
  • 0x08: умножитель (PLL)

К сожалению библиотека SPL не имеет функций для вычисления тактовых частот конкретных периферийных устройств.
Код вычисляющий тактовые частоты таймеров:

uint32_t APB1_TIMCLK_Frequency;
uint32_t APB2_TIMCLK_Frequency;
RCC_ClocksTypeDef clocks;

RCC_GetClocksFreq(&clocks);

if (clocks.HCLK_Frequency == clocks.PCLK1_Frequency)
  APB1_TIMCLK_Frequency = clocks.PCLK1_Frequency;
else
  APB1_TIMCLK_Frequency = 2 * clocks.PCLK1_Frequency;

if (clocks.HCLK_Frequency == clocks.PCLK2_Frequency)
  APB2_TIMCLK_Frequency = clocks.PCLK2_Frequency;
else
  APB2_TIMCLK_Frequency = 2 * clocks.PCLK2_Frequency;

Сброс ST7528

Существует два способа сброса контроллера ЖКИ ST7528:

  • Аппаратный. Установкой низкого логического уровня на выводе RESETB.
  • Программный. Командой RESET.

Аппаратный сброс затрагивает больше функций контроллера, чем программный.

Команда для программного сброса: 0xE2.

Алгоритм аппаратного сброса (жирным выделен программный сброс):

  1. Адрес страницы: 0
  2. Адрес колонки: 0
  3. Чтение/модификация/запись: откл.
  4. Индикация: откл.
  5. Начальная линия: 0 (первая)
  6. Начальный COM: COM0
  7. Количество отображаемых линий: 128
  8. Инверсия изображения: откл.
  9. N-line inversion register: 0 (откл.)
  10. Заполнение черными точками: откл.
  11. ICON: откл.
  12. Цепи питания: откл.
  13. Коэффициент усиления повышающего преобразователя напряжения: 3 (DC1=0, DC0=0)
  14. Уровень КПД преобразователя: 2 (BE = 1)
  15. Коэффициент встроенного делителя напряжения, 1+(Rb/Ra): 2,3 (R2=0, R1=0, R0=0)
  16. Уровень контраста: 32
  17. Смещение напряжения питания ЖК: 1/12
  18. Направление обхода COM-выводов: нормальное (SHL=0, COM0 -> COM127)
  19. Отношение между адресом колонок и SEG-выводами: нормальное (ADC = 0, адрес колонки 0 соответствует SEG0)
  20. Встроенный тактовый генератор: откл.
  21. Энергосбережение: откл.
  22. Объем данных изображения (для трехпроводного SPI): 0
  23. Палитра: откл.
    Для четных (0, 2, …, 14) уровней серого: (GA5…0 = 000000). Для нечетных (1, 3, …, 15) уровней серого: (GA5…0 = 1111111).
  24. Кадры: 4 (4FRC); ШИМ: 45 (45PWM)

Многие программисты микроконтроллеров любят подключать все заголовочные файлы в одном основном заголовочном файле. А потом основной заголовочный файл подключать во всех модулях.

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

Программа для преобразования URL в читаемый вид

Потратил вечер на написание небольшой программы на C++ для преобразования URL, содержащего элементы вида %XX, в читаемый вид.

Опубликовал исходный код на Гитхабе.

В интернете полно сайтов делающих то же, что и эта программа. Например urldecoderonline.com.

Компилируемый растровый шрифт (CBF)

Для вывода текста на индикаторы c контроллерами ST7528, ST7565P, KS0108 мне пришлось изобрести шрифт, который я назвал CBF (Compiled Bitmap Font).

Особенности CBF:

  • Компилируемый
  • Пропорциональный
  • Растровый

Компилируемый, означает, что файл шрифта можно скомпилировать Си-компилятором.

О видеопамяти контроллеров

Особенность вышеназванных контроллеров в том, что их видеопамять делится на страницы и колонки. Адрес колонки задает вертикальный ряд пикселей. Страница задает группу из восьми горизонтальных рядов пикселей. Таким образом, задав страницу и адрес колонки мы можем обратиться к восьми вертикальным пикселям. После записи изображения в эти пиксели, контроллер автоматически изменяет адрес колонки на единицу. Автоматического изменения страницы нет, её должно задавать управляющее индикатором устройство.

Если индикатор монохромный, то, выбрав страницу и адрес колонки, можно передать контроллеру всего байт изображения, чтобы контроллер отобразил его на  восьми вертикальных пикселях. Для цветных индикаторов требуется передать больше байт, но при выводе одноцветного изображения, эти байты формируются из одного исходного байта.

CBF

CBF устроен таким образом, чтобы свести к минимуму затраты ресурсов для вывода текста на индикаторы с вышеописанной организацией видеопамяти.

Файл CBF содержит константу (_height), задающую высоту шрифта в пикселях, и два одномерных массива:

  • Массив позиций глифов (_position[])
  • Массив глифов (_bitmap[])

Высота шрифта кратна восьми пикселям.

Массив позиций нужен для сопоставления кода символа с расположением его глифа в массиве глифов. Если s — это код символа, то _position[s] — это начало глифа.

Массив глифов, кроме изображений символов, содержит ширину этих изображений. Ширина измеряется в пикселях.

Если base — это начало глифа, то:

  • _bitmap[base] — это ширина изображения
  • _bitmap[base + 1] — первый байт изображения
  • _bitmap[base + i] — i-тый байт изображения

Видеопамять контроллера устроена таким образом, что последовательное изъятие байтов из массива _bitmap[] и передача их индикатору, без всякого преобразования, постепенно формирует на индикаторе символ.

Код, выводящий символ «Щ» на индикатор:

int base = _position['Щ']; //Начало глифа символа Щ

int W = _bitmap[base]; //Ширина глифа в битах
int H = _height/8;     //Высота глифа в байтах

int i;
for (i = 1; i <= W*H; i++)
{
  uint8_t image = _bitmap[base + i]; //i-тый байт изображения симв.
  if (i == W+1) indicator_next_page(); // Установить след. страницу
  indicator_send(image);
}

bdftocbf

Для создания шрифтов я написал программу bdftocbf. Это программа преобразует шрифт в формате BDF в CBF.

Программа консольная и написана для работы под Линуксом.

Страница программы: http://github.com/bravikov/bdftocbf

Для создания шрифта BDF рекомендуется использовать программу FontForge.