Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Вопросы начинающих

Вопросы начинающих Прежде чем задать вопрос, стоит воспользоваться поиском

Ответ
 
Опции темы Опции просмотра
Старый 20.10.2014, 15:01   #1
RADJA84
Junior Member
 
Регистрация: 13.10.2014
Возраст: 35
Сообщений: 19
Вес репутации: 100/19
RADJA84 will become famous soon enoughRADJA84 will become famous soon enough
По умолчанию вкл/откл. TMR0

Здравствуйте, уважаемые знатоки МК!
Я только-только начинаю осваивать МК, причем начал с нашего отечественного 1886ВЕ6-аналог PIC17. Пока освоил только ассемблер, немного. А вопрос у меня вот какой:
На МК в любой момент времени могут прийти любые три сигнала. Может прийти один, может сразу два, а могут и все вместе.
Мне нужно организовать задержку этих сигналов, ну скажем 10 сек.

Для таймера 1 и 2 существуют биты включения/отключения, а вот для TMR0 я такого бита не найду?
Так вот как мне включить TMR0?

Могу ли я просто настроить TMR0 на 10 сек., а при наступлении события обнулить TMR0 и разрешить прерывание по его переполнению?
RADJA84 вне форума   Ответить с цитированием
Старый 20.10.2014, 15:04   #2
ampersant
Senior Member
 
Аватар для ampersant
 
Регистрация: 26.02.2008
Адрес: IgorV
Сообщений: 2,498
Вес репутации: 4829/114
ampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond repute
По умолчанию Re: вкл/откл. TMR0

Цитата:
Сообщение от RADJA84 Посмотреть сообщение
Здравствуйте, уважаемые знатоки МК!
Я только-только начинаю осваивать МК, причем начал с нашего отечественного 1886ВЕ6-аналог PIC17. Пока освоил только ассемблер, немного. А вопрос у меня вот какой:
На МК в любой момент времени могут прийти любые три сигнала. Может прийти один, может сразу два, а могут и все вместе.
Мне нужно организовать задержку этих сигналов, ну скажем 10 сек.

Для таймера 1 и 2 существуют биты включения/отключения, а вот для TMR0 я такого бита не найду?
Так вот как мне включить TMR0?

Могу ли я просто настроить TMR0 на 10 сек., а при наступлении события обнулить TMR0 и разрешить прерывание по его переполнению?
с какой точностью необходимо делать задержку?
ampersant вне форума   Ответить с цитированием
Старый 20.10.2014, 15:29   #3
RADJA84
Junior Member
 
Регистрация: 13.10.2014
Возраст: 35
Сообщений: 19
Вес репутации: 100/19
RADJA84 will become famous soon enoughRADJA84 will become famous soon enough
По умолчанию Re: вкл/откл. TMR0

Точность не очень важна. но не хуже процентов 5%. 0,3-0,5 сек
RADJA84 вне форума   Ответить с цитированием
Старый 20.10.2014, 15:34   #4
ampersant
Senior Member
 
Аватар для ampersant
 
Регистрация: 26.02.2008
Адрес: IgorV
Сообщений: 2,498
Вес репутации: 4829/114
ampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond repute
По умолчанию Re: вкл/откл. TMR0

Цитата:
Сообщение от RADJA84 Посмотреть сообщение
Точность не очень важна. но не хуже процентов 5%. 0,3-0,5 сек
таймер не требуется останавливать, необходимо создать 1 ТИК времени, равный дроби от необходимой точности. и считать эти тики.

Например выберем 1тик=10мс. Остается только посчитать 10 сек / 10мс =1000 тиков
Таймер же нужен для организации часов - генерации этих тиков таков.
ampersant вне форума   Ответить с цитированием
Старый 20.10.2014, 16:10   #5
Guaho
Senior Member
 
Аватар для Guaho
 
Регистрация: 28.06.2013
Возраст: 47
Сообщений: 725
Вес репутации: 1505/45
Guaho has a brilliant futureGuaho has a brilliant futureGuaho has a brilliant futureGuaho has a brilliant futureGuaho has a brilliant futureGuaho has a brilliant futureGuaho has a brilliant futureGuaho has a brilliant futureGuaho has a brilliant futureGuaho has a brilliant futureGuaho has a brilliant future
По умолчанию Re: вкл/откл. TMR0

Именно так, достаточно одного таймера для отсчёта трёх независимых задержек. Если происходит некое событие, которое Вы отслеживаете, устанавливайте флаг этого события, а далее в обработчике "таймерных" прерываний модифицируете счётчики (для которых установлен флаг возникновения события). Всё просто.
Guaho вне форума   Ответить с цитированием
Старый 20.10.2014, 16:15   #6
RADJA84
Junior Member
 
Регистрация: 13.10.2014
Возраст: 35
Сообщений: 19
Вес репутации: 100/19
RADJA84 will become famous soon enoughRADJA84 will become famous soon enough
По умолчанию Re: вкл/откл. TMR0

Да, но как я буду постоянно опрашивать порты и считать параллельно тики?
Просто я, наверно, не понимаю алгоритма! Я думал сделать вот как:
1. Опрашивать постоянно три вывода, на которые приходят сигналы.
2 После прихода какого-либо сигнала запускать один из трех таймеров, которые аппаратно будут считать, а МК дальше будет опрашивать выводы.
3. После переполнения таймера обработать прерывание.
Еще забыл указать важную вещь! Сигналы могут как приходить, так и сбрасываться во время отсчета.
RADJA84 вне форума   Ответить с цитированием
Старый 20.10.2014, 17:19   #7
Guaho
Senior Member
 
Аватар для Guaho
 
Регистрация: 28.06.2013
Возраст: 47
Сообщений: 725
Вес репутации: 1505/45
Guaho has a brilliant futureGuaho has a brilliant futureGuaho has a brilliant futureGuaho has a brilliant futureGuaho has a brilliant futureGuaho has a brilliant futureGuaho has a brilliant futureGuaho has a brilliant futureGuaho has a brilliant futureGuaho has a brilliant futureGuaho has a brilliant future
По умолчанию Re: вкл/откл. TMR0

Сигналы вешаете на линии прерываний контроллера. В PIC-контроллерах, к примеру, есть входы, в случае изменения которых возникает прерывание (причём некоторые реагируют на оба фронта, а некоторые - только на заданный фронт). Я бы на Вашем месте сделал так:
1) Внешние сигналы цепляем на линии прерываний.
2) Если возникло такое "событийное" прерывание, устанавливаем флаг прихода сигнала.
3) Таймер работает всегда, по переполнению - прерывание.
4) В обработчике "таймерного" проверяется каждый из 3-х флагов "внешних событий", и, если какой-либо флаг установлен, модифицируем соответствующий счётчик (удобно считать назад). Как только он обнулился, устанавливаете флаг окончания задержки этого счётчика.
5) В основном цикле программы Вы сможете при необходимости наблюдать флаги событий и флаги окончания задержек.
6) Не забывайте в нужные моменты делать инициализацию счётчиков: при старте программы - начальную, и текущую - после обнуления какого-либо счётчика задержки (это тоже всё в прерываниях делаете).
7) Что делать с событием "уход сигнала", не подскажу, т.к. не до конца понятна требуемая логика работы устройства.
Guaho вне форума   Ответить с цитированием
Старый 20.10.2014, 17:51   #8
Забазан-зан-зан
Banned
 
Регистрация: 04.10.2014
Сообщений: 97
Вес репутации: -114/0
Забазан-зан-зан is infamous around these partsЗабазан-зан-зан is infamous around these parts
По умолчанию Re: вкл/откл. TMR0

TMR0 не отключается и считает постоянно. По крайней мере, в PIC-ах, а не в аналогах.
Есть логическое (не физическое)
отключение TMR0 - запрет прерывания от TMR0. Бит T0IE. Когда нет необходимости отсчитывать интервал, прерывание от таймера нужно запретить.

Задержка на 10 с напрямую с помощью любого таймера невозможна (по крайней мере, при работе МК от кварца в МГц. но МК может работать на любой внешней частоте от 0 до мак.предела). По переполнению любого таймера можно инкрементировать счетчики на регистрах и проверять их на достижение заданного значения.

Одновременный опрос портов и опрос счетных регистров делается запросто. Рабочий цикл содержит последовательно эти операции и повторяет их по кругу. Вот так:

___ начало цикла ______
- опрос состояния портов
- проверка значений в счетных регистрах, выполнение операции, если достиг заданного значения
___ конец цикла _______

Цитата:
Сообщение от RADJA84 Посмотреть сообщение
Сигналы могут как приходить, так и сбрасываться во время отсчета.
Как это - "сбрасываться"?? Куда сбрасываться?

Последний раз редактировалось Забазан-зан-зан; 20.10.2014 в 18:01.
Забазан-зан-зан вне форума   Ответить с цитированием
Старый 20.10.2014, 18:02   #9
ampersant
Senior Member
 
Аватар для ampersant
 
Регистрация: 26.02.2008
Адрес: IgorV
Сообщений: 2,498
Вес репутации: 4829/114
ampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond repute
По умолчанию Re: вкл/откл. TMR0

