1. Конструктор K595

Re: 1. Конструктор K595

Сообщение VVZ » 24 фев 2015, 02:44

11. Модуль управления K5M6v2 с мк ATMEGA8.

Электрическая схема текущей версии печатной платы. Сигнал AN к выводу 28 мк не подводится, элементы R5, R6 не устанавливаются !

Изображение

Разъёмы X1 DJK-02A; X2PBS-4 (для подключения модуля HC-06); X3PBD-12 (подключение модуля ZG-01 - внешний тактовый сигнал); X4PBS-8R (для управления модулями в линию) или PLH-8 (для бегущей строки); R1-R410кОм; C1, C2 0.1 мкФ.

На изображении топология печатной платы (плата односторонняя, вид сквозь стеклотекстолит).

Изображение

На плате рядом с панелькой микроконтроллера устанавливаются два разъёма PBS-4 (подключение модуля для шлейфа от программатора).

Изображение

k5M6v2.zip
Файл печатной платы (lay6)
(8.6 KiB) Скачиваний: 753
VVZ
 
Сообщений: 589
Зарегистрирован: 28 апр 2011, 09:44

Re: 1. Конструктор K595

Сообщение VVZ » 26 фев 2015, 05:03

12. Модуль управления K5M2v1 с мк ATtiny13A (с аккумулятором 3,7 в).

На плате модуля устанавливается держатель для аккумулятора типа 14500 (размер обычной батарейки AA) и выключатель питания. Заранее запрограммированный микроконтроллер устанавливать в панельку :

Изображение

Электрическая схема модуля :

Изображение

Разъём X1PBS-8R; K1 - PS850L (с фиксацией); K2 - тактовая кнопка; R1, R210 кОм; C1 0.1 мкФ; Аккумулятор - 14500 (3.7 в, размер пальчиковой батарейки АА).

Печатная плата модуля односторонняя (вид со стороны установки элементов) :

Изображение

K5M2v1.zip
Файл печатной платы (lay6)
(3.35 KiB) Скачиваний: 737
VVZ
 
Сообщений: 589
Зарегистрирован: 28 апр 2011, 09:44

Re: 1. Конструктор K595

Сообщение VVZ » 05 мар 2015, 01:54

13. Конструктор K595 и работа на макетке с мс 74HC595.

На изображении сборка на макетке - вариант Бегущей строки 5x8. На макетке установлено пять мс 74HC595, микроконтроллер Attiny13 и блютуз-модуль HC-06 (прием с телефона и отображение буквы О) :

Изображение

Файлы для скачивания в сообщении Модули для мс 74HC595.
VVZ
 
Сообщений: 589
Зарегистрирован: 28 апр 2011, 09:44

Re: 1. Конструктор K595

Сообщение VVZ » 27 мар 2015, 03:25

14. Программа SerialRegUART – программный UART с выводом байта на регистр.

Программа SerialRegUART— приём по последовательному каналу байта (скорость 9600, по-умолчанию для модулей HC-06) и вывод его через программный SPI на регистр 74HC595.

Фьюзы 3F-FF-7A. (Фьюзы микроконтроллера по-умолчанию 3F-FF-6A, меняется только состояние фьюза LF-CKDIV8 — снимается делитель на 8 (6A-->7A), частота мк 9,6 мГц).


Код: выделить все
//MCU = ATtiny13a
//F_CPU = 9600000

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

/* Подключение файла с различными обьявлениями макросов
* для дальнейшего использования их в программе.
*/
#include "definitions.h"

#define SPEED 100      //период опроса входного сигнала

void loadByte(uchar byte);              // передать байт на регистр


static void byte_received(uchar data);  // функция приема байта по UART
static void byteReceive();              // обработка принятого байта

// обработчик прерывания PCINT0
ISR(PCINT0_vect, ISR_BLOCK) {
    if(bit_is_clear(PINB, RX)) {
        RECEIVE_START;      // запретить прерывания PCINT0 на время приёма
        byteReceive();      // начать прием байта
    }
}

