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

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

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

Сообщение 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
Изображение
Аватара пользователя
RoboC
Мудрый кот
Сообщения: 1795
Зарегистрирован: Ср апр 04, 2012 09:55:53
Откуда: Северодонецк
Контактная информация:

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

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

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

Сообщение veso74 »

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

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

Сообщение RoboC »

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

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

Сообщение 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, то как положенно заходил в первый цикл ожидания, включался выход, при нажатии второй кнопки выход отключался и цикл прерывался как положено.
Но с одной и той же кнопки не хотело работать :)))
Нужно как-то не учитывать ее состояние, либо только по переднему фронту проверять
Аватара пользователя
RoboC
Мудрый кот
Сообщения: 1795
Зарегистрирован: Ср апр 04, 2012 09:55:53
Откуда: Северодонецк
Контактная информация:

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

Сообщение RoboC »

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

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

Сообщение rusman159 »

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

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

Сообщение 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»