|
Диагностика через светодиод, 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. как это сделать в принципе, я знаю, интересны просто варианты сделать это оптимально.
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 26)
|
Feb 27 2008, 03:48
|
Участник

Группа: Новичок
Сообщений: 24
Регистрация: 20-10-06
Пользователь №: 21 500

|
Ну как в PC сделано - при загрузке динамик орет если какая ошибка в процесе POST возникла - вот аналогично и надо делать (у нас в конторе так делается). Основное время ГОРИМ. в случае ошибки - генерируется код ошибки (1,2,3 и т.д.) периодично (ограждая последовательность вспышек интервалами по 2-3 секунде ) зажигаем лед с периодом 1 сек и меандром 0.5 столько раз чтоб соотвествовать коду ошибки. Тогда дяде Васе легко даже с бодуна посчитать скильки раз всыхнула лампочка на контроллере Ну и модификация метода - в нормальном режиме не просто горим а а плавно моргаем - помогает иногда отследить зависания, ну и можно иногда на глаз "перегрузку" процессора отследить (рывки в моргании).
|
|
|
|
|
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, 05:25
|
Местный
  
Группа: Свой
Сообщений: 264
Регистрация: 16-07-05
Из: г. Уфа
Пользователь №: 6 851

|
Цитата(singlskv @ Feb 27 2008, 02:53)  Вопрос в следующем:... Имхо, проще сделать дифференциацию по количеству подмаргиваний, а не по времени. Делал так для индикации светодиодом уровня сигнала GSM-модуля. Было что-то вроде: Код #define TmQuartSeconds 7 // 1/4 секунды при частоте переполнения таймера 30 Гц #define TmFullSSPeriod 160 // Один раз в столько тиков обновляется информация о уровне сигнала Потом, в таймерном прерывании: Код ++Ticks; if (Ticks % TmFullSSPeriod == 0) // Загрузка значения уровня сигнала { TmSS = 2*GSMSigStrength; clrbit(PORTC, GSMLED); } if (Ticks % TmQuartSeconds == 0) // Проверяем состояние GSM-модуля раз в четверть секунды { if (GSMStatus == 2) // Если GSM-модуль зарегистрирован в сети - показываем уровень сигнала { if (TmSS > 0) // Индикатор мигает { invbit(PORTC, GSMLED); TmSS--; } else clrbit(PORTC, GSMLED); // Индикатор потушен } }
Сообщение отредактировал war4one - Feb 27 2008, 05:26
--------------------
|
|
|
|
|
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)
|
|
|
|
|
Feb 27 2008, 07:19
|

Частый гость
 
Группа: Новичок
Сообщений: 111
Регистрация: 10-02-07
Из: St.Petersburg, Russia
Пользователь №: 25 241

|
Цитата(singlskv @ Feb 27 2008, 02:53)  Вопрос в следующем: - есть один LED загорающийся подачей 0 в порт Лучше две ножки использовать. Тогда можно ставить двухцветыные светодиоды и отображать разом 4 цвета: чёрный, красный, зелёный и жёлтый. лисекунду Цитата - нужно выводить много различных состояний(диагностика) на этот LED - примеры: 0,5c горим; 0,5 не горим 0,25c горим; 1c не горим; 0,25 горим, ..... 0,25c горим; 0,25c не горим, 0,25 горим, 1c не горим,.... ну и т.д. - количество состояний ограниченно чем-нить разумным, типа 4-6 вариантов последовательностей. Всё это муторно сильно для пользователя. Единственный разумный вариант: тишина (или свербыстрое перемигивание) и потом 1..10 чётко различимых вспышек разумной (0.5с горит, 0.5с пауза) длительности, чтоб их можно было сосчитать вручную (плюс дублирование звуковым сигналом, если возможно). А декодировать всякие там двоично-десятичные коды закодированные манчестером никакой дурак в трезвом уме не будет.
--------------------
[ZX]
|
|
|
|
|
Feb 27 2008, 09:47
|
Местный
  
Группа: Свой
Сообщений: 264
Регистрация: 16-07-05
Из: г. Уфа
Пользователь №: 6 851

