Attiny 2313. Не запоминает последний режим.

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 11
Зарегистрирован: Вт фев 14, 2012 19:39:41

Сообщение WG15 »

Доброго часа дня всем.
Собрал плату по схеме (во вложении "RGB светики", там же прошивка).
Схема раньше была размещена на сайте Atmega.ru, но сейчас сайт прикрыли.
Суть такая:
Нажатие R_______G_______B
1_______+
2_______________+
3________+
4_______+_______+
5_______________+_______+
6_______+_______+
7_______+_______+_______+
8
В общем всё работает, только вот после отключения питания не запоминает последнее состояние. Как сделать, чтобы запоминал последнее нажатие? Прошивал в низковольтном режиме (ISP) программатором GQ-4X. Также бывает, что проскакивают режимы.
Спасибо за помощь.
Вложения
RGB светики.rar
(356.18 КБ) 150 скачиваний
Последний раз редактировалось WG15 Вт май 21, 2013 08:38:08, всего редактировалось 1 раз.
Реклама
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

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

Как сделать, чтобы запоминал последнее нажатие?
Наверное, записывать в EEPROM.
Или нет ?
Реклама
vAv
Прорезались зубы
Сообщения: 221
Зарегистрирован: Пн июн 13, 2011 20:04:59
Откуда: Новочебоксарск

Сообщение vAv »

В тексте программы нет ни одной команды для запоминания состояния.
Контактная информация:
Родился
Сообщения: 11
Зарегистрирован: Вт фев 14, 2012 19:39:41

Сообщение WG15 »

vAv писал(а):В тексте программы нет ни одной команды для запоминания состояния.
Спасибо. В программировании я, как свинья в апельсинах. Пойду ковыряться с Flowcode AVR :facepalm:
Реклама
Эиком - электронные компоненты и радиодетали
vAv
Прорезались зубы
Сообщения: 221
Зарегистрирован: Пн июн 13, 2011 20:04:59
Откуда: Новочебоксарск

Сообщение vAv »

Для CVAR делается очень просто:
Спойлер

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

#include <tiny2313.h>

eeprom unsigned char temp;
unsigned char a;
void set_rgb (void);

interrupt [EXT_INT0] void ext_int0_isr(void) {  
    PORTB.0=0;
    PORTB.1=0;
    PORTB.2=0;    
    if (a >= 8){
        a=0;
    }   

    a++;
    temp = a; 
    set_rgb();
}

void set_rgb (void){
    switch (a){
        case 1:
            PORTB.0=1; break;
        case 2:
            PORTB.1=1; break;
        case 3:
            PORTB.2=1; break;
        case 4:
            PORTB.1=1; PORTB.2=1; break;
       
        case 5:
            PORTB.0=1; PORTB.2=1; break;
        
        case 6:
            PORTB.0=1; PORTB.1=1; break;
            
        case 7:
            PORTB.0=1; PORTB.1=1; PORTB.2=1; break;
            
        default:
            break;
    }
}
    
void main(void)
{
GIMSK=0b01000000;
MCUCR=0x03;
DDRB.1=1;       
DDRB.0=1;
DDRB.2=1;
#asm("sei")

// если temp не равно нулю, то восстанавливаем ее в а, иначе 0
    if (!temp) {
        a = temp;
    }else{
        a = 0;
        temp = 0;
    } 
set_rgb();
    
while (1)
      {
      };
}
И готовые хекс:
Вложения
rgb.hex
(1.05 КБ) 396 скачиваний
Контактная информация:
Реклама
Родился
Сообщения: 11
Зарегистрирован: Вт фев 14, 2012 19:39:41

Сообщение WG15 »

vAv писал(а):Для CVAR делается очень просто
Премного благодарен vAv, только вот у меня почему-то ничего не поменялось - не хочет запоминать :( Я так понимаю в Eeprom шить нужно?
Реклама
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Да, что-то и я не увидел там работы с EEPROM, может выложили не тот вариант?

А то что режимы проскакивают - это повидимому от того что дребезг контактов не устраняется.

подпрограммы записи в EEPROM приведены в даташите на контроллер, прям оттуда выдирай и пользуйся.
Только имей в виду - запись в EEPROM операция относительно длительная и ресурс перезаписи ячеек EEPROM ограничен. Впрочем, на пару лет его должно хватить точно.
Контактная информация:
vAv
Прорезались зубы
Сообщения: 221
Зарегистрирован: Пн июн 13, 2011 20:04:59
Откуда: Новочебоксарск

Сообщение vAv »

Не, не нужно. CAVR после объявления переменной как eeprom, автоматом добавляет в проект процедуры для работы с еепромом.
Поэтому по логике все нормально, а по сути - я не проверял. Просто скомпилировал то что добавил.
Насчет дребезга - он так же не устранен и в оригинальной прошивке.
Контактная информация:
Родился
Сообщения: 11
Зарегистрирован: Вт фев 14, 2012 19:39:41

Сообщение WG15 »

Alexeyslav
Взял из даташита.
Следующий пример кода покажет, как на С производить запись в EEPROM. В примерах
принято, что прерывания были отключены путем очистки бита I в Регистре Состояния SREG, так что прерывания
не сработают во время выполнения функций в примерах:

void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
{
while(EECR&(1<<EEPE))
;
EEAR=uiAddress;
EEDR=ucData;
EECR|=(1<<EEMPE);
EECR|=(1<<EEPE);
}

и

unsigned char EEPROM_read(unsigned int uiAdress)
{
while(EECR&(1<<EEPE))
;
EEAR=uiAdress;
EECR|=(1<<EERE);
return EEDR;
}

Я так понимаю это нужно соеденить с исходным кодом? А вот как и куда, чего вписывать? :(

http://m.radiokot.ru/forum/viewtopic.php?f=20&t=81743 тут вот что-то похожее человек спрашивал
vAv
Прорезались зубы
Сообщения: 221
Зарегистрирован: Пн июн 13, 2011 20:04:59
Откуда: Новочебоксарск

Сообщение vAv »

Если проект в code vision avr, то специально с еепром ничего мудрить не надо. Вот вырезка из справки:

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

Accessing the AVR internal EEPROM is accomplished using global variables, preceded by the eeprom or __eeprom memory attributes.
Example:


/* The value 1 is stored in the EEPROM during chip programming */
eeprom int alfa=1;
Т.е. для доступа во внутреннюю еепром использую глобальные переменные с атрибутами eeprom или __eeprom.
Все. Больше ничего не нужно.
Контактная информация:
Ответить

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