Цитата:
Сообщение от RADJA84 Посмотреть сообщение
Да, но как я буду постоянно опрашивать порты и считать параллельно тики?
Просто я, наверно, не понимаю алгоритма! Я думал сделать вот как:
1. Опрашивать постоянно три вывода, на которые приходят сигналы.
2 После прихода какого-либо сигнала запускать один из трех таймеров, которые аппаратно будут считать, а МК дальше будет опрашивать выводы.
3. После переполнения таймера обработать прерывание.
Еще забыл указать важную вещь! Сигналы могут как приходить, так и сбрасываться во время отсчета.
подбавленные данные немного изменяют идеологию.

Таймерные прерывания организуются раз в 0.25 сек.
Данные с ног валятся в кольцевой массив на 40 байт. Перед тем как класть новое значение надо старое (задержанное на 10 сек) выдать на выходные ноги. И сместить указатель в массиве.

Если входные ноги могут иметь дребезг, то перед выдачей на выход можно добавить мажоритарной логики.
ampersant вне форума   Ответить с цитированием
Старый 20.10.2014, 20:12   #10
ATAMAN
Senior Member
 
Регистрация: 09.01.2012
Возраст: 36
Сообщений: 443
Вес репутации: 373/35
ATAMAN is just really niceATAMAN is just really niceATAMAN is just really niceATAMAN is just really nice
По умолчанию Re: вкл/откл. TMR0

Опрашиваем PORTB. Сдвигаем на пять бит в право (что бы не реагировать на изменение других пяти битов порта B) и записываем в переменную port_b0.
Как только лог. уровень на одном из трёх битов RB5, RB6 и RB7 изменится то будет выполнено условие if а именно определение что переменная port_b1 не равна port_b0.
Далее состояние порта B ранее записанное в переменную port_b0 будет записана в переменную port_b1 и PORTD и соответственно изменится лог. уровень на одних из трёх битов порта D а именно только на RD0, RD1 и RD2.
При изменение остальных битов порта B RB0, RB1, RB2, RB3, RB4 биты порта D изменяться не будут.

Код:
unsigned short port_b0=0,port_b1=0;

void main() 
{
TRISD=0;
PORTD=0;
TRISB=0xFF;
PORTB=0;
OPTION_REG=0x7F;
while(1)
{
port_b0=(PORTB >> 5);
if(port_b1!=port_b0)
{
PORTD=port_b1=port_b0;
}
}
}
================================================== =======
Код:
_main:

;Код.c,3 :: 		void main()
;Код.c,5 :: 		TRISD=0;
	CLRF       TRISD+0
;Код.c,6 :: 		PORTD=0;
	CLRF       PORTD+0
;Код.c,7 :: 		TRISB=0xFF;
	MOVLW      255
	MOVWF      TRISB+0
;Код.c,8 :: 		PORTB=0;
	CLRF       PORTB+0
;Код.c,9 :: 		OPTION_REG=0x7F;
	MOVLW      127
	MOVWF      OPTION_REG+0
;Код.c,10 :: 		while(1)
L_main0:
;Код.c,12 :: 		port_b0=(PORTB >> 5);
	MOVLW      5
	MOVWF      R0+0
	MOVF       PORTB+0, 0
	MOVWF      R1+0
	MOVF       R0+0, 0
L__main3:
	BTFSC      STATUS+0, 2
	GOTO       L__main4
	RRF        R1+0, 1
	BCF        R1+0, 7
	ADDLW      255
	GOTO       L__main3
L__main4:
	MOVF       R1+0, 0
	MOVWF      _port_b0+0
;Код.c,13 :: 		if(port_b1!=port_b0)
	MOVF       _port_b1+0, 0
	XORWF      R1+0, 0
	BTFSC      STATUS+0, 2
	GOTO       L_main2
;Код.c,15 :: 		PORTD=port_b1=port_b0;
	MOVF       _port_b0+0, 0
	MOVWF      _port_b1+0
	MOVF       _port_b0+0, 0
	MOVWF      PORTD+0
;Код.c,16 :: 		}
L_main2:
;Код.c,17 :: 		}
	GOTO       L_main0
;Код.c,18 :: 		}
	GOTO       $+0
; end of _main
Нажмите на изображение для увеличения
Название: shem.jpg
Просмотров: 7
Размер:	379.8 Кб
ID:	8442
ATAMAN вне форума   Ответить с цитированием
Старый 20.10.2014, 20:42   #11
Забазан-зан-зан
Banned
 
Регистрация: 04.10.2014
Сообщений: 97
Вес репутации: -114/0
Забазан-зан-зан is infamous around these partsЗабазан-зан-зан is infamous around these parts
По умолчанию Re: вкл/откл. TMR0

Не надо ничего никуда сдвигать. Достаточно просто тестировать биты по нужным позициям или отсеивать логической and по маске. "Ненужные" и так трогаться не будут.

Автору - не ясно, что он понимает под словом "сигнал". Если "сингал" в его понятии - одиночный переход из 0 в 1 или из 1 в 0, который нужно повторить через 10 с, то это один вариант, а если "сигнал"
понимается как некая последовательность 1 и 0 в виде последовательного потока, который нужно передавать дальше с задержкой на 10 с, то можно воспользоваться UART-ом с количеством буферов, пропорциональным байтовой скорости приема данных и необходимой задержки. Если эти данные приходят по двум (или трем???) линиям, тогда UART программно-реализуемый (не аппаратный). Кста, сколько там в том МК аппаратных UART-ов то?
А сколько все-таки у автора параллельных сигнальных линий? В первом посте у него было их две, а дальше откуда-то уже выползает три "сигнала".
Как в анекдоте получается: "...Чукча, ты не умничай, ты пальцем покажи, куда мериканская подлодка пошла"

Вообще, автору на этапе освоения нужно ставить для себя более осязаемые, более конкретные и практичные задачи. Какая-нить клавиатурная матрица, динамическая индикация, связь двух МК по последовательным интерфейсам, передача данных.

Последний раз редактировалось Забазан-зан-зан; 20.10.2014 в 20:57.
Забазан-зан-зан вне форума   Ответить с цитированием
Старый 20.10.2014, 21:06   #12
ATAMAN
Senior Member
 
Регистрация: 09.01.2012
Возраст: 36
Сообщений: 443
Вес репутации: 373/35
ATAMAN is just really niceATAMAN is just really niceATAMAN is just really niceATAMAN is just really nice
По умолчанию Re: вкл/откл. TMR0

Код:
unsigned short port_b0=0,port_b1=0,port_b2=0,port_b3=0;

void main() 
{
TRISD=0;
PORTD=0;
TRISC=0;
PORTC=0;
TRISB=0xFF;
PORTB=0;
OPTION_REG=0x7F;
while(1)
{
port_b0=(PORTB >> 5);
port_b2=(PORTB << 3);
if(port_b1!=port_b0 || port_b3!=port_b2)
{
PORTD=port_b1=port_b0;
PORTC=port_b3=port_b2;
}
}
}
Таким способом можно передать отдельно три бита с порта B на порт D, а остальные пять на порт C.
ATAMAN вне форума   Ответить с цитированием
Старый 20.10.2014, 21:12   #13
ampersant
Senior Member
 
Аватар для ampersant
 
Регистрация: 26.02.2008
Адрес: IgorV
Сообщений: 2,498
Вес репутации: 4829/114
ampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond repute
По умолчанию Re: вкл/откл. TMR0

Цитата:
Сообщение от ATAMAN Посмотреть сообщение
Код:
unsigned short port_b0=0,port_b1=0,port_b2=0,port_b3=0;

void main() 
{
TRISD=0;
PORTD=0;
TRISC=0;
PORTC=0;
TRISB=0xFF;
PORTB=0;
OPTION_REG=0x7F;
while(1)
{
port_b0=(PORTB >> 5);
port_b2=(PORTB << 3);
if(port_b1!=port_b0 || port_b3!=port_b2)
{
PORTD=port_b1=port_b0;
PORTC=port_b3=port_b2;
}
}
}
Таким способом можно передать отдельно три бита с порта B на порт D, а остальные пять на порт C.
в контексте нет, нельзя!
ampersant вне форума   Ответить с цитированием
Старый 20.10.2014, 21:17   #14
Забазан-зан-зан
Banned
 
Регистрация: 04.10.2014
Сообщений: 97
Вес репутации: -114/0
Забазан-зан-зан is infamous around these partsЗабазан-зан-зан is infamous around these parts
По умолчанию Re: вкл/откл. TMR0

А зачем? Самое главное, это и близко не стоит с задачей топикстартера, хехехе.
К тому же, топикстартер едва ассемблер то понимает, а тут ему Си втюхивают.
Забазан-зан-зан вне форума   Ответить с цитированием
Старый 20.10.2014, 21:46   #15
ATAMAN
Senior Member
 
Регистрация: 09.01.2012
Возраст: 36
Сообщений: 443
Вес репутации: 373/35
ATAMAN is just really niceATAMAN is just really niceATAMAN is just really niceATAMAN is just really nice
По умолчанию Re: вкл/откл. TMR0

