PIC12f508 Инвертирование сигналов

Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить
Открыл глаза
Сообщения: 57
Зарегистрирован: Пт дек 09, 2011 18:31:13

Сообщение rusman159 »

Думал на вариантом 12f629, там больше функционал, но оригинальный вариант вроде работает на 12c(f)508 ( но это не точно) , поэтому изначально и пал на него выбор
Реклама
OKF
Это не хвост, это антенна
Сообщения: 1455
Зарегистрирован: Вт июн 07, 2011 08:03:18

Сообщение OKF »

Для таких задач, зачастую, даже таймер не нужен.
Реклама
Мудрый кот
Аватара пользователя
Сообщения: 1795
Зарегистрирован: Ср апр 04, 2012 09:55:53
Откуда: Северодонецк

Сообщение RoboC »

veso74 писал(а):Вариант: с помощью имеющегося таймера организовать "временное окно", в течение которого будете "замерять" входной сигнал.
Не путайте человека
СпойлерИзображение
Поменяйте МК на такой, у которого два таймера.
Ага, на stm32 :facepalm: (сарказм)
Вложения
прерывание таймера 2.png
(72.12 КБ) 506 скачиваний
У того, кто делает — получается редко. У того, кто не делает — не получается никогда.
Контактная информация:
Мудрый кот
Аватара пользователя
Сообщения: 1795
Зарегистрирован: Ср апр 04, 2012 09:55:53
Откуда: Северодонецк

Сообщение RoboC »

Если вы подаете на вход постоянно 1 , что у вас с выходом твориться?
У того, кто делает — получается редко. У того, кто не делает — не получается никогда.
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Открыл глаза
Сообщения: 57
Зарегистрирован: Пт дек 09, 2011 18:31:13

Сообщение rusman159 »

Если 1 на входе постоянная, то просто срабатывает выход на 760ms и всё.
(на фото а начале)
Изображение

Мартин, извиняюсь, я ошибся, у Вас и было указано сдвиг вправо (немного непривычная формулировка для меня, поэтому уточнил) деление на 2 звучит проще :)))

Но в итоге так и остается необходимость измерения времени между импульсами на входе, для вычисления времени включения входа.
Реклама
Открыл глаза
Сообщения: 57
Зарегистрирован: Пт дек 09, 2011 18:31:13

Сообщение rusman159 »

[uquote="Martian",url="/forum/viewtopic.php?p=4637146#p4637146"]по приходу импульса:
значение счётчика сохранить в переменную N со сдвигом вправо на 1 (делим на 2)
сбросить счётчик
инвертировать выход
запустить цикл до N.[/uquote]

Но тогда выход будет включен все время до прихода нового импульса, разве нет? Задача именно включить выход немного заранее ( 10-30ms) перед новым импульсом
Реклама
Открыл глаза
Сообщения: 57
Зарегистрирован: Пт дек 09, 2011 18:31:13

Сообщение rusman159 »

Завтра сделаю например от 0 до 5-10гц как происходит корректировка времени выхода
Друг Кота
Аватара пользователя
Сообщения: 15792
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

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

Сообщение rusman159 »

Задача простая, мк должен обеспечивать минимально короткий импульс на выходе при поступлении сигнала на вход.
И стремится при стабильной частоте к минимальному времени работы выхода, около 10ms.
При этом включение выхода должно быть еще до поступления сигнала на вход.

Вот осциллограммы с исходника из поста выше
Скорее всего мк ориентируется по времени между двумя прошлыми импульсами и исходя из этого времени заранее включает выход, чтобы на момент поступления сигнала на вход время работы выхода составило около 10мс ( в идеале), завтра сделаю замер, есть ли зависимость времени выхода от частоты.

Тут я вручную жал на кнопку, поэтому периоды разные, но мк +- подгоняет работы выхода под нужный интервал.
Изображение Изображение
Вот пример работы при стабильной частоте 25hz, частота может плавно меняться от 0 до 300hz и обратно
Изображение
Мудрый кот
Аватара пользователя
Сообщения: 1795
Зарегистрирован: Ср апр 04, 2012 09:55:53
Откуда: Северодонецк

Сообщение RoboC »

