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

Программирование 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 заменить, т.к. они зарезервированы.
Вот вам пример для вывода, доработайте немного.

Пример

Друзья и подскажите мне лентяю неучу 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. » Вопросы - ответы » счетчик имп. на семисегмент. индикатор.