реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Диагностика через светодиод, 1 диод, много состояний
singlskv
сообщение Feb 26 2008, 23:53
Сообщение #1


дятел
*****

Группа: Свой
Сообщений: 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. как это сделать в принципе, я знаю, интересны просто варианты сделать это оптимально.
Go to the top of the page
 
+Quote Post
yod
сообщение Feb 27 2008, 03:48
Сообщение #2


Участник
*

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



Ну как в PC сделано - при загрузке динамик орет если какая ошибка в процесе POST возникла - вот аналогично и надо делать (у нас в конторе так делается).
Основное время ГОРИМ. в случае ошибки - генерируется код ошибки (1,2,3 и т.д.) периодично (ограждая последовательность вспышек интервалами по 2-3 секунде ) зажигаем лед с периодом 1 сек и меандром 0.5 столько раз чтоб соотвествовать коду ошибки. Тогда дяде Васе легко даже с бодуна посчитать скильки раз всыхнула лампочка на контроллере smile.gif
Ну и модификация метода - в нормальном режиме не просто горим а а плавно моргаем - помогает иногда отследить зависания, ну и можно иногда на глаз "перегрузку" процессора отследить (рывки в моргании).
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Feb 27 2008, 04:33
Сообщение #3


фанат дивана
******

Группа: Свой
Сообщений: 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;
        }
    }
}


Вот, как-то так:-)


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
war4one
сообщение Feb 27 2008, 05:25
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 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


--------------------
Электронные устройства Open Hardware
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 27 2008, 07:07
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Feb 27 2008, 07:12
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Есть случаи, когда тестируются базовые вещи в самом начале программы. Если они не работают, нет смысла заходить в основной цикл, с прерываниями и прочим, а просто зависнуть на индикации ошибки. Тогда следующая простая функция может помочь. Константы подобрать в зависимости от частоты и по вкусу.

Код
void Blinks(char pulses)
{        char i;
        if (!pulses) return;
        for (i=0; i<pulses; i++)
        {    ON_LED;
            __delay_cycles(500000);
            OFF_LED;
            __delay_cycles(1600000);
        }
         __delay_cycles(10000000);
}


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
Kirill Frolov
сообщение Feb 27 2008, 07:19
Сообщение #7


Частый гость
**

Группа: Новичок
Сообщений: 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]
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Feb 27 2008, 07:24
Сообщение #8


фанат дивана
******

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



Цитата(Сергей Борщ @ Feb 27 2008, 12:07) *
Код практически один-в-один как у меня, только непонятно, зачем led_is_on, ведь можно считывать if(signal(LED_PIN)).


Тогда уж не signal(), а latch() :-)

А переменная у меня для совместимости с MCS51, там бывали проблемы, когда диод подсаживал ногу.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
war4one
сообщение Feb 27 2008, 09:47
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 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) *
А декодировать всякие там двоично-десятичные коды закодированные манчестером никакой дурак в трезвом уме не будет.


Почему же, видел и такое. У светодиода была три состояния: просто горит - все путем, "спокойно" мигает - неизвестная ошибка, хаотично мигает - значит, проц определил неисправность и передает ее в последовательном коде. Далее извлекался цифровой осциллограф и начинался процесс камлания smile.gif


--------------------
Электронные устройства Open Hardware
Go to the top of the page
 
+Quote Post
bodja74
сообщение Feb 27 2008, 12:15
Сообщение #10


Знающий
****

Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984



Светодиод на TX ,если заморгал ,переключаюсь на терминал и гляжу ,чего он мыргает smile.gif
А в целом лучше просто через терминалку глядеть ,чем через диод.
Go to the top of the page
 
+Quote Post
muravei
сообщение Feb 27 2008, 15:53
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 538
Регистрация: 13-08-05
Пользователь №: 7 591



Цитата(Kirill Frolov @ Feb 27 2008, 10:19) *
Лучше две ножки использовать. Тогда можно ставить двухцветыные светодиоды

Я тоже так делал : на четыре ноги - 4 двухцв. св. диода (дин. инд.) и еще можно помигать разными цветами и попеременно. А одноцвеным мигать лучше азбукой Морзе. smile.gif
Go to the top of the page
 
+Quote Post
singlskv
сообщение Feb 27 2008, 18:22
Сообщение #12


