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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Частотомер 2313+Max7219


Частотомер 2313+Max7219

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

1

Здравствуйте! Делаю себе генератор на XR2206. Вопрос стал за частотомером. Т.к. корпус маленький, то lcd не влез. Решил остановиться на сегментных индикаторах + 7219.
За основу взял забугорный код + код для 7219

Код что получилось
Код:
'$regfile = "2313def.dat"
$regfile = "attiny2313.dat"
'+-----------------------------------------------------------------------------+
'|           AVR Attiny2313 Frequency Meter 1.1 (7 digits, 10MHz)              |
'|      Pawe³ Kisielewski (manekinen) manekinen@mdiy.pl   -   MDIY.PL          |
'|                Not for commercial/profit/sell purposes                      |
'|           Compiler: Bascom AVR 2.0.7.6      Date: 25.03.3013                |
'+-----------------------------------------------------------------------------+
'I Modyfikacjê dla wysw. LCD I
'I opracowa³: Waldek         I
'I---------------------------I

'Crystal, put here your crystal frequency
$crystal = 22118400                                         'L:FF; H:DF

'Divide your crystal frequency by 1024 and put below
'F.e. 16000000/1024=15625; 20000000/1024=19531,25 (use 19531); 25000000/1024=24414,0625 (use 24414)
Const Compare = 21600

Ddrd.1 = 1 : Portd.1 = 0
Ddrd.2 = 1 : Portd.2 = 0
Ddrd.3 = 1 : Portd.3 = 0
Cs Alias Portd.1
Ser_clk Alias Portd.2
Ser_data Alias Portd.3
Ddrd.4 = 0 : Portd.4 = 1                                    'we->pin 8

Config Timer0 = Counter , Edge = Falling
Enable Timer0
On Timer0 Count Nosave
Config Timer1 = Timer , Prescale = 1024 , Clear Timer = 1
On Oc1a 1s Nosave
Enable Compare1a
Compare1a = Compare
Enable Interrupts
Dim Multiplier As Word At &H70
Dim Fr_byte_copy As Byte At &H74
Dim Frequency As Dword

Dim Digit(8)as Byte
Dim Y As Byte
Dim Disp_num As Byte
Dim Disp_data As Byte
Dim Digit_str As String * 6
Dim Temp_str As String * 3
Gosub Max7219_setup

Do
Digit_str = Str(frequency)
Digit_str = Format(digit_str , "000000")
Gosub Prepare
Loop
End


Prepare:
Do
For Y = 1 To 6
   Temp_str = Mid(digit_str , Y , 1)
   Select Case Temp_str
      Case "0" : Temp_str = "126"                           '&b01111110
      Case "1" : Temp_str = "48"                            '&b00110000
      Case "2" : Temp_str = "109"                           '&b01101101
      Case "3" : Temp_str = "121"                           '&b01111001
      Case "4" : Temp_str = "51"                            '&b00110011
      Case "5" : Temp_str = "91"                            '&b01011011
      Case "6" : Temp_str = "95"                            '&b01011111
      Case "7" : Temp_str = "112"                           '&b01110000
      Case "8" : Temp_str = "127"                           '&b01111111
      Case "9" : Temp_str = "123"                           '&b01111011
      Case "." : Temp_str = "128"                           '&b10000000
   End Select
   Digit(y) = Val(temp_str)

      Disp_num = Y                                          'çíàêîìåñòî (ðàçðÿä) íà êîòîðûé âûâîäèì òåêóùóþ öèôðó

      Disp_data = Digit(y)                                  'äàííûå êîòîðûå îòïðàâëÿåì íà âûáðàííûé ðàçðÿä
      Gosub Disp_write
Next Y
Loop Until Y = 7                                            'êîãäà âûâåëè äàííûå íà âñå 4 ðàçðÿäà âîçâðàùàåìñÿ â ãëàâíûé öèêë
Return

1s:
   $asm
   push R24
   IN R24,counter0
   STS &H74,R24
   IN R24, SREG
   push R24
   PUSH R10
   push R11
   push R12
   push R13
   push R14
   push R15
   push R16
   push R17
   push R18
   push R19
   push R20
   push R21
   push R22
   push R23
   push R25
   push R26
   push R27
   push R28
   push R29
   push R30
   push R31
   $end Asm

   Frequency = Multiplier
   Shift Frequency , Left , 8
   Frequency = Frequency + Fr_byte_copy

   Multiplier = 0

   $asm
   pop R31
   pop R30
   pop R29
   pop R28
   pop R27
   pop R26
   pop R25
   pop R23
   pop R22
   pop R21
   pop R20
   pop R19
   pop R18
   pop R17
   pop R16
   pop R15
   pop R14
   pop R13
   pop R12
   pop R11
   pop R10

   'reset timer1 & counter0 at the same time
   ldi R24,&H00
   Out Tcnt1l , R24
   Out Tcnt1h , R24
   Out Tcnt0 , R24

   'erase timer0 interrupt flag
   in R24,tifr
   SBR R24,&H01
   Out Tifr , R24
   pop R24
   Out Sreg , R24
   pop R24
   $end Asm
Return

Count:
   $asm
   push R16
   IN R16, SREG
   push R24
   push R25

   'Incr Multiplier
   lds R24,&H70
   lds R25,&H71
   adiw R24,&H01
   sts &H70,R24
   STS &H71,R25

   POP R25
   POP R24
   Out Sreg , R16
   pop R16
   $end Asm
Return

'Ïåðåäàåì äàííûå â max7221
Disp_write:
Ser_data = 0
Ser_clk = 0
Cs = 0
Shiftout Ser_data , Ser_clk , Disp_num , 1                  'îòïðàâëÿåì íîìåð ðàçðÿäà
Shiftout Ser_data , Ser_clk , Disp_data , 1                 'îòïðàâëÿåì äàííûå â ýòîò ðàçðÿä
Cs = 1
Return


'èíèöèàëèçàöèè max7221
Max7219_setup:
Disp_num = &H0C : Disp_data = 0                             'ðåæèì Shutdown (0-âêëþ÷åí, 1-âûêëþ÷åí)
Gosub Disp_write
Disp_num = &H09 : Disp_data = 0                             'ðåæèì ïðÿìîãî óïðàâëåíèÿ ñåãìåíòàìè èíäèêàòîðà
Gosub Disp_write
Disp_num = &H0A : Disp_data = 10                            'óðîâåíü ñâå÷åíèÿ ñåãìåíòîâ (0-ìèíèìóì, 15-ìàêñèìóì)
Gosub Disp_write
Disp_num = &H0B : Disp_data = 5                             '÷èñëî èñïîëüçóåìûõ ðàçðÿäîâ (ñ÷åò îò 0)
Gosub Disp_write
Disp_num = &H0F : Disp_data = 0                             'òåñòîâûé ðåæèì âûêëþ÷åí (0-âûêëþ÷åí, 1-âêëþ÷åí)
Gosub Disp_write
Disp_num = &H0C : Disp_data = 1
Gosub Disp_write
Return

Проект в протеусе

Исходник MAX7219

Исходник на оригинал частотомера

Будет 6 цифр. Частота в герцах.
В общем в протеусе запускается, но как то криво... Чем выше частота тем медленней считает.
Эксплуатация будет от 1Гц до 100кГц. Еще ни как не соображу, как точки расставить чтобы когда частота 1кГц на дисплее светилось 1.ххх и так далее на всех частотах.
Уважаемые подправьте код! буду очень благодарен! Железо все на руках уже.

Отредактировано NewUserBascom (2017-06-29 00:20:04)

0

2

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

В общем в протеусе запускается, но как то криво... Чем выше частота тем медленней считает.


А, что Вы хотели, ему-же надо всё обсчитать.

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

Уважаемые подправьте код!


Прерывания на ASM

1s:

    !push R16
    !IN R16, SREG
    !push R16
    !PUSH R17
    !push R26
    !push R27
    !push R28
    !push R29
    !push R30
    !push R31

   'Frequency = Multiplier
   'Shift Frequency , Left , 8
    !lds R26 , {Multiplier}
    !lds R27 , {Multiplier + 1}
    !clr R28
    !clr R29
    !ldi R16 , 8

   Shift_left:
    !LSL R26
    !rol R27
    !rol R28
    !rol R29

    !dec R16
    !brne Shift_left

   'Frequency = Frequency + Fr_byte_copy
    !lds R16 , {Fr_byte_copy}
    !clr R17
    !add R26 , R16
    !adc R27 , R17
    !adc R28 , R17
    !adc R29 , R17

    !sts {Frequency} , R26
    !sts {Frequency + 1} , R27
    !sts {Frequency + 2} , R30
    !sts {Frequency + 3} , R31

   'Multiplier = 0
    !sts {Multiplier} , R17
    !sts {Multiplier + 1} , R17

   'reset timer1 & counter0 at the same time
    !Out Tcnt0 , R17
    !Out Tcnt1l , R17
    !Out Tcnt1h , R17

   'erase timer0 interrupt flag
    !in R16 , tifr
    !SBR R16 , 1
    !Out Tifr , R16

    !pop R31
    !pop R30
    !pop R29
    !pop R28
    !pop R27
    !pop R26
    !pop R17
    !pop R16
    !Out Sreg , R16
    !pop R16

  Return

  Count:

    !push R26
    !IN R26 , SREG
    !push R26
    !push R27

   'Incr Multiplier
    !lds R26 , {Multiplier}
    !lds R27 , {Multiplier + 1}
    !adiw R26 , 1
    !sts {Multiplier} , R26
    !STS {Multiplier + 1} ,R27

    !POP R27
    !POP R26
    !Out Sreg , R26
    !pop R26

  Return

Запомните !
Сначала сохраняемся, потом что-то делаем с регистрами, затем восстанавливаем регистры !!!!!!!!!!!!!!!!!!!!!!!

+1

3

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

Запомните !
Сначала сохраняемся, потом что-то делаем с регистрами, затем восстанавливаем регистры !!!!!!!!!!!!!!!!!!!!!!!


Спасибо! Только учусь. Попутно вопрос, а "$asm" подставлять в Ваш код не нужно? баском сам распознает ассемблер?

0

4

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

Прерывания на ASM


в протеусе не работает....

0

5

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

Спасибо! Только учусь. Попутно вопрос, а "$asm" подставлять в Ваш код не нужно? баском сам распознает ассемблер?

Обратите внимание на восклицательные знаки перед каждой инструкцией, по этой метке Bascom распознаёт ASM.



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

в протеусе не работает....

Исправление, проверил в Протеусе

