Портал для радиолюбителей и разработчиков электроники · с 2003 годаРеклама на сайте
Найти компонент, схему или даташит

Даташиты, справочник отечественных приборов, схемы с разбором и живой форум


 
Опции темы

Пишем свое API

Непрочитано 21.08.2015, 14:45  
andries5
Почётный гражданин KAZUS.RUN
 
Регистрация: 19.02.2008
Сообщений: 1,840
Сказал спасибо: 128
Сказали Спасибо 613 раз(а) в 430 сообщении(ях)
andries5 на пути к лучшему
По умолчанию Re: Пишем свое API

Мне очень интересна.
Реклама:
andries5 вне форума  
Непрочитано 22.08.2015, 10:43  
-shiva-
Частый гость
 
Аватар для -shiva-
 
Регистрация: 25.06.2008
Адрес: Ровенская обл., Украина
Сообщений: 23
Сказал спасибо: 149
Сказали Спасибо 6 раз(а) в 5 сообщении(ях)
-shiva- на пути к лучшему
По умолчанию Re: Пишем свое API

Сообщение от Easyrider83 Посмотреть сообщение
хм.... эта тема вообще кому-нибудь интересна?
+1
Пиши ещё!
-shiva- вне форума  
Непрочитано 23.08.2015, 01:37  
Easyrider83
Гуру портала
 
Аватар для Easyrider83
 
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,821
Сказал спасибо: 919
Сказали Спасибо 4,289 раз(а) в 2,570 сообщении(ях)
Easyrider83 на пути к лучшему
По умолчанию 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 в 13:34.
Easyrider83 вне форума  
Сказали "Спасибо" Easyrider83
-shiva- (24.08.2015)
Непрочитано 23.08.2015, 22:18  
dosikus
Гуру портала
 
Аватар для dosikus
 
Регистрация: 20.11.2004
Сообщений: 9,979
Сказал спасибо: 928
Сказали Спасибо 2,261 раз(а) в 1,557 сообщении(ях)
dosikus на пути к лучшему
По умолчанию Re: Пишем свое API

Сообщение от Easyrider83 Посмотреть сообщение
А вот это устройство перед отправкой заказчику.
Что за хрень и кому понадобился такой адский интерфейс ?
__________________
Осторожно , злой кот
dosikus вне форума  
Непрочитано 23.08.2015, 22:30  
Easyrider83
Гуру портала
 
Аватар для Easyrider83
 
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,821
Сказал спасибо: 919
Сказали Спасибо 4,289 раз(а) в 2,570 сообщении(ях)
Easyrider83 на пути к лучшему
По умолчанию Re: Пишем свое API

Сообщение от dosikus Посмотреть сообщение
Что за хрень и кому понадобился такой адский интерфейс ?

Клиент платит - я делаю.
Easyrider83 вне форума  
Сказали "Спасибо" Easyrider83
dosikus (23.08.2015)
Непрочитано 23.08.2015, 22:44  
omercury
Почётный гражданин KAZUS.RUN
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,487
Сказал спасибо: 30
Сказали Спасибо 3,070 раз(а) в 2,011 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: Пишем свое API

Сообщение от dosikus Посмотреть сообщение
Что за хрень и кому понадобился такой адский интерфейс ?
Помнишь, клиенту надо было уровень с морды лица какой-то шарманки на стену в виде цифр?
Вот это оно и есть.
omercury вне форума  
Сказали "Спасибо" omercury
dosikus (23.08.2015)
Непрочитано 23.08.2015, 23:15  
Easyrider83
Гуру портала
 
Аватар для Easyrider83
 
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,821
Сказал спасибо: 919
Сказали Спасибо 4,289 раз(а) в 2,570 сообщении(ях)
Easyrider83 на пути к лучшему
По умолчанию Re: Пишем свое API

Сообщение от omercury Посмотреть сообщение
Помнишь, клиенту надо было уровень с морды лица какой-то шарманки на стену в виде цифр?
Вот это оно и есть.
Почти так. Есть некий Hi-End усилитель, стоящий каких-то нереальных денег и на его панели зачем-то выведен уровень громкости в двоичном коде. Внедряться в схему усилителя нельзя. Вскрывать усилитель тоже. Поэтому такая вот накладка и есть желание клиента.
Easyrider83 вне форума  
Непрочитано 24.08.2015, 00:11  
omercury
Почётный гражданин KAZUS.RUN
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,487
Сказал спасибо: 30
Сказали Спасибо 3,070 раз(а) в 2,011 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: Пишем свое API

Сообщение от Easyrider83 Посмотреть сообщение
на его панели зачем-то выведен уровень громкости в двоичном коде
Типа тех часов.
Понты.

Надо было сразу в виде линейной шкалы сделать, чтоб не перекраивать дважды.
Кстати, имеет смысл предложить.

UPD.
Или в виде стрелочника на графическом дисплее. Уже после изготовления шкалы, естественно.

Последний раз редактировалось omercury; 24.08.2015 в 00:18.
omercury вне форума  
Непрочитано 24.08.2015, 00:43  
omercury
Почётный гражданин KAZUS.RUN
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,487
Сказал спасибо: 30
Сказали Спасибо 3,070 раз(а) в 2,011 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: Пишем свое API

Сообщение от omercury Посмотреть сообщение
в виде стрелочника
Стрелочники лучше эмулировать скифовские - вверх ногами, они прикольнее. Типа таких.

А для шкалы могу подогнать винтажный газоразрядный от магнитофона "Маяк-233", родной, муха не сидела.
omercury вне форума  
Непрочитано 24.08.2015, 00:44  
Easyrider83
Гуру портала
 
Аватар для Easyrider83
 
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,821
Сказал спасибо: 919
Сказали Спасибо 4,289 раз(а) в 2,570 сообщении(ях)
Easyrider83 на пути к лучшему
По умолчанию Re: Пишем свое API

Тема уходит в сторону. Добавил в проект часы и SD карту по SDIO. Потом выложу обновленный вариант.
Easyrider83 вне форума  
 
Опции темы

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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
свое USB устройство ESWANT Микроконтроллеры, АЦП, память и т.д 2 08.09.2009 14:58


Часовой пояс GMT +4, время: 19:16.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.