Сб мар 21, 2020 11:40:35
#define ClearOutBit PORTC &= ~(1<<1) //0 на выход
#define SetOutBit PORTC |= 1<<1 //1 на выход
void Set0( void ) //Выставляем в правую линию ноль ~0.4 мкс
{
SetOutBit;
asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
ClearOutBit;
//После этого временной интервал немного увеличен, в связи с выполнением циклов, но диоды сигнал ловят исправно
}
void Set1( void ) //Выставляем в правую линию единицу ~0.85 мкс
{
SetOutBit;
asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
ClearOutBit;
//После этого временной интервал немного увеличен, в связи с выполнением циклов, но диоды сигнал ловят исправно
}
unsigned long int mas[30]; //32 битный массив из 30 значений
void setMas( void ) //выставление всего массива в линию
{
unsigned long int a;
unsigned int j,i;
for (j=0; j<30; j++) { //количество светодиодов 30
a = 0x1000000; //первым выставляется G (Hi->Low), потом R и B
for (i=0;i<24;i++){ //три байта G,R,B
a=a>>1;
if ((mas[j]&a)==0x00000000) {
Set0(); //ноль
} else {
Set1(); //единица
}
}
}
}
Сб мар 21, 2020 15:20:43
Сб мар 21, 2020 17:42:25
;----------;
; Other modules
.include "mpc_mon.asm" ; System monitor
.include "mpc_play.asm" ; Playback control
.include "mpc_fs.asm" ; File System
.include "mpc_sm.asm" ; Medium access
.include "mpc_iic.asm" ; IIC functions
.include "mpc_comm.asm" ; Communications
.include "mpc_eep.asm" ; EEPROM functions
.include "mpc_mess.asm" ; Constants
Сб мар 21, 2020 17:57:42
затем же, что и отедльные модули в Си: чтобы не ломать голову разными именами меток и прочих индентификаторовoleg110592 писал(а):зачем?
Сб мар 21, 2020 18:16:13
include 'pic14.inc'
macro delai d
movlw d
call delay
end macro
green =0001'0000b
red =0010'0000b
white =0000'0001b
black =0000'0000b
start:
call gpinit
call adinit
call ledinit
goto .a
.a:
delai 10 ;1=from 760Hz to 25540Hz
gpout green+red+white
delai 100 ;1=50%
gpout black
goto .a
;;;;;;;;;;;;;;;;;;;;;;;;;;;
delay:
call adsample
movwf al
.a:
mov ah,bl
.b:
loop ah,.b
loop al,.a
return
start:
call gpinit
call adinit
call ledinit
goto @f
nop
@@:
delai 10 ;1=from 760Hz to 25540Hz
gpout green+red+white
delai 100 ;1=50%
gpout black
goto @b
Сб мар 21, 2020 18:18:17
Сб мар 21, 2020 18:40:09
Сб мар 21, 2020 18:55:46
bptr0:
nop
.org (bptr0 + (256 - (bptr0 & 0x00FF)))
slot0:
;sbr zl,(1<<6)
sbr zl,(1<<5)
;
;
; trd2812_ma.txt
;
; файл обработчика передачи массива
; из буфера вывода в линейку на основе WS2812B
; базовый МК из линейки АТМЕЛ при тактовой частоте
; от 16 Мегагерц ( 0,000000062 S)
;
; требуемые интервалы по даташиту WS2812B
;
;Data transfer time( TH+TL=1.25µs±600ns)
; T0H 0 code ,high voltage time 0.4us ±150ns
; T1H 1 code ,high voltage time 0.8us ±150ns
; T0L 0 code ,low voltage time 0.85us ±150ns
; T1L 1 code ,low voltage time 0.45us ±150ns
; RES low voltage time Above 50µs
; исходный уровень линии связи = 0
; данные передаются пакетами из трех байт на точку
; старшими битами вперед в последовательности
; соответствующей G - R - B цветам точки
; количество блоков должно соответствовать
; количеству точек в ленте
;
; реальные данные согласно тест - отладки дебаггером (версия1!)
; авр-студио 4.19
;
; Data transfer time( TH+TL=1.38µs -10ns)
; T0H 0 code ,high voltage time 0.44us ±10ns
; T1H 1 code ,high voltage time 0.88us ±10ns
; T0L 0 code ,low voltage time 0.94us ±10ns
; T1L 1 code ,low voltage time 0.50us ±10ns
; RES low voltage time 192,88uS (Above 50µs)
;
; длина прерывания с пакетом загрузки (x60*3) = 2175uS (0.002175)
; интервал между прерываниями (irq t/c0) = 0.004S (4000uS)
;
; define datas
; .equ port_out = PORTB ; порт вывода (по усмотрению)
; .equ out_line = 0 ; линия вывода данных
; .equ bufout = SRAM_START ; начальный адрес буфера вывода
; .equ pixel = 60 ; количество точек в линейке/ленте
; .equ bufout_size = (pixel * 3) ; не может быть более объема ОЗУ - стек!!!
;таблица обьявленных имен - переназначение регистров РОН
;
; .def name = r31 ; ZH регистр (полный)
; .def name = r30 ; ZL регистр (полный)
; .def name = r29 ; YH регистр (полный)
; .def name = r28 ; YL регистр (полный)
; .def name = r27 ; XH регистр (полный) указатель текущей ячейки массива bufout
; .def name = r26 ; XL регистр (полный) указатель текущей ячейки массива bufout
; .def name = r25 ; регистр (полный) BH
; .def name = r24 ; регистр (полный) BL
; .def name = r23 ; регистр (полный)
; .def name = r22 ; регистр (полный)
; .def name = r21 ; регистр (полный)
; .def name = r20 ; регистр (полный)
; .def name = r19 ; регистр (полный)
; .def name = r18 ; регистр (полный)
; .def tmp1 = r17 ; регистр (полный) счетчик байт вывода
; .def tmp0 = r16 ; регистр (полный) буфер выводимого байта
; .def regn = r15 ; регистр (урезан)
; .def regn = r14 ; регистр (урезан)
; .def regn = r11 ; регистр (урезан)
; .def regn = r10 ; регистр (урезан)
; .def regn = r9 ; регистр (урезан)
; .def regn = r8 ; регистр (урезан)
; .def regn = r7 ; регистр (урезан)
; .def regn = r6 ; регистр (урезан)
; .def regn = r5 ; регистр (урезан)
; .def regn = r4 ; регистр (урезан)
; .def regn = r3 ; регистр (урезан)
; .def regn = r2 ; регистр (урезан)
; .def matr = r1 ; регистр (урезан) r1 по возможности не использовать!!!
; .def madr = r0 ; регистр (урезан) r0 по возможности не использовать!!!
;
;----------
; .macro ;; ввод и предобработка данных
;
;
; .endmacro
;
;----------
;
; определение буфера вывода в области данных
; .dseg
; .org bufout
;point0: .byte 3 ; g:r:b
;point1: .byte 3 ; g:r:b
;point2: .byte 3 ; g:r:b
;point3: .byte 3 ; g:r:b
;point4: .byte 3 ; g:r:b
;point5: .byte 3 ; g:r:b
;point6: .byte 3 ; g:r:b
;point7: .byte 3 ; g:r:b
;point8: .byte 3 ; g:r:b
;point9: .byte 3 ; g:r:b
;point10: .byte 3 ; g:r:b
;point11: .byte 3 ; g:r:b
;point12: .byte 3 ; g:r:b
;point13: .byte 3 ; g:r:b
;point14: .byte 3 ; g:r:b
;point15: .byte 3 ; g:r:b
;point16: .byte 3 ; g:r:b
;point17: .byte 3 ; g:r:b
;point18: .byte 3 ; g:r:b
;point19: .byte 3 ; g:r:b
;point20: .byte 3 ; g:r:b
;point21: .byte 3 ; g:r:b
;point22: .byte 3 ; g:r:b
;point23: .byte 3 ; g:r:b
;point24: .byte 3 ; g:r:b
;point25: .byte 3 ; g:r:b
;point26: .byte 3 ; g:r:b
;point27: .byte 3 ; g:r:b
;point28: .byte 3 ; g:r:b
;point29: .byte 3 ; g:r:b
;point30: .byte 3 ; g:r:b
;point31: .byte 3 ; g:r:b
;point32: .byte 3 ; g:r:b
;point33: .byte 3 ; g:r:b
;point34: .byte 3 ; g:r:b
;point35: .byte 3 ; g:r:b
;point36: .byte 3 ; g:r:b
;point37: .byte 3 ; g:r:b
;point38: .byte 3 ; g:r:b
;point39: .byte 3 ; g:r:b
;point40: .byte 3 ; g:r:b
;point41: .byte 3 ; g:r:b
;point42: .byte 3 ; g:r:b
;point43: .byte 3 ; g:r:b
;point44: .byte 3 ; g:r:b
;point45: .byte 3 ; g:r:b
;point46: .byte 3 ; g:r:b
;point47: .byte 3 ; g:r:b
;point48: .byte 3 ; g:r:b
;point49: .byte 3 ; g:r:b
;point50: .byte 3 ; g:r:b
;point51: .byte 3 ; g:r:b
;point52: .byte 3 ; g:r:b
;point53: .byte 3 ; g:r:b
;point54: .byte 3 ; g:r:b
;point55: .byte 3 ; g:r:b
;point56: .byte 3 ; g:r:b
;point57: .byte 3 ; g:r:b
;point58: .byte 3 ; g:r:b
;point59: .byte 3 ; g:r:b
;
;----------
.cseg
bptr0:
nop
.org (bptr0 + (256 - (bptr0 & 0x00FF)))
slot0:
; 6/14 (6-4=2 посему роль остатка выполняет CBI)
cbi port_out,out_line ; 2 цикла
nop
nop
nop
nop
nop
nop
nop
nop
nop
ret ; 4 цикла
.org (slot0+16)
slot1:
nop ; 13/7 (13-4=9)
nop
nop
nop
nop
nop
nop
cbi port_out,out_line ; 2 цикла
nop
nop
ret ; 4 цикла
;.org 0x0060
.org (slot1+16)
xslot0:
; 6/14 (6-5=1 посему роль остатка выполняет CBI с избытком в 1 nop)
cbi port_out,out_line ; 2 цикла
cbr zl,(1<<6) ; модификация указателя 1 цикл
nop
nop
nop
nop
nop
nop ; -2 цикла на ld tmp0,x+
dec tmp1 ; 1 цикл
brbs SREG_Z,ends_trd ; 1 цикл при неисполнении (в цикле)
rjmp trasstt ; 2 цикла
.org (xslot0+16)
xslot1:
nop ; 13/7 (13-5=8)
cbr zl,(1<<6) ; модификация указателя 1 цикл
nop
nop
nop
nop
nop
cbi port_out,out_line ; 2 цикла
; -2 цикла на ld tmp0,x+
dec tmp1 ; 1 цикл
brbs SREG_Z,ends_trd ; 1 цикл при неисполнении (в цикле)
rjmp trasstt ; 2 цикла
;
ends_trd:
pop tmp0
pop tmp1
pop xl
pop xh
pop zl
pop zh ; восстановить рабочую область из стека
ret
;----------
;
; предварительно:
; линия out_line настроена на вывод
; исходный уровень out_line =0
; указатель стека усатновлен на RAMEND
; массив данных (bufout:bufout_size) предварительно загружен
; флаг готовности массива данных установлен
;
mass_trm:
push zh
push zl
push xh
push xl
push tmp1
push tmp0 ; храним рабочую область в стеке
res_line:
ldi tmp0,4
ser tmp1
cbi port_out,out_line
res_time:
dec tmp1
brne res_time
dec tmp0
brne res_time ; =>50uS time out
ldi xh,high (bufout)
ldi xl,low (bufout) ; загрузка начального адреса массива
; в указатель
ldi tmp1,bufout_size
ldiw z,slot0 ; адрес начала таблицы в указателе
;----------
trasstt:
ld tmp0,x+ ; 2 цикла
slot_0:
sbi port_out,out_line ; 2 цикла реально до установки 3 цикла
bst tmp0,7 ; 1 цикл
bld zl,4 ; 1 цикл
icall ; 3 цикла = 4 цикла от out_line=1
;----------
slot_1:
sbi port_out,out_line
bst tmp0,6 ; 1 цикл
bld zl,4 ; 1 цикл
icall ; 3 цикла
;----------
slot_2:
sbi port_out,out_line
bst tmp0,5 ; 1 цикл
bld zl,4 ; 1 цикл
icall ; 3 цикла
;----------
slot_3:
sbi port_out,out_line
bst tmp0,4 ; 1 цикл
bld zl,4 ; 1 цикл
icall ; 3 цикла
;----------
slot_4:
sbi port_out,out_line
bst tmp0,3 ; 1 цикл
bld zl,4 ; 1 цикл
icall ; 3 цикла
;----------
slot_5:
sbi port_out,out_line
bst tmp0,2 ; 1 цикл
bld zl,4 ; 1 цикл
icall ; 3 цикла
;----------
slot_6:
sbi port_out,out_line
bst tmp0,1 ; 1 цикл
bld zl,4 ; 1 цикл
icall ; 3 цикла
;----------
slot_7:
sbi port_out,out_line
;sbr zl,(1<<6) ; модификация указателя под завершающий фрагмент
sbr zl,(1<<5)
; 1 цикл
bst tmp0,0 ; 1 цикл
bld zl,4 ; 1 цикл
ijmp ; 3 цикла
;----------
bptr0:
nop
Пн мар 23, 2020 09:33:24
Пн мар 23, 2020 09:52:35
;
; trbspi_mb1.txt
;
; файл протокола приемопередатчика проекта UPGM
; для блока управления KOTUINO (PGX051)
; /master board/
;
;----------
;
; bus_dtr equ 2 ; шина данных/запроса доступа
; по reset вход с внешней подтяжкой к +5 вольт
; при запросе выход с активным уровнем 0
; при обмене соответственно или вход или выход
; с данными в прямом коде
; bus_clc equ 3 ; тактовый строб обмена данными
; по reset/cold init вход с внешней подтяжкой к +5 вольт
; при обмене соответственно вход(прием) или выход(передача)
; активный уровень 0
; bus_qt equ 4 ; шина квитирования
; по reset/cold init вход с внешней подтяжкой к +5 вольт
; активный уровень 0
; вход для передатчика, выход для приемника
;
;----------
;
; модуль передачи
;
; .equ bits_ct = 8 ; константа для cntbit_t
; .define cntbit_t (rbt0+2) ; r2 rb0 счетчик бит
; .define cnt_tm (rbt0+3) ; r3 rb0 счетчик таймера заержки
; .define data_t (rbt0+7) ; r7 rb0 байт буфера данных
; data_key: .dbit 1 ; флаг типа данные/команда
; data_key=0 - байт с данными
; data_key=1 - байт с командой
;
;----------
;
; собственно передача data_key и байта данных
; перед вызовом программы данные должны быть загружены в
; data_t (r7)
; и установлен в соответствие флаг data_key
;(data_key=0 - байт с данными
; data_key=1 - байт с командой)
; программа использует регистровый банк 0
;
;
pspi_txd:
push cntbit_t
push cnt_tm ; копировать временно используемый ресурс в стек
orl P1,#(1<<bus_dtr || 1<<bus_clc || 1<<bus_qt) ; настройка порта
; за исключением at89s52 возможно потребуется настройка портов
; bus_dtr=bus_clc=bus_qt=ВХОД
tx_on:
mov r2,#bits_ct ; mov cntbit_t,#bits_ct
mov c,data_key
acall strob ; бит типа данных передан
data_tx:
xch a,r7
rrc a ; предсдвиг значения данных
xch a,r7
acall strob ; бит данных передан
djnz cntbit_t,data_tx
tx_off:
setb P1.bus_dtr ; страховое закрытие bus_dtr
; за исключением at89s52 возможно потребуется настройка портов
; шины bus_dtr=bus_clcbus_qt=ВХОД
; и bus_dtr=bus_clcbus_qt=1
pop cnt_tm
pop cntbit_t
ret
;----------
strob:
mov P1.bus_dtr,c ; выдать бит data_key на bus_dtr
acall time ; задержка установки данных
clr P1.bus_clc ; активируем запрос синхронизации
acall time ; задержка установки данных
tx_tp0:
mov a,P1 ; читаем входные линии Р1 в А
jb ACC.bus_qt,tx_tp0 ; ожидание ответа приемника (bus_qt=0)
setb P1.bus_clc ; деактивируем запрос синхронизации
acall time ; задержка установки данных
tx_tp1:
mov a,P1 ; читаем входные линии Р1 в А
jnb ACC.bus_qt,tx_tp1 ; ожидание ответа приемника (bus_qt=1)
acall time ; задержка установки данных
ret
;----------
time:
mov r3,#10 ; интервал ~40uS период = 0,00004*5= ~0,0002 бита/секунду
ttime:
nop ;
nop
djnz r3,ttime ; cnt_tm = R3
ret
;----------
;
;
;----------
;
; модуль приема
;
; не имеет защиты от превышения ожидания длительности строба
; сопровождения исходя из предположения, что обмен между модулями
; является основной частью программы в промежутках между исполнением
; команд
; т.е. допускается полный останов обмена
;
;
pspi_rxd:
push cntbit_t
push cnt_tm ; копировать временно используемый ресурс в стек
mov r2,#bits_ct ; загрузить счетчик бит cntbit_t =r2
orl P1,#(1<<bus_dtr || 1<<bus_clc || 1<<bus_qt) ; настройка порта
; за исключением at89s52 возможно потребуется настройка портов
; /bus_dtr=bus_clc=ВХОД, bus_qt=ВЫХОД/
; bus_dtr=bus_clc=bus_qt=ВХОД
; bus_dtr=bus_clc=bus_qt=1
rx_on:
acall strobinp
mov a,r7
rlc a
mov data_key,c
data_rx:
acall strobinp
djnz r2,data_rx
pop cnt_tm
pop cntbit_t ;
ret
;----------
strobinp:
mov a,P1
jb ACC.bus_clc,strobinp ; простой в ожидании
rx_tp0:
acall time ; задержка установки данных
mov a,P1
mov c,ACC.bus_dtr
xch a,r7 ; mov a,data_t
rrc a
xch a,r7
clr P1.bus_qt ; актвировать строб квитирования
acall time ; задержка установки данных
rx_tp1:
mov a,P1
jnb ACC.bus_clc,rx_tp1 ; ждем ответ передатчика
setb P1.bus_qt ; деактвировать строб квитирования
acall time ; задержка установки данных
ret
;----------
; по выходу
; в data_key значение в соответствии с принятым (0 или 1)
; в R7 (data_t) принятые данные в прямом коде прямой последовательности
;----------
;
; trbspi_sb1.txt
;
; файл протокола приемопередатчика проекта UPGM
; для блока подчиненной периферии(PAVR)
; /slave board/
;
;
;----------
;
; .equ bus_dtr = 0 ; шина данных/запроса доступа
; локализация в PORTA PAVR
; по reset вход с внешней подтяжкой к +5 вольт
; при запросе выход с активным уровнем 0
; при обмене соответственно или вход или выход
; с данными в прямом коде
; .equ bus_clc = 1 ; тактовый строб обмена данными
; локализация в PORTA PAVR
; по reset/cold init вход с внешней подтяжкой к +5 вольт
; при обмене соответственно вход(прием) или выход(передача)
; активный уровень 0
; .equ bus_qt = 0 ; шина квитирования
; локализация в PORTD PAVR
; по reset/cold init вход с внешней подтяжкой к +5 вольт
; активный уровень 0
; вход для передатчика, выход для приемника
;
;----------
;
; .def data_t = r11 ; регистр (урезан) данные данных trbspi_sb
;
;----------
;
; данные флаги размещены в регистре РСФ GPIOR0
; или по псевдониму доступа через ОЗУ (GPIOR0+0x20)
;
; .equ data_key = 0 ; (GPIOR0) флаг типа данные/команда
; data_key=0 - байт с данными
; data_key=1 - байт с командой
;
;
;
;----------
;
; тактовая частота системного генератора 8МГц
;
;----------
;
; настройки портов относительно PSPI
;
; исходно по reset
; DDRA=00000000
; PORTA=00000000
; входы с Z-состоянием
; DDRB=00000000
; POTTB=00000000
; входы с Z-состоянием
; DDRD=00000000
; POTTD=00000000
; входы с Z-состоянием
; В init проводим отключение подтягивающих резисторов
; MCUCR.PUD=1
; и устанавливаем PORTD.ptr_clc = 0 DDRD.ptr_clc = ВЫХОД (1)
;
;----------
;
; модуль передачи
;
; собственно передача data_key и байта данных
; перед вызовом программы
; данные должны быть загружены в
; data_t (r11)
; и установлен в соответствие флаг data_key
;(data_key=0 - байт с данными
; data_key=0 - байт с командой)
;
;
pspi_txd:
push tmp0 ; служебный буфер-времянка
push tmp1 ; счетчик бит
push tmp2 ; счетчик таймера интервалов
cbi DDRA,bus_dtr
cbi DDRA,bus_clc
cbi DDRD,bus_qt ; предварительно настроено
; bus_dtr=bus_clc=bus_qt=ВХОД (через внешнюю
; подтяжку = 1)
cbi PORTA,bus_dtr ; подготовлено к выдаче bus_dtr=0
; вывод bus_dtr=1
cbi PORTA,bus_clc ; подготовлено к выдаче bus_clc=0
; вывод bus_clc=1
cbi PORTD,bus_qt ; подготовлено к выдаче bus_qt=0
; вывод bus_qt=1
tx_on:
ldi tmp1,8 ; счетчик бит загружен
in tmp0,GPIOR0 ; читаем флаг data_key
rcall strob ; бит типа данных передан
data_tx:
mov tmp0,data_t
rcall strob ; бит данных передан
lsr tmp0 ; постсдвиг значения данных
mov data_t,tmp0 ; используется вывод данных из tmp0.0
dec tmp1
brne data_tx
tx_off:
pop tmp2
pop tmp1
pop tmp0
ret
;----------
strob:
sbrs tmp0,0
sbi DDRA,bus_dtr ; if tmp0,0=0 --> вывод bus_dtr=0
sbrc tmp0,0
cbi DDRA,bus_dtr ; if tmp0,0=1 --> вывод bus_dtr=1
; вывод в соответствии нулевого бита из tmp0,0
; на PORTA,bus_dtr
rcall time ; задержка установки данных
sbi DDRA,bus_clc ; активируем запрос синхронизации
; ранее в PORTA.bus_clc установлен 0
rcall time ; задержка установки данных
tx_tp0:
sbic PIND,bus_qt
rjmp tx_tp0 ; ожидание ответа приемника (bus_qt=0)
cbi DDRA,bus_clc ; деактивируем запрос синхронизации
; bus_clc=ВХОД
; единица на bus_clc формируется за счет внешнего
; подтягивающего резистора
cbi DDRA,bus_dtr ; вывод bus_dtr=1
; разворот шины данных на ВХОД
rcall time ; задержка установки данных
tx_tp1:
sbis PIND,bus_qt
rjmp tx_tp1 ; ожидание ответа приемника (bus_qt=1)
rcall time ; задержка установки данных
ret
;----------
time:
ldi tmp2,10 ; интервал ~40uS период = 0,00004*5= ~0,0002 бита/секунду
ttime:
nop ;
dec tmp2
brne ttime
ret
;----------
;
;
;----------
;
; модуль приема
;
; не имеет защиты от превышения ожидания длительности строба
; сопровождения исходя из предположения, что обмен между модулями
; является основной частью программы в промежутках между исполнением
; команд
; т.е. допускается полный останов обмена
;
; при выходе
;
; в data_t принятые данные в прямом коде
; флаг GPIOR0.data_key=1 принята команда
; флаг GPIOR0.data_key=0 приняты данные
;
;
pspi_rxd:
push tmp0 ; буфер обмена
push tmp1 ; счетчик бит
push tmp2 ; счетчик таймера интервалов
cbi DDRA,bus_dtr
cbi DDRA,bus_clc
cbi DDRD,bus_qt ; предварительно настроено на
; шины bus_dtr=bus_clc=bus_qt=ВХОД, bus_dtr=bus_clc=bus_qt1=1
cbi PORTA,bus_dtr ; подготовлено к выдаче bus_dtr=0
; вывод bus_dtr=1
cbi PORTA,bus_clc ; подготовлено к выдаче bus_clc=0
; вывод bus_clc=1
cbi PORTD,bus_qt ; подготовлено к выдаче bus_qt=0
; вывод bus_qt=1
rx_on:
rcall strobinp ; флаг типа данных получен
sbrs tmp0,7
cbi GPIOR0,data_key
sbrc tmp0,7
sbi GPIOR0,data_key ; флаг типа данных размещен
ldi tmp1,8 ; загрузить счетчик бит
data_rx:
rcall strobinp ; текущий бит данных получен
dec tmp1
brne data_rx
mov data_t,tmp0 ; данные переданы в data_t
pop tmp2
pop tmp1
pop tmp0
ret
;----------
strobinp:
sbic PINA,bus_clc ; простой в ожидании PORTA.bus_clc=0
; ***!!! выполняется БЕЗ ОГРАНИЧЕНИЯ НА ВРЕМЯ ОЖИДАНИЯ !!!***
rjmp strobinp
rcall time ; задержка установки данных
sbis PINA,bus_dtr
clc
sbic PINA,bus_dtr
sec
ror tmp0 ; заносим значение текущего PINA.bus_dtr в старший бит tmp0
sbi DDRD,bus_qt ; актвировать строб квитирования
; bus_qt=ВЫХОД с предварительно заданным
; (cbi PORTD,bus_qt) значением =0
rcall time ; задержка установки данных
rx_tp1:
sbis PINA,bus_clc ; простой в ожидании PORTA.bus_clc=1
; ***!!! выполняется БЕЗ ОГРАНИЧЕНИЯ НА ВРЕМЯ ОЖИДАНИЯ !!!***
rjmp rx_tp1
cbi DDRD,bus_qt ; деактвировать строб квитирования
; bus_qt=ВХОД, единица устанавливается за счет внешнего
; подтягивающего резистора
rcall time ; задержка установки данных
ret
;
;----------
;
Пн мар 23, 2020 10:10:01
Пн мар 23, 2020 10:19:08
Пн мар 23, 2020 11:18:30
Пн мар 23, 2020 14:08:15
Пн мар 23, 2020 14:41:30
Аппаратные модули и для более соответствующих их назначению задач пригодятся.
Особой надобности в таком решении для того, что и "дрыголап" выполняет как-то ЖАБОДАВНО применять.
Пн мар 23, 2020 14:43:22
Пн мар 23, 2020 14:45:31
Пн мар 23, 2020 15:12:22
Пн мар 23, 2020 15:20:37
Пн мар 23, 2020 15:23:24