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

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

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

Ткните носом, где я туплю?
Питание (+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);
}
}
}
Если в картинках, то:
Рация включена:

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

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

Ткните носом, где я туплю?