|
Цитата(Kirill Frolov @ Feb 27 2008, 10:19)  Всё это муторно сильно для пользователя. Единственный разумный вариант: тишина (или свербыстрое перемигивание) и потом 1..10 чётко различимых вспышек разумной (0.5с горит, 0.5с пауза) длительности, чтоб их можно было сосчитать вручную. Так и предлагаю. Действительно удобно, когда сложная система, а из средств вывода - одни лампочки. Видел еще реализацию с яркостью свечения, но, имхо, не очень удобно. Цитата(Kirill Frolov @ Feb 27 2008, 10:19)  А декодировать всякие там двоично-десятичные коды закодированные манчестером никакой дурак в трезвом уме не будет. Почему же, видел и такое. У светодиода была три состояния: просто горит - все путем, "спокойно" мигает - неизвестная ошибка, хаотично мигает - значит, проц определил неисправность и передает ее в последовательном коде. Далее извлекался цифровой осциллограф и начинался процесс камлания
--------------------
|
|
|
|
|
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, 20:10
|

Знающий
   
Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065

|
Господа, господа! Давайте сначала определимся с целевой аудиторией -- для кого эти моргания предназначены -- для себя людимого (1), для специалиста, который умеет тыкать осциллографом (2), или для юзера, который умеет тыкать пальцем (3). Начну с последего -- с юзера (3). Тут бесспорно лучше отдать предпочтение предложению от Kirill FrolovЦитата Всё это муторно сильно для пользователя. Единственный разумный вариант: тишина (или свербыстрое перемигивание) и потом 1..10 чётко различимых вспышек разумной (0.5с горит, 0.5с пауза) длительности, чтоб их можно было сосчитать вручную (плюс дублирование звуковым сигналом, если возможно). А декодировать всякие там двоично-десятичные коды закодированные манчестером никакой дурак в трезвом уме не будет. Кирилл абсолютно прав. Сначала выдаем какой-нибудь отличительный признак того, что сейчас начнется отсчет вспышек, например частое моргание или длительная пауза, а потом выдаем собственно серию этих самых всышек. Любая толстаяжо тетка сообразит посчитать вспышки и сообщить по телефону (или как там) специалисту о неисправности системы. Тупо, просто и предельно понятно. В пределах десятка вспышек не напрягая юзера можно сообщить об основных проблемах. Что касаемо звука, то можно параллельно ЛЭДу повесить зуммер (со встроенным генератором, таких полно, стоят они не дорого). Если речь идет о специалисте (2) с компом, то самое простое -- это зажигать лампочку, а по TXD вываливать инфу. Причем можно это все дело совместить на одной ноге, как предложил bodja74. Спец цепляет ногу к компу, запускает терминалку и читает на экране ASCII-сообщения. Про "себя любимого" (1) скажу только одно -- "Месье знает толк в извращениях" (С). Что характерно, тема полезная получилась
--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
|
|
|
|
|
Feb 27 2008, 21:02
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(zhevak @ Feb 27 2008, 23:10)  Господа, господа! Давайте сначала определимся с целевой аудиторией -- для кого эти моргания предназначены -- для себя людимого (1), для специалиста, который умеет тыкать осциллографом (2), или для юзера, который умеет тыкать пальцем (3).....
...а потом выдаем собственно серию этих самых всышек. Любая толстаяжо тетка сообразит посчитать вспышки и сообщить по телефону (или как там) специалисту о неисправности системы. Тупо, просто и предельно понятно. Разговор именно об этой толстаяжо женщине с красивой, и не очень худощавой попой... Ну а если серьезно, разговор о том как хранить инфу для диагностики в сложных случаях, именно тогда когда она предназначена для красивых женщин пользователей вашей поделки....
|
|
|
|
|
Feb 27 2008, 21:38
|
Знающий
   
Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984

|
Цитата(singlskv @ Feb 28 2008, 01:02)  Разговор именно об этой толстаяжо женщине с красивой, и не очень худощавой попой... Ну а если серьезно, разговор о том как хранить инфу для диагностики в сложных случаях, именно тогда когда она предназначена для красивых женщин пользователей вашей поделки.... Смотрите тематику автодиагностики.  Во всех машинах ошибки прописываются в EEPROM и лампочка мыргает  ,ну а дальше с денежками в дяде Васе ,бывшему автослесарю ,который поднялся и купил себе комп со шнурком
|
|
|
|
|
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)
|
|
|
|
|
Feb 28 2008, 04:45
|

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

|
Цитата(singlskv @ Feb 27 2008, 23:22)  нужно разные(в том числе по количеству состояний) последовательности, как в моем первом примере, 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 // все время включено Тогда наверное проще иметь массив длительностей, и чтобы некоторые значения (например отрицательные) имели специальный смысл. Например, -1 - остановиться, -2 - вернуться к началу... Хотя, если это для пользователей, то я тоже склоняюсь к мысли, что индикация должна производиться числом вспышек, а не хитрой последовательностью сигналов.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Feb 28 2008, 06:53
|

За битами по регистрам гоняюсь
  
Группа: Свой
Сообщений: 457
Регистрация: 24-04-06
Из: Таганрог
Пользователь №: 16 446

|
Если прибор не сильно многосерийный, а пользователи не специалисты, лучше поставить один дешёвый семисегментный индикатор и регистр сдвига. Число осмысленных знаков более двух десятков, а если использовать и мигание, тогда, ИМХО, хватит на всё. Расходуется всего два пина, можно обойтись и одним. В итоге, получится ещё и дешевле, ибо экономятся деньги на междугородних переговорах с заказчиком. В своё время мне приходилось растолковывать заказчикам мигающие сигналы, и хотя в мануале всё было расписано, всегда находится особо неопытный пользователь. После установки индикатора проблемы закончились.
--------------------
Курсор влево, курсор вправо - считается хакерством. FORMAT C: производится без предупреждения
|
|
|
|
|
Feb 28 2008, 22:12
|
Частый гость
 
Группа: Участник
Сообщений: 104
Регистрация: 21-12-06
Пользователь №: 23 770

|
Цитата Если прибор не сильно многосерийный, а пользователи не специалисты, лучше поставить один дешёвый семисегментный индикатор и регистр сдвига. Число осмысленных знаков более двух десятков, а если использовать и мигание, тогда, ИМХО, хватит на всё. Расходуется всего два пина, можно обойтись и одним. В итоге, получится ещё и дешевле, ибо экономятся деньги на междугородних переговорах с заказчиком. В своё время мне приходилось растолковывать заказчикам мигающие сигналы, и хотя в мануале всё было расписано, всегда находится особо неопытный пользователь. После установки индикатора проблемы закончились. Святые слова По поводу одного светодиода с различными комбинациями для женщины - знало бы о ваших идеях наше ОТК =>  ... Количество глюков невообразимо. Могут пропускать все - мигание, включение, выключение, считать вспышки - тем более. Это вы и специалист разберетесь и знаете, когда работает, а когда нет. Ставьте индикатор по совету Nanobyte и не сомневайтесь. Вам будет намного легче жить
--------------------
Затравленный и прижатый к стене кот превращается в тигра. Мигель Сервантес.
|
|
|
|
|
Feb 28 2008, 22:38
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(Wildcat @ Feb 29 2008, 01:12)  По поводу одного светодиода с различными комбинациями для женщины - знало бы о ваших идеях наше ОТК =>  ... Количество глюков невообразимо. Могут пропускать все - мигание, включение, выключение, считать вспышки - тем более. Это вы и специалист разберетесь и знаете, когда работает, а когда нет. Да нет, насчет женщин это была просто кем-то подкинутая шутка, смотреть на мигание будут инженеры, так что непоняток не будет, а поставить по индикатору к каждому процу просто невозможно, на одной плате может быть до 16 таких процов и каждый со своим блоком питания, и т.д. Вопрос был именно в организации хранения информации о состоянии светодиода(количество режимов, количество состояний в каждом режиме, длительности интервалов ON/OFF). Просто количество байтиков на хранение этой инфы оказалось немаленьким, и хотя в итоге я уместился в нужный объем, возник вопрос, а нельзя ли уменьшить количество, необходимой для столь простого действия, памяти.... типа может я чего-нить не так делаю
|
|
|
|
|
Feb 28 2008, 23:43
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Когда-то особо не заморачиваясь написал мигалку на 10 состояний для 4x светодиодов, ARM  Код //--------------------------------------------------------------------------- #define MAX_LED_MODES 10 static const ulong led_const[MAX_LED_MODES] = { 0x00000000, // 0 Off 0x11111111, // 1 On 0x11110000, // 2 Slow Blink 0x11001100, // 3 Normal Blink 0x10101010, // 4 Fast Blink 0x10000000, // 5 Single Flash 0x10100000, // 6 Two Flash 0x10101000, // 7 Tree Flash 0x01111111, // 8 Single Blackout 0x01011111 // 9 Two Blackout }; ulong ledstat = 0; // 4 LEDS processor //--------------------------------------------------------------------------- void led_prosess( int counter ) { ulong curstat; curstat = ((ledstat >> ((counter & 0x07 )<<2)) & 0x0F)<<BIT_LED0; if( curstat ) IO1CLR = curstat; curstat = (~curstat)&(0x0F<<BIT_LED0); if( curstat ) IO1SET = curstat; }
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Feb 29 2008, 00:10
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(zltigo @ Feb 29 2008, 02:43)  Когда-то особо не заморачиваясь написал мигалку на 10 состояний для 4x светодиодов, ARM  Спасибо. Нечто подобное я обдумывал, но у такого варианта есть один недостаток, все циклы(время одного прохода) имеют одинаковую длительность, а это не всегда удобно, правда зато по памяти не накладно.
|
|
|
|
|
Feb 29 2008, 07:47
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(singlskv @ Feb 29 2008, 02:10)  Нечто подобное я обдумывал, но у такого варианта есть один недостаток, все циклы(время одного прохода) имеют одинаковую длительность, а это не всегда удобно, правда зато по памяти не накладно. Ну и что? Всё равно очень тонких различий в длительности на глаз нельзя заметить - выбираете подходящий квант времени и останавливаетесь на различии Т и 2Т, а 1,5Т всё равно будет мало отличимо от обеих. Зато очень просто реализуется, "хочется вааще цветомузыку устроить" - дайте 16 бит маску на светодиод. У меня с не помню каких времён так и светодиоды сделаны (загружается маска, в прерывании по старшему биту светим/не светим и циклический сдвиг маски влево) и пискунчики (только там маска в прерывании сдвигается логическим сдвигом, а не циклическим - отпищали и затихли).
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Feb 29 2008, 08:13
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(ReAl @ Feb 29 2008, 10:47)  ...на различии Т и 2Т, а 1,5Т всё равно будет мало отличимо от обеих. Именно так, как на слух можно отличить более-менее уверенно 6dB по уровню, так и на глаз частоту мигания в два раза. Посему и сделано было три градации, частоты мигания и до трех (дальше уже народ путается) морганий/пригасаний. Формально, состояний в приведенном тексте можно нарисовать и много больше, но они будут мало отличаться.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Feb 29 2008, 09:21
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(ReAl @ Feb 29 2008, 10:47)  Ну и что? Всё равно очень тонких различий в длительности на глаз нельзя заметить - выбираете подходящий квант времени и останавливаетесь на различии Т и 2Т, а 1,5Т всё равно будет мало отличимо от обеих. Зато очень просто реализуется, "хочется вааще цветомузыку устроить" - дайте 16 бит маску на светодиод. Дело в том, что иногда вывод на светодиод диагностики совмещен с выводом диагностики на верхний проц и там приходиться делать очень разные по длительности последовательности. Вобщем, как всегда, хочется максимальная гибкость настроек в сочетании с минимальными ресурсами на реализацию. И на елку влезть....
|
|
|
|
|
Mar 1 2008, 15:16
|
Участник

Группа: Участник
Сообщений: 58
Регистрация: 1-12-07
Пользователь №: 32 871

|
Используйте 2 светодиода, затраты чуть выше, зато легко определяемых состояний на порядки больше. Не эстетично юзеру с секундомером сидеть, это зло.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|