Муфты электромонтажные от производителя Fucon

Гирлянда на Atmega8 с управлением RC5

Новичок
 
Регистрация: 19.04.2011
Сообщений: 2
Репутация: 10
0 2
0 0
 
08.03.2015 13:14 #1
Здравствуйте!
Прошу помощи у знатоков!
Задача заключается в том, чтобы кнопкой power на пульте ДУ потушить гирлянду, а повторным нажатием на power включить гирлянду с того же case, на котором она была выключена?
Чтобы после подачи питания на контроллер (если питание было выключено) программа также продолжила работу с того же case на котором питание было выключено.

Что я не так делаю? Срабатывание от кнопки POWER не постоянное (иногда надо трижды нажать, чтобы произошло переключение программы или вызов программы после отключения питания). И не удается включить последнюю исполняемую программу после подачи питания (т.е. не задействую кнопку POWER, подать питание и сразу включилась бы последняя исполняемая программа).

Код:
#include "delay.h"
#include "rc5.h"
#include "main.h"


eeprom int d_eep;      

int lastCommand = 1;    // последняя полученная команда. Считываем её с eeprom       
int state = 0;           // состояние         

void main (void)

 {
    PORTB = 0b00000000; DDRB = 0b00000000;  // светодиоды и на РВ7 ИК-порт
    PORTC = 0b00000000; DDRC = 0b00000000;  // светодиоды
    PORTD = 0b00000000; DDRD = 0b11111100;  // светодиоды
        	Rc5_SetRx();
    
    lastCommand = d_eep;         
                    
#asm ("sei")            
      
               
    while(1)
        {
            if (rc5.dataOK) {
            rc5.dataOK = 0;      
            
            
            if (rc5.command == 12) {             // нажатие кнопки POWER  
                   if (state) {                  // если гирлянда включена
                   state = 0;      
                   PORTD=0b00000000; 
                   d_eep = lastCommand;          // тушим гирлянду и сохраняем lastCommand в eeprom   
                   }
                         else {
                                  state = 1;              
                                  lastCommand = d_eep;
                                  rc5.command = lastCommand; 
                                }   
            }                                                      
            if (state) // если включено 
            state = 1;     
               
            switch (rc5.command) {
            case 1: while (rc5.dataOK==0) {    // программа по нажатию 1
            lastCommand = rc5.command;         // сохраняем последнее нажатие 
            d_eep = lastCommand;     
                PORTD=0b00000100;
                delay_ms(500);   
                PORTD=0b00001000;
                delay_ms(500);
                PORTD=0b00000100;
                delay_ms(500); 
            } break;     
            
            case 2: while (rc5.dataOK==0) {    // программа по нажатию 2
            lastCommand = rc5.command;         // сохраняем последнее нажатие 
            d_eep = lastCommand;      
                PORTD=0b00001100;
                delay_ms(500);   
                PORTD=0b00011000;
                delay_ms(500);
                PORTD=0b00010100;
                delay_ms(500);
            } break;

            case 3: while (rc5.dataOK==0) {     // программа по нажатию 3
            lastCommand = rc5.command;          // сохраняем последнее нажатие  
            d_eep = lastCommand;
                PORTB=0b00000000;
                PORTD=0b00000100;
                delay_ms(100);
                PORTB=0b00000000;
                PORTD=0b00001100;
                delay_ms(100);
                PORTB=0b00000000;
                PORTD=0b00011100;
                delay_ms(100);
                PORTB=0b00000000;
                PORTD=0b00111100;
                delay_ms(100);
                PORTB=0b00000000;
                PORTD=0b01111100;
                delay_ms(100);  
                PORTB=0b00000000;
                PORTD=0b11111100;
                delay_ms(100);
                PORTB=0b00000001;
                PORTD=0b11111100;
                delay_ms(100);
                PORTB=0b00000011;
                PORTD=0b11111100;
                delay_ms(100);
            } break;
         }               
      }                  
   }
        delay_ms(700);   
        rc5.dataOK = 0;         
}
Вложения
Тип файла: rar RC5.rar (111.6 Кб, 0 просмотров)
Оценка
В многообразии литиевых батареек и аккумуляторов нет какого-то универсального или идеального варианта. Выбирая тот или иной вариант для питания устройства, разработчику приходится оперировать множеством параметров, используя наиболее оптимальное их сочетание для каждого приложения. Разберем параметры для различных приложений.
Новичок
 
Регистрация: 08.05.2012
Сообщений: 184
Репутация: 36
26 6
0 4
 
09.03.2015 09:30 #2
а если так
eeprom int d_eep@0x10;
тогда у вас переменная точно будет сидеть на своем месте в еепром
Оценка
Новичок
 
Регистрация: 09.02.2008
Сообщений: 26
Репутация: 15
5 0
0 0
Отправить сообщение для ARV с помощью ICQ Отправить сообщение для ARV с помощью Skype™
 
09.03.2015 14:19 #3
Цитата:
Сообщение от Valaster
Что я не так делаю?
вы все делаете не так.
эффекты гирлянды нужно сделать асинхронными, т.е. по таймеру, а не задержками в главном цикле. я бы вообще рекомендовал создать двумерный массив во FLASH, где по одному измерению номер эффекта, а по другому - последовательность, выводимая в порт. в этом случае по таймеру надо просто брать из массива очередной элемент в строке и выводить в порт.

в этом случае в основном цикле вы будете только принимать команды с пульта и их обрабатывать.
__________________
меня всегда можно найти здесь: http://arv.radioliga.com
Оценка
Новичок
 
Регистрация: 19.04.2011
Сообщений: 2
Репутация: 10
0 2
0 0
 
09.03.2015 23:22 #4
Цитата:
Сообщение от ARV
вы все делаете не так.
эффекты гирлянды нужно сделать асинхронными, т.е. по таймеру, а не задержками в главном цикле. я бы вообще рекомендовал создать двумерный массив во FLASH, где по одному измерению номер эффекта, а по другому - последовательность, выводимая в порт. в этом случае по таймеру надо просто брать из массива очередной элемент в строке и выводить в порт.

в этом случае в основном цикле вы будете только принимать команды с пульта и их обрабатывать.
Спасибо за вариант решения задачи.
Буду разбираться.
Оценка
Новичок
 
Регистрация: 20.11.2012
Сообщений: 43
Репутация: 25
15 0
0 0
 
12.03.2015 14:40 #5
RC5 хорошо по прерываниям захватывается (ждешь первый перепад, отступаешь по таймеру 444мкс - пол импульса, далее через 888мкс фиксируешь состояния, и поскольку события достаточно редкие, декодирование выполняешь сразу в обработчике прерывания - соотв есть возможность прервать процесс, если в пакете ошибка) нагрузка минимальная. по готовности флаг. Тогда совершенно не важно что делаешь в главном цикле, главное чтобы все твои ожидания не стопорили прерывания и задействованный таймер не трогали, а так, просто "просыпаешь" посылку. Вообще в главном цикле обычно не хорошо ждать с целью выстроить длительный алгоритм в цепочку. Режешь алгоритм на элементарные стадии, сопоставляешь стадиям флаги. В главном цикле проверяешь флаги состояния (например таймер еще не вышел) если еще нужно ждать - просто пропускаешь обработку и даешь главному циклу крутиться дальше.
Оценка
Ответ
Похожие темы
Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход
Электронные компоненты. Бесплатная доставка по России
Часовой пояс GMT +3, время: 20:18.
Обратная связь РадиоЛоцман Вверх