PIC12f508 Инвертирование сигналов
Re: PIC12f508 Инвертирование сигналов
В PIC12f508 TMR0 с этим справится?
Пытаюсь разобраться в настройке и запуске таймера на pic12f508
Из мануала
Режим Таймера выбирается сбросом бита T0CS (OPTION 5). В режиме таймера, модуль Timer0 инкременируется каждый машинный цикл (без ПД). После записи в регистр TMR0 его инкрементация задерживается на следующие два цикла (Рис 6-2 и Рис. 6-3). Подробное описание смотреть в руководстве по PIC16C8X. Пользователь может это использовать, для записи и коррекции значения регистра. Режим счетчика выбирается установкой бита T0CS (OPTION < 5 >). В этом режиме, Timer0 инкременируется по фронту или спаду входного сигнала на выводе T0CKI. Бит T0SE (OPTION < 4 >) определяет фронт переключения. Установка бита T0SE вызывает инкремент ТС по спаду входного сигнала.
РЕГИСТР OPTION
Bit5: T0CS: Timer0 выбор источника тактирования 1 = С внешнего вывода GP2 / T0CKI, 0 = Внутренняя частота, Fosc/4
Bit4: T0SE: выбор фронта переключения Timer0 1 = Инкремент при переходе с “1”на “0” на выводе T0CKI,, 0 = Инкремент при переходе с “0”на “1” на выводе T0CKI
Импульсы нужно подавать только на ногу T0CKI или можно на любую другую GP0, 1, и тд?
Bit3: PSA: Бит назначения предварительного делителя (ПД) 1 = Предварительный делитель включен после WDT 0 = Предварительный делитель включен перед Timer0 Bit2-0: PS2-PS0: Выбор коэф.деления ПД
Нужно включать делитель?
Пытаюсь разобраться в настройке и запуске таймера на pic12f508
Из мануала
Режим Таймера выбирается сбросом бита T0CS (OPTION 5). В режиме таймера, модуль Timer0 инкременируется каждый машинный цикл (без ПД). После записи в регистр TMR0 его инкрементация задерживается на следующие два цикла (Рис 6-2 и Рис. 6-3). Подробное описание смотреть в руководстве по PIC16C8X. Пользователь может это использовать, для записи и коррекции значения регистра. Режим счетчика выбирается установкой бита T0CS (OPTION < 5 >). В этом режиме, Timer0 инкременируется по фронту или спаду входного сигнала на выводе T0CKI. Бит T0SE (OPTION < 4 >) определяет фронт переключения. Установка бита T0SE вызывает инкремент ТС по спаду входного сигнала.
РЕГИСТР OPTION
Bit5: T0CS: Timer0 выбор источника тактирования 1 = С внешнего вывода GP2 / T0CKI, 0 = Внутренняя частота, Fosc/4
Bit4: T0SE: выбор фронта переключения Timer0 1 = Инкремент при переходе с “1”на “0” на выводе T0CKI,, 0 = Инкремент при переходе с “0”на “1” на выводе T0CKI
Импульсы нужно подавать только на ногу T0CKI или можно на любую другую GP0, 1, и тд?
Bit3: PSA: Бит назначения предварительного делителя (ПД) 1 = Предварительный делитель включен после WDT 0 = Предварительный делитель включен перед Timer0 Bit2-0: PS2-PS0: Выбор коэф.деления ПД
Нужно включать делитель?
- RoboC
- Мудрый кот
- Сообщения: 1795
- Зарегистрирован: Ср апр 04, 2012 09:55:53
- Откуда: Северодонецк
- Контактная информация:
Re: PIC12f508 Инвертирование сигналов
С максимальным делителем таймер переполнится за 1/15с . Забудьте в про таймер в этом мк в отношении к вашей задаче.
Разберитесь с алгоритмами предложными мной и описанным Martian.
За вас код никто не напишет, но вас поправят и подскажут.
Вы движетесь , пока, не туда.
Разберитесь с алгоритмами предложными мной и описанным Martian.
За вас код никто не напишет, но вас поправят и подскажут.
Вы движетесь , пока, не туда.
У того, кто делает — получается редко. У того, кто не делает — не получается никогда.
Re: PIC12f508 Инвертирование сигналов
Я для себя понимаю примерный алгоритм работы, но по идее нужен отдельно таймер либо отдельный независимый процесс, который будет считать время между импульсами, и отдельно кусок программы на всё остальное.
Код естественно буду пробовать писать самостоятельно.
В алгоритме мартина не совсем понял про сдвиг 1 влево.
Позавчера проводил эксперименты с функцией __Delay, при ее работе контроллер стоит на месте, ждет.
Для теста заменил ее на цикл for где просто было N=N+1; и проверка нажатия кнопки, по замерам осциллографом 12500 сложений=500ms, 250 сложений=10ms.
Была идея по приходу импульса запускать цикл for, по второму приходу останавливаем, таким образом будет известно время ( количество сложений) между импульсами, но возникла проблема, нужно же параллельно запускать еще один цикл по приходу импульса на вход, который будет равен прошлое время минус 15ms к примеру, и он будет включать выход.
Но параллельно два цикла работать не смогут, либо нужен цикл внутри цикла.
Добавлено after 23 minutes 56 seconds:
Набросал блок схему, она не совсем полная, тут скажем так на один цикл работы, далее все по кругу

