PIC12f508 Инвертирование сигналов
- Сообщения: 57
- Зарегистрирован: Пт дек 09, 2011 18:31:13
Думал на вариантом 12f629, там больше функционал, но оригинальный вариант вроде работает на 12c(f)508 ( но это не точно) , поэтому изначально и пал на него выбор
- Реклама
- Сообщения: 1455
- Зарегистрирован: Вт июн 07, 2011 08:03:18
Не путайте человекаveso74 писал(а):Вариант: с помощью имеющегося таймера организовать "временное окно", в течение которого будете "замерять" входной сигнал.
Спойлер
Ага, на stm32Поменяйте МК на такой, у которого два таймера.
- Вложения
-
- прерывание таймера 2.png
- (72.12 КБ) 506 скачиваний
У того, кто делает — получается редко. У того, кто не делает — не получается никогда.
Если вы подаете на вход постоянно 1 , что у вас с выходом твориться?
У того, кто делает — получается редко. У того, кто не делает — не получается никогда.
- Сообщения: 57
- Зарегистрирован: Пт дек 09, 2011 18:31:13
Если 1 на входе постоянная, то просто срабатывает выход на 760ms и всё.
(на фото а начале)

Мартин, извиняюсь, я ошибся, у Вас и было указано сдвиг вправо (немного непривычная формулировка для меня, поэтому уточнил) деление на 2 звучит проще
Но в итоге так и остается необходимость измерения времени между импульсами на входе, для вычисления времени включения входа.
(на фото а начале)
Мартин, извиняюсь, я ошибся, у Вас и было указано сдвиг вправо (немного непривычная формулировка для меня, поэтому уточнил) деление на 2 звучит проще
Но в итоге так и остается необходимость измерения времени между импульсами на входе, для вычисления времени включения входа.
- Реклама
- Сообщения: 57
- Зарегистрирован: Пт дек 09, 2011 18:31:13
[uquote="Martian",url="/forum/viewtopic.php?p=4637146#p4637146"]по приходу импульса:
значение счётчика сохранить в переменную N со сдвигом вправо на 1 (делим на 2)
сбросить счётчик
инвертировать выход
запустить цикл до N.[/uquote]
Но тогда выход будет включен все время до прихода нового импульса, разве нет? Задача именно включить выход немного заранее ( 10-30ms) перед новым импульсом
значение счётчика сохранить в переменную N со сдвигом вправо на 1 (делим на 2)
сбросить счётчик
инвертировать выход
запустить цикл до N.[/uquote]
Но тогда выход будет включен все время до прихода нового импульса, разве нет? Задача именно включить выход немного заранее ( 10-30ms) перед новым импульсом
- Сообщения: 57
- Зарегистрирован: Пт дек 09, 2011 18:31:13
Завтра сделаю например от 0 до 5-10гц как происходит корректировка времени выхода
Я вот не пойму... А зачем по сути повторителю импульсов временные характеристики измерять - то?
Похоже rusman159 перемудрил с задачей.
Для начала словами описать "чего хочется" да ручками график желаемого нарисовать.
А там и прояснится...
Интервалы времени не только таймером обеспечиваются.
Вопрос "предсказания" ожидаемого входного сигнала можно решать только при заранее заданном диапазоне входных параметров - иначе для столь простого МК это не имеет решения.
Да и программу для такой "букашки" лучше под ассемблером делать.

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

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

И стремится при стабильной частоте к минимальному времени работы выхода, около 10ms.
При этом включение выхода должно быть еще до поступления сигнала на вход.
Вот осциллограммы с исходника из поста выше
Скорее всего мк ориентируется по времени между двумя прошлыми импульсами и исходя из этого времени заранее включает выход, чтобы на момент поступления сигнала на вход время работы выхода составило около 10мс ( в идеале), завтра сделаю замер, есть ли зависимость времени выхода от частоты.
Тут я вручную жал на кнопку, поэтому периоды разные, но мк +- подгоняет работы выхода под нужный интервал.
Вот пример работы при стабильной частоте 25hz, частота может плавно меняться от 0 до 300hz и обратно

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