Цитата:
Сообщение от Забазан-зан-зан Посмотреть сообщение
А зачем? Самое главное, это и близко не стоит с задачей топикстартера, хехехе.
К тому же, топикстартер едва ассемблер то понимает, а тут ему Си втюхивают.
Цитата:
Сообщение от RADJA84 Посмотреть сообщение
1. Опрашивать постоянно три вывода, на которые приходят сигналы.
Как же не в тему вроде как в тему.
ATAMAN вне форума   Ответить с цитированием
Старый 20.10.2014, 22:11   #16
RADJA84
Junior Member
 
Регистрация: 13.10.2014
Возраст: 35
Сообщений: 19
Вес репутации: 100/19
RADJA84 will become famous soon enoughRADJA84 will become famous soon enough
По умолчанию Re: вкл/откл. TMR0

Воу-воу-воу! Господа знатоки, спасибо что помогаете в таком сложном деле как освоение МК, но чего-то мне стало совсем непонятно. Короче, постараюсь описать все подробно (к тому же добавилось еще пара условий, надеюсь последние).

Я хочу сделать пульт, который управляет тремя реле, через которые питаются три устройства.
На вход пульта от каждого из трех устройств приходит сигнал исправности. Устройство исправно - на входе 0В (лог. 0), неисправно - (+5)В (лог.1).
Сигналы приходят параллельно, каждый сигнал на свою ножку МК (никаких USART, SPI и т.п последовательных протоколов): signal_1 - PortB,2; signal_2 - PortB,3, signal_3 - PortB,4.
(новое условие) Так же на вход пульта приходят еще два сигнала - запрет отключения реле: Zapret_1 - PortB,0 и Zapret_2 - PortB,1.
Если Zapret_1 и Zapret_2 установлены в "1", то при приходе любого сигнала исправности (signal_*) в виде "1"ничего не происходит.
Если хотя бы один запрет не "1", то при приходе любого сигнала исправности (signal_*) в виде "1" через 10 сек. реле должно отключится.
Если во время отсчета сигнал исправности установится в "0", то реле не должно отключиться.
Вроде так должно быть понятнее. И еще. Я СИ НЕ ЗНАЮ!
RADJA84 вне форума   Ответить с цитированием
Старый 20.10.2014, 23:29   #17
tsb58
Senior Member
 
Аватар для tsb58
 
Регистрация: 04.11.2008
Адрес: Харьков
Сообщений: 365
Вес репутации: 1041/53
tsb58 has much to be proud oftsb58 has much to be proud oftsb58 has much to be proud oftsb58 has much to be proud oftsb58 has much to be proud oftsb58 has much to be proud oftsb58 has much to be proud oftsb58 has much to be proud of
По умолчанию Re: вкл/откл. TMR0

Цитата:
Сообщение от RADJA84 Посмотреть сообщение
...Вроде так должно быть понятнее.
В описанном алгоритме не хватает некоторых условий.
Цитата:
Сообщение от RADJA84 Посмотреть сообщение
Если Zapret_1 и Zapret_2 установлены в "1", то при приходе любого сигнала неисправности (signal_*) в виде "1" ничего не происходит.
А если какое-то из реле было уже выключено, а потом оба "запрета" устанавливаются в "1" - должно ли выключенное реле снова включиться?

Цитата:
Сообщение от RADJA84 Посмотреть сообщение
Если хотя бы один запрет не "1", то при приходе любого сигнала неисправности (signal_*) в виде "1" через 10 сек. реле должно отключится.
А если уже после выключения реле с этого канала придет сигнал "исправности"=0, должно ли это реле снова включиться? Если да, то сразу или с какой-то задержкой?
Цитата:
Сообщение от RADJA84 Посмотреть сообщение
Если во время отсчета сигнал исправности установится в "0", то реле не должно отключиться.
А должен ли при этом сброситься таймер задержки по этому каналу?
tsb58 вне форума   Ответить с цитированием
Старый 21.10.2014, 03:41   #18
Забазан-зан-зан
Banned
 
Регистрация: 04.10.2014
Сообщений: 97
Вес репутации: -114/0
Забазан-зан-зан is infamous around these partsЗабазан-зан-зан is infamous around these parts
По умолчанию Re: вкл/откл. TMR0

Хм. Обычно при сигналах неисправности производят немедленные действия и они ничем не запрещаются, иначе задержка аж на 10 с и запрет реакции на неисправность способны наломать дров...
Например, при увеличении выше порога вибрации какого-нибудь вращающегося механизма, его стараются как можно быстрее остановить, поскольку вибрация быстро разрушает крепление механизма, а запрет остановки вообще может привести к самоуничтожению механизма.