Код естественно буду пробовать писать самостоятельно.
В алгоритме мартина не совсем понял про сдвиг 1 влево.
Позавчера проводил эксперименты с функцией __Delay, при ее работе контроллер стоит на месте, ждет.
Для теста заменил ее на цикл for где просто было N=N+1; и проверка нажатия кнопки, по замерам осциллографом 12500 сложений=500ms, 250 сложений=10ms.
Была идея по приходу импульса запускать цикл for, по второму приходу останавливаем, таким образом будет известно время ( количество сложений) между импульсами, но возникла проблема, нужно же параллельно запускать еще один цикл по приходу импульса на вход, который будет равен прошлое время минус 15ms к примеру, и он будет включать выход.
Но параллельно два цикла работать не смогут, либо нужен цикл внутри цикла.
Добавлено after 23 minutes 56 seconds:
Набросал блок схему, она не совсем полная, тут скажем так на один цикл работы, далее все по кругу
-
veso74
- Поставщик валерьянки для Кота
- Сообщения: 1905
- Зарегистрирован: Сб май 05, 2012 20:24:52
- Откуда: KN34PC, Болгария
- Контактная информация:
Re: PIC12f508 Инвертирование сигналов
Измерение временных характеристик сигналов одним таймером (и у которого нет interrupt при преполнения) - это своего рода "мазохизм" :П.
Вариант: с помощью имеющегося таймера организовать "временное окно", в течение которого будете "замерять" входной сигнал. Но без interrupt в таймере метод опять полный беспорядок. Приходится постоянно "проверять", сколько времени прошло от предыдущего события или предыдущего сброса. С задержкой на чтение и вычитанием сравнения - метод снова бессмысленен. И это должно быть помещено в 25 байт SRAM
. Поменяйте МК на такой, у которого два таймера. Один: для отчета о времени, другой: для состояния входного сигнала – передний/задний фронт. А после анализа времени запускайте/останавливайте другие выходы по мере необходимости. (частично пользуюсь переводчиком)
Вариант: с помощью имеющегося таймера организовать "временное окно", в течение которого будете "замерять" входной сигнал. Но без interrupt в таймере метод опять полный беспорядок. Приходится постоянно "проверять", сколько времени прошло от предыдущего события или предыдущего сброса. С задержкой на чтение и вычитанием сравнения - метод снова бессмысленен. И это должно быть помещено в 25 байт SRAM
Re: PIC12f508 Инвертирование сигналов
Думал на вариантом 12f629, там больше функционал, но оригинальный вариант вроде работает на 12c(f)508 ( но это не точно) , поэтому изначально и пал на него выбор
Re: PIC12f508 Инвертирование сигналов
Для таких задач, зачастую, даже таймер не нужен.
- RoboC
- Мудрый кот
- Сообщения: 1795
- Зарегистрирован: Ср апр 04, 2012 09:55:53
- Откуда: Северодонецк
- Контактная информация:
Re: PIC12f508 Инвертирование сигналов
Не путайте человекаveso74 писал(а):Вариант: с помощью имеющегося таймера организовать "временное окно", в течение которого будете "замерять" входной сигнал.
Спойлер
Ага, на stm32Поменяйте МК на такой, у которого два таймера.
- Вложения
-
- прерывание таймера 2.png
- (72.12 КБ) 472 скачивания
У того, кто делает — получается редко. У того, кто не делает — не получается никогда.
Re: PIC12f508 Инвертирование сигналов
[uquote="rusman159",url="/forum/viewtopic.php?p=4637240#p4637240"]не совсем понял про сдвиг 1 влево.[/uquote] Я написал влево?
прошу прощения, этот от бессонницы. Вправо, конечно же. Эквивалент делению на два.
- RoboC
- Мудрый кот
- Сообщения: 1795
- Зарегистрирован: Ср апр 04, 2012 09:55:53
- Откуда: Северодонецк
- Контактная информация:
Re: PIC12f508 Инвертирование сигналов
Если вы подаете на вход постоянно 1 , что у вас с выходом твориться?
У того, кто делает — получается редко. У того, кто не делает — не получается никогда.
Re: PIC12f508 Инвертирование сигналов
Если 1 на входе постоянная, то просто срабатывает выход на 760ms и всё.
(на фото а начале)