Штука весьма неблагодарная и самим МК ничего особо не меняющая, если механика уже свой срок отработала...
- Сообщения: 57
- Зарегистрирован: Пт дек 09, 2011 18:31:13
Это логика работы управления катушкой зажигания на старом скутере, около 10ms-время заряда катушки перед искрой.
Скорость нарастания около 30hz/сек.
Вечером подключу генератор импульсов и сделаю замер выхода на 2-10-15hz.
Добавлено after 1 hour 29 minutes 42 seconds:
Замеры с генератором импульсов.
2.5hz, период = 395ms, импульс на выходе 58ms
5hz, период = 200ms, импульс на выходе 30ms
7.5hz, период = 133ms, импульс на выходе 20ms
10hz, период = 100ms, импульс на выходе 15ms
15hz, период = 66ms, импульс на выходе 10ms
Т.е выход примерно в 6.8 раз короче чем период на входе.
75hz, период = 13.2ms, импульс на выходе 5.8ms
150hz, период = 6.68ms, импульс на выходе 3.92ms
Но тут скважность возможно не совсем корректно настроена на генераторе, завтра сделаю замер без генератора, на железе.
Несколько осциллограмм с генератором (красный это выходной импульс):
7.5hz

15hz

Скорость нарастания около 30hz/сек.
При постоянной 1 на входе на выходе один единичный сигнал 760ms и всёповторю вопрос при постоянной 1 на входе на выходе сигнал переодический или единичный?
Если единичный, то только по фронту, переодический = фронт+ таймер.
Да, так как я подавал сигнал нажатием на кнопку, отсюда и нестабильная частота на входе.На фото видно и колебания и перерегулирование.
Вечером подключу генератор импульсов и сделаю замер выхода на 2-10-15hz.
Добавлено after 1 hour 29 minutes 42 seconds:
Замеры с генератором импульсов.
2.5hz, период = 395ms, импульс на выходе 58ms
5hz, период = 200ms, импульс на выходе 30ms
7.5hz, период = 133ms, импульс на выходе 20ms
10hz, период = 100ms, импульс на выходе 15ms
15hz, период = 66ms, импульс на выходе 10ms
Т.е выход примерно в 6.8 раз короче чем период на входе.
75hz, период = 13.2ms, импульс на выходе 5.8ms
150hz, период = 6.68ms, импульс на выходе 3.92ms
Но тут скважность возможно не совсем корректно настроена на генераторе, завтра сделаю замер без генератора, на железе.
Несколько осциллограмм с генератором (красный это выходной импульс):
7.5hz
15hz
Исходник для 629(в протеусе нет 508
)
Код: Выделить всё
#include <pic.h>
#include <stdio.h>
#include <htc.h>
#define KEY_PULS GPIO5
#define LOAD GPIO1
void power_on_delay(void);
void delay_1ms(void);
bit tik;
unsigned char time_hi,time_lo;
unsigned int duration;
/***********************************************************/
__CONFIG(FOSC_INTRCIO & WDTE_OFF & MCLRE_OFF & PWRTE_ON & BOREN_OFF & CP_OFF & CPD_OFF);
__EEPROM_DATA(0,0,0,0,0,0,0,0);
_READ_OSCCAL_DATA();
main()
{
power_on_delay();
CMCON = 0x7; /* turn off comparators */
GPIO=0;
TRISIO = 0b110000;
duration=0;
tik=0;
while(1)
{
if ((KEY_PULS == 0)&(!tik)) {tik=1;LOAD =1;
duration=time_lo;
duration+=time_hi;
duration-=5;
time_lo=0;
}
if ((KEY_PULS == 1)&(tik)) {tik=0;time_hi=0; }
delay_1ms();
delay_1ms();
if (tik) { time_lo++;}
else { time_hi++;}
if (duration==0) {
LOAD =0;}
else {
duration--;}
}
}
void power_on_delay(void)
{
unsigned int i;
for(i = 0; i<1000; i++)
{
delay_1ms();
}
}
void delay_1ms(void)
{
unsigned char i;
for(i = 0; i<130; i++)
{
;
}
}У того, кто делает — получается редко. У того, кто не делает — не получается никогда.
У того, кто делает — получается редко. У того, кто не делает — не получается никогда.
- Сообщения: 57
- Зарегистрирован: Пт дек 09, 2011 18:31:13
RoboC, Спасибо!
Вечером буду проверять, вчера тоже пробовал через циклы, но столкнулся с одной проблемой ( скорее всего она звучит глупо)
При первом нажатии проверял
Получилось так, что при нажатии кнопки я заходил в цикл и сразу вылетал через Break, так как кнопка была уже нажата.
Хотя с ставил KEY1=1;
Если вместо KEY1 Указывал KEY2, то как положенно заходил в первый цикл ожидания, включался выход, при нажатии второй кнопки выход отключался и цикл прерывался как положено.
Но с одной и той же кнопки не хотело работать
Нужно как-то не учитывать ее состояние, либо только по переднему фронту проверять
Вечером буду проверять, вчера тоже пробовал через циклы, но столкнулся с одной проблемой ( скорее всего она звучит глупо)
При первом нажатии проверял
Код: Выделить всё
if ((KEY1 == 0)&&(Flag==0))
{
KEY1=1;
LED1=0; (Включаем выход при первом цикле)
flag=1;
for(i = 0; i<15000; i++)
{
if ((KEY1 == 0) && (flag==1)) (второе нажатие кнопки)
{
LED1=1;
Break;
}
;
}
Далее делаем действия и тд
Хотя с ставил KEY1=1;
Если вместо KEY1 Указывал KEY2, то как положенно заходил в первый цикл ожидания, включался выход, при нажатии второй кнопки выход отключался и цикл прерывался как положено.
Но с одной и той же кнопки не хотело работать
Нужно как-то не учитывать ее состояние, либо только по переднему фронту проверять
Так и сделано. Но учитываете что при задержке 2 мс макс. время полупериода не может быть больше 510мс, иначе переполнение.
У того, кто делает — получается редко. У того, кто не делает — не получается никогда.
- Сообщения: 57
- Зарегистрирован: Пт дек 09, 2011 18:31:13
- Сообщения: 57
- Зарегистрирован: Пт дек 09, 2011 18:31:13
Взял на тест несколько PIC12F675, они уже с прерыванием.
Не могу разобраться со входами
По даташиту настроил GP2, GP5 на входы, но если ставлю if (KEY1==0), то переключение выходов не работает в цикле, если ставлю if (KEY2==0), то всё работает, как так?
Пробовал подключать кнопку к GP4, if (GP4==0), тоже не работает
Нужно было
ANSEL = 0x00; //disable all analog pins and make digital I/O
Не могу разобраться со входами
По даташиту настроил GP2, GP5 на входы, но если ставлю if (KEY1==0), то переключение выходов не работает в цикле, если ставлю if (KEY2==0), то всё работает, как так?
Пробовал подключать кнопку к GP4, if (GP4==0), тоже не работает
Код: Выделить всё
#pragma config CP = OFF // Code protection off
#pragma config FOSC = INTRCCLK // Oscillator Selection bits (INTOSC oscillator: CLKOUT function on GP4/OSC2/CLKOUT pin, I/O function on GP5/OSC1/CLKIN)
#pragma config WDTE = ON // Watchdog Timer Enable bit (WDT enabled)
#pragma config PWRTE = OFF
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#define _XTAL_FREQ 4000000L
//#define BUTTON GPIO0
#define LED1 GP0
#define LED2 GP1
#define KEY1 GP2
#define KEY2 GP5
/*
*
*/
void main(void)
{
//GPIO =0; //
WPU =0b11111111;
OPTION_REG = 0b10000000; // ???????? ? ??????????? ?? ?????? ?????????
TRISIO = 0b00111100; // GP0,GP1 = output
GPIO = 0b00000011;
while(1)
{
if (KEY1==0)
GPIO = 0b00000010;
else
GPIO = 0b00000001;
}
}ANSEL = 0x00; //disable all analog pins and make digital I/O


