Пт янв 02, 2015 21:24:40
Пт янв 02, 2015 21:43:08
Пт янв 02, 2015 21:44:16
Пт янв 02, 2015 21:50:37
Пт янв 02, 2015 21:55:18
Пт янв 02, 2015 22:01:59
Пт янв 02, 2015 22:25:16
Пт янв 02, 2015 23:12:36
Сб янв 03, 2015 05:51:16
Сб янв 03, 2015 05:51:59
D.i.M.K.i.N. писал(а):Разобрался.
Обнова не проходит, если открыт проект.
Сб янв 03, 2015 05:54:26
Сб янв 03, 2015 18:52:36
Вт янв 06, 2015 17:44:50
Вт янв 06, 2015 22:57:52
Ср янв 07, 2015 05:29:26
xkp писал(а):1. может есть смысл задуматься над универсальным генератором? а в его настройках уже делать что надо... пилу, синус, прямоугольник.
2. можно как то сделать что бы обязательные блоки, необходимые для других блоков, вносились в проект автоматически. например, береш блок "генератор" и автоматически в проекте появляется блок "счетчик миллисекунд".
#ifndef _FBD48_
#define _FBD48_ FBD48
#message define FBD48 generator pila
;Размер FBD блока
;1 байт -вход //In
;2 байта - время прирощения //параметры блока
;2 байта - минимальное значение //параметры блока
;2 байта - максимальное значение //параметры блока
;1 байт -выход //Out
;Оперативная память:
; 2 байта - текущее значение
; 2 байта - отсечка времени
FBD48_run:
ld Uz3L, X+ ;текущее значение Lw
ld Uz3H, X+ ;текущее значение Hw
ld Uz1L, X+ ;отсечка времени Lw
ld Uz1H, X+ ;отсечка времени Hw
sbiw XL, 4 ;Возвращаем указатель
rcall Read_cfg_Load_Uz2 ;вход
rcall Read_cfg ;время прирощения Lw
mov A, Addr_Data ;время прирощения Lw
rcall Read_cfg ;время прирощения Hg
mov B, Addr_Data ;время прирощения Hg
rcall Read_cfg ;минимальное значение Lw
mov C, Addr_Data ;минимальное значение Lw
rcall Read_cfg ;минимальное значение Hg
mov D, Addr_Data ;минимальное значение Hg
rcall Read_cfg ;максимальное значение Lw
mov E, Addr_Data ;максимальное значение Lw
rcall Read_cfg ;максимальное значение Hg
mov F, Addr_Data ;максимальное значение Hg
//***************** Отслеживаем сигнал **********************
sbrs Uz2L, 0 //Проверка состояния входа
rjmp FBD48_clear
rcall Timer_Diff //Вычисляем разницу времени
cp ZL, A //Сраниваем
cpc ZH, B //Сраниваем
brmi FBD46_end
//******************** Увеличение +1 ***********************
add Uz3L, One //Uzl3=Uz3+1
adc Uz3H, Zero //Uzl3=Uz3+1
//********** Сравниваем с максимальным **********************
cp E, Uz3L //Сраниваем максимальное значением
cpc F, Uz3H //Сраниваем максимальное значением
brpl FBD48_cutoff_time
FBD48_clear:
lds Uz3L, C //Минимальное состояние
lds Uz3H, D //Минимальное состояние
FBD48_cutoff_time:
lds Uz1L, TimerCounter0_DATA_RAM+1 //Отсечка времени
lds Uz1H, TimerCounter0_DATA_RAM+2 //Отсечка времени
FBD46_end:
st X+, Uz3L //сохраняем
st X+, Uz3H //сохраняем
st X+, Uz1L //сохраняем
st X+, Uz1H //сохраняем
rcall Read_cfg_Save_Uz3 //выводим состояние
ret
FBD48:
.db 8, 4 //Размер FBD блока, необходимая оперативная память
.dw FBD48_run, Init_default
#else
#error redeclared FBD48 __FILE__
#endif
Ср янв 28, 2015 10:42:26
Чт янв 29, 2015 10:18:06
Чт янв 29, 2015 11:21:49
Чт янв 29, 2015 16:21:34
Мурик писал(а):Посмотрел видео....
Данная задача решается элементарно через сдвиг и получится не только более быстрый и компактный код, но еще и намного нагляднее!
Чт янв 29, 2015 16:26:09
ARV писал(а):Система все более и более приближается к классической FBD системе, используемой в ПЛК.
я бы рекомендовал вместо генераторов пилы и т.п. наворотов использовать блоки типа "запускаемый/автономный/перезапускаемый таймер" или "одновибратор".