Страница 3 из 3

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

Добавлено: Чт окт 17, 2024 19:14:26
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
Изображение

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

Добавлено: Пт окт 18, 2024 09:38:28
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++)
	{
		;
	}	
}

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

Добавлено: Пт окт 18, 2024 09:57:34
veso74
[uquote="RoboC",url="/forum/viewtopic.php?p=4637705#p4637705"]Исходник для 629(в протеусе нет 508 :))) )[/uquote]
Вероятно снова шутите. Сделайте на 12F508 как в теме.
Изображение

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

Добавлено: Пт окт 18, 2024 10:05:37
RoboC
Отнюдь :dont_know: , но думаю rusman159 справится :music:
Изображение

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

Добавлено: Пт окт 18, 2024 13:18:26
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, то как положенно заходил в первый цикл ожидания, включался выход, при нажатии второй кнопки выход отключался и цикл прерывался как положено.
Но с одной и той же кнопки не хотело работать :)))
Нужно как-то не учитывать ее состояние, либо только по переднему фронту проверять

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

Добавлено: Пт окт 18, 2024 13:37:26
RoboC
Так и сделано. Но учитываете что при задержке 2 мс макс. время полупериода не может быть больше 510мс, иначе переполнение.

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

Добавлено: Пт окт 18, 2024 19:43:52
rusman159
RoboC, Проверил на мк, вместо bit tik пришлось поставить int tik
Результат получился обратный, импульс на выход подается После поступления импульса на вход
Изображение
Вот как должно быть, выход включается до поступления импульса на вход
Изображение

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

Добавлено: Чт окт 24, 2024 23:38:06
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