Переключение режима кнопкой.

Обсуждаем контроллеры компании Atmel.
Ответить
Встал на лапы
Сообщения: 131
Зарегистрирован: Вс май 08, 2016 22:45:48

Сообщение sTRog »

Нужно переключать два режима с одного на другой - кнопокй без фиксатора. В момент переключения может работать устройство, которое легко сажает всю батарейку, если держать ключ (полевой транзистор) открытым. Поэтому открываю ключ на 1 ms - так не сажает.
Однако, когда нажимаю кнопку, и МК ее обрабатывает - вся система вешается. Т.е. батарейка, которую я использую (литионка на 4 В), показывает 0.5 В. И единственный способ запустить снова работу - это разьеденить цепь и заново замкнуть.
Код использую такой
Спойлер

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

#include <util/delay.h>
#include <stdio.h>
#include <avr/io.h>
#include <avr/interrupt.h>

char mod = 0;
int FixTime = 5400;
volatile uint8_t i;
volatile uint8_t Sec;
int tp = 0; // time pain - время сколько бьет током.

ISR(TIM0_OVF_vect)
{
   if (!(++i%4)) //period 1s
   {   PORTB ^= (1<<PB0);
      Sec++;
   }
}

int main(void) {


   PRR = (1<<PRADC); // shut down ADC

        TIMSK0 = (1<<TOIE0);  // timer0 overflow interrupt enable
        TCCR0B = (1<<CS02) | (1<<CS00); // prescaler 1/1024

   DDRB |= (1<<PB0);
   i=0; Sec=0;

   sei();
   int RandTime = 3600 + random()%3600;
   
   DDRB |=(1<<2); //транзистор
   DDRB |=(1<<3); //cветодиод З
   DDRB |=(1<<4); //cветодиод К
   DDRB &=~(1<<1); //кнопка
 
while (1)
{
	
	if (mod==0) //если первый режим включен, то когда прошедшее время равно RandTime - подаем напряжение на ножку.
	{
			while (tp <= 20)
				{
			
			        PORTB &=~(1<<2);
					_delay_ms(100);
					PORTB |= (1<<2);
					_delay_us(1000);
					tp++; 
				}
				tp = 0;
			
	}
	else //если второй режим включен, то когда прошедшее время равно FixTime - подаем напряжение на ножку.
	{
		while (tp <= 20)
		{
			
	                PORTB &=~(1<<2);
			_delay_ms(4000);
			PORTB |= (1<<2);
			_delay_us(1000);
			tp++; 
		}
		tp = 0;		
	}
	
	
	if (PINB & (1<<1)) //Если на ножке есть напряжение то:
	{
		if (mod==0) //Если включен режим 0, меняем его на 1
		{
			mod = 1;
			
			Sec = 0; //обнуляем время

			_delay_ms(100);
			
			
			
		}
		else //Если включен 1 режим, меняем его на 0
		{
			mod = 0;
			
			Sec = 0; //обнуляем время
			
			_delay_ms(100);
			
			
		}
	}
}

    
}
И еще вопрос.
Микроконтроллер управляет через ключ в виде полевого транзистора можным устройством.
Если задать команду
Спойлерwhile (1)
PORTB &=~(1<<2);
_delay_ms(4000);
PORTB |= (1<<2);
_delay_us(1000);
То выдает сигнал раз в 4 сек.
Но если добавить после этого
СпойлерPORTB &=~(1<<2);
_delay_ms(4000);
PORTB |= (1<<2);
_delay_us(1000);
PORTB &=~(1<<2);
_delay_ms(1000);
PORTB |= (1<<2);
_delay_us(1000);
Т.е. должен срабатывать так: 4 сек ждет, сигнал, 1 сек ждет, сигнал, 4 сек ждет и т.д.
Но по факту работает так: 4 сек ждет, сигнал, 4 сек ждет и т.д.
Почему?
Реклама
Это не хвост, это антенна
Сообщения: 1492
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

В вашем случае нужно описать что за устройство, схема. Затруднения. И только потом код. Один код без описания и схем бесполезен.
Контактная информация:
Реклама
Встал на лапы
Сообщения: 131
Зарегистрирован: Вс май 08, 2016 22:45:48

Сообщение sTRog »

Меня интересует - есть ли ошибка в коде?
Это не хвост, это антенна
Сообщения: 1492
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

То есть ваше устройство - тайна великая, а здесь форум телепатов? Весь ваш код - ошибка. Что дальше?
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

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

Т.е. вешается батарейка до 0.5V, а показываем нам код и ищем в нём проблему. Где логика ? :dont_know:
Причём тут вообще код, если проблема с питанием ? :dont_know:
Реклама
Встал на лапы
Сообщения: 131
Зарегистрирован: Вс май 08, 2016 22:45:48

Сообщение sTRog »

Новая формулировка.
Режим (используется этот код) переключается самостоятельно, хотя ножка, которая испольняет роль кнопки - обесточена и подтянута резистором 5кОМ к массе.
Реклама
Электрический кот
Аватара пользователя
Сообщения: 1031
Зарегистрирован: Чт июн 20, 2013 00:00:58
Откуда: москва, м.Сходненская

Сообщение Mishany »

Без схемы - разговор ни о чем.
Встал на лапы
Сообщения: 131
Зарегистрирован: Вс май 08, 2016 22:45:48

Сообщение sTRog »

Изображение
Родился
Сообщения: 6
Зарегистрирован: Сб окт 22, 2016 18:10:32

Сообщение leo__b »

а вот так, без контроллера не пойдет? (извините за корявый рисунок).
Вложения
123132.jpg
(45.68 КБ) 436 скачиваний
Встал на лапы
Сообщения: 131
Зарегистрирован: Вс май 08, 2016 22:45:48

