Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » счетчик имп. на семисегмент. индикатор.


счетчик имп. на семисегмент. индикатор.

Сообщений 1 страница 11 из 11

1

написал исходник для счета имп. с выводом на семисегментный индик.  В качестве импульсов стоит валкодер через + питания. При вращение валкодера мигает индикатор. Как сделать так чтобы не моргал пока имп. идут. числа меняются, но через раз. У меня будет как-бы два куска программы одна отвечает за кнопки, вторая будет счетчиком которая отображает имп. на индикатор.
об этом позже, сначала хотел бы разобраться с миганием и чтобы имп. нормально считал, а не через раз. Помогите пожалуйста с кодом, как решить проблему?
Прошивку сразу опробываю на макетной плате которая специально для этого собрал.

Код:
'семисегментный индикатор макет mega8535


$regfile = "m8535.dat"
$crystal = 6000000
$hwstack = 40
$swstack = 16
$framesize = 32
$sim

Dim W As Word                                'для переменн. выдел. 2 байта
Dim N1 As Byte
Dim N2 As Byte
Dim N3 As Byte
Dim M1 As Long
Dim M2 As Long
Dim M3 As Long

Config Portb = Output                        'выходы на сегменты
Config Porta = Output                        'выходы на светодиоды
Ddrd = &B11111011                           'выходы кроме 2-го бита(он вход имп.)
Ddrc = &B00000001                           'портС входы кроме 0-го бита
Portc = &B11111110                         'подтяжка входов резис-ми

Sw_reset Alias Pinc.7                          'кнопка "обнулить счетчик"
Puls Alias Pind.2                                  ' вход для импульсов
Dig1 Alias Porta.0                           ' 1-й разряд индикатора
Dig2 Alias Porta.1                           ' 2-й разряд индикатора
Dig3 Alias Porta.2                           ' 3-й разряд индикатора 

Do

Dig1 = 0 : Dig2 = 1 : Dig3 = 1
'Porta = &B00000011
Select Case N1
Case 0 : Portb = &B01010000
Case 1 : Portb = &B01111011
Case 2 : Portb = &B00110100
Case 3 : Portb = &B00110010
Case 4 : Portb = &B00011011
Case 5 : Portb = &B10010010
Case 6 : Portb = &B10010000
Case 7 : Portb = &B01111010
Case 8 : Portb = &B00010000
Case 9 : Portb = &B00010010
End Select

Waitms 5

Dig2 = 0 : Dig1 = 1 : Dig3 = 1
'Porta = &B00000101
Select Case N2
Case 0 : Portb = &B01010000
Case 1 : Portb = &B01111011
Case 2 : Portb = &B00110100
Case 3 : Portb = &B00110010
Case 4 : Portb = &B00011011
Case 5 : Portb = &B10010010
Case 6 : Portb = &B10010000
Case 7 : Portb = &B01111010
Case 8 : Portb = &B00010000
Case 9 : Portb = &B00010010
End Select

Waitms 5

Dig3 = 0 : Dig2 = 1 : Dig1 = 1
'Porta = &B00000110
Select Case N3
Case 0 : Portb = &B01010000
Case 1 : Portb = &B01111011
Case 2 : Portb = &B00110100
Case 3 : Portb = &B00110010
Case 4 : Portb = &B00011011
Case 5 : Portb = &B10010010
Case 6 : Portb = &B10010000
Case 7 : Portb = &B01111010
Case 8 : Portb = &B00010000
Case 9 : Portb = &B00010010
End Select
Waitms 5

M1 = W
M2 = M1
M3 = M1

M1 = M1 Mod 1000                             '
M1 = M1 / 100
N1 = Abs(m1)

M2 = M2 Mod 100                              '
M2 = M2 / 10
N2 = Abs(m2)

M3 = M3 Mod 10                               '
N3 = Abs(m3)

Debounce Sw_reset , 0 , Resets , Sub
Debounce Puls , 1 , Impulse , Sub

Loop
End

Resets:
If Sw_reset = 0 Then                         'кн. сброс нажата?
Waitms 30
W = 0                                        'выводим на индикатор 000
End If
                               

Impulse:

If Puls = 1 Then
Wend
Incr W
Waitms 20
End If

Return
End

0

2

Обновление индикации по прерываниям таймера

Счет импульсов на одно из внешних прерываний

Кнопки, как Вам больше нравится, или по прерываниям или в главном цикле.

Посмотрите здесь

0

3

Обязательно счетчик импульсов вешать на внешние прерывание? В Bascome никак не могу просимулировать нажатую кнопку нажал\отпустил. Таймер независим от сновного цикла, правильно я понял? Т.е в исходнике можно создать два независимых цикла Do....Loop один будет работать на кнопки и счетчик имп. второй на таймер который по окончании будет переходить в метку обработки индикатора.

0

4

leshui написал(а):

Обязательно счетчик импульсов вешать на внешние прерывание?


Всё зависит от качества подсчёта, можно и не вешать.

leshui написал(а):

В Bascome никак не могу просимулировать нажатую кнопку нажал\отпустил.


А простым языком, что под этим подразумевается?

leshui написал(а):

Таймер независим от сновного цикла, правильно я понял?


Конечно.

leshui написал(а):

Т.е в исходнике можно создать два независимых цикла Do....Loop один будет работать на кнопки и счетчик имп. второй на таймер который по окончании будет переходить в метку обработки индикатора.


Конечно можно и так сказать, но это не совсем правильно.

Таймер работает независимо ни от чего, так сказать в фоновом режиме. По прерыванию таймера идёт развёртка индикации.

0

5

А простым языком, что под этим подразумевается?

В AVR studio при симуляции можно поставить галочку на какой нибудь пин (нажал кнопку) симулятор прыгает на метку по условию нажатой кнопки потом снимаю галочку(кнопка отпущена). В Bascome  я такого не нашел.

Всё зависит от качества подсчёта, можно и не вешать.

Импульсы будут сыпаться примерно не более 100имп. в сек. точно еще не проверял, но там мне точность не нужна.
И еще не понятно почему три разряда горят тусклее чем один разряд? В исходнике на каждый разряд задержка всего 5мс и кварц стоит 6МГц. такое впечатление что у меня исходник на макетной плате работает на частоте 100кГц.
Спасибо щас буду изучать как работать с таймером.

0

6

leshui написал(а):

И еще не понятно почему три разряда горят тусклее чем один разряд?

Потому что этот код не выполняется за 0 тактов.

M1 = M1 Mod 1000                             '
M1 = M1 / 100
N1 = Abs(m1)

M2 = M2 Mod 100                              '
M2 = M2 / 10
N2 = Abs(m2)

M3 = M3 Mod 10                               '
N3 = Abs(m3)

Debounce Sw_reset , 0 , Resets , Sub
Debounce Puls , 1 , Impulse , Sub

Как уже написали выше, динамическую индикацию лучше перенести в ПП от таймера.
Пример. http://pure-basic.narod.ru/forum_files/ … mo_Led.rar

0

7

Все до меня доперло как в БАСКОМЕ симулировать кнопку.

Вот сижу изучаю исходник по ссылке так и не понял как реализовать по таймеру. Есть ли у кого нибудь еще примеры?

0

8

Что именно не понятно? Подпрограмма прерывания от таймера осуществляющая динамическую индикацию на 4-ех разрядном индикаторе.

Код:
Dinam:

 DinamIndex = DinamIndex + 1
 If Dinamindex > 4 Then Dinamindex = 1

 Temp = Dinaminfo(dinamindex)

 Portc = 0
 Portd = Lookup(temp , Ind)
 If Dinamindex = 2 Then Portd.7 = 0
 Temp = 1
 Decr Dinamindex
 Shift Temp , Left , Dinamindex
 Incr Dinamindex

 Portc = Temp

Return

0

9

Ниже писал писал, все уже есть. Жаль труды, оставлю нижний текст. Для начала изучите пост Простые програмки для начинающих там много чего полезного и понятного. И форум почитывали бы. Для кого Саша трудился? Примеры применения в среде Баском

Часы на атмега 8 очень простые Прокомментирован вывод на семисегментник. Нужно выбросить строку "Config Clock = Soft" и переменные _hour _min _sec заменить, т.к. они зарезервированы.
Вот вам пример для вывода, доработайте немного.

Пример
Код:
'вывод информации на индикатор по таймеру2
$regfile = "m88def.dat"                                     ' говорим компилятору что у нас микропроцессор Atmega 88
$crystal = 7372800                                          ' говорим компилятору что процессор тактируется от генератора с частотой 7,372800 мегагерц
Ddrb = &B11111111 : Portb = 0 : Ddrc = &B00000111 : Portc = &B11111000       'Конфигурация порта В на выход, порта C 0..3 на выход порта С 4..7 на вход, подключение внутренних подтягивающих резисторов на порт С 3..7. Для общего минуса нужно все выводы порта, которые подключены к общим выводам  сегментника установить в единицу. К примеру Portc = &B11111111.
Dim Переменная  as integer, Цифра(4) as integer ' сюда дописать через запятую все переменные, которые встретятся по коду далее.
Config Timer2 = Timer , Prescale = 64 : On Timer2 Pulse : Enable Timer2 : Enable Interrupts       ' конфигурируем таймер 2 чтоб потом на него повесить алгоритм отображения цифр ' назначаем подпрограмму Pulse , которая будет запускаться по переполнению 2го таймера. Можно использовать и таймер0, это не имеет значение.

do ' основной цикл
Переменная = 123' то что будем отображать
Цифра(3) = Переменная Mod 10 : Цифра(1) = Переменная / 100 : Цифра(4) = Переменная / 10 : Цифра(2) = Цифра(4) Mod 10       ' разбиваем переменную на 3 разряда и заносим их в массив Цифра(1-3). А Цифра(4) это временная переменная для расчетов. Можно после этой строки написать к примеру Цифра(1) = 11 что потушит первый индикатор или Цифра(2)=17 что отобразит символ t на втором индикаторе (номер символа по порядку таблицы Dta)
loop

Pulse:                                                      ' подпрограмма прерываний таймера2 для работы с семисегментником. При срабатывании выполнение основного цикла останавливается и выполняется следующий код:
   Set Portc.x                                              ' Гасим зажжённый индикаторы. Для общего минуса заменить set на reset. Можно явно прописать единицы или нули для всех портов общих выводов сегментника.
   Incr X : If X = 3 Then X = 0                             ' При каждом срабатывании таймера выбираем какой сегмент будем показывать на порту С0..2 (тут можно задать кол-во сегментов изменяя тройку)
'  Состояние_индикатора = Lookup(цифра(x + 1) , Dta) : Portb.1 = Состояние_индикатора.1 : Portd.1 = Состояние_индикатора.2      ' вывод числа на минусовые клеммы сегментов, подключенных к разным портам. Необходимо продолжить строку до .... : PortX.Y = Состояние_индикатора.7 но лучше цеплять индикатор на один порт и применять не эту, а следующую строку:
Portb = Lookup(цифра(x + 1) , Dta)' вывод числа на минусовые клеммы сегментов, подключенных к Portb.
'   if x = 1 and точка = 1 then set portb.7 ' в случае необходимости индикации точки зажигаем ее на индикаторе 2
   Reset Portc.x                                            'Зажигаем индикатор на порту С.x. Для общего минуса заменить reset на set
Return' возвращаемся в место где прервали основной цикл.
       Dta:                                                 '  таблица с данными о цифрах зажигает по порядку : 0123456789.
'        Data &H3F , &H06 , &H5B , &H4F , &H66 , &H6D , &H7D , &H07 , &H7F , &H6F , &H40 , &H00 , &H37 , &H76 , &H77 , &H39 , &H3E , &H78 , &H10       'общий катод
       Data &HC0 , &HF9 , &HA4 , &HB0 , &H99 , &H92 , &H82 , &HF8 , &H80 , &H90 , &HBF , &HFF , &HC8 , &H89 , &H88 , &HC6 , &HC1 , &H87 , &HEF       'общий анод
       '      0       1    2       3       4     5      6      7      8      9      -     Пусто    П     H       A       C     U       t     i

Друзья и подскажите мне лентяю неучу N2 = Abs(m2) это модуль?

Отредактировано Pasha (2016-03-12 05:16:10)

0

10

Pasha написал(а):

Друзья и подскажите мне лентяю неучу N2 = Abs(m2) это модуль?

http://kbyte.ru/ru/Programming/Guides.a … ;mode=show
Т.е. - да.

0

11

Товарищи помогите пожалуйста, читал в декаде про массивы так и не понял как ими манипулировать, мне нужно считать импульсы со входа и как-то отображать на индикаторе. Как это сделать с применением массива? В посте №8 ни одного комментария и что куда отображается.

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » счетчик имп. на семисегмент. индикатор.