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

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

Сообщение rusman159 »

Добрый вечер!
Имеется мини отладочная плата и PIC12F508
Пробую простейшие программы со светодиодами
Не могу разобраться, почему уровни 0=включено, 1= выключено.
К примеру GPIO = 0b00000011; выключает два светодиода на ногах GP0 и GP1
Кнопки тоже работают наоборот, в чем может быть проблема?

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

#include <xc.h>
// chip=PIC12F508

// CONFIG
#pragma config CP = OFF    // Code protection off 
#pragma config OSC = IntRC // internal RC oscillator 
#pragma config MCLRE = ON  // GP3/MCLR pin function is MCLR 
#pragma config WDT = OFF   // WDT disabled 


#define _XTAL_FREQ 4000000L
//#define BUTTON GPIO0
#define LED1 GP0
#define LED2 GP1
#define KEY1 GP2
#define KEY2 GP5
void main(void)
{
  GPIO = 0x00; // 
  OPTION = 0b11000000; // Подтяжка и пробуждение по входам отключены
  TRIS = 0b11111100; // GP1,GP2 = output
  GPIO = 0x00; 
  int flag=0;
  
while (1)
{
    LED1=1;
    LED2=0;
}
}
Тут LED1 не горит, LED2 горит
Реклама
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

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

Сообщение rusman159 »

Мини отладочная плата.
Кнопки подключают GND к пинам + подтяжка к +5в через резисторы 10к
На светодиоды идут +5в через резисторы, второй контакт на МК, те МК подает на них землю
Изображение
Последний раз редактировалось rusman159 Пн окт 14, 2024 07:41:35, всего редактировалось 1 раз.
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

:facepalm:
Реклама
Эиком - электронные компоненты и радиодетали
Открыл глаза
Сообщения: 57
Зарегистрирован: Пт дек 09, 2011 18:31:13

Сообщение rusman159 »

Спасибо большое!

Добавлено after 1 hour 8 minutes 43 seconds:
Еще возник вопрос, как работать с таймером TMR0 ?
Необходимо вычислить время между двумя импульсами на ноге GP0 или GP1
Как можно настроить таймер на счет времени и куда будет записываться значение?
не смог найти примеры на 12f508, но ранее с таймерами на pic не работал
Реклама
Поставщик валерьянки для Кота
Сообщения: 1975
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария

Сообщение veso74 »

Начало деятельности именно с PIC12F508 не OK. Его ресурсы слишком ограничены. Напр. по TMR0 - нет interrupt при переполнении. Вообще нет interrupts. Вариант: на той же пробной плате замените МК на другой из серии: PIC12F675, PIC12F683, PIC12F1822, PIC12F1840 ...
Контактная информация:
Реклама
Мудрый кот
Аватара пользователя
Сообщения: 1795
Зарегистрирован: Ср апр 04, 2012 09:55:53
Откуда: Северодонецк

Сообщение RoboC »

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

Сообщение rusman159 »

У меня есть устройство на чипе 12с508 ( вроде как ), но прочитать его не смогу.
насколько я понимаю, там реализация такая:
1 вход
1 выход
При поступлении первого и (если он единственный) импульса на вход мк включает выход на 0.7сек
Потом со 2 и далее импульса мк сокращает время включения выхода примерно до 10ms по замерам осциллографом, но самый нюанс в том, что мк должен включить выход заранее, когда импульс на вход еще не поступил.
Т.е необходимо сделать замер времени между двумя импульсами на входе и при поступлении 2, 3 и далее импульсов заранее ( за 10-15ms ) до предполагаемого импульса включаем выход, при поступлении импульса отключаем выход, делаем перерасчет времени и всё сначала.
Как мне кажется, это можно сделать только таймером, или как еще можно рассчитать время между двумя прошлыми импульсами, чтобы заранее включить выход?
Пример во вложении (нажать для увеличения)
Изображение
Последний раз редактировалось rusman159 Ср окт 16, 2024 14:14:15, всего редактировалось 1 раз.
Мудрый кот
Аватара пользователя
Сообщения: 1795
Зарегистрирован: Ср апр 04, 2012 09:55:53
Откуда: Северодонецк

Сообщение RoboC »

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

Сообщение rusman159 »

[uquote="RoboC",url="/forum/viewtopic.php?p=4636985#p4636985"]По ослику он его включает по ниспадающему фронту, фиксированной длинны. :roll:[/uquote]
Да, так как для замеров на входе был сигнал около 25hz
Опытным путем ( при нажатии кнопки рукой, либо с генератора ) мк начинает подстраивать включение выхода заранее, чтобы время накопления было около 10ms ( т.е лампочка, которая подключена на выход загорается всего 10ms+- ), но включена или выключена сейчас не суть важно, главное как включить заранее)

Добавлено after 2 minutes 22 seconds:
[uquote="rusman159",url="/forum/viewtopic.php?p=4636989#p4636989"][uquote="RoboC",url="/forum/viewtopic.php?p=4636985#p4636985"]По ослику он его включает по ниспадающему фронту, фиксированной длинны. :roll:[/uquote]
Да, так как для замеров на входе был сигнал около 25hz
Опытным путем ( при нажатии кнопки рукой, либо с генератора ) мк начинает подстраивать включение выхода заранее, чтобы время накопления было около 10ms ( т.е лампочка, которая подключена на выход загорается всего 10ms+- )[/uquote]
Если 12f508 не может посчитать время между импульсами, то кто из его братьев сможет? Например 12f629?
Но от производителя информация была именно о чипе 12c508 ( без маркировки на нем )
Мудрый кот
Аватара пользователя
Сообщения: 1795
Зарегистрирован: Ср апр 04, 2012 09:55:53
Откуда: Северодонецк