Изображение
В середине видно , что никаких там предсказаний и 10мс нет.
Скорее всего ПИД. Регулирующий импульс макс 760мс мин 0
ПЕресчет ПИД либо по таймеру и/или по ниспадающему фронту.
повторю вопрос при постоянной 1 на входе на выходе сигнал переодический или единичный?
Если единичный, то только по фронту, переодический = фронт+ таймер.
На фото видно и колебания и перерегулирование.
У того, кто делает — получается редко. У того, кто не делает — не получается никогда.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 15792
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Задачка предсказания для датчика положения ленты относительно нагревательных ножей фасовочного автомата?
Штука весьма неблагодарная и самим МК ничего особо не меняющая, если механика уже свой срок отработала...
8)
Открыл глаза
Сообщения: 57
Зарегистрирован: Пт дек 09, 2011 18:31:13

Сообщение rusman159 »

Это логика работы управления катушкой зажигания на старом скутере, около 10ms-время заряда катушки перед искрой.
Скорость нарастания около 30hz/сек.
повторю вопрос при постоянной 1 на входе на выходе сигнал переодический или единичный?
Если единичный, то только по фронту, переодический = фронт+ таймер.
При постоянной 1 на входе на выходе один единичный сигнал 760ms и всё
На фото видно и колебания и перерегулирование.
Да, так как я подавал сигнал нажатием на кнопку, отсюда и нестабильная частота на входе.
Вечером подключу генератор импульсов и сделаю замер выхода на 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
Изображение
Мудрый кот
Аватара пользователя
Сообщения: 1795
Зарегистрирован: Ср апр 04, 2012 09:55:53
Откуда: Северодонецк

Сообщение RoboC »

Исходник для 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++)
	{
		;
	}	
}
У того, кто делает — получается редко. У того, кто не делает — не получается никогда.
Контактная информация:
Поставщик валерьянки для Кота
Сообщения: 1975
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария

Сообщение veso74 »

[uquote="RoboC",url="/forum/viewtopic.php?p=4637705#p4637705"]Исходник для 629(в протеусе нет 508 :))) )[/uquote]
Вероятно снова шутите. Сделайте на 12F508 как в теме.
Изображение
Контактная информация:
Мудрый кот
Аватара пользователя
Сообщения: 1795
Зарегистрирован: Ср апр 04, 2012 09:55:53
Откуда: Северодонецк

Сообщение RoboC »

Отнюдь :dont_know: , но думаю rusman159 справится :music:
Изображение
У того, кто делает — получается редко. У того, кто не делает — не получается никогда.
Контактная информация:
Открыл глаза
Сообщения: 57
Зарегистрирован: Пт дек 09, 2011 18:31:13

Сообщение rusman159 »

RoboC, Спасибо!
Вечером буду проверять, вчера тоже пробовал через циклы, но столкнулся с одной проблемой ( скорее всего она звучит глупо)
При первом нажатии проверял

Код: Выделить всё

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;

}
      ;
   }  
Далее делаем действия и тд
Получилось так, что при нажатии кнопки я заходил в цикл и сразу вылетал через Break, так как кнопка была уже нажата.
Хотя с ставил KEY1=1;
Если вместо KEY1 Указывал KEY2, то как положенно заходил в первый цикл ожидания, включался выход, при нажатии второй кнопки выход отключался и цикл прерывался как положено.
Но с одной и той же кнопки не хотело работать :)))
Нужно как-то не учитывать ее состояние, либо только по переднему фронту проверять
Мудрый кот
Аватара пользователя
Сообщения: 1795
Зарегистрирован: Ср апр 04, 2012 09:55:53
Откуда: Северодонецк

Сообщение RoboC »

Так и сделано. Но учитываете что при задержке 2 мс макс. время полупериода не может быть больше 510мс, иначе переполнение.
У того, кто делает — получается редко. У того, кто не делает — не получается никогда.
Контактная информация:
Открыл глаза
Сообщения: 57
Зарегистрирован: Пт дек 09, 2011 18:31:13

Сообщение rusman159 »

RoboC, Проверил на мк, вместо bit tik пришлось поставить int tik
Результат получился обратный, импульс на выход подается После поступления импульса на вход
Изображение
Вот как должно быть, выход включается до поступления импульса на вход
Изображение
Открыл глаза
Сообщения: 57
Зарегистрирован: Пт дек 09, 2011 18:31:13

Сообщение rusman159 »

Взял на тест несколько PIC12F675, они уже с прерыванием.
Не могу разобраться со входами
По даташиту настроил 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
Ответить

Вернуться в «PIC»