INT 21h

Домашняя страница самого страшного прерывания

Программное управление освещением в комнате

№ 3704 В разделах: Программирование Электроника от September 17th, 2011,

Я сделал Wiki svet.blindage.org с подборкой моих статей об умном освещении. Рекомендую перейти сразу на нее, если вы действительно хотите создать замену своей старой люстре своими руками.

Железная часть

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

Клевенкий индикатор от Futaba. Показывает отладочную информацию: оба канала PWM, свободное место в буфере (при ошибке передачи сбрасывается, чтобы передача могла начаться заново), 4 управляющих байта (команда и 3 параметра).

Моя отладочная плата, на которой собрано все устройство. Подключается к компьютеру через UART-USB преобразователь.

Управляющая программа. Подключается к UART-USB адаптеру и посылает команды в устройство. Сейчас устройство приняло команду ручного режима, зеленый диод светит с яркостью 10 (0A на дисплее). Яркость определяется в диапазоне от 0 до 255.

Планируется подключение через Bluetooth и управление освещением с помощью любого сотового телефона с установленной управляющей программой.

Программное обеспечение

Программа управления первой версии. Написана на Delphi на скорую руку.

Вторая версия программы. Как видите, умеет гораздо больше функционала и написана на Qt и C++.

А теперь как устроена программа микроконтроллера

Команды с компьютера отсылаются по UART в виде 4 байтов – управляющий код и 3 параметра. Я не использовал свою UART библиотеку и сделал прием команды с помощью прерывания, буфера и счетчика его заполненности. Прерывание сработает на приём 1 символа и уменьшит счетчик на единицу. По достижении счетчика нуля сработает условие, которое запишет байты из буффера в специальные переменные, с которыми будет идти дальнейшая работа. Использовать этот буффер напрямую я не рекомендую, т.к. прием данных идет медленно (в моем случае 9600 бод), а программа работает аж на 8 МГц. Получится так, что команда пришла одна, а параметры еще прийти не успели и что-то сработает не так как должно :)

volatile char uart_buffer[4]; 
volatile uint8_t uart_buffer_flag = 4; 

ISR(USART_RX_vect) {
    unsigned char data = UDR;
    uart_buffer_flag--;
    uart_buffer[uart_buffer_flag] = data; 
}

Следует обратить внимание на то, что при инициализации UART вы должны включить прерывание на приём (RXCIE). Это очень важно, иначе код работать не будет.

UCSRB = (1 << TXEN) | (1 << RXEN) | (1 << RXCIE);

Иногда у вас в линии может появиться ошибка и придет не 4 символа, а 3. А может даже 5. Для таких целей создан таймер, который сбросит счетчик буффера. Это немного неправильно, т.к. делает невозможным использование PWM1 и позже таймер будет заменен на обычный счетчик в теле основной программы, который сбросится при приёме очередного символа.

ISR(TIMER1_OVF_vect)
{
    //command sequence timeout
    uart_buffer_flag = 4;
    TCNT1 = 0x00FF;
}

void Init_Timer()
{
    TCCR1B = (1 << CS12);
    TCNT1 = 0x00FF;
    TIMSK = (1 << TOIE1);
}

Инициализация аппаратных ШИМов для управления 2 лентами (PWM0 и PWM2). Скоро будет еще добавлено 2 ленты, где будет использован 16 битный PWM1. Полезно прочитать статью , где хорошо описана реализация.

void Init_MOSFET1()             // OC0
{
    TCCR0 = (1 << WGM01) | (1 << WGM00) | (1 << CS00);  // setup PMW, no prescaler
    OCR0 = pwm1;
    DDRB |= (1 << DDB3);
}

void Init_MOSFET2()             // OC2
{
    TCCR2 = (1 << WGM21) | (1 << WGM20) | (1 << CS20);  // setup PMW, no prescaler
    OCR2 = pwm2;
    DDRD |= (1 << DDD7);
}

