Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту


 
Опции темы
Непрочитано 21.08.2015, 14:45  
andries5
Почётный гражданин KAZUS.RU
 
Регистрация: 19.02.2008
Сообщений: 1,802
Сказал спасибо: 124
Сказали Спасибо 602 раз(а) в 419 сообщении(ях)
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,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
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
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
dosikus на пути к лучшему
По умолчанию Re: Пишем свое API

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

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

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

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

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

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

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

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

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

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

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

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

Закладки
Опции темы

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

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

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

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


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


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot