Туплю с портами ATtiny13

Обсуждаем контроллеры компании Atmel.
Ответить
Нашел транзистор. Понюхал.
Сообщения: 160
Зарегистрирован: Сб дек 08, 2012 16:40:40

Сообщение Триод »

Есть автомобильная рация, которая не запоминает своё последнее состояние (вкл/выкл) после выключения зажигания. Решил добавить ей такую возможность. Повесил ATtiny13 (без обвязки). На пине PINB2 смотрю напряжение, если там еденица (рация включена), в ЕЕПРОМ записываю единичку. Если она выключена, соответсвенно пишится нолик. При очередном включении достаю это значение из ЕЕПРОМ и если там 1, то на 200 мс опускаю пин PINB4 в нолик для эмуляции нажатия кнопки питания.
Питание (+5В) на рации есть всегда, пока включено зажигание, вне зависимости от того, включена она или нет.
Нашёл точку, которую можно мониторить. Там скачут импульсы, но они очень редкие, а в основном при включенной рации там единица.

Программа под спойлером:
Спойлер

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


#ifndef F_CPU
#   define  F_CPU   9600000   
#endif
#include <avr/io.h>
#include <util/delay.h>
#include <avr/eeprom.h>

#define sbi(reg, bit)  (reg|=(1<<bit))
#define cbi(reg, bit)  (reg&=~(1<<bit))
#define ckbi(reg, bit) reg & (1<<bit) 


#define PIN_IN PINB2
#define PIN_OUT PINB4


uint8_t LastState EEMEM = 0; //При первом включении контроллера автоматического включения рации не будет

int main(void)
{
	
	uint8_t NowState;
	
    while(1)
    {
		
		LastState = eeprom_read_byte(&LastState);
		
		if (LastState==1)
		{
			
			//Включение кнопки 
			sbi(DDRB,PIN_OUT); //Порт на выход. т.к. порты по дефолту в ноле, то сразу будет ноль на пине
			_delay_ms(200);
			cbi(DDRB,PIN_OUT);// Переводим на вход в Z-состояние
			
		}
		
// Мониторим состояние рации (включена/выключена) и сохраняем это в EEPROM. Т.к. Этот цикл бесконечный и работает пока включено
// зажигание, то в EEPROM остаётся последнее состояние

		while (1)
		{
			
					if ((ckbi(PINB, PIN_IN))==0)
					{
						NowState=0;
					}
						else
					{
						NowState=1;
					}
				eeprom_update_byte(&LastState, NowState);
				
		}
		
    }
} 


Проблема в чём. На макетке всё работает отлично. Вешаю светодиодик между PINB4 и питанием, подаю единицу на PINB2, отключаю питание , включаю, светодиодик горит 200 мс. Соответственно, вешаю PINB2 на ноль, отключаю-включаю - ничего не горит. Ставлю всё в рацию - на PINB4 всегда еденица.

Если в картинках, то:
Рация включена:
Изображение


Выключаем зажигание, включаем снова:
Изображение

А вот так должно быть:
Это я подсоединил PINB2 на +5В и выключил-включил
Изображение

Ткните носом, где я туплю?
Реклама
Мучитель микросхем
Сообщения: 453
Зарегистрирован: Ср июн 08, 2011 20:25:20

Сообщение bob1 »

По программе:
1) первый цикл while(1) убрать.
2) Во втором цикле while(1) вы постоянно записываете EEPROM. Зачем ? Число записей в нее не бесконечно. Нужно производить запись только при условии изменения уровня. Если изменения на PIN_IN не происходит, то запись не производить. А так при снятии питания записывается в ячейку EEPROM скорее всего 0. Внести в цикл задержку для опроса вывода PIN_IN раз в секунду.
Контактная информация:
Реклама
Нашел транзистор. Понюхал.
Сообщения: 160
Зарегистрирован: Сб дек 08, 2012 16:40:40

Сообщение Триод »

bob1 писал(а): 1) первый цикл while(1) убрать.
Согласен, уберу.
bob1 писал(а): 2) Во втором цикле while(1) вы постоянно записываете EEPROM. Зачем ? Число записей в нее не бесконечно. Нужно производить запись только при условии изменения уровня. Если изменения на PIN_IN не происходит, то запись не производить.
Постоянной записи нет. Функция eeprom_update_byte() переписывает память только если новое значение отличается от того, что уже есть в памяти.
bob1 писал(а): А так при снятии питания записывается в ячейку EEPROM скорее всего 0
Думал об этом, но нет, нормально пишется. Последняя картинка это иллюстрирует.
bob1 писал(а):Внести в цикл задержку для опроса вывода PIN_IN раз в секунду.
Не совсем понятно что это изменит, но добавлю, отпишусь что изменится.
Мучитель микросхем
Сообщения: 453
Зарегистрирован: Ср июн 08, 2011 20:25:20

Сообщение bob1 »

Триод писал(а): Не совсем понятно что это изменит
Предполагаю, что записывается все таки 0 при выключении. Вывод будет опрашиваться раз в сек. Уменьшит вероятность "неправильной" записи.
По уму бы включить систему BOD.
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Нашел транзистор. Понюхал.
Сообщения: 160
Зарегистрирован: Сб дек 08, 2012 16:40:40

Сообщение Триод »

bob1 писал(а): По уму бы включить систему BOD.
А как это поможет? Напряжение питающее снимается моментально.
Реклама
Мучитель микросхем
Сообщения: 453
Зарегистрирован: Ср июн 08, 2011 20:25:20

Сообщение bob1 »

Триод писал(а):Напряжение питающее снимается моментально.
Не совсем. Для примера:

Изображение
Вложения
20140804_532308.jpg
(75.64 КБ) 804 скачивания
Контактная информация:
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2896
Зарегистрирован: Сб ноя 13, 2010 12:53:25
Откуда: приходит весна?

Сообщение B@R5uk »

Проблема скорее всего в том, что рация и микроконтроллер при пропадании питания отключаются не одновременно. Сначала рация, а потом микроконтроллер. Поэтому микроконтроллер перед выключением своего питания успевает записать в память тот факт, что рация выключена, что не верно.

Возможное решение проблемы: после того, как рация подала сигнал, что она выключилась, микроконтроллер должен выждать некоторое время и проверить в норме ли питание, если нет, то запись в EEPROM не производить. А контроллер может сохранять работоспособность чуть ли не до 1 вольта и меньше, хоть это и не гарантируется производителем.

Триод, приведите, пожалуйста, схему того, как МК и рация подключены к бортовой сети машины. Со всеми конденсаторами, диодами и дросселями. Это поможет понять какое время надо выждать.
Нашел транзистор. Понюхал.
Сообщения: 160
Зарегистрирован: Сб дек 08, 2012 16:40:40

Сообщение Триод »

Ребята, спасибо за идеи! BOD не помог, но добавил задержку 1.5 секунды перед записью в память, что бы не успевал записываться нолик после отключении зажигания и всё заработало как нужно!
Тему можно закрыть.

В очередной раз убеждаюсь в силу котов!!!
Собутыльник Кота
Аватара пользователя
Сообщения: 2896
Зарегистрирован: Сб ноя 13, 2010 12:53:25
Откуда: приходит весна?

Сообщение B@R5uk »

Очень рад за вас.

Но задержку надо выполнять только после того, как рация выключилась. Иначе возможна такая последовательность событий: вы включаете рацию, она посылает сигнал в МК, МК ждёт 1,5 сек, но в это время всё питание отключается, в результате МК не успевает записать в память, что рация включилась, и после включения питания, рация снова оказывается выключена. Такое может произойти, если включить рацию и тут же начать заводить машину. Попробуйте так сделать, пожалуйста.

Хотя стоп! Такое же может быть, если рацию выключить и тут же начать заводить машину. В память не запишется, что рация выключена. Надо подумать. :hunger:
Собутыльник Кота
Аватара пользователя
Сообщения: 2896
Зарегистрирован: Сб ноя 13, 2010 12:53:25
Откуда: приходит весна?

Сообщение B@R5uk »

Я понял! Надо в момент, когда рация послала сигнал, что выключилась, проверить подаётся ли на неё бортовое питание. Если нет, то нолик в память не записывать. Задержка не нужна, хоть она и проще. Лучше какой-нибудь простой быстродействующей детектор падения напряжения бортовой сети (но именно сети, а не питания МК).
Нашел транзистор. Понюхал.
Сообщения: 160
Зарегистрирован: Сб дек 08, 2012 16:40:40

Сообщение Триод »

B@R5uk писал(а): Попробуйте так сделать, пожалуйста.
Попробовал поиграться с блоком питанием - вроде бы всё логично отрабатывается. Завтра посмотрю как это в машине будет работать
B@R5uk писал(а):Я понял! Надо в момент, когда рация послала сигнал, что выключилась, проверить подаётся ли на неё бортовое питание. Если нет, то нолик в память не записывать. Задержка не нужна, хоть она и проще. Лучше какой-нибудь простой быстродействующей детектор падения напряжения бортовой сети (но именно сети, а не питания МК).
Это более верно, согласен. Можно использовать АЦП, но попробую пока без него - с задержкой.
Нашел транзистор. Понюхал.
Сообщения: 160
Зарегистрирован: Сб дек 08, 2012 16:40:40

Сообщение Триод »

В общем, два дня поездил, странностей либо неверной логики работы не замечено. Всё работает как нужно. Ещё раз спасибо за идеи!
Ответить

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