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

 
 
> динамическая индикация, вывод децимиальной точки
RicLab
сообщение Jan 24 2011, 13:00
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 41
Регистрация: 24-11-08
Пользователь №: 41 901



Добрый день
Необходим совет.
на 4-х разрядный 7-сегментый индикатор выводиться произвольное число 0-9999, необходимо во втором разряде включать децимиальную точку т.е. 0,0-999,9.
как я понимаю необходимо создать ещё один массив цифр только с точкой, но как сделать что бы этот массив использовалься только для второго разряда или для любого другого?

код для CVAVR
Код
Chip type           : ATtiny2313
Clock frequency     : 8,000000 MHz
Memory model        : Tiny
External SRAM size  : 0
Data Stack size     : 32
*****************************************************/

#include <tiny2313.h>
#include <delay.h>

#define digit1 PORTD.5 // разряд 4
#define digit2 PORTD.4 // разряд 3
#define digit3 PORTD.1 // разряд 2
#define digit4 PORTD.0 // разряд 1

flash char digits []= {       //создаём массив с цифрами
0x3F,                   //0
0x06,                   //1
0x5B,                   //2
0x4F,                   //3
0x66,                   //4
0x6D,                   //5
0x7D,                   //6
0x07,                   //7
0x7F,                   //8
0x6F,                   //9
0x40,                   //знак минуса
0x00                    //пустота
};                
char digit_out[4], cur_dig;  //переменные для работы с LED

unsigned int indication;    //переменная для хранения чисел
unsigned int x;
void recoding(void) {       //функция для перекодировки из hex в dec
if (indication<10000)       //начинаем преобразование если число < 1000 так как 4-х разрядный LED
{        
digit_out[0]=indication%10;     //Делим на 10, остаток записываем в масив 1-разряд    
indication=indication/10;               //Оставляем 3 разряда                        
digit_out[1]=(indication%10);   //Делим на 10, остаток записываем в масив 2-разряд    
indication=(indication/10);                //Оставляем 2 разряда                    
digit_out[2]=indication%10;     //Делим на 10, остаток записываем в масив 3-разряд
indication=(indication/10);                //Оставляем 1 разряда                    
digit_out[3]=indication%10;     //Делим на 10, остаток записываем в масив 4-разряд  
}                                          
}                                          

//таймер 0
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
PORTB=0x00;       //чтобы предотвратить эффект “тени” на соседних индикаторах
switch (cur_dig){
case 0:{digit1=0; digit2=0; digit3=0; digit4=1; break;};  //подаём питание на разряд 1, гасим остальные разряды
case 1:{digit4=0; digit2=0; digit1=0; digit3=1; break;};  //подаём питание на разряд 2, ггасим остальные разряды
case 2:{digit3=0; digit1=0; digit4=0; digit2=1; break;};  //подаём питание на разряд 3, гасим остальные разряды
case 3:{digit2=0; digit3=0; digit4=0; digit1=1; break;};  //подаём питание на разряд 3, гасим остальные разряды
}
PORTB=digits[digit_out[cur_dig]];    //выводим с каждым срабатыванием таймера число с массива в порт В, но не для всех разрядов сразу

cur_dig++;                                           //с каждым срабатыванием таймера, увеличиваем переменную cur_dig на 1
if(cur_dig==4) cur_dig=0;                  //если cur_dig = 4 обнуляем  

}
void main(void)
{
// Declare your local variables here

// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// Input/Output Ports initialization
// Port A initialization
// Func2=In Func1=In Func0=In
// State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTB=0x00;
DDRB=0xFF;

// Port D initialization
// Func6=In Func5=Out Func4=Out Func3=In Func2=In Func1=Out Func0=Out
// State6=T State5=0 State4=0 State3=P State2=P State1=0 State0=0
PORTD=0x0C;
DDRD=0x33;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 8000,000 kHz
// Mode: Normal top=FFh
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x00;
TCCR0B=0x01;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// Interrupt on any change on pins PCINT0-7: Off
GIMSK=0x00;
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x02;

// Universal Serial Interface initialization
// Mode: Disabled
// Clock source: Register & Counter=no clk.
// USI Counter Overflow Interrupt: Off
USICR=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;

// Global enable interrupts
#asm("sei")
while (1)
      {
      x++;
      delay_ms(100);
      if(x>9999) x=0;
      indication=x;
      recoding();
      };
}

laughing.gif
Go to the top of the page
 
+Quote Post
3 страниц V  < 1 2 3 >  
Start new topic
Ответов (15 - 29)
RicLab
сообщение Jan 25 2011, 10:29
Сообщение #16


Участник
*

Группа: Участник
Сообщений: 41
Регистрация: 24-11-08
Пользователь №: 41 901



это германиевые что-ли? biggrin.gif
вот схема
Прикрепленное изображение


может стоит добавить резистор 100к в цепь базы на общий.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 25 2011, 11:38
Сообщение #17


Гуру
******

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



QUOTE (RicLab @ Jan 25 2011, 12:29) *
вот схема
Не маловат ли базовый ток 45мкА? Уменьшите резистор до 1К.


--------------------
На любой вопрос даю любой ответ
"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
RicLab
сообщение Jan 25 2011, 12:21
Сообщение #18


Участник
*

Группа: Участник
Сообщений: 41
Регистрация: 24-11-08
Пользователь №: 41 901