1s:

    !push R16
    !IN R16, SREG
    !push R16
    !PUSH R17
    !push R26
    !push R27
    !push R28
    !push R29
    !push R30
    !push R31

   'Frequency = Multiplier
   'Shift Frequency , Left , 8
    !lds R26 , {Multiplier}
    !lds R27 , {Multiplier + 1}
    !clr R28
    !clr R29
    !ldi R16 , 8

   Shift_left:
    !LSL R26
    !rol R27
    !rol R28
    !rol R29

    !dec R16
    !brne Shift_left

   'Frequency = Frequency + Fr_byte_copy
    !lds R16 , {Fr_byte_copy}
    !clr R17
    !add R26 , R16
    !adc R27 , R17
    !adc R28 , R17
    !adc R29 , R17

    !sts {Frequency} , R26
    !sts {Frequency + 1} , R27
    !sts {Frequency + 2} , R28
    !sts {Frequency + 3} , R29

   'Multiplier = 0
    !sts {Multiplier} , R17
    !sts {Multiplier + 1} , R17

   'reset timer1 & counter0 at the same time
    !Out Tcnt0 , R17
    !Out Tcnt1l , R17
    !Out Tcnt1h , R17

   'erase timer0 interrupt flag
    !in R16 , tifr
    !SBR R16 , 1
    !Out Tifr , R16

    !pop R31
    !pop R30
    !pop R29
    !pop R28
    !pop R27
    !pop R26
    !pop R17
    !pop R16
    !Out Sreg , R16
    !pop R16

  Return

  Count:

    !push R26
    !IN R26 , SREG
    !push R26
    !push R27

   'Incr Multiplier
    !lds R26 , {Multiplier}
    !lds R27 , {Multiplier + 1}
    !adiw R26 , 1
    !sts {Multiplier} , R26
    !STS {Multiplier + 1} ,R27

    !POP R27
    !POP R26
    !Out Sreg , R26
    !pop R26

  Return



По поводу MAX7219, Вам сюда

Отредактировано sasha_1973 (2017-06-29 14:38:09)

0

6

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

Обратите внимание на восклицательные знаки перед каждой инструкцией, по этой метке Bascom распознаёт ASM.


Да, добавил Ваш код, работает немного лучше. Но теперь занижает показания. Вместо 101кГц показывает 100,864кГц и так далее, занижает показания... Это протеус неверно работает или программа в мк?

По ссылке которую дали очень интересно, но ссылки на исходники не действительны(не работают)

привел код к такому виду:

код
Код:
$regfile = "attiny2313.dat"
$crystal = 22118400                                         'L:FF; H:DF

'F.e. 16000000/1024=15625; 20000000/1024=19531,25 (use 19531); 25000000/1024=24414,0625 (use 24414)
Const Compare = 21600

Ddrd.1 = 1 : Portd.1 = 0
Ddrd.2 = 1 : Portd.2 = 0
Ddrd.3 = 1 : Portd.3 = 0
Cs Alias Portd.1
Ser_clk Alias Portd.2
Ser_data Alias Portd.3
Ddrd.4 = 0 : Portd.4 = 1                                    'we->pin 8

Config Timer0 = Counter , Edge = Falling
Enable Timer0
On Timer0 Count Nosave
Config Timer1 = Timer , Prescale = 1024 , Clear Timer = 1
On Oc1a 1s Nosave
Enable Compare1a
Compare1a = Compare
Enable Interrupts
Dim Multiplier As Word At &H70
Dim Fr_byte_copy As Byte At &H74
Dim Frequency As Dword
Dim Freq_str As String * 7
Dim Dlug As Byte
Dim Digit(8)as Byte
Dim Y As Byte
Dim Disp_num As Byte
Dim Disp_data As Byte
Dim Digit_str As String * 6
Dim Temp_str As String * 3
Gosub Max7219_setup

Do
Loop
End


Prepare:
Do
For Y = 1 To 6
   Temp_str = Mid(digit_str , Y , 1)
   Select Case Temp_str
      Case "0" : Temp_str = "126"                           '&b01111110
      Case "1" : Temp_str = "48"                            '&b00110000
      Case "2" : Temp_str = "109"                           '&b01101101
      Case "3" : Temp_str = "121"                           '&b01111001
      Case "4" : Temp_str = "51"                            '&b00110011
      Case "5" : Temp_str = "91"                            '&b01011011
      Case "6" : Temp_str = "95"                            '&b01011111
      Case "7" : Temp_str = "112"                           '&b01110000
      Case "8" : Temp_str = "127"                           '&b01111111
      Case "9" : Temp_str = "123"                           '&b01111011
      Case "." : Temp_str = "128"                           '&b10000000

   End Select
   Digit(y) = Val(temp_str)

      Disp_num = Y                                          'çíàêîìåñòî (ðàçðÿä) íà êîòîðûé âûâîäèì òåêóùóþ öèôðó

      Disp_data = Digit(y)                                  'äàííûå êîòîðûå îòïðàâëÿåì íà âûáðàííûé ðàçðÿä
      Gosub Disp_write