Мартин, извиняюсь, я ошибся, у Вас и было указано сдвиг вправо (немного непривычная формулировка для меня, поэтому уточнил) деление на 2 звучит проще
Но в итоге так и остается необходимость измерения времени между импульсами на входе, для вычисления времени включения входа.
(на фото а начале)
Мартин, извиняюсь, я ошибся, у Вас и было указано сдвиг вправо (немного непривычная формулировка для меня, поэтому уточнил) деление на 2 звучит проще
Но в итоге так и остается необходимость измерения времени между импульсами на входе, для вычисления времени включения входа.
Re: PIC12f508 Инвертирование сигналов
не, было влево, я после Вашего замечания исправил.
Re: PIC12f508 Инвертирование сигналов
[uquote="Martian",url="/forum/viewtopic.php?p=4637146#p4637146"]по приходу импульса:
значение счётчика сохранить в переменную N со сдвигом вправо на 1 (делим на 2)
сбросить счётчик
инвертировать выход
запустить цикл до N.[/uquote]
Но тогда выход будет включен все время до прихода нового импульса, разве нет? Задача именно включить выход немного заранее ( 10-30ms) перед новым импульсом
значение счётчика сохранить в переменную N со сдвигом вправо на 1 (делим на 2)
сбросить счётчик
инвертировать выход
запустить цикл до N.[/uquote]
Но тогда выход будет включен все время до прихода нового импульса, разве нет? Задача именно включить выход немного заранее ( 10-30ms) перед новым импульсом
Re: PIC12f508 Инвертирование сигналов
необходимость вычисления времени между двумя импульсами будет всегда, либо придётся строить невероятно огромную и вряд ли здесь нужную систему сбора статистики и прогнозирования, которая может оказать совершенно недостоверной, если изменения абсолютно случайны.
Так что, выход всегда будет отставать от входа на один период.
Добавлено after 3 minutes 6 seconds:
[uquote="rusman159",url="/forum/viewtopic.php?p=4637373#p4637373"]Но тогда выход будет включен все время до прихода нового импульса, разве нет? Задача именно включить выход немного заранее ( 10-30ms) перед новым импульсом[/uquote] Это возможно только при постоянной частоте на входе. Если постоянна - то тогда измеряем первые несколько периодов, убеждаемся, что она постоянна, ну и дальше каждый импульс запускает счётчик, равный длительности минус 10-30 мс, и проверяет эти 10-30 мс на следующем импульсе.
И это всё можно без таймера, просто инкрементировать переменные и знать, сколько времени это занимает.
А на графике мне показалось /2
Так что, выход всегда будет отставать от входа на один период.
Добавлено after 3 minutes 6 seconds:
[uquote="rusman159",url="/forum/viewtopic.php?p=4637373#p4637373"]Но тогда выход будет включен все время до прихода нового импульса, разве нет? Задача именно включить выход немного заранее ( 10-30ms) перед новым импульсом[/uquote] Это возможно только при постоянной частоте на входе. Если постоянна - то тогда измеряем первые несколько периодов, убеждаемся, что она постоянна, ну и дальше каждый импульс запускает счётчик, равный длительности минус 10-30 мс, и проверяет эти 10-30 мс на следующем импульсе.
И это всё можно без таймера, просто инкрементировать переменные и знать, сколько времени это занимает.
А на графике мне показалось /2
Re: PIC12f508 Инвертирование сигналов
Завтра сделаю например от 0 до 5-10гц как происходит корректировка времени выхода
Re: PIC12f508 Инвертирование сигналов
ну, в зависимости от направления, скорости и диапазона изменения частоты, при таком простом алгоритме, будет ситуация, когда выходной импульс совпадёт со входным, и то, если это заставить его делать, иначе он будет позже. Либо писать какой-то анализ, что если два раза частота изменилась на какую-то дельту, примерно равную, то предполагать, что и в третий раз будет. Это очень запарно, на мой взгляд и меняет время вычислений непрогнозируемо, придётся использовать таймер.
Re: PIC12f508 Инвертирование сигналов
Я вот не пойму... А зачем по сути повторителю импульсов временные характеристики измерять - то?
Похоже rusman159 перемудрил с задачей.
Для начала словами описать "чего хочется" да ручками график желаемого нарисовать.
А там и прояснится...
Интервалы времени не только таймером обеспечиваются.
Вопрос "предсказания" ожидаемого входного сигнала можно решать только при заранее заданном диапазоне входных параметров - иначе для столь простого МК это не имеет решения.
Да и программу для такой "букашки" лучше под ассемблером делать.