int main(void) {
    PORTB = 0b11101000;
    DDRB =  0b00000111;

    GIMSK = (1 << PCIE);
    PCMSK = (1 << RX);         //PCINT на RX

    sei();
    for(;;) {}
}


// передать байт на регистр
void loadByte(uchar byte) {
    uchar i;
    for(i = 0; i < 8; ++i) {        // Последовательная передача 8 бит на регистр
        if((byte & 0x80) == 0)
            DATA_LOW;
        else
            DATA_HIGH;
        SHIFT_CLOCK;                // Тактирующий импульс после каждого бита
        byte <<= 1;
    }
}

// функция приема байта по UART
void byteReceive(void) {
    sei();
    uchar buf = 0;      // байт в который будут последовательно записываться биты
    uchar i;

    _delay_us(SPEED/2);
    if(bit_is_clear(PINB, RX))     // Проверка, точно ли это был стартовый бит
        buf = 0;
    else {                     // Если все же помеха, то закончить прием
        RECEIVE_END;
        return;
    }

    for(i = 0; i < 8; i++) {        // Прием 8 бит по UART
        _delay_us(SPEED);
        buf >>= 1;
        if(bit_is_set(PINB, RX))
            buf |= 0b10000000;
    }

    _delay_us(SPEED);
    RECEIVE_END;
    byte_received(buf);            // Обработка полученного байта
}

// обработка принятого байта
void byte_received(uchar data) {
    loadByte(data);                 // Загрузить полученный байт в регистр
    STATE_LOAD;
}

Дмитрий Лиман (студент НИЯУ МИФИ)

SerialRegUART.zip
Архив для WinAVR
(22.48 KiB) Скачиваний: 753

Настройка приёма :

Строка программы “#define SPEED 100” отвечает за качество приёма байта. Величина SPEED зависит от скорости приёма (здесь 9600) и рабочей частоты микроконтроллера, которая может несколько отличаться от паспортной частоты 9,6 мГц.

Например, отправляем число 64 (01000000) и смотрим на приём.
Установлено, что для скорости 9600 величина SPEED менялась от 94 до 105, обеспечивая достоверность приёма (для микроконтроллера, оказавшегося под рукой). Соответственно для SPEED выбрана средняя величина равная 100.

Что наблюдалось на приёме за пределами диапазона (94-105) :

При установке SPEED = 92 (уменьшенный период опроса входного сигнала) принималось не число 64 (01000000), а число 128 (10000000). Объясните почему ?

При установке SPEED = 107 (увеличенный период опроса входного сигнала) принималось не число 64 (01000000), а число 160 (32+128, 10100000). То есть, происходит смещение в другую сторону, где 32 – это информация от принятого байта, а 128 – это от стопового бита. Объясните почему ?

В случае с микроконтроллером, который окажется у Вас, величина SPEED может несколько отличаться (не 100, а например 96 или 104) и она определяется экспериментальным путём, учитывая вышеизложенную информацию и правильные ответы на вопросы.

Дополнительно!

Как вариант подстройки частоты микроконтроллера, из темы "Примеры для ATtiny13":
19. Подстройка частоты RC-генератора и регистр OSCCAL.
VVZ
 
Сообщений: 589
Зарегистрирован: 28 апр 2011, 09:44

Re: 1. Конструктор K595

Сообщение VVZ » 27 мар 2015, 14:01

15. Программа SerialShiftCount – вывод светодинамических рисунков.

SerialShiftCount – программа-автомат, выводит последовательно различные светодинамические рисунки через программный SPI на восемь модулей K595L1v1 с регистрами 74HC595 (8x8 – 64 светодиода). Тактирование рисунков - внутреннее (здесь скорость постоянная).

Фьюзы мк — 3F-FF-7A. (Фьюзы микроконтроллера по-умолчанию 3F-FF-6A, меняется только состояние фьюза LF-CKDIV8 — снимается делитель на 8 (6A-->7A), частота мк 9,6 мГц). Эта программа может использоваться для любых вариантов соединения модулей, в том числе и для варианта "бегущая строка".

