roboforum.ru

Технический форум по робототехнике.

7-ми сегментные индикаторы

7-ми сегментные индикаторы

aliens » 15 янв 2005, 04:07

Вот одним управлять научился, а вот как двумя?
Знаю что надо поочереди транзисторы включать, интересует именно сама программа. С какой скоростью и т.д.
Спасибо :D

setar » 15 янв 2005, 21:12

я думаю сама скорость не важна - важнее отношение времени подсвечено/выключено.
А переключать так же 2 ноги, 2 транзистора

aliens » 16 янв 2005, 03:11

Именно про это и спрашиваю. Чтобы глаз не видел что они поочереди зажигаются

setar » 16 янв 2005, 14:10

честно сказать не знаю точно но рассуждал бы так.
нормальная смена кадров в телевизоре 50раз в сек, в принципе можно эту скорость опустить до 15-20 раз в сек - это как сильно сжатый видеоролик.
Ну и продолжительность свечения по отношению к погашенному режиму (точнее скважность) будет напрямую задавать яркость свечения.

Например зажигая 50раз в сек (50гц -> раз в 20мс) и длительность свечения в 10мс ,  получим очень плавную смену индикации с 50% яркостью

aliens » 16 янв 2005, 15:51

А реализацию видел где-нибудь с пояснениями на русском??

setar » 16 янв 2005, 16:06

Дык здесь же http://www.gaw.ru/html.cgi/txt/app/micr ... AVR242.htm
там управление 4мя 7сегментными индикаторами.
Или я не понял сути вопроса ?

aliens » 16 янв 2005, 23:41

Да там про весь девайс, и очень мало именно про индикатор. :(

chief » 22 янв 2005, 21:53

Для управления двумя семисегментными индикаторами необходимо подключить катоды через резисторы 330 Ом на пины порта B0-B6 а базы транзисторов на D0 и D1 соответственно. А дальше пишем прогу... В общем я надрываться не буду, если еше интересует подробный ответ скажи....

aliens » 23 янв 2005, 14:30

Мне надо именно программную реализацию

chief » 25 янв 2005, 20:14

я как раз этим занимаюсь, только у меня их четыре, пришли мне на мыло свою схему я подпрограмму индикации накатаю, только нужно знать что еще программа делает. Если схемы нет могу предложить свою. Вообщем на форуме бываю редко пиши на мыло.
v_gavenko@mail.ru

chief » 03 фев 2005, 23:17

Итак, имеем микруху, кварц. На порт В вешаем катодами вперед два индикатора с общим анодом. Катоды соединяем с портом через резисторы 330 Ом следующим образом В0-a, В1-b,B2-c,B3-d,B4-e,B5-f,B6-g. Так получится что одинаковые сегменты разных индикаторов закорочены, но управлять будем динамически транзисторами.
На D0 и D1 вешаем базы транзисторов (у меня КТ503Е) через резисторы 1.2 кОм. Коллектор на +5В, емитер на анод индикатора. Причем D0 - первый, а D1 - второй. Даем питание и сброс, вот собственно и вся схема. Током коллектора - эмитера будет ограничивать резистор 330 Ом и сегмент индикатора.
На счет программы распространятся не буду, скажу только что таймер через каждые 5 мс выдает добро на прерывание которое в свою очередь считает секунды и выдает их на индикаторы.
Программу подаю без комментариев, 100% работает как на софте так и на плате. Советую лишь разобраться с командами и прошивкой Епромки. Программу писал в AVRStudio4.0 прошивал SP12slavomir...
При перекомпиляции нужно позаботиться о наличии файла 2313def.inc
А начертание цифир можно посмотреть из ЕЕпрома. В общем удачи, будут проблемы обращайся.  :lol:


Код: Выделить всёРазвернуть
.include "2313def.inc"

; ***** объявление переменных *****************
   .def   del_set      =r9
   .def   lcd         =r24
   .def   tmp         =r25
   .def   count      =r26
   .def   second      =r29
   
; ************** векторы прерываний ***********
      rjmp    RESET           ;Reset Handle
       reti                    ;irq0
       reti                    ;irq1
       reti                    ;timer1
       reti                    ;timer1 comA
       reti                  ;timer1 over
       rjmp   OVER0           ;timer0 over
       reti                    ;spi
       reti                    ;uart
       reti                    ;uart
       reti                    ;uart
       reti                    ;anacomp

; *********************************************

; ***** вектор прерывания переп. Т1 ***********
OVER0:

   ldi tmp,177         
   out TCNT0,tmp      ;корректировка таймера

;**************** ПОДПРОГРАММЫ ****************

   rcall clock
   rcall out_display
   reti

; ***** выход из обработчика прерывания *******

; ***** подпрограмма секундного счетчика ******
clock:
   inc count      
   cpi count,198      
   brne nochange      
   clr count      
   inc second      
   mov tmp,second   
   andi tmp,0x0f   
   cpi tmp,10      
   brne nochange   
   andi second,0xf0
   ldi tmp,0x10      
   add second, tmp
   cpi second,0x60
   brne nochange
   clr second
nochange:
   ret
; ***** вывод на дисплей **********************

out_display:
   cbi portD,0
   cbi portD,1
      
   inc lcd            
   cpi lcd,1
   brne d2

   sbi portD,0
   rjmp digit1
d2:   
   cpi lcd,2
   brne d3
   
   sbi portD,1
   rjmp digit2

d3:
   clr lcd

digit1:
   mov tmp,second
   swap tmp
   andi tmp,0x0f
   out EEAR, tmp
   sbi EECR, EERE
   in tmp, EEDR
   out portB,tmp
   rjmp exit

digit2:
   mov tmp,second
   andi tmp,0x0f
   out EEAR, tmp
   sbi EECR, EERE
   in tmp, EEDR
   out portB,tmp
exit:
   ret

; ***** обработка прерывания сброса ***********

reset:   
   ldi second,0
   clr tmp      ;очистка регистра
   ldi tmp,$6f   ;установка значений битов регистра
   out SPL,tmp   ;установка начального адреса стека
   clr tmp
   sei   
   clr tmp
   ldi tmp,0x02   ;установка значений битов регистра
   out TIMSK,tmp   ;установка битов в TIMSK
   clr tmp
   ldi tmp,0x04
   out TCCR0,tmp   ;запуск таймера
   ldi tmp,177
   out TCNT0,tmp
   clr count
   ldi tmp,0xff
   out DDRB,tmp
   out DDRD,tmp
next:   
   rjmp next   


; ***** сегмент EЕPROMа ***********************
.eseg         
   .org 0
table1:
   .db 0x40, 0x79, 0x24, 0x30, 0x19, 0x12, 0x02, 0x78, 0x00, 0x10, 0xFF
   ;dig  0       1     2     3     4     5     6     7     8     9

aliens » 07 фев 2005, 16:03

Расскажите ламеру что означает запись 1<<что-то (SE,CS02)

eseg          
  .org 0
table1:
  .db 0x40, 0x79, 0x24, 0x30, 0x19, 0x12, 0x02, 0x78, 0x00, 0x10, 0xFF
  ;dig  0       1     2     3     4     5     6     7     8     9
это я так понимаю значения порта при посылке цифирок(чтобы каждый раз не писать ldi регистр,значение)
А можно не много поподробней о выводе. Текстом рассказать что как, а то для меня пока тяжко.

Mike_MA » 07 фев 2005, 18:02

aliens писал(а):Расскажите ламеру что означает запись 1<<что-то (SE,CS02)

Я сразу скажу - это сдвиг влево на один разряд ,... хотя надо уточнить ....

aliens писал(а):eseg          
  .org 0
table1:
  .db 0x40, 0x79, 0x24, 0x30, 0x19, 0x12, 0x02, 0x78, 0x00, 0x10, 0xFF
  ;dig  0       1     2     3     4     5     6     7     8     9


А теперь про табличку. Это таблица перекодировки из  десятичного в семисегментный код, то есть когда тебе нужно зажечь на индикаторе "3", то ты берёшь по смещению +3 берёшь байт (а именно "0x30") и суёшь его в порт на вывод. И так работаешь с каждой цифрой.

setar » 07 фев 2005, 18:38

aliens писал(а):Расскажите ламеру что означает запись 1<<что-то (SE,CS02)

это всего навсего установка в 1 двух бит SE и CS02 (биты одного управляющего регистра)

chief » 07 фев 2005, 19:15

По поводу кода к семисегментным индикаторам
      --а-
    f|     |b       надеюсь понятно что это семисегминтный индикатор
      -g--          что бы зажечь сегмент нужно в порт выдать 0
   e|     |c        получается что для "3" будет код b00100100 или 0x24
      --d-          в общем то и все....
 


Rambler\'s Top100 Mail.ru counter