Вт сен 06, 2016 16:46:13
Вт сен 06, 2016 17:22:47
roman.com писал(а):-измерил датчик 1
-обработал данные
-закинул в SPI... SPI автоматом передает. А я измеряю следующие датчики...
...
-измерил датчик N
-обработал данные
-закинул в SPI... SPI автоматом передает. А я измеряю следующие датчики...
Вт сен 06, 2016 17:59:14
Ср сен 07, 2016 04:33:45
Alkul писал(а):То есть, если у Вас 10 одинаковых датчиков, Вы линейно 10 раз повторите кодroman.com писал(а):Нет, в цикле.
roman.com писал(а):Ну и нафига эта мне головная боль с подпрограммами при линейном алгоритме?
Ср сен 07, 2016 10:25:51
Alkul писал(а):Тогда у Вас проблемы с терминологией.
vit007 писал(а):Значит аппаратный SPI работает параллельно программе, может поэтому и надо ждать появления флаг, а то как понять когда собирать данный со слейва...
Alkul писал(а):То есть, если у Вас 10 одинаковых датчиков, Вы линейно 10 раз повторите код опроса датчика, код обработки данных и код передачи по SPI?
Ср сен 07, 2016 18:27:11
roman.com писал(а):Т.е. я так понял Вы меня спросили: буду ли я использовать в своей программе линейный алгоритм? Я Вам ответил - нет. Если мне нужно будет измерить 10 датчиков и отправить 10 байт на индикатор, то я для этого использую цикл.
roman.com писал(а):А если у меня простой линейный алгоритм? Например есть куча датчиков, их надо вывести на экран...
roman.com писал(а):А Вы, как я понял, для того что бы измерить 10 датчиков и отправить 10 байт на индикатор, предлагаете использовать подпрограмму ?))
предлагаете использовать подпрограмму ?
;Подпрограмма, выполняющая однократный опрос термодатчика и занесение полученных значений температуры
;в память (переменные DS1L:DS1H)
TERMO_READ:
rcall DS1RESET ;Сброс термодатчика
brtc TERMO_R1 ;Если бит T сброшен (нет ошибки датчика), то перейти на TERMO_R1
rjmp TERMOERR ;Ошибка термодатчика, индицировать символы ошибки и отключить нагрев
TERMO_R1:
ldi BYTEDS,$CC ;Код команды обращения к датчику без указания его 64-битного адреса
rcall DS1WRITE ;Занести команду в термодатчик
ldi BYTEDS,$BE ;Код команды чтения 9 байт из памяти датчика
rcall DS1WRITE ;Занести команду в термодатчик
clr R16 ;Обнулить ячейку, хранящую значение CRC
sts CRC8,R16 ;перед расчетом CRC для принятого пакета байт
rcall DS1READ ;Прочитать нулевой байт из памяти термодатчика (Temperature LSB)
rcall CRC_8 ;Вычислить CRC для нулевого байта
sts DS1L,BYTEDS ;Занести прочитанный младший байт температуры в ячейку DS1L
rcall DS1READ ;Прочитать первый байт из памяти термодатчика (Temperature MSB)
rcall CRC_8 ;Вычислить CRC для первого байта
sts DS1H,BYTEDS ;Занести прочитанный старший байт температуры в ячейку DS1H
ldi R16,0x07 ;Организовать цикл для чтения оставшихся семи байт памяти термодатчика
mov R14,R16 ;
TERMO_R2: rcall DS1READ ;Прочитать байт из памяти термодатчика
rcall CRC_8 ;Вычислить CRC для прочитанного байта
dec R14 ;Декремент счетчика прочитанных байт
brne TERMO_R2 ;Если прочитаны не все байты, вернуться на метку TERMO_R2
mov R16,STAT2 ;Загрузить в рег.R16 значение байта STAT2
andi R16,~((1<<TIMEDS)|(1<<DSCONV)|(1<<DSREAD)) ;Так как опрос термодатчика выполнен,
;сбросить все биты, относящиеся к измерению температуры
mov STAT2,R16 ;Сохранить в памяти новое значение байта STAT2
lds R16,CRC8 ;Занести в рег.R16 рассчитанную для 9-ти байтного пакета CRC
tst R16 ;Если пакет принят корректно, то расчет CRC для байта CRC должен дать нуль
brne TERMOERR ;Если результат расчета не нуль, то пакет принят с ошибкой, перейти на метку TERMOERR
rcall TEMPSYMB ;Иначе пакет принят корректно, вызвать подпрограмму, проверяющую необходимость
;включения нагреватели и подготавливающую значения для индикации температуры
ret ;
;Подпрограмма формирования RESET для интерфейса 1-Wire и чтения ответа датчика PRESENCE PULSE
;Если термодатчик не ответил, подпрограмма установит бит T
DS1RESET: cli ;Запретить прерывания для неразрывности формирования RESET
sbi DSDDR,DS1 ;Перевод вывода на передачу
cbi DSPORT,DS1 ;Сброс выхода в ноль, формирование Trstl
rcall DEL05MS ;Задержка 500 мкс
cbi DSDDR,DS1 ;Перевод вывода на прием
sbi DSPORT,DS1 ;и ожидание ответа датчика "Presence pulse"
rcall DEL10MK ;Задержка 10 мк
rcall DEL10MK ;Задержка 10 мк
ldi R24,$A0 ;Цикл для непрерывного чтения данных в течение 100 мкс
;если ответа нет, то ошибка
DS1RES_L: dec R24 ;
breq DS1RES_ERR ;Если цикл непрерывного чтения завершен, то ошибка
sbic DSPIN,DS1 ;Проверка состояния на шине данных от термодатчика
rjmp DS1RES_L ;если 1, то ответа датчика пока нет, возврат на ожидание
clt ;Иначе на линии 0, ответ датчика получен, сбросить бит Т
rcall DEL05MS ;Задержка 500 мкс
bld STATUS,DSFAIL_ST ;Сбросить бит DSFAIL_STв байте STATUS, т.к. термодатчик исправен
DS1RES_1: sei ;Неразрывный процесс окончен, разрешить прерывания
ret ;
DS1RES_ERR:
set ;Термодатчик не ответил, установить бит Т
bld STATUS,DSFAIL_ST ;Установить бит DSFAIL_STв байте STATUS, т.к. термодатчик неисправен
rjmp DS1RES_1 ;Переход для разрешения прерываний и завершения подпрограммы
;Подпрограмма чтения одного байта данных для интерфейса 1-Wire, результат возвращается в регистре BYTEDS
DS1READ: cli ;Запретить прерывания для неразрывности цикла чтения байта
ldi R24,8 ;В рег.R24 счетчик принятых бит
DS1READ2: cbi DSPORT,DS1 ;Сброс выхода в 0, формирование Trdv
sbi DSDDR,DS1 ;Переключение вывода на передачу
rcall DEL2MK7 ;Задержка 2,7мкс
cbi DSDDR,DS1 ;Переключение вывода на приём
sbi DSPORT,DS1 ;Резистор подтяжки линии к питанию включен
rcall DEL10MK ;Задержка 10мкс
clc ;Сбросить бит С перед проверкой состояния линии
sbic DSPIN,DS1 ;Если на линии лог.0, то пропустить следующую команду
DS1BIN: sec ;Иначе на линии лог.1, установить бит С
ror BYTEDS ;Сдвинуть бит С в регистр результата
DS1DELAY: rcall DEL60MK ;Задержка 60мкс
dec R24 ;Декремент счетчика принятых бит
brne DS1READ2 ;Если счетчик принятых бит не равен 0, то возврат для приёма следующего бита
rjmp DS1RES_1 ;Иначе байт принят, переход для разрешения прерываний и завершения подпрограммы
;Подпрограмма записи одного байта данных для интерфейса 1-Wire, байт для отправки должен находится в BYTEDS
DS1WRITE: cli ;Запретить прерывания для неразрывности цикла записи байта
ldi R24,8 ;В рег.R24 счетчик отправленных бит
DS1COMP: cbi DSPORT,DS1 ;Сброс выхода в ноль, формирование Tlow1
sbi DSDDR,DS1 ;Переключение выхода на передачу
rcall DEL2MK7 ;Задержка 2,7мкс
ror BYTEDS ;Отправка байта происходит младшим битом вперед
brcc DS1WR0 ;Проверка бита С на 0. Если бит С равен нулю, отправляемый бит - нуль,
;переход на DS1WR0
sbi DSPORT,DS1 ;Иначе отправляемый бит - единица
DS1WR0: rcall DEL60MK ;Задержка 60мкс
sbi DSPORT,DS1 ;Установка строгой "1" на 2 мкс
rcall DEL2MK7 ;Задержка 2,7мкс
dec R24 ;Декремент счетчика отправленных бит
brne DS1COMP ;Если отправлены не все биты, вернуться на DS1COMP
cbi DSDDR,DS1 ;Иначе все биты переданы,линию данных - в состояние входа, резистор подтяжки
;обеспечит лог.1 на линии данных
rjmp DS1RES_1 ;Переход для разрешения прерываний и завершения подпрограммы
Чт сен 08, 2016 00:22:17
vit007 писал(а):Значит аппаратный SPI работает параллельно программе?
vit007 писал(а):это правда, что предмет плохо знаю...
Пожалуйста)) Вообщем с SPI интерфейсом разобрались... переходим на следующий этап))vit007 писал(а):Всем спасибо, за участие... много интересного узнал... следующий этап - реализация в железе, но это другая история...
Ср окт 24, 2018 19:58:46
;загоняем биты в 74hc595
out SPDR, ShiftRegister4 ; передаём байт для 4-го 74hc595
Wait_SPI_Tranfer4: ;ожидание передачи байта
in temp, SPSR
sbrs temp, SPIF ;если флаг завершения передачи установлен,
rjmp Wait_SPI_Tranfer4 ;то пропускаем эту команду
out SPDR, ShiftRegister3 ; передаём байт для 3-го 74hc595
Wait_SPI_Tranfer3: ;ожидание передачи байта
in temp, SPSR
sbrs temp, SPIF ;если флаг завершения передачи установлен,
rjmp Wait_SPI_Tranfer3 ;то пропускаем эту команду
out SPDR, ShiftRegister2 ; передаём байт для 2-го 74hc595
Wait_SPI_Tranfer2: ;ожидание передачи байта
in temp, SPSR
sbrs temp, SPIF ;если флаг завершения передачи установлен,
rjmp Wait_SPI_Tranfer2 ;то пропускаем эту команду
out SPDR, ShiftRegister1 ; передаём байт для 1-го 74hc595
Wait_SPI_Tranfer1: ;ожидание передачи байта
in temp, SPSR
sbrs temp, SPIF ;если флаг завершения передачи установлен,
rjmp Wait_SPI_Tranfer1 ;то пропускаем эту команду
Пн ноя 20, 2023 15:17:39