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

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

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

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


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


Проблема с LED индикатором

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

1

Небольшая учебная программа. На двухразрядном индикаторе при запуске должно высветиться число 25, при нажатии на кнопку число должно увеличиваться.  Но почему-то в Протеусе выходит так: при включении 1 разряда первая цифра загорается на обоих разрядах, а затем точно так же на обоих разрядах загорается вторая цифра. Т.е. вместо числа 25 появляется сначала 22, потом 55. Не могу понять, в чем дело.

Код:
$regfile = "attiny2313.dat"
$Crystal=4000000
$hwstack=40
$swstack=16
$framesize=32

Dim A As Integer
Dim T As Byte
Dim Count As Byte
Dim Number(2) As Byte

Config Portb = Output                                       'индикатор
Config Portd.4 = Output                                     '1 разряд
Config Portd.5 = Output                                     '2 разряд
Config Pind.3 = Input                                       'кнопка

Dig1 Alias Portd.4
Dig2 Alias Portd.5
Button Alias Pind.3

T = 25
Gosub Rasch
Gosub Indic
Do
If Button = 0 Then
Waitms 200
Incr T : If T > 99 Then T = 1
Gosub Rasch
Gosub Indic
End If
Loop

Rasch:
Number(1) = 0
Number(2) = 0
A = T
Do
A = A - 10
If A < 0 Then Exit Do
Number(1) = Number(1) + 1
Loop
Number(2) = A + 10
Return

Indic:
Reset Dig1 : Reset Dig2 : Count = 0
Do
Incr Count : If Count > 2 Then Exit Do
Portb = Lookup(number(count) , Digits)
Select Case Count
Case 1 : Set Dig1
Case 2 : Set Dig2
End Select
Loop
Return

End

Digits:
Data &B00111111 , &B00000110 , &B01011011 , &B01001111 , &B01100110
Data &B01101101 , &B01111101 , &B00000111 , &B01111111 , &B01101111

http://s2.uploads.ru/t/Tzg4i.jpg

0

2

как может быть, что А меньше нуля?

Код:
' На входе десятичное число, на выходе - значения для индикатора
Sub Byte2led(data_2byte)
 Tyscha = 0 : Sotka = 0 : Desaytka = 0 : Edinica = 0
 Tempw = Data_2byte

 Byte2led_t:
    If Tempw < 1000 Then Goto Byte2led_s
     Incr Tyscha
     Tempw = Tempw - 1000
     Goto Byte2led_t

 Byte2led_s:
    If Tempw < 100 Then Goto Byte2led_d
     Incr Sotka
     Tempw = Tempw - 100
     Goto Byte2led_s

 Byte2led_d:
    If Tempw < 10 Then Goto Byte2led_e
     Incr Desaytka
     Tempw = Tempw - 10
     Goto Byte2led_d

 Byte2led_e:
   Edinica = Tempw

0

3

Александр Д. написал(а):

как может быть, что А меньше нуля?

А - это вспомогательная переменная, нужна именно для разложения числа на разряды. И в конце цикла она всегда меньше нуля - от -1 до -9. Этот способ рассчета не мной придуман, но он работает - я проверял в пошаговом режиме. А суть моей проблемы в том, что число выводится на оба разряда индикатора одновременно, хотя по коду вроде все правильно.

0

4

Mrshilov, спасибо за совет! Похоже, так оно и есть - вечером проверю.

0

5

Попробовал переделать код по совету Mrshilov:

Indic:
Reset Dig1 : Reset Dig2 : Count = 0
Do
Incr Count : If Count > 2 Then Exit Do
Portb = Lookup(number(count) , Digits)
Select Case Count
Case 1 : Set Dig1
Waitms 20
Case 2 : Reset Dig1
Set Dig2
End Select
Loop
Return

В общем, ничего не изменилось. В Протеусе в пошаговом режиме после строки "Case 1 : Set Dig1" сразу выскакивают двойки в обоих разрядах, а после строки "Set Dig2" выскакивают две пятерки. В режиме обычной симуляции видно, как промелькнет 22, потом появляется 55. Думаю дальше.

0

6

Добрый всем вечер. Разобрался я со своей проблемой.
1. Изменил схему в Протеусе - убрал транзисторы и пришлось поменять местами разряды. Насчет разрядов - не понятно, почему.
2. Переделал код - сделал нормальную динамическую индикацию по переполнению Таймера0.
Единственное, что осталось непонятным - медленная смена цифр. т.е. на индикаторе - не число 25, а загорающиеся и гаснущие по очереди цифры 2 и 5. Пробовал увеличить частоту кварца с 4 до 8 Ггерц - практически ничего не изменилось. Может быть, кто-нибудь знает, почему все так медленно происходит? Хотелось бы узнать.
Так что тему можно закрывать.

0

7

Доброго здравия, господа.
С недавних пор начал по-немногу осваивать программирование Atmel при помощи Bascom. Программированием до этого вообще не занимался, поэтому приходится учиться по ходу дела. Моргать диодом, пищать мелодию спикером научился :blush: . Перешел к более серьезным задачам.
Сегодня изучал программный UART. Передать данные с одного микроконтроллера на другой получилось. Считать принимаемые данные тоже, но задача такова, что принимаемое трехзначное число нужно вывести ШИМом на два порта и вывести динамической индикацией на трехразрядный семисегментный светодиодный индикатор через сдвиговый регистр 74HC595.
ШИМ работает, а индикация нет.
Вооружившись примером отсюда:
http://avrproject.ru/index/podkljucheni … mer_1/0-16
убрал первый разряд за ненадобностью.

Код:
$regfile = "m8def.dat"
$crystal = 12000000
$hwstack = 40
$swstack = 16
$framesize = 32

Config Portc = Output

Config Pinb.1 = Output
Config Pinb.2 = Output
Config Pinb.3 = Output



Dim A As Word



Dim N2 As Byte
Dim N3 As Byte
Dim N4 As Byte

Dim M2 As Integer
Dim M3 As Integer
Dim M4 As Integer



Dim R As Byte


Open "comb.1:9600,8,n,1" For Output As #1
Open "comb.0:9600,8,n,1" For Input As #2

Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1

Pwm1a = 0
Pwm1b = 0

Do

Input #2 , A

Waitms 5                                                    


Pwm1a = A
Pwm1b = A



M2 = A
M3 = M2
M4 = M2
                                                                       
M2 = M2 Mod 1000                                           
M2 = M2 / 100                                              
N2 = Abs(m2)                                                

M3 = M3 Mod 100
M3 = M3 / 10
N3 = Abs(m3)

M4 = M4 Mod 10
N4 = Abs(m4)





Portc = &B00000001
R = Lookup(n4 , Numbers)                                    

Gosub Registr                                              

Portc = &B00000010
R = Lookup(n3 , Numbers)                                    

Gosub Registr

Portc = &B00000100
R = Lookup(n2 , Numbers)                                   

Gosub Registr

Loop

End                                                       


Numbers:
Data &B11000000                                             '0
Data &B11111001                                             '1
Data &B10100100                                             '2
Data &B10110000                                             '3
Data &B10011001                                             '4
Data &B10010010                                             '5
Data &B10000010                                             '6
Data &B11111000                                             '7
Data &B10000000                                             '8
Data &B10010000                                             '9


Registr:
Shiftout Portc.3 , Portc.4 , R , 1                        
Pulseout Portc , 5 , 10                                     
Waitms 7
Return

В момент смены значения переменной A с одной цифры на другую все разряды светятся адекватно, но  стоит значению установиться, как начинается отображаться только первый разряд ( он отправляется в сдвиговый регистр последним).

Момент смены одного значения на другое. Все разряды отображаются:
http://savepic.net/6341629m.jpg

Здесь установившееся значение. Отображается только один разряд:
http://savepic.net/6292474m.jpg
http://savepic.net/6353917m.jpg

Читал "Цикл статей на тему "Исследование работы 7-Seg Led индикации в Bascom". Динамическая ндикация на основе сдвиговых регистров 74HC595."

Много воды и не нужного мне. Может посоветуете в чем может быть проблема, господа?

Отредактировано Avus (2015-01-16 21:30:28)

0

8

Нужно было хотя бы схему выложить.

Держите рабочий пример динамической индикации, который я "вытащил" из своего проекта. http://pure-basic.narod.ru/forum_files/ … inTest.zip

Код:
$regfile = "m8def.dat"
$crystal = 1000000
$hwstack = 128
$swstack = 128
$framesize = 128

$eepleave                                         ' Не создавать eer-файл (EEPROM).

Port_shift_data Alias Portc.2                     ' Данные для 74HC595 (индикация и клавиатура).
Port_shift_clock Alias Portc.1                    ' Тактовые импульсы для 74HC595.
Port_shift_write Alias Portc.0                    ' Запись даных в регистр 74HC595.

Config Base = 0                                   ' Индексация массива начинается с нуля.


Config Portb = Input
Config Portc = Input
Config Portd = Input


Port_shift_data = 0
Port_shift_clock = 0
Port_shift_write = 0


Config Port_shift_data = Output
Config Port_shift_clock = Output
Config Port_shift_write = Output

Dim Outbuff As Word
Dim Outbuff_1 As Byte At Outbuff Overlay
Dim Outbuff_2 As Byte At Outbuff + 1 Overlay


Config Timer1 = Timer , Prescale = 1              ' Для динамической индикации.
On Timer1 Ltimer1
Timer1 = 55536
Enable Timer1

' Динамическая индикация.
Dim Dinamindex As Byte
Dim Dinaminfo(4) As Byte
Dim Count_ind_blink As Byte                       ' Необходимо для нигания разрядов при настройке.


' Прерываия.
Dim Int_temp As Byte                              ' Временная переменная, используемая в прерываниях.


Dinaminfo(0) = 1
Dinaminfo(1) = 2
Dinaminfo(2) = 3
Dinaminfo(3) = 4


Enable Interrupts

Do


Loop

' ****************************** Прерывания ************************************

' ------------------------------------------------------------------------------

Ltimer1:                                          ' Прерывание от таймера Timer1 (100 Гц).
   Timer1 = 55536

   Incr Dinamindex
   Dinamindex = Dinamindex And 3
   Outbuff_1 = Lookup(dinaminfo(dinamindex) , Ind)
   Int_temp = 1
   Shift Int_temp , Left , Dinamindex
   Outbuff_2 = Outbuff_2 And &B11110000
   Outbuff_2 = Outbuff_2 Or Int_temp

   Shiftout Port_shift_data , Port_shift_clock , Outbuff , 0 , 16
   Port_shift_write = 1                           ' Запись в 74HC595.
   !NOP
   !NOP
   Port_shift_write = 0
Return


' ********************************* Данные *************************************

Ind:                                              ' Коды цифр для индикатора.
   Data &B11000000                                ' 0
   Data &B11111001                                ' 1
   Data &B10100100                                ' 2
   Data &B10110000                                ' 3
   Data &B10011001                                ' 4
   Data &B10010010                                ' 5
   Data &B10000010                                ' 6
   Data &B11111000                                ' 7
   Data &B10000000                                ' 8
   Data &B10010000                                ' 9
   Data &B10111111                                ' -
   Data &B11111111                                ' Пусто

0

9

Петр, спасибо за содействие.

Схема аналогична этой, только порты у меня другие:
http://savepic.net/6322955m.png

Из Вашего примера я понял, что отображаются цифры из массива
Dinaminfo(0) = 1
Dinaminfo(1) = 2
Dinaminfo(2) = 3
Dinaminfo(3) = 4

Я попробовал Outbuff разложить на четыре цифры и каждую из них приравнять к соответствующему значению из массива:

Код:
$regfile = "m8def.dat"
$crystal = 1000000
$hwstack = 128
$swstack = 128
$framesize = 128

$eepleave                                                   ' Íå ñîçäàâàòü eer-ôàéë (EEPROM).

Port_shift_data Alias Portc.2                               ' Äàííûå äëÿ 74HC595 (èíäèêàöèÿ è êëàâèàòóðà).
Port_shift_clock Alias Portc.1                              ' Òàêòîâûå èìïóëüñû äëÿ 74HC595.
Port_shift_write Alias Portc.0                              ' Çàïèñü äàíûõ â ðåãèñòð 74HC595.

Config Base = 0                                             ' Èíäåêñàöèÿ ìàññèâà íà÷èíàåòñÿ ñ íóëÿ.


Config Portb = Input
Config Portc = Input
Config Portd = Input


Port_shift_data = 0
Port_shift_clock = 0
Port_shift_write = 0


Config Port_shift_data = Output
Config Port_shift_clock = Output
Config Port_shift_write = Output

Dim Outbuff As Word
Dim Outbuff_1 As Byte At Outbuff Overlay
Dim Outbuff_2 As Byte At Outbuff + 1 Overlay


Dim N1 As Byte                                              'Äëÿ ðàçëîæåíèÿ ÷åòûðåõçíà÷íîãî ÷èñëà íà ÷åòûðå öèôðû.
Dim N2 As Byte
Dim N3 As Byte
Dim N4 As Byte
Dim M1 As Integer
Dim M2 As Integer
Dim M3 As Integer
Dim M4 As Integer

                                               'äëÿ çíà÷åíèé îòïðàâëÿåìûõ â ðåãèñòð


Config Timer1 = Timer , Prescale = 1                        ' Äëÿ äèíàìè÷åñêîé èíäèêàöèè.
On Timer1 Ltimer1
Timer1 = 55536
Enable Timer1

' Äèíàìè÷åñêàÿ èíäèêàöèÿ.
Dim Dinamindex As Byte
Dim Dinaminfo(4) As Byte
Dim Count_ind_blink As Byte                                 ' Íåîáõîäèìî äëÿ íèãàíèÿ ðàçðÿäîâ ïðè íàñòðîéêå.


' Ïðåðûâàèÿ.
Dim Int_temp As Byte                                        ' Âðåìåííàÿ ïåðåìåííàÿ, èñïîëüçóåìàÿ â ïðåðûâàíèÿõ.







Enable Interrupts

Do



M1 = Outbuff
M2 = M1
M3 = M1
M4 = M1

M1 = M1 / 1000                                              'îòäåëÿåì òûñÿ÷è
Dinaminfo(0) = Abs(m1)

M2 = M2 Mod 1000                                            'îòäåëÿåì ñîòíè
M2 = M2 / 100
Dinaminfo(1) = Abs(m2)

M3 = M3 Mod 100                                             'îòäåëÿåì äåñÿòêè
M3 = M3 / 10
Dinaminfo(2) = Abs(m3)

M4 = M4 Mod 10                                              'îòäåëÿåì åäèíèöû
Dinaminfo(3) = Abs(m4)

Loop

' ****************************** Ïðåðûâàíèÿ ************************************

' ------------------------------------------------------------------------------

Ltimer1:                                                    ' Ïðåðûâàíèå îò òàéìåðà Timer1 (100 Ãö).
   Timer1 = 55536

   Incr Dinamindex
   Dinamindex = Dinamindex And 3
   Outbuff_1 = Lookup(dinaminfo(dinamindex) , Ind)
   Int_temp = 1
   Shift Int_temp , Left , Dinamindex
   Outbuff_2 = Outbuff_2 And &B11110000
   Outbuff_2 = Outbuff_2 Or Int_temp

   Shiftout Port_shift_data , Port_shift_clock , Outbuff , 0 , 16
   Port_shift_write = 1                                     ' Çàïèñü â 74HC595.
   !NOP
   !NOP
   Port_shift_write = 0
Return


' ********************************* Äàííûå *************************************

Ind:                                                        ' Êîäû öèôð äëÿ èíäèêàòîðà.
   Data &B11000000                                          ' 0
   Data &B11111001                                          ' 1
   Data &B10100100                                          ' 2
   Data &B10110000                                          ' 3
   Data &B10011001                                          ' 4
   Data &B10010010                                          ' 5
   Data &B10000010                                          ' 6
   Data &B11111000                                          ' 7
   Data &B10000000                                          ' 8
   Data &B10010000                                          ' 9
   Data &B10111111                                          ' -
   Data &B11111111                                          ' Ïóñòî

Затолкал это в основной цикл, что наверное неверно, но в силу слабых познаний не знаю как сделать иначе.

Отредактировано Avus (2015-01-17 14:49:37)

0

10

Переменные Outbuff, Outbuff_1, Outbuff_2 изменять не нужно. Они используются в подпрограмме прерываний для преобразования данных.
Выводимые числа нужно помещать в массив Dinaminfo.

