Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
08.10.2011, 21:20
|
|
Гражданин KAZUS.RU
Регистрация: 25.11.2008
Адрес: Волгоград
Сообщений: 507
Сказал спасибо: 42
Сказали Спасибо 49 раз(а) в 46 сообщении(ях)
|
Re: Светодиодный индикатор и нагрузка на порты
Сообщение от oleg110592
|
если надо зажигаем или если не надо не зажигаем в каждом разряде сегмент А, за тем если надо зажигаем или если не надо не зажигаем в каждом разряде сегмент В и т.д.
|
Любопытно, раньше не знал такой метод, надо покумекать...
|
|
|
|
08.10.2011, 21:31
|
|
Гражданин KAZUS.RU
Регистрация: 05.04.2009
Сообщений: 976
Сказал спасибо: 35
Сказали Спасибо 155 раз(а) в 134 сообщении(ях)
|
Re: Светодиодный индикатор и нагрузка на порты
Сообщение от st_1
|
Проехали...
Я успел прочитать затёртый пост...
|
Прошу прощения там, мне показалось, сильно нахвастался - нехорошо.
Сообщение от roma9112
|
Любопытно, раньше не знал такой метод, надо покумекать...
|
Когда увидел подобную схему впервые, тоже не смог долго вьехать -надо ли пример Вам на СИ, AB?
|
|
|
|
08.10.2011, 21:39
|
|
Гражданин KAZUS.RU
Регистрация: 25.11.2008
Адрес: Волгоград
Сообщений: 507
Сказал спасибо: 42
Сказали Спасибо 49 раз(а) в 46 сообщении(ях)
|
Re: Светодиодный индикатор и нагрузка на порты
Не плохо бы примерчики! Заранее спасибо!
|
|
|
|
08.10.2011, 22:11
|
|
Гражданин KAZUS.RU
Регистрация: 05.04.2009
Сообщений: 976
Сказал спасибо: 35
Сказали Спасибо 155 раз(а) в 134 сообщении(ях)
|
Re: Светодиодный индикатор и нагрузка на порты
типа как-то так (прерывания каждые 2мс при тактовой 8 мГц )
IAR AVR MEGA48:
Код:
|
#define SEI() asm("sei")
#define SETBIT(x,y) (x |= (y)) // Set bit y in byte x
#define CLRBIT(x,y) (x &= (~(y))) // Clear bit y in byte x
#define CHKBIT(x,y) (x & (y)) // Check bit y in byte x
#define TOGGLEBIT(x,y) (x^=y)
// A
// --
// F | | B
// -- G
// E | | C
// -- ~H
// D
#define SegA 1‹‹2
#define SegB 1‹‹0
#define SegC 1‹‹4
#define SegD 1‹‹7
#define SegE 1‹‹6
#define SegF 1‹‹1
#define SegG 1‹‹3
#define SegH 1‹‹5
#define digit_0 (SegA | SegB | SegC | SegD | SegE | SegF)
#define digit_1 (SegB | SegC)
#define digit_2 (SegA | SegB | SegG | SegE | SegD)
#define digit_3 (SegA | SegB | SegG | SegC | SegD)
#define digit_4 (SegF | SegG | SegB | SegC)
#define digit_5 (SegA | SegF | SegG | SegC | SegD)
#define digit_6 (SegA | SegF | SegE | SegD | SegC | SegG)
#define digit_7 (SegA | SegB | SegC)
#define digit_8 (SegA | SegB | SegC | SegD | SegE | SegF | SegG)
#define digit_9 (SegA | SegB | SegC | SegD | SegF | SegG)
const __flash unsigned char seg7[10]={
digit_0,
digit_1,
digit_2,
digit_3,
digit_4,
digit_5,
digit_6,
digit_7,
digit_8,
digit_9
};
#define CAT0 PORTC_Bit2
#define CAT1 PORTC_Bit4
#define CAT2 PORTC_Bit3
#define CAT3 PORTB_Bit4
#define SEGMENTS PORTD
__regvar __no_init unsigned char Led0 @ 8;
__regvar __no_init unsigned char Led1 @ 9;
__regvar __no_init unsigned char Led2 @ 10;
__regvar __no_init unsigned char Led3 @ 11;
__regvar __no_init unsigned char DigitIndex @ 12;
/*
================================================== ==============================
Timer0 interrupt.
================================================== ==============================
*/
#pragma vector = TIMER0_OVF_vect
__interrupt void Timer0_Ovf (void)
{
CAT0 = 1;
CAT1 = 1;
CAT2 = 1;
CAT3 = 1;
SEGMENTS = DigitIndex;
if (CHKBIT(Led0,DigitIndex)) CAT0 = 0;
if (CHKBIT(Led1,DigitIndex)) CAT1 = 0;
if (CHKBIT(Led2,DigitIndex)) CAT2 = 0;
if (CHKBIT(Led3,DigitIndex)) CAT3 = 0;
DigitIndex››=1;
if (DigitIndex==0) DigitIndex=1‹‹7;
}
void main()
{
//... все настраиваем типа:
CLKPR=0x80;
CLKPR=0x00;
// Port B initialization
PORTB=1‹‹3|1‹‹2|1‹‹1;
DDRB=1‹‹5|1‹‹4;
// Port C initialization
PORTC=0x38; //111000
DDRC=0x7C; //1111100
// Port D initialization
PORTD=0x00;
DDRD=0xFF;
//TIMER0 initialize - prescale:64
// WGM: Normal
// desired value: 2mSec
// actual value: 2,000mSec (0,0%)
TCCR0B = 0x00; //stop
TCNT0 = 0x06; //set count
TCCR0A = 0x00;
TCCR0B = 0x03; //start timer
// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=0x01;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
ADCSRB=0x00;
// ADC initialization
// ADC Clock frequency: 250,000 kHz
// ADC Voltage Reference: Int., cap. on AREF
// ADC Auto Trigger Source: None
// Digital input buffers on ADC0: Off, ADC1: Off, ADC2: On, ADC3: On
// ADC4: On, ADC5: On
DIDR0=0x03;
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x87;
SEI(); // разрешаем прерывания
DigitIndex=1‹‹7;
// на экране видим 1234
Led0=seg7[1];
Led1=seg7[2];
Led2=seg7[3];
Led3=seg7[4];
while(1)
{
// цикл
}
} |
Последний раз редактировалось oleg110592; 08.10.2011 в 22:16.
|
|
|
Сказали "Спасибо" oleg110592
|
|
|
09.10.2011, 14:52
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 7,004
Сказал спасибо: 3,023
Сказали Спасибо 3,194 раз(а) в 2,166 сообщении(ях)
|
Re: Светодиодный индикатор и нагрузка на порты
1. Я-бы не стал.
2. Ввиду явной бессмысленности вопроса без указания точной марки индикатора (цвет ~ рабочее напряжение), и напряжения питания) решим задачку графически для ATmega + American Opto Plus A564CG (картинка). Ток получается около 70 мА с сильной зависимостью от температуры и напряжения питания. Допуская скважность 4 - для индикатора он, вероятно (100 мА * 4/10), избыточен.
Для mega, принимая, что в среднем засвечено 4 сегмента, - суммарный средний ток порта получается порядка 280 мА, что превосходит не только требования по максимальному току на линию порта, но и на порт в целом (см. примечания к таблице DC Characteristics).
3. Работать может и будет, но не известно, как долго. Да ещё и глючить сможет по полной из-за помех по земле.
"махровая китайщина детектед".
|
|
|
|
09.10.2011, 17:13
|
|
Гражданин KAZUS.RU
Регистрация: 05.04.2009
Сообщений: 976
Сказал спасибо: 35
Сказали Спасибо 155 раз(а) в 134 сообщении(ях)
|
Re: Светодиодный индикатор и нагрузка на порты
Еще раз повторю - ЗАСВЕЧИВАЕТСЯ ТОЛЬКО ОДИН СЕГМЕНТ В РАЗРЯДЕ -ну поймите - это только максимум 4 светодиода по 15мА на 4 ноги микроконтроллера и это, поверте не страшно. Ну лучше это чем 8 светодиодов на 8 ног микроконтроллера. Эта махровая китайщина уже работает (надежно) в нескольких тыс. изделий в течении 6 лет.
|
|
|
|
09.10.2011, 18:06
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
|
Re: Светодиодный индикатор и нагрузка на порты
Сообщение от oleg110592
|
Ну лучше это чем 8 светодиодов на 8 ног микроконтроллера.
|
Чем это лучше? Попробуйте хотя бы знакогенератор написать для такого варианта - причём со спец-символами. В классическом все просто: 1 байт = 1 знак, только точку подставить если надо. Что за устройство вы выпускаете тысячами штук, что экономия 4 копеек за 4 резистора (это даже не оптовая цена) подвигла на такие подвиги?
|
|
|
|
09.10.2011, 23:56
|
|
Гражданин KAZUS.RU
Регистрация: 05.04.2009
Сообщений: 976
Сказал спасибо: 35
Сказали Спасибо 155 раз(а) в 134 сообщении(ях)
|
Re: Светодиодный индикатор и нагрузка на порты
Устал доказывать... Знакогенератор такой же точно как и при поразрядном. Выгода очевидна:
+ 4 лишних резистора (уж не будем ставить транзисторов с резисторами в базу) по 2 коп. украинских за дополнительных 4 резистора это 8 коп. + 8 паек по 9 коп. это 72 коп. итого 80 коп.
На 1000 изделий это 800 гривен = 100$. А если продать 1000 изделий в месяц (это реальная цифра - поверьте на слово) - за год получится 1200$ экономии.
|
|
|
|
10.10.2011, 00:07
|
|
Заблокирован
Регистрация: 26.12.2009
Сообщений: 3,124
Сказал спасибо: 116
Сказали Спасибо 867 раз(а) в 614 сообщении(ях)
|
Re: Светодиодный индикатор и нагрузка на порты
Сообщение от oleg110592
|
Еще раз повторю - ЗАСВЕЧИВАЕТСЯ ТОЛЬКО ОДИН СЕГМЕНТ В РАЗРЯДЕ -ну поймите - это только максимум 4 светодиода по 15мА на 4 ноги микроконтроллера и это, поверте не страшно.
|
Осталось уточнить... через ногу сегмента... 60мА бегает???
|
|
|
|
10.10.2011, 00:19
|
|
Гражданин KAZUS.RU
Регистрация: 05.04.2009
Сообщений: 976
Сказал спасибо: 35
Сказали Спасибо 155 раз(а) в 134 сообщении(ях)
|
Re: Светодиодный индикатор и нагрузка на порты
60мА НЕ БЕГАЕТ- бегает 15мА МАКСИМУМ - уже начала преследовать мания - может я в чем то ошибся и надо отзывать для модификации мои устройства .
Что-то и сам запутался 15мА это при полной посегментной индикации. А если нагружено на один сегмент 4 катода, то 5В минус падение на светодиоде 2В = 3В через один катод при резисторе 200 Ом ток 15мА * 4, да признаю бегает 60мА это в статике. Произвел сейчас реальный замер - плата MEGA48 + 3разрядный индикатор, на индикаторе число 108(есть одовременно горящие сегменты), китайский тестер - измеренное потребление платы 25,9 мА. Надо попробовать число 8.8.8.. Да для 3 разрядного индикатора ток через сегмент может быть максимум 45мА допустимо 40мА. Недавно приносили на ремонт 6 летний приборчик с такой индикацией (сгорела аналоговая часть) - индикатор не деградировал, светит как и светил, ноги микроконтроллера не отгорели.
Код:
|
60mA 60mA 60mA
|-|_______|-|_______|-|__
1mS 7mS 1mS 7mS 1mS |
Это нагрузка на один сегмент (если горят сегменты во всех разрядах)
На самом деле в некоторых приборах точки не зажигают и числа на индикаторе 888 не будет, например тот же барьер в старшем разряде только числа от 1 до 3 например 388 вольт самое плохое число. Тут даже можно соеденить сегмент F с катодом старшего разряда (он никогда гореть не должен - больше 399 вольт отображать нет необходимости) экономия ног. Можно соеденить сегмент H с катодом младшего разряда (точка крайняя справа врядли пригодится). Две ноги уже сэкономили. Есть у меня в загашнике такая разработка на 14ногом PIC.
Все, признал - правда махровая китайщина
Последний раз редактировалось oleg110592; 10.10.2011 в 11:13.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 19:33.
|
|