Кстати, глянув даташит на 17-ю серию, увидел, что таймер то 16-битный с 8-битным предделителем. Суммарный коэфф.деления - 16,8 млн. При частоте кварца 4 МГц это даст интервал времени до 16,8 с.
Но сейчас 17-я серия уже давно не выпускается и заменена на 18-ю.
Дашашит на 1886ВЕ6 - вообще какой-то жуткий и чисто по-русски неправильно составленный. Такими путями топикстартер потратит еще полгода на изучение и так ничего и не поймет.
Забазан-зан-зан вне форума   Ответить с цитированием
Старый 21.10.2014, 08:29   #19
Забазан-зан-зан
Banned
 
Регистрация: 04.10.2014
Сообщений: 97
Вес репутации: -114/0
Забазан-зан-зан is infamous around these partsЗабазан-зан-зан is infamous around these parts
По умолчанию Re: вкл/откл. TMR0

Немного подумал. На мой взгляд, наиболее оптимальным будет такое решение:
таймер считает постоянно интервалы по 10 с, а по приходу "1" с каждого контроллируемого входа "неисправности" будет записываться значение таймера на тот момент, а в следующем цикле счета таймера это значение сравнивается с регистами счета таймера, таймер достигнет того же значения, реле нужно отключить, подав на него "0", но предварительно прочитать состояние (1 или 0)по входам запрета и состояние по входу неисправности.

Таймер с предделителем настраивается так, чтобы постоянно отсчитывать заданный интервал времени - 10 с по кругу. При тактовой частоте МК 4 МГц и предделителе 1:256 инкремент (приращение на +1) таймера будет происходить каждые 256 мкс. Следовательно, за 10 с таймер досчитает до 39062 (39062,5 если точно, но половинку не учитываем). Для того, чтобы наступило переполнение таймера и вывесился флаг T0IF, не хватает 65536-39062=26747 отсчетов. Это и будет стартовое число, которое в каждом новом цикле счета будет записываться в регистры TMR0H и TMR0L. В 16-ричном виде это будут числа 0x68 и 0x7B.
При появлении на любом входе "неисправность" сигнала неисправности ("1"), текущее значение счетных регистров TMR0H и TMR0L переносится в пару регистров для каждой линии "неисправность". То есть, 3 пары регистров. На следующем круге счета таймера значение счетных регистров таймера постоянно сравниваются с этими тремя парами регистров, и если произошло равенство, то должен выдаваться соотвествующий сигнал на отключение реле, предварительно проверив состояние входов "запрет" и состояние входов "неисправность". Счет таймера и сравнение счетных регистров должно продолжаться и дальше, чтобы отреагировать на остальные сигналы "неисправность".
Если сигналов "неисправность" не поступает, то начальные состояния трех пар регистров не должны быть равны 0х00. Ведь в каждом цикле переполнения таймера его регистры сбрасываются на 0х00, а затем происходит установка начального значения регистров. Поэтому, для трех пар регистров сравнеия в качестве начальных значений должно быть установлено любое двухбайтное число в диапазоне от 0x0001 до 0х687A. Тогда значения счетных регистров таймера не будут попадать в этот диапазон и не будет ложных срабатываний..

Вот как-то так, мне думается.
Забазан-зан-зан вне форума   Ответить с цитированием
Старый 21.10.2014, 10:23   #20
ampersant
Senior Member
 
Аватар для ampersant
 
Регистрация: 26.02.2008
Адрес: IgorV
Сообщений: 2,498
Вес репутации: 4829/114
ampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond repute
По умолчанию Re: вкл/откл. TMR0

Цитата:
Сообщение от Забазан-зан-зан Посмотреть сообщение
Немного подумал. На мой взгляд, наиболее оптимальным будет такое решение:
таймер считает постоянно интервалы по 10 с, а по приходу "1" с каждого контроллируемого входа "неисправности" будет записываться значение таймера на тот момент, а в следующем цикле счета таймера это значение сравнивается с регистами счета таймера, таймер достигнет того же значения, реле нужно отключить, подав на него "0", но предварительно прочитать состояние (1 или 0)по входам запрета и состояние по входу неисправности.