Next Y
Loop Until Y = 7                                            'êîãäà âûâåëè äàííûå íà âñå 4 ðàçðÿäà âîçâðàùàåìñÿ â ãëàâíûé öèêë
Return

1s:
   $asm
   push R24
   IN R24,counter0
   STS &H74,R24
   IN R24, SREG
   push R24
   PUSH R10
   push R11
   push R12
   push R13
   push R14
   push R15
   push R16
   push R17
   push R18
   push R19
   push R20
   push R21
   push R22
   push R23
   push R25
   push R26
   push R27
   push R28
   push R29
   push R30
   push R31
   $end Asm

   Frequency = Multiplier
   Shift Frequency , Left , 8
   Frequency = Frequency + Fr_byte_copy
   Multiplier = 0
   Digit_str = Str(frequency)
   Digit_str = Format(digit_str , "      ")
   Gosub Prepare

   $asm
   pop R31
   pop R30
   pop R29
   pop R28
   pop R27
   pop R26
   pop R25
   pop R23
   pop R22
   pop R21
   pop R20
   pop R19
   pop R18
   pop R17
   pop R16
   pop R15
   pop R14
   pop R13
   pop R12
   pop R11
   pop R10

   'reset timer1 & counter0 at the same time
   ldi R24,&H00
   Out Tcnt1l , R24
   Out Tcnt1h , R24
   Out Tcnt0 , R24

   'erase timer0 interrupt flag
   in R24,tifr
   SBR R24,&H01
   Out Tifr , R24
   pop R24
   Out Sreg , R24
   pop R24
   $end Asm
Return

Count:
   $asm
   push R16
   IN R16, SREG
   push R24
   push R25

   'Incr Multiplier
   lds R24,&H70
   lds R25,&H71
   adiw R24,&H01
   sts &H70,R24
   STS &H71,R25

   POP R25
   POP R24
   Out Sreg , R16
   pop R16
   $end Asm
Return

'èíèöèàëèçàöèè max7221
Max7219_setup:
Disp_num = &H0C : Disp_data = 0                             'ðåæèì Shutdown (0-âêëþ÷åí, 1-âûêëþ÷åí)
Gosub Disp_write
Disp_num = &H09 : Disp_data = 0                             'ðåæèì ïðÿìîãî óïðàâëåíèÿ ñåãìåíòàìè èíäèêàòîðà
Gosub Disp_write
Disp_num = &H0A : Disp_data = 10                            'óðîâåíü ñâå÷åíèÿ ñåãìåíòîâ (0-ìèíèìóì, 15-ìàêñèìóì)
Gosub Disp_write
Disp_num = &H0B : Disp_data = 5                             '÷èñëî èñïîëüçóåìûõ ðàçðÿäîâ (ñ÷åò îò 0)
Gosub Disp_write
Disp_num = &H0F : Disp_data = 0                             'òåñòîâûé ðåæèì âûêëþ÷åí (0-âûêëþ÷åí, 1-âêëþ÷åí)
Gosub Disp_write
Disp_num = &H0C : Disp_data = 1
Gosub Disp_write
Return

'Ïåðåäàåì äàííûå â max7221
Disp_write:
Disable Interrupts
Ser_data = 0
Ser_clk = 0
Cs = 0
Shiftout Ser_data , Ser_clk , Disp_num , 1                  'îòïðàâëÿåì íîìåð ðàçðÿäà
Shiftout Ser_data , Ser_clk , Disp_data , 1                 'îòïðàâëÿåì äàííûå â ýòîò ðàçðÿä
Cs = 1
Enable Interrupts
Return

