21.08.2015, 14:45
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.02.2008
Сообщений: 1,802
Сказал спасибо: 124
Сказали Спасибо 602 раз(а) в 419 сообщении(ях)
|
Re: Пишем свое API
Мне очень интересна.
|
|
|
|
22.08.2015, 10:43
|
|
Частый гость
Регистрация: 25.06.2008
Адрес: Ровенская обл., Украина
Сообщений: 23
Сказал спасибо: 149
Сказали Спасибо 6 раз(а) в 5 сообщении(ях)
|
Re: Пишем свое API
Сообщение от Easyrider83
|
хм.... эта тема вообще кому-нибудь интересна?
|
+1
Пиши ещё!
|
|
|
|
23.08.2015, 01:37
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Пишем свое API
Итак, применяем на практике. Стреляем из гаубицы по мухам.
В качестве железа у нас STM32F100 на 24МГц и семисегментный индикатор. FreeRTOS на нем забирает всю оперативу, но при этом таки работает.
Итак, все предельно просто:
Код:
|
const PIN_TypeDef DIGITS[3] = {PB7, PB6, PB5}; //digits pins
const PIN_TypeDef SEGMENTS[8] = {PA15, PB3, PC14, PB9, PB8, PB4, PC15, PC13}; //segments pins
const u8 LCD_toBCD[10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F}; //decoder |
Массив DIGITS определяет пины для управления цифрами. SEGMENTS - сегментами, а LCD_toBCD декодирует число 0..9 в соответствующую цифру на дисплее.
Код маин у нас очень короткий:
Код:
|
int main ()
{
xTaskCreate( vInitTask, "InitTask", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1 , NULL);
vTaskStartScheduler();
return 0;
} |
Всего один таск - инитиализация. Она инитиализирует пины, создает еще один таск, в котором будет жить динамическая индикация, создает две очереди для нее - одна для передачи числа и другая для не декодированных данных, если мы захотим нарисовать что-то, чего нет в LCD_toBCD. Затем мы просто будем кидать данные в очередь, которая будет выводить их на дисплей.
Очередь LCD_RAW_DataQueue для не декодированных данных, максимальный объем 10 групп элементов по 3 байта каждый.
LCD_DataQueue - десять байтовых переменных для декодирования.
Код:
|
void vInitTask(void * pvArg)
{
u8 cnt;
s8 stp = 1;
stm32_Init();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
xTaskCreate( vLEDTask, "LED Task", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 3 , NULL);
LCD_RAW_DataQueue = xQueueCreate(10, 3);
LCD_DataQueue = xQueueCreate(10, 1);
for (; ;)
{
cnt += stp;
xQueueSend(LCD_DataQueue, &cnt, 0);
vTaskDelay(20);
if (cnt == 0xFF) stp = -1;
if (cnt == 0) stp = 1;
}
} |
Ну и собственно задача для динамической индикации:
Код:
|
void vLEDTask(void * pvArg)
{
while(1)
{
static u8 DigitOn = 0, dig_cnt, seg_cnt;
static u8 LCD_RawData[3], LCD_Data;
vTaskDelay(5);
xQueueReceive(LCD_RAW_DataQueue, &LCD_RawData, 0);
if (xQueueReceive(LCD_DataQueue, &LCD_Data, 0) == pdTRUE)
{
LCD_RawData[2] = LCD_toBCD[LCD_Data % 10];
LCD_Data /= 10;
LCD_RawData[1] = LCD_toBCD[LCD_Data % 10];
LCD_Data /= 10;
LCD_RawData[0] = LCD_toBCD[LCD_Data % 10];
}
for (dig_cnt = 0; dig_cnt ‹ 3; dig_cnt++)
if (dig_cnt == DigitOn)
{
for (seg_cnt = 0; seg_cnt ‹ 8; seg_cnt++)
if ((0x01 ‹‹ seg_cnt) & LCD_RawData[dig_cnt]) PIN_OFF(SEGMENTS[seg_cnt].GPIOx, SEGMENTS[seg_cnt].PINx);
else PIN_ON(SEGMENTS[seg_cnt].GPIOx, SEGMENTS[seg_cnt].PINx);
PIN_OFF(DIGITS[dig_cnt].GPIOx, DIGITS[dig_cnt].PINx);
}
else PIN_ON(DIGITS[dig_cnt].GPIOx, DIGITS[dig_cnt].PINx);
if (DigitOn == 2) DigitOn = 0; else DigitOn++;
}
} |
Вывод на дисплей довольно путанный на первый взгляд, оптимизацией тут и не пахнет. Зато работать будет на любом железе. Вообще вопрос оптимизации я пока не поднимаю. Тут можно сделать все в 1000 раз проще и быстрее без всяких RTOS, но тогда теряется всякий смысл этой темы.
Итак, процедура берет данные из очереди и выводит их на дисплей. Если данные есть в первой очереди, она их еще и декодирует.
А вот так это все работает:
|
|
|
Сказали "Спасибо" Easyrider83
|
|
|
23.08.2015, 22:18
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
|
Re: Пишем свое API
Сообщение от Easyrider83
|
А вот это устройство перед отправкой заказчику.
|
Что за хрень и кому понадобился такой адский интерфейс ?
__________________
Осторожно , злой кот
|
|
|
|
23.08.2015, 22:30
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Пишем свое API
Сообщение от dosikus
|
Что за хрень и кому понадобился такой адский интерфейс ?
|
![Очень смешно](images/smilies/icon_veryhappy.gif)
Клиент платит - я делаю.
|
|
|
Сказали "Спасибо" Easyrider83
|
|
|
23.08.2015, 22:44
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Пишем свое API
Сообщение от dosikus
|
Что за хрень и кому понадобился такой адский интерфейс ?
|
Помнишь, клиенту надо было уровень с морды лица какой-то шарманки на стену в виде цифр?
Вот это оно и есть.
|
|
|
Сказали "Спасибо" omercury
|
|
|
23.08.2015, 23:15
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Пишем свое API
Сообщение от omercury
|
Помнишь, клиенту надо было уровень с морды лица какой-то шарманки на стену в виде цифр?
Вот это оно и есть.
|
Почти так. Есть некий Hi-End усилитель, стоящий каких-то нереальных денег и на его панели зачем-то выведен уровень громкости в двоичном коде. Внедряться в схему усилителя нельзя. Вскрывать усилитель тоже. Поэтому такая вот накладка и есть желание клиента.
|
|
|
|
24.08.2015, 00:11
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Пишем свое API
Сообщение от Easyrider83
|
на его панели зачем-то выведен уровень громкости в двоичном коде
|
Типа тех часов.
Понты.
Надо было сразу в виде линейной шкалы сделать, чтоб не перекраивать дважды.
Кстати, имеет смысл предложить.
UPD.
Или в виде стрелочника на графическом дисплее. Уже после изготовления шкалы, естественно.
Последний раз редактировалось omercury; 24.08.2015 в 00:18.
|
|
|
|
24.08.2015, 00:43
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Пишем свое API
Сообщение от omercury
|
в виде стрелочника
|
Стрелочники лучше эмулировать скифовские - вверх ногами, они прикольнее. Типа таких.
А для шкалы могу подогнать винтажный газоразрядный от магнитофона " Маяк-233", родной, муха не сидела.
|
|
|
|
24.08.2015, 00:44
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Пишем свое API
Тема уходит в сторону. Добавил в проект часы и SD карту по SDIO. Потом выложу обновленный вариант.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
свое USB устройство
|
ESWANT |
Микроконтроллеры, АЦП, память и т.д |
2 |
08.09.2009 14:58 |
Часовой пояс GMT +4, время: 06:52.
|
|