Таймер с предделителем настраивается так, чтобы постоянно отсчитывать заданный интервал времени - 10 с по кругу. При тактовой частоте МК 4 МГц и предделителе 1:256 инкремент (приращение на +1) таймера будет происходить каждые 256 мкс. Следовательно, за 10 с таймер досчитает до 39062 (39062,5 если точно, но половинку не учитываем). Для того, чтобы наступило переполнение таймера и вывесился флаг T0IF, не хватает 65536-39062=26747 отсчетов. Это и будет стартовое число, которое в каждом новом цикле счета будет записываться в регистры TMR0H и TMR0L. В 16-ричном виде это будут числа 0x68 и 0x7B.
При появлении на любом входе "неисправность" сигнала неисправности ("1"), текущее значение счетных регистров TMR0H и TMR0L переносится в пару регистров для каждой линии "неисправность". То есть, 3 пары регистров. На следующем круге счета таймера значение счетных регистров таймера постоянно сравниваются с этими тремя парами регистров, и если произошло равенство, то должен выдаваться соотвествующий сигнал на отключение реле, предварительно проверив состояние входов "запрет" и состояние входов "неисправность". Счет таймера и сравнение счетных регистров должно продолжаться и дальше, чтобы отреагировать на остальные сигналы "неисправность".
Если сигналов "неисправность" не поступает, то начальные состояния трех пар регистров не должны быть равны 0х00. Ведь в каждом цикле переполнения таймера его регистры сбрасываются на 0х00, а затем происходит установка начального значения регистров. Поэтому, для трех пар регистров сравнеия в качестве начальных значений должно быть установлено любое двухбайтное число в диапазоне от 0x0001 до 0х687A. Тогда значения счетных регистров таймера не будут попадать в этот диапазон и не будет ложных срабатываний..

Вот как-то так, мне думается.
как только ТС стал перекладвывать с себя выполнение этой задачи, интерес к теме пропал.
ampersant вне форума   Ответить с цитированием
Старый 21.10.2014, 10:32   #21
RADJA84
Junior Member
 
Регистрация: 13.10.2014
Возраст: 35
Сообщений: 19
Вес репутации: 100/19
RADJA84 will become famous soon enoughRADJA84 will become famous soon enough
По умолчанию Re: вкл/откл. TMR0

Цитата:
Сообщение от Забазан-зан-зан Посмотреть сообщение
Если сигналов "неисправность" не поступает, то начальные состояния трех пар регистров не должны быть равны 0х00. Ведь в каждом цикле переполнения таймера его регистры сбрасываются на 0х00, а затем происходит установка начального значения регистров. Поэтому, для трех пар регистров сравнеия в качестве начальных значений должно быть установлено любое двухбайтное число в диапазоне от 0x0001 до 0х687A. Тогда значения счетных регистров таймера не будут попадать в этот диапазон и не будет ложных срабатываний...
Вот это чего-то я не понял, а так, вроде, все логично! Спасибо.

И еще, как я понял, TMR0 не может инкрементироваться до момента равенства со значением его N-го регистра, как в TMR1 например. Ему обязательно нужно загружать в TMR0H и TMR0L значения с которого он начнет считать?
RADJA84 вне форума   Ответить с цитированием
Старый 21.10.2014, 10:40   #22
RADJA84
Junior Member
 
Регистрация: 13.10.2014
Возраст: 35
Сообщений: 19
Вес репутации: 100/19
RADJA84 will become famous soon enoughRADJA84 will become famous soon enough
По умолчанию Re: вкл/откл. TMR0

Цитата:
Сообщение от ampersant Посмотреть сообщение
как только ТС стал перекладвывать с себя выполнение этой задачи, интерес к теме пропал.
Я не перекладывал с себя выполнения этой задачи. Я больше хочу разобраться с МК и алгоритмами его работы. Структурой программ.
У меня еще куча вопросов...
RADJA84 вне форума   Ответить с цитированием
Старый 21.10.2014, 10:42   #23
ampersant
Senior Member
 
Аватар для ampersant
 
Регистрация: 26.02.2008
Адрес: IgorV
Сообщений: 2,498
Вес репутации: 4829/114
ampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond reputeampersant has a reputation beyond repute
По умолчанию Re: вкл/откл. TMR0

Цитата:
Сообщение от RADJA84 Посмотреть сообщение
Я не перекладывал с себя выполнения этой задачи. Я больше хочу разобраться с МК и алгоритмами его работы. Структурой программ.
У меня еще куча вопросов...
пора бы уже начинать какие то попытки свои выкладывать решений хоть чего то из этой простой задачи.
ampersant вне форума   Ответить с цитированием
Старый 21.10.2014, 10:57   #24
Забазан-зан-зан
Banned
 
Регистрация: 04.10.2014
Сообщений: 97
Вес репутации: -114/0
Забазан-зан-зан is infamous around these partsЗабазан-зан-зан is infamous around these parts
По умолчанию Re: вкл/откл. TMR0