Разбор полученных команд я сделал в теле основной программы с помощью switch … case.

   while (1) {
        // if uart buffer full
        if (uart_buffer_flag == 0) {
            uart_command = uart_buffer[3]; //command
            uart_param1 = uart_buffer[2]; //param 1
            uart_param2 = uart_buffer[1]; //param 2
            uart_param3 = uart_buffer[0]; //param 3
            uart_buffer_flag = 4;       // make buffer empty
        }

        switch (uart_command) {
            case 0x30:
		// IDLE MODE
                //fprintf_P(&display, PSTR("\rIdle mode       \n                "));
                break;
            case 0x31: //31:00:00:XX - delay
		// DEMO MODE
		_delay_ms(uart_param3);
		sei();
		...

А теперь о самом главном. 4 шимов на mega88 мне конечно же не хватит. Нужны более маленькие МК для управления 10 лампами. Я хочу использовать attiny, отдавая им команды и принимая с них данные об освещенности через шину TWI (она же I2C). Когда я дополню свою TWI библиотеку функциями для slave устройств (), все микроконтроллеры смогут без проблем общаться и главный МК будет автоматически принимать решения на основе имеющихся данных от своих “деток”.

Я планирую сделать настенную панель управления, на которой будет всего 1 круговой шифратор, 1 кнопка и дисплей. Шифратором будет выставляться максимальный уровень освещенности. Кнопка будет служить переключателем между умным режимом и простой регулировкой яркости ламп. BlueTooth модуль (будет установлен в будущем) как и настольный компьютер работает с МК по UART и позволит сделать приложение для управления светом с помощью обычного сотового телефона.

Для управления 10 лампами и чтения данных с датчиков заказал 2 микросхемы ATtiny461-20PU. На них целых 6 ШИМов, TWI и куча ADC. Они будут располагаться в центре комнаты, чтобы расстояние между чипами не сильно влияло на качество передачи данных через шину TWI.

3 комментариев »

3 комментариев »

Comment by Alexus100 | September 17, 2011 @ 13:33:02

прикольно

Comment by ZiB | September 27, 2011 @ 19:19:34

Молодец, не стоишь на месте
Пиками не хочешь побаловаться, а то я себе свежий проггер собрал, старый жалко выбрасывать :)
http://ziblog.ru/2011/04/13/programmator-dlya-pic/

Comment by 21h | October 1, 2011 @ 00:28:27

ну читать конечно все не успеваю, но в рамках текущего проекта вроде все сростается.

пики это клево, но когда я закончу этот проект, хочу перейти на арм. если не жалко, отдавай мне. пригодится всяко.

Форма отправки комментария

CAPTCHA
*

Разрешенные HTML-теги:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

RSS RSS Feed только для этого поста |


Комментарии
  • Игорь: Все настроил, еще раз просмотрел видео и методом научного тыка все настроил и сохранил, все работает и обе...
  • 21h: Здравствуйте, Игорь! Я не знаю :) Думаю аналогично согласно инструкции к вашей радиостанции.
  • Игорь: Добрый день, просмотрел Ваше видео все доступно и ясно для 8 ми канальных радеек, но мне нада настроить 69...
  • Гоги: Есть инструкция к Моторолкам – она подходит к серии Motorola TLKR T4… Т8. В конце сетка частот и...
  • 21h: торчок давно уже не обновлял, как только закрыл сайт где он работал. да, это морда для opentracker. без...
  • Buter: Какова дальнейшая жизнь торчка? Он кстати веб-интерфейсом для OpenTracker выступает? Без OpenTracker работать...
  • 21h: понятия не имею. гуглите инструкцию к вашей радейке и сверяйтесь с ней.
  • Денис: хочу их подружить с uv5r
  • Денис: t-388 walkie talkie на эти шпаргалочек нет,или как приминить ваши к их настройке?
  • John: Стекла для электроник – техночас.ру