возможно, прикинул по грубым расчётам нужно около 4,7кОм.
Go to the top of the page
 
+Quote Post
rezident
сообщение Jan 25 2011, 13:07
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(RicLab @ Jan 25 2011, 15:29) *
может стоит добавить резистор 100к в цепь базы на общий.
Это ничего не даст, только лишний расход резисторов. Резистор Б-Э следует брать 4,7кОм. Последовательно с базой 2,2кОм, если управляющий сигнал уровня 5В или 1,2кОм, если он уровня 3,3В.
Go to the top of the page
 
+Quote Post
RicLab
сообщение Jan 25 2011, 13:19
Сообщение #20


Участник
*

Группа: Участник
Сообщений: 41
Регистрация: 24-11-08
Пользователь №: 41 901



что то тема начала уходить в область схемотехники, а не программирования.
Go to the top of the page
 
+Quote Post
МП41
сообщение Jan 25 2011, 14:17
Сообщение #21


4 синих кубика
****

Группа: Участник
Сообщений: 526
Регистрация: 19-09-08
Из: полупроводника, металла и стекла
Пользователь №: 40 326



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


--------------------
p-n-p-p-n-p-n-n-p-n-p структура однако очень эффективна
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 25 2011, 14:21
Сообщение #22


Гуру
******

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



QUOTE (RicLab @ Jan 25 2011, 15:19) *
что то тема начала уходить в область схемотехники
Форум как бы профессиональный. Негоже криво спроектированное железо лечить затычками в программе.


--------------------
На любой вопрос даю любой ответ
"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
rezident
сообщение Jan 25 2011, 14:24
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(RicLab @ Jan 25 2011, 18:19) *
что то тема начала уходить в область схемотехники, а не программирования.
Дык потому, что программистские проблемы вроде уже решены
Цитата(RicLab @ Jan 24 2011, 21:00) *
проверил работает.
Но остались схемотехнические недоработки
Цитата(RicLab @ Jan 24 2011, 21:00) *
но появилась слабая засветка соседних разрядов.


Go to the top of the page
 
+Quote Post
RicLab
сообщение Jan 25 2011, 16:27
Сообщение #24


Участник
*

Группа: Участник
Сообщений: 41
Регистрация: 24-11-08
Пользователь №: 41 901



Цитата
Форум как бы профессиональный. Негоже криво спроектированное железо лечить затычками в программе.

такую схему включения я подсмотрел на плате ME EasyAVR5.

Цитата
Но остались схемотехнические недоработки

сейчас всё работает, не думаю что динамическая индикация должна производиться с частотой несколько килогерц.
50-60 Гц вполне достаточно, а 123Гц более чем достаточно.
Go to the top of the page
 
+Quote Post
rezident
сообщение Jan 25 2011, 17:12
Сообщение #25


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(RicLab @ Jan 25 2011, 21:27) *
50-60 Гц вполне достаточно, а 123Гц более чем достаточно.
100Гц это необходимый минимум. Это хорошо понимают, например, инженеры-конструкторы электронных табло wink.gif
Go to the top of the page
 
+Quote Post
ukpyr
сообщение Jan 25 2011, 17:33
Сообщение #26


Профессионал
*****

Группа: Участник
Сообщений: 1 264
Регистрация: 17-06-08
Из: бандустан
Пользователь №: 38 347



Цитата
100Гц это необходимый минимум.
почему ? 60-70Гц нормально
Go to the top of the page
 
+Quote Post
rezident
сообщение Jan 25 2011, 17:55
Сообщение #27


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(ukpyr @ Jan 25 2011, 22:33) *
почему ? 60-70Гц нормально
Для статической картинки, меняющейся редко (раз в секунду или реже), может и нормально. А вот для электронного табло или бегущей строки ... Вы делали электронное табло?
Go to the top of the page
 
+Quote Post
RicLab
сообщение Jan 25 2011, 23:01
Сообщение #28


Участник
*

Группа: Участник
Сообщений: 41
Регистрация: 24-11-08
Пользователь №: 41 901



Цитата
почему ? 60-70Гц нормально

порог инерционности человеческого глаза, в ЭЛТ развертка идет с частотой 50-60Гц.

Цитата
Для статической картинки, меняющейся редко (раз в секунду или реже), может и нормально. А вот для электронного табло или бегущей строки ... Вы делали электронное табло?

Если бы я делал электронное табло у меня не возникали бы вопросы.
Go to the top of the page
 
+Quote Post
МП41
сообщение Jan 25 2011, 23:04
Сообщение #29


4 синих кубика
****

Группа: Участник
Сообщений: 526
Регистрация: 19-09-08
Из: полупроводника, металла и стекла
Пользователь №: 40 326



Цитата(RicLab @ Jan 26 2011, 01:01) *
порог инерционности человеческого глаза, в ЭЛТ развертка идет с частотой 50-60Гц.

Меньше будет мелькать при съёмке камерой wink.gif


--------------------
p-n-p-p-n-p-n-n-p-n-p структура однако очень эффективна
Go to the top of the page
 
+Quote Post
RicLab
сообщение Jan 26 2011, 00:04
Сообщение #30


Участник
*

Группа: Участник
Сообщений: 41
Регистрация: 24-11-08
Пользователь №: 41 901



Цитата
Меньше будет мелькать при съёмке камерой

такой задачи у меня не было rolleyes.gif
Go to the top of the page
 
+Quote Post

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

 


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


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