Сообщение RoboC »

У вас грубо период 40мс . Вы постоянно считываете в цикле состояние сигнала с входа(желтый сигнал GP0, предположим) и как только он станет равным 0 GP1 =1 задержка 30 мс GP1=0(красный сигнал) и вернулись к считыванию состояния сигнала.
У того, кто делает — получается редко. У того, кто не делает — не получается никогда.
Контактная информация:
Открыл глаза
Сообщения: 57
Зарегистрирован: Пт дек 09, 2011 18:31:13

Сообщение rusman159 »

А если заранее неизвестна частота или период? Условно от 2 до 300hz, тогда опять возвращаемся к необходимости вычислить время между прошлыми импульсами.
Т.е сейчас скорость вентилятора 5hz, далее изменилась до 150hz и каждый раз нужно включать выход заранее на 10ms
Необходимо использовать таймер, ведь так?
Мудрый кот
Аватара пользователя
Сообщения: 1795
Зарегистрирован: Ср апр 04, 2012 09:55:53
Откуда: Северодонецк

Сообщение RoboC »

Вы "ЗАРАНЕЕ" никак не узнаете при изменяющейся частоте. С таймером или без, т.к. вам неизвестно будет на сл. импульсе период больше или меньше. Скорее всего вы не правильно интенсифицируете полученные данные.
У того, кто делает — получается редко. У того, кто не делает — не получается никогда.
Контактная информация:
Открыл глаза
Сообщения: 57
Зарегистрирован: Пт дек 09, 2011 18:31:13

Сообщение rusman159 »

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

Сообщение RoboC »

Т.е. абстрактно это должно работать так с максимальной длинной импульса ~255 мс?

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

  	time=0;
	duration=0;
	tik=0;
	while(1)
	{
		if ((KEY_PULS == 1)&(tik==0))	{tik=1;	time=0;}	
		if ((KEY_PULS == 0){tik=0;duration=time;load =1; }																			
		delay_1ms();
		if (tik) { time++;}
				else
				{	
					if (duration==0) {
										load =0;}
					else {
										duration--;}
				}
	}
У того, кто делает — получается редко. У того, кто не делает — не получается никогда.
Контактная информация:
Открыл глаза
Сообщения: 57
Зарегистрирован: Пт дек 09, 2011 18:31:13

Сообщение rusman159 »

Все работает и на более низкой частоте, вот к примеру 1 и 2 картинка.
Первый импульс, после него сделал задержку, выход был включен максимальное время 760ms, далее со 2 и далее импульса начинается подстройка, тут время работы выхода не 10мс, а около 80-100ms, но оно подстраивается с повышением частоты.
Изображение
в середине частота около 1.75-2hz, всё отрабатывает корректно. ( сделаем погрешность на мою неравномерность подучи импульсов)
Изображение
Далее подал импульсы ( вручную ) около 7hz, не очень равномерно, но результат работы +- стабильный.
Изображение
Т.е вот такую логику работы и нужно получить.
Открыл глаза
Сообщения: 57
Зарегистрирован: Пт дек 09, 2011 18:31:13

Сообщение rusman159 »

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

Сообщение RoboC »

С максимальным делителем таймер переполнится за 1/15с . Забудьте в про таймер в этом мк в отношении к вашей задаче.
Разберитесь с алгоритмами предложными мной и описанным Martian.
За вас код никто не напишет, но вас поправят и подскажут.
Вы движетесь , пока, не туда.
У того, кто делает — получается редко. У того, кто не делает — не получается никогда.
Контактная информация:
Открыл глаза
Сообщения: 57
Зарегистрирован: Пт дек 09, 2011 18:31:13

Сообщение rusman159 »

Я для себя понимаю примерный алгоритм работы, но по идее нужен отдельно таймер либо отдельный независимый процесс, который будет считать время между импульсами, и отдельно кусок программы на всё остальное.
Код естественно буду пробовать писать самостоятельно.

В алгоритме мартина не совсем понял про сдвиг 1 влево.
Позавчера проводил эксперименты с функцией __Delay, при ее работе контроллер стоит на месте, ждет.
Для теста заменил ее на цикл for где просто было N=N+1; и проверка нажатия кнопки, по замерам осциллографом 12500 сложений=500ms, 250 сложений=10ms.
Была идея по приходу импульса запускать цикл for, по второму приходу останавливаем, таким образом будет известно время ( количество сложений) между импульсами, но возникла проблема, нужно же параллельно запускать еще один цикл по приходу импульса на вход, который будет равен прошлое время минус 15ms к примеру, и он будет включать выход.
Но параллельно два цикла работать не смогут, либо нужен цикл внутри цикла. :cry:

Добавлено after 23 minutes 56 seconds:
Набросал блок схему, она не совсем полная, тут скажем так на один цикл работы, далее все по кругу
Изображение
Поставщик валерьянки для Кота
Сообщения: 1975
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария

Сообщение veso74 »

Измерение временных характеристик сигналов одним таймером (и у которого нет interrupt при преполнения) - это своего рода "мазохизм" :П.
Вариант: с помощью имеющегося таймера организовать "временное окно", в течение которого будете "замерять" входной сигнал. Но без interrupt в таймере метод опять полный беспорядок. Приходится постоянно "проверять", сколько времени прошло от предыдущего события или предыдущего сброса. С задержкой на чтение и вычитанием сравнения - метод снова бессмысленен. И это должно быть помещено в 25 байт SRAM :). Поменяйте МК на такой, у которого два таймера. Один: для отчета о времени, другой: для состояния входного сигнала – передний/задний фронт. А после анализа времени запускайте/останавливайте другие выходы по мере необходимости. (частично пользуюсь переводчиком)
Контактная информация:
Ответить

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