Малость неправильно ты понял. Эммм... нет, вернее, правильно, эт я не вкурил в фразу. Правильно, TMR0 считает от нуля и до нуля по кругу.
TMR0 инкрементируется постоянно от значения 0х0000 (два байта, таймер ведь 16-битный) до значения 0xFFFF и при следующем приращении получиьтся переход из 0xFFFF в 0x0000, это называется переполнением таймера, когда значений больше, чем 0xFFFF нету и приходится счет начинать с начала. Период времени, за которое таймер будет считать от нуля до максимума с последующим переполнением, будет зависеть как от интервалов, с которыми происходит переполнение, так и от начального значения, от которого начнется счет. Начальное значение можно выставить принудительно в регистрах TMR0H и TMR0L. Эти ренистры - это старший и младший байты двухбайтного числа.
Период времени, за которое происходит инкремент таймера на 1 единицу, задается предделителем. Если предделитель = 1:1, то инкремент таймера проиходит каждый машинный такт. Машинный такт в PIC-ах равен четырем тактам осциллятора, проще говоря, частота МК в 4 раза ниже частоты кварца. Так задумано.
Поэтому, с предделителем 1:256 приращение TMR0 будет происходить каждые 256 микросекунд. Все остальное я уже писал. Чтобы получить флаг прерывания от таймера, он должен досчитать до конца (0xFFFF) и перейти к 0x0000. Чтобы считать не от 0, в каждом новом цикле счета нужно записать начальное значение. Тоже написал, чему оно будет равно.
Флаг прерывания как раз и нужен для того, чтобы записать начальное значение в начале нового круга счета. Отслеживая появление этого флага, можно узнать, когда таймер досчитает до конца.
Можно поступить иначе, без использования этого флага. Можно постоянно читать значения регистров TMR0H:TMR0L и когда их значение будет равно или больше 39062 отсчетов (в десятичном формате), сбросить регистры таймера в 0х0000.
А сравнивать значения таймера нужно с парой регистров, в которые было переписано текущее значение таймера в предыдущем круге, когда произошло срабатывание по приходу сигнала "неисправность".

Да какие там попытки автора то, он ведь просто взял какой-то неправильный устаревший МК, на которой даже нет нормальной документации и фик знает какой у него аналог в PIC-ах.
Изучать надо было начинать с простых, типа PIC12 или PIC16. Потом уже на PIC18 переходить. А PIC17, как я уже писал, давно не производятся и даже почти что не поддерживаются средствами разработки.
Потому автор и никак не может понять, что там и зачем нужно то.

Последний раз редактировалось Забазан-зан-зан; 21.10.2014 в 11:13.
Забазан-зан-зан вне форума   Ответить с цитированием
Старый 21.10.2014, 11:02   #25
_WIL_
Senior Member
 
Регистрация: 26.11.2009
Адрес: Беларусь
Сообщений: 712
Вес репутации: 1226/55
_WIL_ has much to be proud of_WIL_ has much to be proud of_WIL_ has much to be proud of_WIL_ has much to be proud of_WIL_ has much to be proud of_WIL_ has much to be proud of_WIL_ has much to be proud of_WIL_ has much to be proud of_WIL_ has much to be proud of
По умолчанию Re: вкл/откл. TMR0

Цитата:
Сообщение от Забазан-зан-зан Посмотреть сообщение
Да какие там попытки автора то, он ведь просто взял какой-то неправильный устаревший МК, на которой даже нет нормальной документации и фик знает какой у него аналог в PIC-ах.
Изучать надо было начинать с простых, типа PIC12 или PIC16. Потом уже на PIC18 переходить. А PIC17, как я уже писал, давно не производятся и даже почти что не поддерживаются средствами разработки.
Потому автор и никак не может понять, что там и зачем нужно то.
Он видимо решил поддержать отечественного производителя.
Когда появился 1886ВЕ6 я тоже купил один , но потом забил на него , чего и топикстартеру советую.
_WIL_ вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отсчёт времени с помощью TMR0 Guaho Продукция MICROCHIP 10 28.06.2014 03:24
Имитатор DS18B20 Filya44 Вопросы начинающих 14 12.03.2012 17:39
F873 и TMR0 Rex72 Вопросы начинающих 19 12.01.2012 16:38
Отключение TMR0 в PIC12F675 Zeus80 Продукция MICROCHIP 15 28.03.2010 06:01
Помогите разобраться с таймером TMR0 student Вопросы начинающих 17 08.05.2009 12:59


Часовой пояс GMT +3, время: 23:14.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot