|
Диагностика через светодиод, 1 диод, много состояний |
|
|
|
Feb 26 2008, 23:53
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Вопрос в следующем: - есть один LED загорающийся подачей 0 в порт - пусть имя порта определено типа #define LED_PORT PORTx - и маска пина диода типа #define LED_MASK (1<<Pxx) - есть прерывание(функция) вызывающаяся допустим раз в миллисекунду - нужно выводить много различных состояний(диагностика) на этот LED - примеры: 0,5c горим; 0,5 не горим 0,25c горим; 1c не горим; 0,25 горим, ..... 0,25c горим; 0,25c не горим, 0,25 горим, 1c не горим,.... ну и т.д. - количество состояний ограниченно чем-нить разумным, типа 4-6 вариантов последовательностей.
вопрос в том как эфективнее(и по коду и по скорости) это организовать...
P.S. крайние варианты типа горим полгода а потом не горим 1мс не рассматриваем P.P.S должен присутствовать и вариант просто горим непрерывно P.P.P.S. как это сделать в принципе, я знаю, интересны просто варианты сделать это оптимально.
|
|
|
|
|
 |
Ответов
|
Feb 27 2008, 04:33
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Ну например так. Заводим структуру: Код typedef struct { unsigned int OnTime; unsigned int OffTime; }LedStateTimes; Перечисляем возможные состояния светодиода: Код typedef enum { lsState1 = 0, lsState2, lsState3, lsState4 }LedStates; И соответствующие им длительности горения/негорения (в тиках таймера): Код const LedStateTimes LedTimes[] = { {20, 50}, {20, 500}, {200, 50}, {2000, 50}, }; объявляем переменную состояния диода: Код LedStates led_state = lsState1; И в таймерном прерывании: Код { static unsigned int ticks = 10; static int led_is_on;
if (!--ticks) { if (led_is_on) { led_is_on = 0; off(LED_PIN); ticks = LedTimes[led_state].OffTime; } else { led_is_on = 1; on(LED_PIN); ticks = LedTimes[led_state].OnTime; } } } Вот, как-то так:-)
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Feb 27 2008, 07:07
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(AHTOXA @ Feb 27 2008, 06:33)  Ну например так. Заводим структуру: Перечисляем возможные состояния светодиода: Код практически один-в-один как у меня, только непонятно, зачем led_is_on, ведь можно считывать if(signal(LED_PIN)). Еще у меня состояния перечислены в порядке их приоритетов, первое состояние IDLE (не горим): Код enum tLEDState { LED_IDLE, LED_GPS_OFF, LED_GPS_NOT_VALID, LED_GPS_VALID }; typedef struct { tFastTime OnTime; tFastTime Period; } tLEDBlink; #define sec *(OSC/65536) __flash tLEDBlink const LEDBlink[] = { {0,0}, {0.15 sec, 10 sec}, {1.35 sec, 1.5 sec}, {0.15 sec, 1.5 sec}, }; После откончания цикла состояние возвращается в IDLE и функция blink(), через которую прописывается новое состояние, проверяет - если новое состояние более приоритетно, чем текущее - оно принимается и процесс перезапускается. Если менее - игнорируется. В программе blink() вызывается на каждом проходе основного цикла (можно в нескольких разных местах).
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
Сообщений в этой теме
singlskv Диагностика через светодиод Feb 26 2008, 23:53 yod Ну как в PC сделано - при загрузке динамик орет е... Feb 27 2008, 03:48  AHTOXA Цитата(Сергей Борщ @ Feb 27 2008, 12:07) ... Feb 27 2008, 07:24 singlskv Цитата(AHTOXA @ Feb 27 2008, 07:33) ........ Feb 27 2008, 18:22  Сергей Борщ Цитата(singlskv @ Feb 27 2008, 20:22) воп... Feb 27 2008, 21:57  AHTOXA Цитата(singlskv @ Feb 27 2008, 23:22) нуж... Feb 28 2008, 04:45 war4one Цитата(singlskv @ Feb 27 2008, 02:53) Воп... Feb 27 2008, 05:25 Dog Pawlowa Есть случаи, когда тестируются базовые вещи в само... Feb 27 2008, 07:12 Kirill Frolov Цитата(singlskv @ Feb 27 2008, 02:53) Воп... Feb 27 2008, 07:19 war4one Цитата(Kirill Frolov @ Feb 27 2008, 10:19... Feb 27 2008, 09:47 muravei Цитата(Kirill Frolov @ Feb 27 2008, 10:19... Feb 27 2008, 15:53 bodja74 Светодиод на TX ,если заморгал ,переключаюсь на те... Feb 27 2008, 12:15 zhevak Господа, господа!
Давайте сначала определимся... Feb 27 2008, 20:10 singlskv Цитата(zhevak @ Feb 27 2008, 23:10) Госпо... Feb 27 2008, 21:02  bodja74 Цитата(singlskv @ Feb 28 2008, 01:02) Раз... Feb 27 2008, 21:38 Nanobyte Если прибор не сильно многосерийный, а пользовател... Feb 28 2008, 06:53 Wildcat ЦитатаЕсли прибор не сильно многосерийный, а польз... Feb 28 2008, 22:12 singlskv Цитата(Wildcat @ Feb 29 2008, 01:12) По п... Feb 28 2008, 22:38  rezident Цитата(singlskv @ Feb 29 2008, 03:38) Про... Feb 28 2008, 22:48 zltigo Когда-то особо не заморачиваясь написал мигалку на... Feb 28 2008, 23:43 singlskv Цитата(zltigo @ Feb 29 2008, 02:43) Когда... Feb 29 2008, 00:10  ReAl Цитата(singlskv @ Feb 29 2008, 02:10) Неч... Feb 29 2008, 07:47   zltigo Цитата(ReAl @ Feb 29 2008, 10:47) ...на р... Feb 29 2008, 08:13   singlskv Цитата(ReAl @ Feb 29 2008, 10:47) Ну и чт... Feb 29 2008, 09:21 Angelo Используйте 2 светодиода, затраты чуть выше, зато ... Mar 1 2008, 15:16
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|