Код: выделить все
//MCU = ATtiny13a
//F_CPU = 9600000

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>


// Подключение файла с различными объявлениями макросов
// для дальнейшего использования их в программе.
//
#include "definitions.h"


#define NEW_MODE (mode & 0b00111111) == 0       // Проверка на начало нового режима

int mode = 0;
/*   описание битов mode:
    0-3 bit - этап
    4 bit - направление (влево/вправо)
    5 bit - счет/сдвиг
    6 bit -   движение по строке/диагонали
    7-9 bit - стартовая позиция
*/

// Массив стартовых позиций для режима сдвига
uchar start_pos[] = {0b00000001,
                     0b00001111,
                     0b00010001,
                     0b00011111,
                     0b01111111};


void updateRegisters(uchar row, uchar column);  // записать рисунок на 8 последновательных регистров
void loadByte(uchar byte);          // Загрузить байт в регистр

void next_step(uchar *row, uchar *column);            // Перейти к следующему "шагу" в светодинамическом рисунке.
uchar make_move(uchar port);      // Определение режима: сдвиг или счет.

uchar shift(uchar port);         // Определение направления сдвига
uchar shift_left(uchar port);      // Сдвиг влево
uchar shift_right(uchar port);      // Сдвиг вправо

uchar count(uchar port);         // Определение направления счета
uchar count_left(uchar port);      // Счет влево
uchar count_right(uchar port);      // Счет вправо


/* Тактирование от таймера
* Частота тактирования (clock) вычисляется по следующей формуле:
* clock = F_CPU / tim_pres / (OCR0A + 1), где tim_pre - предделитель таймера.
* В нашем случае F_CPU = 9600000, tim_pre  1024, и OCR0A = 255:
* clock = 9600000 / 1024 / 256 = 36.6 Гц
*/
ISR(TIM0_COMPA_vect) {
    static uchar cnt = 0;
    static uchar row, column;

    cnt++;
    if(cnt == 8) {                       // Делитель частоты тактирования рисунка
        cnt = 0;
        next_step(&row, &column);        // Перейти к следующему "шагу" в светодинамическом рисунке.
        updateRegisters(row, column);    // Записать рисунок на 8 последновательных регистров
        STATE_LOAD;                      // Выгрузить на выходы новое состояние регистров
    }
}


int main(void) {
    PORTB = 0b11111000;
    DDRB =  0b00000111;

    TCCR0A = 0x02;              // Режим сброс по совпадению
    TCCR0B = 0x05;              // Предделитель на 1024

    OCR0A = 255;
    TIMSK0 = 1 << OCIE0A;       // Разрешение прерываний таймера по совпадению

    sei();
    for(;;) {

    }
}


// записать рисунок на 8 последовательных регистров
void updateRegisters(uchar row, uchar column)
{
    uchar rowCnt;
    for(rowCnt = 0; rowCnt < 8; ++rowCnt) {     // Последовательная запись 8 байт на регистры
        if((row & 0x80) == 0)
            loadByte(0);
        else
            loadByte(column);
        row <<= 1;
    }
}


// Загрузить байт в регистр
void loadByte(uchar byte) {
    uchar i;
    for(i = 0; i < 8; ++i) {        // Последовательная передача 8 бит на регистр
        if((byte & 0x80) == 0)
            DATA_LOW;
        else
            DATA_HIGH;
        SHIFT_CLOCK;                // Тактирующий импульс после каждого бита
        byte <<= 1;
    }
}


// Перейти к следующему "шагу" в светодинамическом рисунке.
void next_step(uchar *row, uchar *column)
{
    if(bit_is_clear(mode,6)) {            // Движение по столбцам
        if( NEW_MODE ) {               // Если новый режим, то установить начальное значение
            *row = 0xFF;
            *column = start_pos[mode>>7];   // mode >> 8 - индекс массива стартовых позиций
        }
        else
            *column = make_move(*column);
    }
    else {                                 // Движение по строкам
        if( NEW_MODE ) {               // Если новый режим, то установить начальное значение
            *column = 0xFF;
            *row = start_pos[mode>>7];      // mode >> 8 - индекс массива стартовых позиций
        }
        else
            *row = make_move(*row);
    }

    mode++;
    if(mode == 128 * sizeof (start_pos))   // Зацикливание рисунков (когда все режимы показаны - повторить снова)
        mode = 0;
}