0

11

1. Значит нужно ввести еще одну переменную, например "A", которую нужно будет разложить на цифры и приравнять к соответствующему значению из массива?
2. То, что разложение на цифры происходит в основном цикле , это правильно?

0

12

Заполнять массив можно где угодно, в т. ч. в главном цикле.
Разложение цифр обсуждалось тут. Разделить 16 bit

0

13

Из того что здесь:

Код:
Dim Val_byte(6) As Byte
Dim Val_long As Long
Dim Tmp As Long
Dim I As Byte

Val_long = 987654

For I = 1 To 6
  Tmp = Val_long Mod 10
  Val_byte(i) = Tmp
  Val_long = Val_long / 10
Next I

я понял, что в случае вывода четырехзначного числа нужно так:

Код:
Dim Val_byte(4) As Byte
Dim Val_long As Word
Dim Tmp As Long
Dim I As Byte

Val_long = 1234

For I = 1 To 4
  Tmp = Val_long Mod 10
  Val_byte(i) = Tmp
  Val_long = Val_long / 10
Next I

Правильно?

0

14

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

Правильно?

Вроде да.

0

15

Петр, а вот теперь самое интересное. Куда вышеописанный фрагмент вставить в основной Ваш код? Понимаю, что вопрос глупый, но от недостатка знаний он появляется.
Ваш код:

Код:
$regfile = "m8def.dat"
$crystal = 1000000
$hwstack = 128
$swstack = 128
$framesize = 128

$eepleave                                         ' Не создавать eer-файл (EEPROM).

Port_shift_data Alias Portc.2                     ' Данные для 74HC595 (индикация и клавиатура).
Port_shift_clock Alias Portc.1                    ' Тактовые импульсы для 74HC595.
Port_shift_write Alias Portc.0                    ' Запись даных в регистр 74HC595.

Config Base = 0                                   ' Индексация массива начинается с нуля.


Config Portb = Input
Config Portc = Input
Config Portd = Input


Port_shift_data = 0
Port_shift_clock = 0
Port_shift_write = 0


Config Port_shift_data = Output
Config Port_shift_clock = Output
Config Port_shift_write = Output

Dim Outbuff As Word
Dim Outbuff_1 As Byte At Outbuff Overlay
Dim Outbuff_2 As Byte At Outbuff + 1 Overlay


Config Timer1 = Timer , Prescale = 1              ' Для динамической индикации.
On Timer1 Ltimer1
Timer1 = 55536
Enable Timer1

' Динамическая индикация.
Dim Dinamindex As Byte
Dim Dinaminfo(4) As Byte
Dim Count_ind_blink As Byte                       ' Необходимо для нигания разрядов при настройке.


' Прерываия.
Dim Int_temp As Byte                              ' Временная переменная, используемая в прерываниях.


Dinaminfo(0) = 1
Dinaminfo(1) = 2
Dinaminfo(2) = 3
Dinaminfo(3) = 4


Enable Interrupts

Do


Loop

' ****************************** Прерывания ************************************

' ------------------------------------------------------------------------------

Ltimer1:                                          ' Прерывание от таймера Timer1 (100 Гц).
   Timer1 = 55536

   Incr Dinamindex
   Dinamindex = Dinamindex And 3
   Outbuff_1 = Lookup(dinaminfo(dinamindex) , Ind)
   Int_temp = 1
   Shift Int_temp , Left , Dinamindex
   Outbuff_2 = Outbuff_2 And &B11110000
   Outbuff_2 = Outbuff_2 Or Int_temp

   Shiftout Port_shift_data , Port_shift_clock , Outbuff , 0 , 16
   Port_shift_write = 1                           ' Запись в 74HC595.
   !NOP
   !NOP
   Port_shift_write = 0
Return


' ********************************* Данные *************************************

Ind:                                              ' Коды цифр для индикатора.
   Data &B11000000                                ' 0
   Data &B11111001                                ' 1
   Data &B10100100                                ' 2
   Data &B10110000                                ' 3
   Data &B10011001                                ' 4
   Data &B10010010                                ' 5
   Data &B10000010                                ' 6
   Data &B11111000                                ' 7
   Data &B10000000                                ' 8
   Data &B10010000                                ' 9
   Data &B10111111                                ' -
   Data &B11111111                                ' Пусто

