|
Диагностика через светодиод, 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, 18:22
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(AHTOXA @ Feb 27 2008, 07:33)  .................... Цитата(Сергей Борщ @ Feb 27 2008, 10:07)  ................... Ну у меня примерно тоже самое.., только вопрос вот в чем, У вас все задействованно только под длитON,длитOFF, а нужно разные(в том числе по количеству состояний) последовательности, как в моем первом примере, OK, пусть нужно очень конкретные: 250MS_ON, 250MS_OFF, 250MS_ON, 250MS_OFF, 250MS_ON, 1000MS_OFF // три вспышки, пауза 500MS_ON, 500MS_OFF // равномерное мигание 250MS_ON, 250MS_OFF, 250MS_ON, 1000MS_OFF // две вспышки, пауза _ON // все время включено вопрос в том как запоминать все состояния эфективно, они все разные по длительности и по количеству состояний. Цитата(bodja74 @ Feb 27 2008, 15:15)  Светодиод на TX ,если заморгал ,переключаюсь на терминал и гляжу ,чего он мыргает  А в целом лучше просто через терминалку глядеть ,чем через диод. Спасибо, Вы подсказали мне одну идею, хотя чуть с другим вариантом использования, действительно, можно для нужд диагностики задействовать какой-нить незадействованный интерфейс, буду подумать...
|
|
|
|
|
Feb 27 2008, 21:57
|

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

|
Цитата(singlskv @ Feb 27 2008, 20:22)  вопрос в том как запоминать все состояния эфективно, они все разные по длительности и по количеству состояний. Примерно так (нашел в очень старом исходнике): Код .h:
typedef struct { unsigned char Freq; unsigned Time; } NoteType; extern void beep(NoteType *);
extern NoteType PowerOnBeep[]; extern NoteType PowerOffBeep[]; extern NoteType LegalKeyBeep[]; extern NoteType IllegalKeyBeep[];
.c:
NoteType const PowerOnBeep[]= { {Hz(2000),100 ms}, {Hz(1000),100 ms}, {Hz(500),100 ms}, {Hz(200),200 ms}, {0,0} }; NoteType const PowerOffBeep[]= { {Hz(100),200 ms}, {Hz(500),100 ms}, {0,0} }; NoteType const LegalKeyBeep[]={{Hz(1000),100 ms},{0,0}}; NoteType const IllegalKeyBeep[]={{Hz(200),100 ms},{0,0}};
--------------------
На любой вопрос даю любой ответ"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, 06:33) Ну на... Feb 27 2008, 07:07  AHTOXA Цитата(Сергей Борщ @ Feb 27 2008, 12:07) ... Feb 27 2008, 07:24  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
|
|
|