// Определение режима: сдвиг или счет.
uchar make_move(uchar port) {
    if(bit_is_clear(mode, 5)) {            // если 5 бит в mode == 0, то режим сдвига
        if((mode & 0b00011111) == 31)      // вместо 32 шага сдвига - установка порта в 0 (что бы режим счета начинался с нуля)
            return 0;
        else
            return shift(port);
    }
    else
        return count(port);               // если 5 бит в mode == 1, то режим счета
}


// Режим счета
uchar count(uchar port) {
    if(bit_is_set(mode, 4))
        return count_right(port);      // если 4 бит в mode == 1, то режим счета вправо
    else
        return count_left(port);      // если 4 бит в mode == 0, то режим счета влево
}


// Счет вправо
uchar count_right(uchar port) {
    port >>= 1;                     // сдвиг вправо
    if(bit_is_clear(mode, 3))
        port |= 0b10000000;
    return port;
}


// Счет влево
uchar count_left(uchar port) {
    port <<= 1;                     // сдвиг влево
    if(bit_is_clear(mode, 3))
        port |= 0b00000001;
    return port;
}


// Режим сдвига
uchar shift(uchar port) {
    if(bit_is_set(mode, 4))
        return shift_right(port);      // сдвиг вправо, если 4 бит в mode единица
    else
        return shift_left(port);      // иначе сдвиг влево
}


// Сдвиг влево
uchar shift_left(uchar port) {
    if(bit_is_set(port, 7)) {   // если самый левый бит единица, то после сдвига в единицу нужно установить самый правый бит
        port <<= 1;            // сдвиг влево на 1
        port |= 0b00000001;
    }
    else
        port <<= 1;
    return port;
}


// Сдвиг вправо
uchar shift_right(uchar port) {
    if(bit_is_set(port, 0)) {   // если самый правый бит единица, то после сдвига в единицу нужно установить самый левый бит
        port >>= 1;            // сдвиг вправо на 1
        port |= 0b10000000;
    }
    else
        port >>= 1;
    return port;
}

Дмитрий Лиман (студент НИЯУ МИФИ)

SerialShiftCount.zip
Архив для WinAVR
(31.3 KiB) Скачиваний: 776
VVZ
 
Сообщений: 589
Зарегистрирован: 28 апр 2011, 09:44

Re: 1. Конструктор K595

Сообщение VVZ » 14 апр 2015, 13:57

16. Программа ToothCommandSender для смартфонов с Андроид.

После запуска программы предлагается сразу соединиться с внешним блютуз-модулем типа HC-06 через вкладки “Соединение с устройством” (1, 2). Далее в меню программы (3) можно выбрать вкладки “Отладочная панель” (4, отправка одиночных байтов, которыми назначается каждая кнопка), “Отправка ASCII-кодов” (5, отправка последовательности кодов), “Отправка столбцов” (6) и “О приложении”.

Изображение

Изображение

При отправке ASCII-кодов первый байт в посылке определяет количество знаков в тексте. В режиме “Отправка столбцов” после ввода текста программа отправляет не коды знаков, а последовательность столбцов от каждого знака. Скорость вывода столбцов определяется положением движка. Сдвиг столбцов происходит от схемного решения устройства (последовательного соединения регистров).


TCS_v1.zip
Установочный файл программы
(844.54 KiB) Скачиваний: 1331

Вопросы и пожелания по программе можно направлять на e-mail: vas-z@yandex.ru.
VVZ
 
Сообщений: 589
Зарегистрирован: 28 апр 2011, 09:44

Re: 1. Конструктор K595

Сообщение VVZ » 11 мар 2016, 04:32

17. Программа ToothCommandSender_v1.01 для смартфонов с Андроид.

Изменения и дополнения в новой версии программы :

Изменился вид Меню программы (1) и Отладочной панели (2, в её верхней части состояние принятого байта отображается в 4-х вариантах). Добавлена новая вкладка Терминальный режим (3, в нижней части можно установить символы CRLF). Символы CRLF необходимы при работе с модулями HC-05 (для работы с модулями HC-06 они не нужны).

Изображение

TCS_v1.01.zip
архив с программой
(847.64 KiB) Скачиваний: 1308
VVZ
 
Сообщений: 589
Зарегистрирован: 28 апр 2011, 09:44

Re: 1. Конструктор K595

Сообщение VVZ » 15 апр 2016, 04:02

18. Светодиодные линейки и индикатор уровня без микроконтроллера. Модуль IU24.

В схеме темы “Индикатор уровня на 74HC595” также используются регистры. Их подключение в схеме индикатора позволяет применять светодиодные линейки данного конструктора для вывода индикации. Так как в схеме индикатора используются два регистра и 16 светодиодов, то к плате модуля можно подключать последовательно как минимум две линейки (16 светодиодов) или их парное количество (2, 4, 6 и так далее, на парах более одной рисунок индикации повторяется). Светодиодные модули подключаются прямо к выходному разъёму данного модуля.

Исходная схема индикатора на макетке без пайки:

Изображение

Схема модуля IU24:

В отличии от исходной схемы индикатора здесь отсутствуют элементы - С6, KN1, VD3, R12, R10.

Добавлены элементы: в ОС микрофонного усилителя устанавливается переменное сопротивление R33 -1 мОм, при этом сопротивление R5 уменьшено до 100 кОм; на плате установлен светодиод VD6 и сопротивление R36 -10 кОм для индикации питания модуля; C7 :

Изображение

R33 – 1 мОм; R1, R3, R4, R9, R36 – 10 кОм, R5 – 100 кОм, R6- 100 Ом; R7*, R8* – 4.7 кОм, R2, R16 – 1 кОм, R15- 2 кОм; R14- 3,9 кОм; R13- 8.2 кОм; R11- 300 Ом; C1 – 0.47 мкФ, C2, C3* – 10.0 мкФ, C4 – 200.0 мкФ, C5, C7 – 0.1 мкФ, D1 – LM358; D2 – К155ИЕ5, D3 – К155ЛА3.


Изображение

Печатная плата односторонняя, вид сквозь стеклотекстолит. На плате присутствует пять проводных перемычек.
Вложения
iu24.zip
Файлы печатной платы
(8.14 KiB) Скачиваний: 610
VVZ
 
Сообщений: 589
Зарегистрирован: 28 апр 2011, 09:44

Re: 1. Конструктор K595

Сообщение VVZ » 04 май 2016, 01:17

19. Плата IU100 - новая версия платы IU24.

В новой версии добавлено переменное сопротивление R34 (10 кОм, подстройка уровня напряжения на входе 6 мс D1), а для контроля состояния выхода 7 установлен светодиод VD4 и сопротивление R35 (1 кОм).

Изображение

Изображение

Печатная плата односторонняя, вид сквозь стеклотекстолит. На плате присутствует пять проводных перемычек.

iu100p.zip
Файл печатной платы (lay6)
(6 KiB) Скачиваний: 656
VVZ
 
Сообщений: 589
Зарегистрирован: 28 апр 2011, 09:44

Re: 1. Конструктор K595

Сообщение VVZ » 31 май 2016, 01:08

20. Плата IU138 - новая версия платы IU100.

Схема версии платы IU138 такая же как и IU100. Отличие - на плате IU138 разъём питания расположен с другой стороны платы.

Изображение

Печатная плата односторонняя, вид сквозь стеклотекстолит. На плате присутствует четыре проводных перемычки.

iu138p.zip
Файл печатной платы (lay6)
(6.63 KiB) Скачиваний: 638
VVZ
 
Сообщений: 589
Зарегистрирован: 28 апр 2011, 09:44

Пред.След.

Вернуться в Электронные конструкторы

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4