заработал быстрей. Открыл примеры на 7119(21) но не могу не как вникнуть... Пытаюсь поставить точку, но ничего не выходит.
Экспериментировал, если делаю так:
Digit_str = Format(digit_str , "   .   ")
то на знакоместе ставится только точка, цифра сдвигается.
ничего не могу понять...

Отредактировано NewUserBascom (2017-06-30 22:07:16)

0

7

В общем методом проб и ошибок, изучения этого примера:
Ссылка
вроде получилось. В протеусе работает.
как сделал: записываю в переменную количество выводимых символов частоты, и если количество больше или равно 4, то включаю флаг точки, затем устанавливаю ее. Может немного криво, но я только учусь. Буду пробовать в железе.

код
Код:
$regfile = "attiny2313.dat"
$crystal = 22118400                                         'L:FF; H:DF

'работает в протеусе 2017

'F.e. 16000000/1024=15625; 20000000/1024=19531,25 (use 19531); 25000000/1024=24414,0625 (use 24414)
Const Compare = 21600

Ddrd.1 = 1 : Portd.1 = 0
Ddrd.2 = 1 : Portd.2 = 0
Ddrd.3 = 1 : Portd.3 = 0
Cs Alias Portd.1
Ser_clk Alias Portd.2
Ser_data Alias Portd.3
Ddrd.4 = 0 : Portd.4 = 1                                    'we->pin 8

Config Timer0 = Counter , Edge = Falling
Enable Timer0
On Timer0 Count Nosave
Config Timer1 = Timer , Prescale = 1024 , Clear Timer = 1
On Oc1a 1s Nosave
Enable Compare1a
Compare1a = Compare
Enable Interrupts
Dim Multiplier As Word At &H70
Dim Fr_byte_copy As Byte At &H74
Dim Frequency As Dword
Dim Freq_str As String * 7
Dim Search_dot As Byte
Dim Digit(8)as Byte
Dim Y As Byte
Dim Disp_num As Byte
Dim Disp_data As Byte
Dim Digit_str As String * 6
Dim Temp_str As String * 3
Dim Flag_dot As Bit

Const On = 1
Const Off = 0

Gosub Max7219_setup

Do
Loop
End



Prepare:
Do
For Y = 1 To 6
   Temp_str = Mid(digit_str , Y , 1)
   Select Case Temp_str
      Case "0" : Temp_str = "126"                           '&b01111110
      Case "1" : Temp_str = "48"                            '&b00110000
      Case "2" : Temp_str = "109"                           '&b01101101
      Case "3" : Temp_str = "121"                           '&b01111001
      Case "4" : Temp_str = "51"                            '&b00110011
      Case "5" : Temp_str = "91"                            '&b01011011
      Case "6" : Temp_str = "95"                            '&b01011111
      Case "7" : Temp_str = "112"                           '&b01110000
      Case "8" : Temp_str = "127"                           '&b01111111
      Case "9" : Temp_str = "123"                           '&b01111011

   End Select
   Digit(y) = Val(temp_str)

      Disp_num = Y                                          'знакоместо (разряд) на который выводим текущую цифру
      Disp_data = Digit(y)                                  'данные которые отправляем на выбранный разряд

     If Search_dot >= 4 Then
        Flag_dot = On
     End If
If Flag_dot = On Then

If Y = 3 Then Disp_data = Disp_data + 128
End If

      Gosub Disp_write
Next Y
Flag_dot = Off
Loop Until Y = 7                                            'когда вывели данные на все 4 разряда возвращаемся в главный цикл
Return