Сообщение sTRog »

leo__b писал(а):а вот так, без контроллера не пойдет? (извините за корявый рисунок).
Типо вибратор?
Просто микрокотроллер мне нужен - потому что светодиод должен зажигать в определенный интервал, а точнее, в случайное время казанного интервала.
Родился
Сообщения: 6
Зарегистрирован: Сб окт 22, 2016 18:10:32

Сообщение leo__b »

sTRog писал(а):
leo__b писал(а):а вот так, без контроллера не пойдет? (извините за корявый рисунок).
Типо вибратор?
Просто микрокотроллер мне нужен - потому что светодиод должен зажигать в определенный интервал, а точнее, в случайное время казанного интервала.
Из описания я понял, что по кнопке вам нужно получить одиночный ипмульс определенной длины. Это я просто нарисовал тригер + ограничитель длительности импульса, можно сказать - одновибратор по кнопке. В самом задании про переодичность не увидел, только в посл. коментарии... Вообще это можно реализовать на мелкой логике (счетчик), но тут зависит все от конкретного алгоритма, насколькоточен интервал д.б., если нужно то 4 сек, то 1 сек, то можно так: счетчик считает до 4 сек - схема выдает импульс, потом он считает до 1 сек - схема выдает тот же импульс - так? т.е. после каждого импульса изменяется число сброса счетчика. не тут нужно наверное как минимум 3 микрухи.
Это не хвост, это антенна
Сообщения: 1492
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

Конечные автоматы. Автоматное программирование. Цикл статей. Конкретно по вопросу часть 8.
Смысл следующий. Модульность программ. Нужно разбивать процессы на подзадачи. Дробить процессы. Чтобы добиться псевдопараллельности. Каждый модуль за итерацию основного цикла выполняет часть кода. Никаких долгих циклов. Процессы дробятся условиями, флагами, состояниями конечных автоматов.
Контактная информация:
Встал на лапы
Сообщения: 131
Зарегистрирован: Вс май 08, 2016 22:45:48

Сообщение sTRog »

А попроще можно в двух словах? В чем ошибка то, почему МК сам переключается?
Это не хвост, это антенна
Сообщения: 1492
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

В двух словах никак не получится. Тут много моментов. Вам попросту не хватает знаний и опыта.

1 - Дребезг контактов. Ищите информацию самостоятельно в поисковиках.
2 - При выполнении задержек delay МК выполняет только эту задачу. Грубо, он вешается на время выполнения задержек. Поставили 100 мс, все это время МК выполняет только эту задачу. Решается это только программными таймерами.

Так что берите паузу и читайте цикл статей с самого начала и внимательно.
Контактная информация:
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 378
Зарегистрирован: Сб сен 19, 2009 07:02:19

Сообщение shindax »

Demiurg писал(а):...Так что берите паузу и читайте цикл статей с самого начала и внимательно.
Ну или сделать на Arduino. Так, глядишь, весь мусор отвалится и каждый, наконец, займется своим делом. :)
Последний раз редактировалось shindax Вс окт 23, 2016 09:48:03, всего редактировалось 1 раз.
Это не хвост, это антенна
Сообщения: 1492
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

shindax писал(а):
Demiurg писал(а):...Так что берите паузу и читайте цикл статей с самого начала и внимательно.
Ну или сделать на Arduino. Так, глядишь, весь мусор и отвалится. :)
ардуина не панацея. там такие же задержки delay.
Контактная информация:
Друг Кота
Сообщения: 19495
Зарегистрирован: Чт фев 20, 2014 18:57:55

Сообщение Morroc »

Не панацея против такого :)) Совет был с некоторой долей сарказма, IMHO.
На ардуине как то так можно, можно и без ардуины точно так же

...
if (<условие включения чего то на ноге 2 с учетом дребезга и т.п.>) {
digitalWrite(2, HIGH);
pin_2_TimerOff = millis() + 4000; // заводим будильник на 4 сек
}
...
if ((digitalRead(2)==HIGH)&&(pin_2_TimerOff > millis()) digitalWrite(2, LOW); // выключаем через 4 сек
...

ну и подумать что делать при переполнении таймера если это критично.
Те самые конечные автоматы про которые советовали почитать в общем.
"Вся военная пропаганда, все крики, ложь и ненависть исходят от людей, которые на эту войну не пойдут !" / Джордж Оруэлл /
"Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /
Встал на лапы
Сообщения: 131
Зарегистрирован: Вс май 08, 2016 22:45:48

Сообщение sTRog »

Demiurg писал(а):В двух словах никак не получится. Тут много моментов. Вам попросту не хватает знаний и опыта.

1 - Дребезг контактов. Ищите информацию самостоятельно в поисковиках.
2 - При выполнении задержек delay МК выполняет только эту задачу. Грубо, он вешается на время выполнения задержек. Поставили 100 мс, все это время МК выполняет только эту задачу. Решается это только программными таймерами.

Так что берите паузу и читайте цикл статей с самого начала и внимательно.
Дребезг у странил. Я говорил, что мк переключается сам, даже без нажатия кнопки, хотя резистором ножка (которая отвечает за кнопку) притянута к массе. Так что дребезг тут не причем.
Это не хвост, это антенна
Сообщения: 1492
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

WatchDog включен? Если включен, то какое время сброса сторожевого таймера и какие у вас задержки? Во время задержек в цикле delay МК больше ничего не делает, также как и не выполняет команду wdr.
Контактная информация:
Встал на лапы
Сообщения: 131
Зарегистрирован: Вс май 08, 2016 22:45:48

Сообщение sTRog »

Это все замечательно, но никто так и не ответил, почему переключаются режимиы, если на ножку, которую програмно подключаю кнопку - на самом деле ничего не вешаю, только к массе резистором заземляю.
Ответить

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