0

16

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

Куда вышеописанный фрагмент вставить

Туда где должны выводится данные на индикацию. Например, если это термометр, то по окончанию измерения температуры и считывания данных, их необходимо поместить в массив индикации.

0

17

Значение частоты кварцевого резонатора скажется на работе индикации? У меня по проекту $crystal = 12000000   вместо $crystal = 1000000, которые у Вас в коде.

0

18

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

Значение частоты кварцевого резонатора скажется на работе индикации?

Да. От частоты тактового генератора зависит частота прерываний от таймера. Нужно подобрать такую минимальную частоту прерываний, при которой незаметны мерцания индикатора.

0

19

Выходит это:
Ltimer1:                                          ' Прерывание от таймера Timer1 (100 Гц).
   Timer1 = 55536

А есть какая-то формула расчета для значения Timer1 в зависимости от частоты кварца?

0

20

Все просто. При частоте 1 МГц и предделителе 1 и при счете таймера до 10 тысяч, получаем 100 прерываний в секунду. Т. е. 1000000 / 10000 = 100.
Таймер 16 битный, т. е. может считать до 65536. Поучаем 65536 - 55536 = 10000.

Отредактировано Пётр (2015-01-17 22:48:51)

0

21

Для 12МГц кварца --> Config Timer1 = Timer , Prescale = 8 --> 12000000/8 = 1500000

1500000/100 прерыв. в сек. = 15000

65536 - 15000 = 50536

Следовательно,
Ltimer1:                                          ' Прерывание от таймера Timer1 (100 Гц).
   Timer1 = 50536

Правильно?

0

22

Да.

0

23

Хорошо. С этим разобрался. А вот с этим до сих пор так и не понял:

Пётр написал(а):

Туда где должны выводится данные на индикацию. Например, если это термометр, то по окончанию измерения температуры и считывания данных, их необходимо поместить в массив индикации.


Как фрагмент:

Код:
Dim Val_byte(4) As Byte
Dim Val_long As Word
Dim Tmp As Long
Dim I As Byte

Val_long = 1234

For I = 1 To 4
  Tmp = Val_long Mod 10
  Val_byte(i) = Tmp
  Val_long = Val_long / 10
Next I

поместить в массив индикации ( пока разложение тут реализовано на понятном мне способе):

Код:
M1 = A
M2 = M1
M3 = M1
M4 = M1

M1 = M1 / 1000                                              'отделяем тысячи
Dinaminfo(0) = Abs(m1)

M2 = M2 Mod 1000                                            'отделяем сотни
M2 = M2 / 100
Dinaminfo(1) = Abs(m2)

M3 = M3 Mod 100                                             'отделяем десятки
M3 = M3 / 10
Dinaminfo(2) = Abs(m3)

M4 = M4 Mod 10                                              'отделяем единицы
Dinaminfo(3) = Abs(m4)

Весь код UART приемника с выводом принимаемого числа на светодиодный индикатор:

Код:
$regfile = "m8def.dat"
$crystal = 12000000
$hwstack = 128
$swstack = 128
$framesize = 128

$eepleave                                                   ' Не создавать eer-файл (EEPROM).

Port_shift_data Alias Portc.2                               ' Данные для 74HC595 (индикация и клавиатура).
Port_shift_clock Alias Portc.1                              ' Тактовые импульсы для 74HC595.
Port_shift_write Alias Portc.0                              ' Запись даных в регистр 74HC595.

Config Base = 0                                             ' Индексация массива начинается с нуля.


Config Portb = Input
Config Portc = Input
Config Portd = Input


Open "comb.1:9600,8,n,1" For Output As #1                   'конфигурируем программный UART. Нам нужен только прием.
Open "comb.0:9600,8,n,1" For Input As #2

Port_shift_data = 0
Port_shift_clock = 0
Port_shift_write = 0


Config Port_shift_data = Output
Config Port_shift_clock = Output
Config Port_shift_write = Output

Dim Outbuff As Word
Dim Outbuff_1 As Byte At Outbuff Overlay
Dim Outbuff_2 As Byte At Outbuff + 1 Overlay

Dim A As Word                                               'Число, которое принимаем и будем выводить на индикатор.

Dim N1 As Byte                                              'Для разложения четырехзначного числа на четыре цифры.
Dim N2 As Byte
Dim N3 As Byte
Dim N4 As Byte
Dim M1 As Integer
Dim M2 As Integer
Dim M3 As Integer
Dim M4 As Integer

                                               


Config Timer1 = Timer , Prescale = 8                        ' Для динамической индикации.
On Timer1 Ltimer1
Timer1 = 50536
Enable Timer1

' Динамическая индикация.
Dim Dinamindex As Byte
Dim Dinaminfo(4) As Byte
Dim Count_ind_blink As Byte                                 ' Необходимо для нигания разрядов при настройке.


' Прерываия.
Dim Int_temp As Byte                                        ' Временная переменная, используемая в прерываниях.







Enable Interrupts

Do

Input #2 , A                                                ' принимаем по UART "А"

M1 = A
M2 = M1
M3 = M1
M4 = M1

M1 = M1 / 1000                                              'отделяем тысячи
Dinaminfo(0) = Abs(m1)

M2 = M2 Mod 1000                                            'отделяем сотни
M2 = M2 / 100
Dinaminfo(1) = Abs(m2)

M3 = M3 Mod 100                                             'отделяем десятки
M3 = M3 / 10
Dinaminfo(2) = Abs(m3)

M4 = M4 Mod 10                                              'отделяем единицы
Dinaminfo(3) = Abs(m4)

Loop

' ****************************** Прерывания ************************************

' ------------------------------------------------------------------------------

Ltimer1:                                                    ' Прерывание от таймера Timer1 (100 Гц).
   Timer1 = 50536

   Incr Dinamindex
   Dinamindex = Dinamindex And 3
   Outbuff_1 = Lookup(dinaminfo(dinamindex) , Ind)
   Int_temp = 1
   Shift Int_temp , Left , Dinamindex
   Outbuff_2 = Outbuff_2 And &B11110000
   Outbuff_2 = Outbuff_2 Or Int_temp

   Shiftout Port_shift_data , Port_shift_clock , Outbuff , 0 , 16
   Port_shift_write = 1                                     ' Запись в 74HC595.
   !NOP
   !NOP
   Port_shift_write = 0
Return


' ********************************* Данные *************************************

Ind:                                                        ' Коды цифр для индикатора.
   Data &B11000000                                          ' 0
   Data &B11111001                                          ' 1
   Data &B10100100                                          ' 2
   Data &B10110000                                          ' 3
   Data &B10011001                                          ' 4
   Data &B10010010                                          ' 5
   Data &B10000010                                          ' 6
   Data &B11111000                                          ' 7
   Data &B10000000                                          ' 8
   Data &B10010000                                          ' 9
   Data &B10111111                                          ' -
   Data &B11111111                                          ' Пусто

Отредактировано Avus (2015-01-18 19:01:55)

0

24

В этом коде из UART'а принимается строковые данные, а не числовые.
Попробуйте вместо

Код:
Input #2 , A

использовать.

Код:
Inputbin #2 , A

0

25

В окончательной версии там будет Byte, т. к. принимаемое число будет от 0 до 200.
Меня интересует встраивание Вашего кода для разложения цифр в мой исходник. С этим не могу разобраться.

0

26

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

Меня интересует встраивание Вашего кода для разложения цифр в мой исходник.

Все просто.

Код:
$regfile = "m8def.dat"
$crystal = 12000000
$hwstack = 128
$swstack = 128
$framesize = 128

$eepleave                                                   ' Не создавать eer-файл (EEPROM).

Port_shift_data Alias Portc.2                               ' Данные для 74HC595 (индикация и клавиатура).
Port_shift_clock Alias Portc.1                              ' Тактовые импульсы для 74HC595.
Port_shift_write Alias Portc.0                              ' Запись даных в регистр 74HC595.

Config Base = 0                                             ' Индексация массива начинается с нуля.


Config Portb = Input
Config Portc = Input
Config Portd = Input


Open "comb.1:9600,8,n,1" For Output As #1                   'конфигурируем программный UART. Нам нужен только прием.
Open "comb.0:9600,8,n,1" For Input As #2

Port_shift_data = 0
Port_shift_clock = 0
Port_shift_write = 0


Config Port_shift_data = Output
Config Port_shift_clock = Output
Config Port_shift_write = Output

Dim Outbuff As Word
Dim Outbuff_1 As Byte At Outbuff Overlay
Dim Outbuff_2 As Byte At Outbuff + 1 Overlay

Dim A As Word                                               'Число, которое принимаем и будем выводить на индикатор.

Dim N1 As Byte                                              'Для разложения четырехзначного числа на четыре цифры.
Dim N2 As Byte
Dim N3 As Byte
Dim N4 As Byte
Dim M1 As Integer
Dim M2 As Integer
Dim M3 As Integer
Dim M4 As Integer




Config Timer1 = Timer , Prescale = 8                        ' Для динамической индикации.
On Timer1 Ltimer1
Timer1 = 50536
Enable Timer1

' Динамическая индикация.
Dim Dinamindex As Byte
Dim Dinaminfo(4) As Byte
Dim Count_ind_blink As Byte                                 ' Необходимо для нигания разрядов при настройке.


' Прерываия.
Dim Int_temp As Byte                                        ' Временная переменная, используемая в прерываниях.


Dim Val_b As Byte
Dim Tmp As Byte
Dim I As Byte




Enable Interrupts

Do

  Inputbin #2 , Val_b

  For I = 1 To 4
    Tmp = Val_b Mod 10
    Dinaminfo(i) = Tmp
    Val_b = Val_b / 10
  Next I

Loop

' ****************************** Прерывания ************************************

' ------------------------------------------------------------------------------

Ltimer1:                                                    ' Прерывание от таймера Timer1 (100 Гц).
   Timer1 = 50536

   Incr Dinamindex
   Dinamindex = Dinamindex And 3
   Outbuff_1 = Lookup(dinaminfo(dinamindex) , Ind)
   Int_temp = 1
   Shift Int_temp , Left , Dinamindex
   Outbuff_2 = Outbuff_2 And &B11110000
   Outbuff_2 = Outbuff_2 Or Int_temp

   Shiftout Port_shift_data , Port_shift_clock , Outbuff , 0 , 16
   Port_shift_write = 1                                     ' Запись в 74HC595.
   !NOP
   !NOP
   Port_shift_write = 0
Return


' ********************************* Данные *************************************

Ind:                                                                 ' Коды цифр для индикатора.
   Data &B11000000                                          ' 0
   Data &B11111001                                          ' 1
   Data &B10100100                                          ' 2
   Data &B10110000                                          ' 3
   Data &B10011001                                           ' 4
   Data &B10010010                                          ' 5
   Data &B10000010                                           ' 6
   Data &B11111000                                          ' 7
   Data &B10000000                                           ' 8
   Data &B10010000                                           ' 9
   Data &B10111111                                           ' -
   Data &B11111111                                           ' Пусто

0

27

Я так пробовал. Потом запускал проект в Протеусе. Сперва загорается на миг принимаемое число, только почему то отраженное (223 отображается как 322), потом отображаются просто нули и всё.  Пробовал менять частоту кварца. Не помогло.

0

28

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

Я так пробовал. Потом запускал проект в Протеусе. Сперва загорается на миг принимаемое число, только почему то отраженное (223 отображается как 322), потом отображаются просто нули и всё.  Пробовал менять частоту кварца. Не помогло.

Скиньте на мыло симуляцию + исходники

0

29

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

Читал "Цикл статей на тему "Исследование работы 7-Seg Led индикации в Bascom". Динамическая ндикация на основе сдвиговых регистров 74HC595."

Много воды и не нужного мне. Может посоветуете в чем может быть проблема, господа?

Кто Вам мешает удалить "Воду", ведь всё прокомментировано, в итоге получите то, что хотели?

Здесь  гляньте, может, что и найдёте.

Отредактировано sasha_1973 (2015-01-18 21:07:50)

0

30

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

Меня интересует встраивание Вашего кода для разложения цифр в мой исходник. С этим не могу разобраться.

На самом деле всё довольно просто, просто надо разобраться, как оно работает. Пройдитесь пошагово в Протеусе и всё поймёте.

0


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