1s:
   $asm
   push R24
   IN R24,counter0
   STS &H74,R24
   IN R24, SREG
   push R24
   PUSH R10
   push R11
   push R12
   push R13
   push R14
   push R15
   push R16
   push R17
   push R18
   push R19
   push R20
   push R21
   push R22
   push R23
   push R25
   push R26
   push R27
   push R28
   push R29
   push R30
   push R31
   $end Asm

   Frequency = Multiplier
   Shift Frequency , Left , 8
   Frequency = Frequency + Fr_byte_copy
   Multiplier = 0
   Digit_str = Str(frequency)
   Search_dot = Len(digit_str )
   Digit_str = Format(digit_str , "      ")
   Gosub Prepare

   $asm
   pop R31
   pop R30
   pop R29
   pop R28
   pop R27
   pop R26
   pop R25
   pop R23
   pop R22
   pop R21
   pop R20
   pop R19
   pop R18
   pop R17
   pop R16
   pop R15
   pop R14
   pop R13
   pop R12
   pop R11
   pop R10

   'reset timer1 & counter0 at the same time
   ldi R24,&H00
   Out Tcnt1l , R24
   Out Tcnt1h , R24
   Out Tcnt0 , R24

   'erase timer0 interrupt flag
   in R24,tifr
   SBR R24,&H01
   Out Tifr , R24
   pop R24
   Out Sreg , R24
   pop R24
   $end Asm
Return

Count:
   $asm
   push R16
   IN R16, SREG
   push R24
   push R25

   'Incr Multiplier
   lds R24,&H70
   lds R25,&H71
   adiw R24,&H01
   sts &H70,R24
   STS &H71,R25

   POP R25
   POP R24
   Out Sreg , R16
   pop R16
   $end Asm
Return

'инициализации max7221
Max7219_setup:
Disp_num = &H0C : Disp_data = 0                             'режим Shutdown (0-включен, 1-выключен)
Gosub Disp_write
Disp_num = &H09 : Disp_data = 0                             'режим прямого управления сегментами индикатора
Gosub Disp_write
Disp_num = &H0A : Disp_data = 10                            'уровень свечения сегментов (0-минимум, 15-максимум)
Gosub Disp_write
Disp_num = &H0B : Disp_data = 5                             'число используемых разрядов (счет от 0)
Gosub Disp_write
Disp_num = &H0F : Disp_data = 0                             'тестовый режим выключен (0-выключен, 1-включен)
Gosub Disp_write
Disp_num = &H0C : Disp_data = 1
Gosub Disp_write
Return

'Передаем данные в max7221
Disp_write:
Disable Interrupts
Ser_data = 0
Ser_clk = 0
Cs = 0
Shiftout Ser_data , Ser_clk , Disp_num , 1                  'отправляем номер разряда
Shiftout Ser_data , Ser_clk , Disp_data , 1                 'отправляем данные в этот разряд
Cs = 1
Enable Interrupts
Return

Отредактировано NewUserBascom (2017-07-01 02:10:28)

0

8

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

вроде получилось. В протеусе работает.


Раз работает и всё устраивает, значит Вам повезло с расположением звёзд на небе.

+1

9

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

Раз работает и всё устраивает, значит Вам повезло с расположением звёзд на небе.


Я так полагаю Вы указывайте на кривизну кода? Буду очень признателен, если ткнете в мои ошибки. Я буду пробовать два варианта в железе: с исходным куском кода и с Вашим. Тот который будет работать адекватней оставлю.
Изучал Ваши примеры по драйверу MAX72xx, ни как не могу привыкнуть к русским буквам в коде  8-) , но все равно информация очень полезна для развития  :cool:

Ассемблер пока изучаю... Как известно он очень тяжело дается... Скоро буду пытаться переносить прогу а ассемблере с pic16f877 на авр +  MAX72xx, соответственно через баском.

Отредактировано NewUserBascom (2017-07-01 15:00:17)

0

10

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

Я так полагаю Вы указывайте на кривизну кода?

С чего это Вы взяли ?


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

Буду очень признателен, если ткнете в мои ошибки

Прерывания, на то и прерывания, что-бы находиться там кратчайшее время.


Повторюсь, если всё устраивает, чего тут советовать.

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Частотомер 2313+Max7219