Похоже rusman159 перемудрил с задачей.
Для начала словами описать "чего хочется" да ручками график желаемого нарисовать.
А там и прояснится...
Интервалы времени не только таймером обеспечиваются.
Вопрос "предсказания" ожидаемого входного сигнала можно решать только при заранее заданном диапазоне входных параметров - иначе для столь простого МК это не имеет решения.
Да и программу для такой "букашки" лучше под ассемблером делать.
Re: PIC12f508 Инвертирование сигналов
Задача простая, мк должен обеспечивать минимально короткий импульс на выходе при поступлении сигнала на вход.
И стремится при стабильной частоте к минимальному времени работы выхода, около 10ms.
При этом включение выхода должно быть еще до поступления сигнала на вход.
Вот осциллограммы с исходника из поста выше
Скорее всего мк ориентируется по времени между двумя прошлыми импульсами и исходя из этого времени заранее включает выход, чтобы на момент поступления сигнала на вход время работы выхода составило около 10мс ( в идеале), завтра сделаю замер, есть ли зависимость времени выхода от частоты.
Тут я вручную жал на кнопку, поэтому периоды разные, но мк +- подгоняет работы выхода под нужный интервал.

Вот пример работы при стабильной частоте 25hz, частота может плавно меняться от 0 до 300hz и обратно

И стремится при стабильной частоте к минимальному времени работы выхода, около 10ms.
При этом включение выхода должно быть еще до поступления сигнала на вход.
Вот осциллограммы с исходника из поста выше
Скорее всего мк ориентируется по времени между двумя прошлыми импульсами и исходя из этого времени заранее включает выход, чтобы на момент поступления сигнала на вход время работы выхода составило около 10мс ( в идеале), завтра сделаю замер, есть ли зависимость времени выхода от частоты.
Тут я вручную жал на кнопку, поэтому периоды разные, но мк +- подгоняет работы выхода под нужный интервал.
Вот пример работы при стабильной частоте 25hz, частота может плавно меняться от 0 до 300hz и обратно
Re: PIC12f508 Инвертирование сигналов
ну, понятие "плавно" не очень информативно... нужно описывать скорость изменения математически, если это вообще возможно.
- RoboC
- Мудрый кот
- Сообщения: 1795
- Зарегистрирован: Ср апр 04, 2012 09:55:53
- Откуда: Северодонецк
- Контактная информация:
Re: PIC12f508 Инвертирование сигналов

В середине видно , что никаких там предсказаний и 10мс нет.
Скорее всего ПИД. Регулирующий импульс макс 760мс мин 0
ПЕресчет ПИД либо по таймеру и/или по ниспадающему фронту.
повторю вопрос при постоянной 1 на входе на выходе сигнал переодический или единичный?
Если единичный, то только по фронту, переодический = фронт+ таймер.
На фото видно и колебания и перерегулирование.
У того, кто делает — получается редко. У того, кто не делает — не получается никогда.
Re: PIC12f508 Инвертирование сигналов
Задачка предсказания для датчика положения ленты относительно нагревательных ножей фасовочного автомата?
Штука весьма неблагодарная и самим МК ничего особо не меняющая, если механика уже свой срок отработала...

Штука весьма неблагодарная и самим МК ничего особо не меняющая, если механика уже свой срок отработала...