дятел
*****

Группа: Свой
Сообщений: 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 ,если заморгал ,переключаюсь на терминал и гляжу ,чего он мыргает smile.gif
А в целом лучше просто через терминалку глядеть ,чем через диод.
Спасибо, Вы подсказали мне одну идею, хотя чуть с другим вариантом
использования, действительно, можно для нужд диагностики задействовать
какой-нить незадействованный интерфейс, буду подумать...
Go to the top of the page
 
+Quote Post
zhevak
сообщение Feb 27 2008, 20:10
Сообщение #13


Знающий
****

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



Господа, господа!

Давайте сначала определимся с целевой аудиторией -- для кого эти моргания предназначены -- для себя людимого (1), для специалиста, который умеет тыкать осциллографом (2), или для юзера, который умеет тыкать пальцем (3).

Начну с последего -- с юзера (3). Тут бесспорно лучше отдать предпочтение предложению от Kirill Frolov

Цитата
Всё это муторно сильно для пользователя. Единственный разумный вариант: тишина (или свербыстрое перемигивание) и потом 1..10 чётко различимых вспышек разумной (0.5с горит, 0.5с пауза) длительности, чтоб их можно было сосчитать вручную (плюс дублирование звуковым сигналом, если возможно). А декодировать всякие там двоично-десятичные коды закодированные манчестером никакой дурак в трезвом уме не будет.


Кирилл абсолютно прав. Сначала выдаем какой-нибудь отличительный признак того, что сейчас начнется отсчет вспышек, например частое моргание или длительная пауза, а потом выдаем собственно серию этих самых всышек. Любая толстаяжо тетка сообразит посчитать вспышки и сообщить по телефону (или как там) специалисту о неисправности системы. Тупо, просто и предельно понятно. В пределах десятка вспышек не напрягая юзера можно сообщить об основных проблемах. Что касаемо звука, то можно параллельно ЛЭДу повесить зуммер (со встроенным генератором, таких полно, стоят они не дорого).

Если речь идет о специалисте (2) с компом, то самое простое -- это зажигать лампочку, а по TXD вываливать инфу. Причем можно это все дело совместить на одной ноге, как предложил bodja74. Спец цепляет ногу к компу, запускает терминалку и читает на экране ASCII-сообщения.

Про "себя любимого" (1) скажу только одно -- "Месье знает толк в извращениях" (С).


Что характерно, тема полезная получилась smile.gif


--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
Go to the top of the page
 
+Quote Post
singlskv
сообщение Feb 27 2008, 21:02
Сообщение #14


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(zhevak @ Feb 27 2008, 23:10) *
Господа, господа!
Давайте сначала определимся с целевой аудиторией -- для кого эти моргания предназначены -- для себя людимого (1), для специалиста, который умеет тыкать осциллографом (2), или для юзера, который умеет тыкать пальцем (3).....

...а потом выдаем собственно серию этих самых всышек. Любая толстаяжо тетка сообразит посчитать вспышки и сообщить по телефону (или как там) специалисту о неисправности системы. Тупо, просто и предельно понятно.

Разговор именно об этой толстаяжо женщине с красивой, и не очень худощавой попой...
Ну а если серьезно, разговор о том как хранить инфу для диагностики в сложных случаях,
именно тогда когда она предназначена для красивых женщин пользователей вашей
поделки....
Go to the top of the page
 
+Quote Post
bodja74
сообщение Feb 27 2008, 21:38
Сообщение #15


Знающий
****

Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984



Цитата(singlskv @ Feb 28 2008, 01:02) *
Разговор именно об этой толстаяжо женщине с красивой, и не очень худощавой попой...
Ну а если серьезно, разговор о том как хранить инфу для диагностики в сложных случаях,
именно тогда когда она предназначена для красивых женщин пользователей вашей
поделки....


Смотрите тематику автодиагностики. smile.gif

Во всех машинах ошибки прописываются в EEPROM и лампочка мыргает smile.gif ,ну а дальше с денежками
в дяде Васе ,бывшему автослесарю ,который поднялся и купил себе комп со шнурком biggrin.gif
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 05:47
Рейтинг@Mail.ru


Страница сгенерированна за 0.01509 секунд с 7
ELECTRONIX ©2004-2016