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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Исходники » Альтернативный вывод в сдвиговый регистр 595


Альтернативный вывод в сдвиговый регистр 595

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

1

Может кому пригодится, исходник для вывода в сдвоенный регистр 595 16 битного значения.
Время выполнения 15мкс при 16МГц

595
Код:
'Подпрограмма вывода в сдвиговый регистр на НС595

$regfile = "m16def.dat"                                     ' specify the used micro
$crystal = 16000000                                         ' used crystal frequency
$baud = 19200                                               ' use baud rate
$hwstack = 32                                               ' default use 32 for the hardware stack
$swstack = 10                                               ' default use 10 for the SW stack
$framesize = 68


'Назначение порта и пинов для регистра
Shiftport Alias Portb                                       'Назначаем порт для вывода в регистр
Const Dataclk = 2                                           'Номер пина для тактирования регистра
Const Dataout = 3                                           'Номер пина для данных регистра
Const Dataset = 4                                           'Номер пина для защелки регистра
Config Shiftport = Output                                   'Назначаем порт на вывод
'-----------------------------------------------
'Объявляем функцию для вывода в регистр
Declare Sub Shiftreg
'-----------------------------------------------
'Объявляем переменную 2-байтовую для вывода в регистр
Dim S As Word
'-----------------------------------------------
'Основное тело программы

S = &B1111000011000001

Call Shiftreg                                               ' 15.3uS выгрузка в регистр 16бит                                                     '

End
'-----------------------------------------------


'Функция вывода в регистр

Sub Shiftreg
$asm
  push r16
   Loadadr S , X
  lds r16, {s}                                              ' Загрузка младшего байта переменной S                                             '
  rCall Shiftout
  Lds r16, {s+1}                                            'Загрузка старшего байта переменной S
  rCall Shiftout
  sbi  Shiftport,Dataset                                    'Защелка
  cbi  Shiftport,Dataset                                    'Защелка
  pop r16
  $end Asm

End Sub

$asm
Shiftout:
 Push r18
  ldi  r18,&h08
So2:
  Ror r16
  brcc So1
  sbi  Shiftport,Dataout
  rjmp So3
So1:
  Cbi Shiftport , Dataout
So3:
  Sbi Shiftport , Dataclk
  cbi  Shiftport,Dataclk
  dec  r18
  brne So2
  cbi  Shiftport,Dataout
  pop r18
  ret
$end Asm
'------------------------------

+1

2

спасибо, полезно

а штатная функция работает медленней?

Отредактировано RDW (2014-11-21 12:14:22)

-1

3

Стандартная функция тратит 20.6 мкс

Отредактировано Geolog (2014-11-21 14:16:22)

-1

4

Значит не критично, но теперь есть выбор.)

-1

5

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

Стандартная функция тратит 20.6 мкс

Насколько я понял, речь о ShiftOut?
У функции есть необязательный параметр Delay, задающий задержку между импульсами.

The DELAY normally consists of 2 NOP instructions. When the clock is too fast you can specify a delay time(in uS).

Если его сделать равным нулю, то скорость должна увеличится.

-1

6

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

Может кому пригодится, исходник для вывода в сдвоенный регистр 595 16 битного значения.
Время выполнения 15мкс при 16МГц

Все-бы так выкладывали, МОЛОДЧИНА, так держать!

0

7

Добавляю
Вывод двубайтного числа в 595 регистр с помощью аппаратного SPI
Время передачи 6,75мкс при частоте шины SPI 4мГц, в конфигурации SPI шины установлен Fosc/4

595_SPI_HARDWARE
Код:
'Подпрограмма вывода в сдвиговый регистр на НС595 с помощью аппаратного SPI
' ДВУХБАЙТНОЕ ЧИСЛО

$regfile = "m1280def.dat"               ' specify the used micro
$crystal = 16000000                     ' used crystal frequency
$baud = 19200                           ' use baud rate
$hwstack = 32                           ' default use 32 for the hardware stack
$swstack = 32                           ' default use 10 for the SW stack
$framesize = 68
 '------конфигурируем выводы SPI на вывод
 '---смотрим на каких выводах висят MOSI SCK SS и конфигурируем

 Config Portb.0 = Output : Reset Portb.0       '---SS
 Config Portb.1 = Output : Reset Portb.1       '---SCK
 Config Portb.2 = Output : Reset Portb.2       '---MOSI

'--- конфигурируем SPI
Spcr = &B01010000                       'конфигурация управляющего регистра SPCR шины SPI

'(
'------биты конфигурации
'SPIE - 0
'SPE - 1
'DORD - 0
'MSTR - 1
'CPOL - 0
'CPHA - 0
'SPR1 - 0
'SPR0 - 0
Описание битов конфигурации по ссылке  http://www.gaw.ru/html.cgi/txt/doc/micros/avr/arh128/15_1.htm
')


Dim S As Word
S = &B0000000111111101                  ' число которое будем выводить
 '       16--------------------0 bits


Gosub Spi_send

nop

End




Spi_send:
!push r16
!in r16,sreg
!push r16


!lds r16,{s+1}
!out SPDR,r16
Wait1:
!sbis SPSR,SPIF                         ' ожидаем окончание передачи байта
!rjmp Wait1

!lds r16,{s}
!out SPDR,r16
Wait2:
!sbis SPSR,SPIF                         ' ожидаем окончание передачи байта
!rjmp Wait2


!sbi  portb,0                           '---Импульс для защелки регистра --- SS
!cbi portb,0                            '---Импульс для защелки регистра --- SS

!pop r16
!out sreg, r16
!pop r16
Return

Картинка с Протеуса

http://sa.uploads.ru/t/nc1k3.png

0

8

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

Вывод двубайтного числа в 595 регистр с помощью аппаратного SPI
Время передачи 6,75мкс при частоте шины SPI 4мГц, в конфигурации SPI шины установлен Fosc/4

А ещё быстрее?

Spcr = &B01010000                       'конфигурация управляющего регистра SPCR шины SPI
'                         |
                Spsr.spi2x = 1       ' Bit 0 – SPI2X: Double SPI Speed Bit

Отредактировано sasha_1973 (2014-11-27 01:41:46)

0

9

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

Насколько я понял, речь о ShiftOut?
У функции есть необязательный параметр Delay, задающий задержку между импульсами.

Если его сделать равным нулю, то скорость должна увеличится.

Я в шоке, Пётр прошу прощения, но я "-" не ставил, у меня вообще чёрте-что творится с этим форумом!

Администратор, прошу разобраться!

За всё время разорился только на один "-", а тут такое творится!

http://sa.uploads.ru/t/v3rbf.jpg http://sa.uploads.ru/t/Pvoi3.jpg

У всех прошу прощения за "-", я их действительно не ставил!

Отредактировано sasha_1973 (2014-11-27 01:57:11)

0

10

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

Spsr.spi2x = 1       ' Bit 0 – SPI2X: Double SPI Speed Bit

Ага, все правильно Александр. тогда будет Fosc/2

0

11

Самый шустрый вариант 67 тактов для 16-бит.

Силами Bascom - 108 тактов для 16-бит.

0

12

Можно ещё задействовать прерывания, что-бы не ждать флага. Всё зависит от задачи.

0

13

Паша, так где шустрый вариант, наверняка есть в заначке?

И с прерываниями, то-же надо, выкладывай, не жмись!

0

14

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

Паша, так где шустрый вариант, наверняка есть в заначке?

И с прерываниями, то-же надо, выкладывай, не жмись!


Саша, выложу, позже

0


Вы здесь » Программирование ATMEL в BASCOM. » Исходники » Альтернативный вывод в сдвиговый регистр 595