Например TDA7294

Форум РадиоКот • Просмотр темы - Котуинко
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Ср апр 24, 2024 15:15:58

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 2071 ]     ... , , , 59, , , ...  
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: Котуинко
СообщениеДобавлено: Вт окт 20, 2020 14:33:03 
Друг Кота
Аватар пользователя

Карма: 93
Рейтинг сообщений: 1351
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 14062
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
Повторная попытка - снова "синий экран" с кучей сообщений и мгновенная перезагрузка.
НЕТ СМЫСЛА РИСКОВАТЬ.
:evil:
возможно под 10-ку х64 и запустится, но "ловить вирь" или переустанавливать ОС желания как-то НЕТУ.
:twisted:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Котуинко
СообщениеДобавлено: Вт окт 20, 2020 14:34:43 
Друг Кота
Аватар пользователя

Карма: 32
Рейтинг сообщений: 482
Зарегистрирован: Сб сен 10, 2011 17:46:25
Сообщений: 3832
Рейтинг сообщения: 0
по "аварийной" ссылке оба браузера у меня (хром и лиса свежие) прекрасно ходят, может ваш браузер устаревший - жаба скрипты так могут действовать.
А мэйком можно и Си++ и ардуино:
Создал я ардуиновский проектик (main.cpp и Makefile) подключил "Arduino.h" как в скетчах делают. Cкопипастил себе в проект ядро MiniCore (mega8 там есть). Поблинкал стандартным набортным светодиодом с помощью тупой задержки. Скопипастил себе библиотеку MsTimer2. Поблинкал с помощью асинхронного таймера2:
Изображение
И понял в ардуино вся сила в либах, брат, а собирать ардуиновский проект где неважно - в иде или мэйкфайлом...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Котуинко
СообщениеДобавлено: Вт окт 20, 2020 15:50:55 
Друг Кота
Аватар пользователя

Карма: 93
Рейтинг сообщений: 1351
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 14062
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
Ессно под ХР х32 будут "устаревшими" - надо сие учитывать и проверять перед выкладкой ссылок.
УВЫ... Не от нашего желания такие "мелки пакости" зависят...
:(
ВОТЬ...
Посему главный упор делаем на САМОСТОЯТЕЛЬНОЕ написание библиотек - это и универсальнее и понятнее (для себя) и заметно проще, чем разбираться в "чужих" библиотеках.
8)
А в данном случае не просто "поблинкать", а создать собственную библиотечку для 4-х позиционного дисплея со 4-мя кнопами надо - это примерно половина простейшего проекта по смыслу.
8)


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: Котуинко
СообщениеДобавлено: Вт окт 20, 2020 16:07:17 
Друг Кота
Аватар пользователя

Карма: 32
Рейтинг сообщений: 482
Зарегистрирован: Сб сен 10, 2011 17:46:25
Сообщений: 3832
Рейтинг сообщения: 0
как его проверять, если у меня сейчас Debian на ПК, есть вообще в виртуалке виндовс7, но ей отрублен интернет именно чтоб не нахваталась вирусни.
Хорошо - да для часов ардуиновских нужен индикатор. Интересно, а есть ли ардуиновские либы для семисегментных индикаторов?
Есть... тамже на аварийном сайте этот ответ нашел. У нас в каждом ларьке есть в продаже семисегментные светодиодные индикаторы для ардуино с двумя 74HC595 в виде готовой платы - дешевле намного чем самому паять.
Изображение
Скачал либу для такого индикатора, скопипастил к себе в проект, там и пример есть - проверил работает:
Изображение
Асинхронный таймер мигает светодиодом - время идет, индикатор выводит циферки, никто из разных либ никому не мешает - это уже почти готовые часы.
Уйду в ардуинщики - всяких либ хоть завались :) .
оный скетч (модное слово):
Спойлер
Код:
#include "Arduino.h"
#include "MsTimer2.h"
#include "TM74HC595Display.h"

int ledPin = 13;

int SCLK = 7;
int RCLK = 6;
int DIO = 5;

TM74HC595Display disp(SCLK, RCLK, DIO);
unsigned char LED_0F[29];

void setup()
{
    LED_0F[0] = 0xC0;  //0
    LED_0F[1] = 0xF9;  //1
    LED_0F[2] = 0xA4;  //2
    LED_0F[3] = 0xB0;  //3
    LED_0F[4] = 0x99;  //4
    LED_0F[5] = 0x92;  //5
    LED_0F[6] = 0x82;  //6
    LED_0F[7] = 0xF8;  //7
    LED_0F[8] = 0x80;  //8
    LED_0F[9] = 0x90;  //9
    LED_0F[10] = 0x88; //A
    LED_0F[11] = 0x83; //b
    LED_0F[12] = 0xC6; //C
    LED_0F[13] = 0xA1; //d
    LED_0F[14] = 0x86; //E
    LED_0F[15] = 0x8E; //F
    LED_0F[16] = 0xC2; //G
    LED_0F[17] = 0x89; //H
    LED_0F[18] = 0xF9; //I
    LED_0F[19] = 0xF1; //J
    LED_0F[20] = 0xC3; //L
    LED_0F[21] = 0xA9; //n
    LED_0F[22] = 0xC0; //O
    LED_0F[23] = 0x8C; //P
    LED_0F[24] = 0x98; //q
    LED_0F[25] = 0x92; //S
    LED_0F[26] = 0xC1; //U
    LED_0F[27] = 0x91; //Y
    LED_0F[28] = 0xFE; //hight -
}

void flash()
{
    static boolean output = HIGH;

    digitalWrite(ledPin, output);
    output = !output;
}

int main()
{
    pinMode(ledPin, OUTPUT);
    MsTimer2::set(500, flash); // 500ms period
    MsTimer2::start();
    setup();
    sei();

    for (;;)
    {
        disp.send(LED_0F[0], 0b0001); //send digital "0" to 1st indicator
        _delay_ms(2000);
        disp.send(LED_0F[3], 0b0110); //send digital "3" to 2nd and 3rd indicator
        _delay_ms(2000);
        disp.send(LED_0F[10], 0b1111); //send simbol "A" to all indicators
        _delay_ms(2000);

        for (int i = 0; i <= 99; i++)
        {
            disp.digit2(i, 0b0001, 50); //send counter 0-99 with delay 50 cicles int 1st and 2nd view ports
        }

        for (int i = 0; i <= 99; i++)
        {
            disp.digit2(i, 0b0100, 50); //send counter 0-99 with delay 50 cicles int 3st and 4rd view ports
        }

        for (int i = 0; i <= 100; i++)
        {
            disp.digit4showZero(i, 50); //send counter 0-100 with delay 50 cicles with zero
        }

        for (int i = 0; i <= 9999; i++)
        {
            disp.digit4(i, 50); //send counter 0-9999 with delay 50 cicles and hide zero
        }
    }
    return 0;
}


з.ы. проверил тревожный сайт онлайн антивирусами, в том числе DrWeb - все в порядке
Изображение


Последний раз редактировалось oleg110592 Ср окт 21, 2020 10:56:38, всего редактировалось 1 раз.

Вернуться наверх
 
Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Котуинко
СообщениеДобавлено: Ср окт 21, 2020 10:54:13 
Друг Кота
Аватар пользователя

Карма: 93
Рейтинг сообщений: 1351
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 14062
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
С "добавками" индикаторов хош удавись...
И программы там заметно проще выполняются.
Да и семисегментники - также не в диковинку.
Драйверки к ним можно вполне и самому написать, без влезания в "чужие библиотеки" -
то уже кому как удобнее (порой вычитка библиотеки занимает больше времени, чем создание своей).
Разве что когда уже никак не обойтись простыми средствами - OneWire, Adafruit_NeoPixel да эзернетовские...
Там лучше таки библиотеки применить на начальном этапе.
8)
Только вот именно без дополнительных мелкосхем надо прокрутить...
Т.е. динамическая индикация с совмещенной кноподавой в автономно вертящемся режиме.
В принципе под ассемблером - не проблема (вероятно и под "чистым Си также).
А вот такой же по функционалу для адуринки с ее базовыми "бабочками"(меги8,186,328Р в DIP28 корпусировке) да используя только референс... Уж слишком "раздуться" может... Что и несколько напрягает...
:?
Пока надо из имеющегося набора тест-макет соорудить... Для теста придется нанку стару использовать - а у меня там разводка макетки ... "весьма неудачная" - делалась давно и без учета возможных особенностей, что позже проявились.
А переделывать все ВЛОМ...
:beer:


Вернуться наверх
 
Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Котуинко
СообщениеДобавлено: Ср окт 21, 2020 11:09:00 
Друг Кота
Аватар пользователя

Карма: 32
Рейтинг сообщений: 482
Зарегистрирован: Сб сен 10, 2011 17:46:25
Сообщений: 3832
Рейтинг сообщения: 0
Цитата:
Только вот именно без дополнительных мелкосхем надо прокрутить...

имхо надо ближе к народу/китайпрому быть - ардуине-ардуиново, пошел и купил задешево. Но и без доп. микросхем ардуинщики все давно разжевали:
https://www.circuitbasics.com/arduino-7 ... -tutorial/
(сайт проверен онлайн)
несложно Эта простая программа выведет на дисплей число «4,999»:
Код:
#include "SevSeg.h"
SevSeg sevseg;

void setup(){
  byte numDigits = 4;
  byte digitPins[] = {10, 11, 12, 13};
  byte segmentPins[] = {9, 2, 3, 5, 6, 8, 7, 4};

  bool resistorsOnSegments = true;
  bool updateWithDelaysIn = true;
  byte hardwareConfig = COMMON_CATHODE;
  sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments);
  sevseg.setBrightness(90);
}

void loop(){
    sevseg.setNumber(4999, 3);
    sevseg.refreshDisplay();
}


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Котуинко
СообщениеДобавлено: Ср окт 21, 2020 11:43:43 
Держит паяльник хвостом

Карма: 10
Рейтинг сообщений: 99
Зарегистрирован: Вт июн 07, 2011 08:03:18
Сообщений: 967
Рейтинг сообщения: 0
А пчему нет аргумента resistorsOnCommons!) Зачастую ТАКИЕ дурные эти библиотеки (не конкретно эта). Давеча писал человеку для модуля на hc595. Ужас! Пришлось самому накидать.)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Котуинко
СообщениеДобавлено: Ср окт 21, 2020 22:39:30 
Друг Кота
Аватар пользователя

Карма: 93
Рейтинг сообщений: 1351
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 14062
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
Скажем так "не все так гладко" - при тесте под нанкой наскочил на весьма странный эфект...
И неприятный...
У меня выходы сегментных ключей были выставлены рядком на D19-18-17-16-15-14-12-11...
ДЫК... Попытка заменить программу после модификации - последующая загрузка СКОТча привела к ... отказу IDE - ошибки прошивки...
Как будто выход из строя или ПК или адуриньи...
В принципе и то и другое оказалось исправным, но нервов покушало.
Отделался перепрошивкой бутлоадера из-под siProg (моей готовки) и автономной аврдудешелл.
Ибо средствами IDE восстановить режим перепрошивки невозможно...
Данный "ступор" продолжал повторяться до тех пор, пока не перебросил лапки с D12-D11 на D10-D9...
Независимо от типа бутлоадера...
После переброски сигнала на другие лапки "как пошептало" (опять же на двух разных нанках)...
Однако ISP при работе бутлоадера вроде не должен быть задействован... или как-то повлиять "внешними цепями"...
:dont_know:
....
по схеме сегментные выводы подключены к ULN2803...
Проверялись две платки - поведение абсолютно одинаковое.
На больше порыться пока нету настроения, как и полную схему того "странного теста" окончательно вычертить.
Смотрим наброски
общая схема (набор блоков без межсоединений)
Вложение:
oll_test.pdf [223.64 KiB]
Скачиваний: 123

и раскладка, которая работает и перезагрузку выполняет
Вложение:
namepins.pdf [85.23 KiB]
Скачиваний: 106

Ну и сама тест-прожка в текущем "сыром и отвратном" виде:
Вложение:
csdts.rar [5.24 KiB]
Скачиваний: 138

Единственный плюс (помимо "заметки карандашом") - заменил бутлоадер на оптибутовский - его или в соответствующих папках найти можно или сама IDE прошивает в режиме "загрузка через программатор" (у мня в качестве оного нанка с прошивкой ардуино ISP).
:roll:
Теперь можно и с кнопами да всякоэфектами демоиндикации поморочиться - интересно насколько чувствительны будут...
:write:

Не факт, что все окончательно прояснено - вполне реально какой глюк и в прожке - надо таки некоторое время на выяснение...
Как одно из предположений - довольно высокочастотный сигнал tone() на D13 каким-то образом блокирует возможность работы бутлоадера после 5-6 минут работы макета.
Отключение схемы на пару минут возсстанавливает работу загрузчика.
Бум дальше "непутевы заметки" по ходу пыток делать...
:roll:

ИТОГОВЫЙ АНАЛИЗ
("...утро вечера мудренее...")
Сбой загрузки из IDE через штатный бутлоадер
1. не зависит от комбинации и назначения активных выводов платки ардуино-нано;
2. не зависит от типа бутлоадера;
3. проявляется случайным образом;
4. в зависимости от "стечения обстоятельств" может иметь место как полное самовосстановление после отключения питания от платки, так и необходимость полной перезагрузки бутлоадера через ISP программатор.
5. наблюдается некоторая зависимость частоты и тяжести последствий отказов в зависимости от частоты на выходе, используемом функцией tone().
При этом сама программа функционирует абсолютно нормально. Сбой происходит только при попытке перезагрузки средствами штатного бутлоадера.
Как предположение -
сбой вызывает случайное наложение с одной стороны "каскадируемого прерывания" -
частично функционала tone(), частично прерывания на INT0 и его обработчика при одновременном запуске на исполнение встроенного бутлоадера. Причем то "стечение обстоятельств" возникает в разные моменты времени с точки активации бутлоадера - от того и последствия разные - от "самовосстановления" до необходимости полной перезаливки бутлоадера МК.
Далее аналитика только для спецов. Оставлю себе лишь "замечание о возможном глюке и методах его(глюка) устранения".
:beer:

Фотка макета а-ля "кошмар в ночи" :
https://img.radiokot.ru/files/20529/2cc0t02zml.jpg
:facepalm:
и временно - окончательный (до проработки кноп) текст прожки в "более простонародном доступе"

Спойлер
Код:
/*
 *
 *  шаблон-заготовка обработчика клавиатуры-дисплея
 *  базовая модель МК - atmega8
 *  автономно-независимое исполнение по прерыванию
 *  обмен с основной программой через буфер предподготовки данных и
 *  буфер содержимого байта кода клавиатуры
 *  данные в буфере предподготовки представлены
 *  уже в виде сегментного кода
 *  флаги -
 *  наличие данных в буфере содержимого байта кода клавиатуры
 *  в текущем скан-цикле
 *  и
 *  запрос обновления данных из буфера предподготовки в
 *  буфер видеопамяти
 * 
 */
//*****************************************************************
//  Секция include: здесь подключается заголовочный файл к модулю
//*****************************************************************
//#include "leds4.h" // заголовочный *.h файл текущего проекта
//
// содержимое leds4.h на этапе тестирования на симуляторе
//
// знакогенератор

#define s_A 0 // значение номера сегмента A
#define s_B 1 // значение номера сегмента B
#define s_C 2 // значение номера сегмента C
#define s_D 3 // значение номера сегмента D
#define s_E 4 // значение номера сегмента E
#define s_F 5 // значение номера сегмента F
#define s_G 6 // значение номера сегмента G
#define s_H 7 // значение номера сегмента H

/* "кодовая страница кракозябр 7-сегментных"
 раскладка сегментов по символам определяется стандартной разметкой A-H
 по условию, что активный уровень(сегмент астивен/светится) принят за 1 */
 #define fnt_bl 0
 #define fnt_0 (1<<s_A | 1<<s_B | 1<<s_C | 1<<s_D | 1<<s_E | 1<<s_F) // цмфра 0 или символ "О"
 #define fnt_1 (1<<s_B | 1<<s_C)
 #define fnt_2 (1<<s_A | 1<<s_B | 1<<s_D | 1<<s_E | 1<<s_G)
 #define fnt_3 (1<<s_A | 1<<s_B | 1<<s_C | 1<<s_D | 1<<s_G) // цифра 3 или символ "З"
 #define fnt_4 (1<<s_B | 1<<s_C | 1<<s_F | 1<<s_G) // цифра 4 или символ "Ч"
 #define fnt_5 (1<<s_A | 1<<s_C | 1<<s_D | 1<<s_F | 1<<s_G) // цифра 5 или символ "S"
 #define fnt_6 (1<<s_A | 1<<s_C | 1<<s_D | 1<<s_E | 1<<s_F | 1<<s_G)
 #define fnt_7 (1<<s_A | 1<<s_B | 1<<s_C)
 #define fnt_8 (1<<s_A | 1<<s_B | 1<<s_C | 1<<s_D | 1<<s_E | 1<<s_F | 1<<s_G)
 #define fnt_9 (1<<s_A | 1<<s_B | 1<<s_C | 1<<s_D | 1<<s_F | 1<<s_G)
 #define fnt_A (1<<s_A | 1<<s_B | 1<<s_C | 1<<s_E | 1<<s_F | 1<<s_G) // символ "A"
 #define fnt_b (1<<s_C | 1<<s_D | 1<<s_E | 1<<s_F | 1<<s_G) // символ "b"
 #define fnt_C (1<<s_A | 1<<s_D | 1<<s_E | 1<<s_F) // символ "C"
 #define fnt_d (1<<s_B | 1<<s_C | 1<<s_D | 1<<s_E | 1<<s_G) // символ "d"
 #define fnt_E (1<<s_A | 1<<s_D | 1<<s_E | 1<<s_F | 1<<s_G) // символ "E"
 #define fnt_F (1<<s_A | 1<<s_E | 1<<s_F | 1<<s_G) // символ "F"
 #define fnt_P (1<<s_A | 1<<s_E | 1<<s_F | 1<<s_G | 1<<s_B) // символ "P"
 #define fnt_L (1<<s_E | 1<<s_F | 1<<s_D) // символ "L"
 #define fnt_H (1<<s_B | 1<<s_C | 1<<s_E | 1<<s_F | 1<<s_G) // символ "H"
 #define fnt_U (1<<s_B | 1<<s_C | 1<<s_E | 1<<s_F | 1<<s_D) // символ "U"
 #define fnt_I (1<<s_E | 1<<s_F) // левая 1 или латинская I
 #define fnt_S (1<<s_A | 1<<s_C | 1<<s_D | 1<<s_F | 1<<s_G) // аналог цифры 5
 #define fnt_J (1<<s_A | 1<<s_B | 1<<s_C | 1<<s_D | 1<<s_E) // символ "J"
 #define fnt_r (1<<s_G | 1<<s_E) // символ "r"
 #define fnt_n (1<<s_G | 1<<s_E | 1<<s_C) // символ "п"
 #define fnt_c (1<<s_G | 1<<s_E | 1<<s_D) // символ "с"
 #define fnt_o (1<<s_G | 1<<s_E | 1<<s_D | 1<<s_C) // нижний кружок "о"
 #define fnt_u (1<<s_C | 1<<s_E | 1<<s_D) // символ "u"
 #define fnt_h (1<<s_C | 1<<s_E | 1<<s_F | 1<<s_G) // символ "h"
 #define fnt_rusg (1<<s_A | 1<<s_E | 1<<s_F) // символ "Г"
 #define fnt_rusP (1<<s_A | 1<<s_E | 1<<s_F | 1<<s_B | 1<<s_C) // символ "П"
 #define fnt_rus_iE (1<<s_A | 1<<s_B | 1<<s_C | 1<<s_D | 1<<s_G) // символ Э (инверсное Е)
 #define fnt_rusY (1<<s_F | 1<<s_G | 1<<s_B | 1<<s_C | 1<<s_D) // символ "У"
 #define fnt_qest (1<<s_A | 1<<s_B | 1<<s_E | 1<<s_G) // символ "?"
 #define fnt_rC (1<<s_A | 1<<s_B | 1<<s_C | 1<<s_D) // символ ) (обратная скобка)
 #define fnt_gradus (1<<s_A | 1<<s_B | 1<<s_F | 1<<s_G) // верхний кружок "символ грвдуса"
 #define fnt_minus (1<<s_G) // символ "-" (средняя черта)
 #define fnt_aplin (1<<s_A) // символ "верхняя черта"
 #define fnt_dnlin (1<<s_D) // символ "_" (нижняя черта)
 #define fnt_trlin (1<<s_A | 1<<s_G | 1<<s_D) // символ "три черты"
 #define fnt_coma (1<<s_H) // символ "," (децимальная точка)

// определение линий интерфейса
// линии интерфейса связи для программного I2C обмена

// активный уровень для сегментных ключей = 1
// режим работы OUTPUT
// состояние по сбросу = все Z
// состояние при инициализации = все OUTPUT = 1

#define segline_a 11 // управление сегментным ключом A на D12
#define segline_b 12 // управление сегментным ключом B на D13
#define segline_c 14 // управление сегментным ключом C на D14
#define segline_d 15 // управление сегментным ключом D на D15
#define segline_e 16 // управление сегментным ключом E на D16
#define segline_f 17 // управление сегментным ключом F на D17
#define segline_g 18 // управление сегментным ключом G на D18
#define segline_h 19 // управление сегментным ключом H на D19

// активный уровень для анодных ключей = 0
// режим работы OUTPUT
// состояние по сбросу = все с внешней подтяжкой к 1
// состояние при инициализации = все OUTPUT = 1

#define sa_line0 3 // управление анодным ключом 0 на D11
#define sa_line1 6 // управление анодным ключом 1 на D10
#define sa_line2 5 // управление анодным ключом 2 на D9
#define sa_line3 4 // управление анодным ключом 3 на D8

// линия контроля ЛВК (линия возврата клавиатуры)
// режим работы INPUT с внешней подтяжкой к 1
// активный уровень = 0

#define lvk_line 8 // линия контроля ЛВК на D7

// линия выходного тактового сигнала
// для тактирования Контроллера Клавиатуры Дисплея

#define sdr_clco 13 // источник тактового сигнала ККД на D4
// линия входного тактового сигнала
// для тактирования Контроллера Клавиатуры Дисплея

#define sdr_clci 2 // приемник тактового сигнала ККД на D2 (INT0)

// константы и маски

#define kkd_freq 30000 //260 // константа генератора регенерации ККД
#define llq 10 // константа малого цикла (10тиков/переполнение)
#define hlq 10 //26 // константа большого цикла (26циклов/переполнение)

#define nump 4 // константа для счетчика позиций (0-3)

#define mask_sa0 B00000001 // маска линии sa_line0
#define mask_sa1 B00000010 // маска линии sa_line1
#define mask_sa2 B00000100 // маска линии sa_line2
#define mask_sa3 B00001000 // маска линии sa_line3

// переменные ККД

volatile byte cntk=0; // счетчик позиций(кадров) дисплея в строке развертки
volatile byte cntl=0; // счетчик малого цикла интервала текущего кадра
volatile byte cnth=0; // счетчик большого цикла интервала текущего кадра

volatile byte lvk_mask=0; // буфер текущей маски ЛВК
volatile byte lvk_data=0; // буфер данных ЛВК за текущий цикл развертки
volatile byte lvk_dold=0; // буфер данных ЛВК за предшествующий цикл развертки
volatile byte qf_sn_press=0; // флаг наличия нажатия в текущем цикле
volatile byte qf_sn_stabl=0; // флаг наличия подтвержденных данных в lvk_dold
volatile byte qf_refram=0; // флаг запроса перезаписи информации из
                        // pp_ram в v_ram
byte v_ram[4]={fnt_0,fnt_1,fnt_2,fnt_3}; // массив видеопамяти текущего отображения
byte pp_ram[4]={fnt_4,fnt_5,fnt_6,fnt_7}; // массив буфера предподготовки данных


//  Секция прототипов функций

void sdr_prog(); // основной обработчик регенерации ККД




//**************************************************
//       Секция создания экземпляров классов
//  задаем соответствие физических линий интерфейса
//         и передаваемых параметров
//      закрытым переменным членам класса
//***************************************************



//----------

//*************************************************
//       Секция начальной инициализации setup
//   (выполняется однократно при запуске системы)
//*************************************************

void setup() {
  // put your setup code here, to run once:
// инициализация железа при подаче питания

//сегментные ключи, уровень
digitalWrite(segline_a,HIGH); digitalWrite(segline_b,HIGH);
digitalWrite(segline_c,HIGH); digitalWrite(segline_d,HIGH);
digitalWrite(segline_e,HIGH); digitalWrite(segline_f,HIGH);
digitalWrite(segline_g,HIGH); digitalWrite(segline_h,HIGH);
//сегментные ключи, режим
pinMode(segline_a,OUTPUT); pinMode(segline_b,OUTPUT);
pinMode(segline_c,OUTPUT); pinMode(segline_d,OUTPUT);
pinMode(segline_e,OUTPUT); pinMode(segline_f,OUTPUT);
pinMode(segline_g,OUTPUT); pinMode(segline_h,OUTPUT);

//анодные ключи, уровень
digitalWrite(sa_line0,LOW); digitalWrite(sa_line1,LOW);
digitalWrite(sa_line2,LOW); digitalWrite(sa_line3,LOW);
//анодные ключи, режим
pinMode(sa_line0,INPUT); pinMode(sa_line1,INPUT);
pinMode(sa_line2,INPUT); pinMode(sa_line3,INPUT);

//линия контроля ЛВК
digitalWrite(lvk_line,HIGH);
//линия контроля ЛВК, режим
pinMode(lvk_line,INPUT);

// линия выходного тактового сигнала
// для тактирования Контроллера Клавиатуры Дисплея, уровень
digitalWrite(sdr_clco,HIGH);
// линия выходного тактового сигнала
// для тактирования Контроллера Клавиатуры Дисплея, режим
pinMode(sdr_clco,OUTPUT);

// линия входного тактового сигнала
// для тактирования Контроллера Клавиатуры Дисплея, уровень
digitalWrite(sdr_clci,HIGH);
// линия входного тактового сигнала
// для тактирования Контроллера Клавиатуры Дисплея, режим
digitalWrite(sdr_clci,INPUT);

//подключение прерывания обработчика ККД
attachInterrupt(digitalPinToInterrupt(sdr_clci), sdr_prog, FALLING);
//запуск ККД
tone(sdr_clco, kkd_freq);

}

//***************************************************
//  Секция основной программы (в обычном Си = main)
//***************************************************

void loop() {
  // put your main code here, to run repeatedly:


}

//----------

//***************************************************
//              ПОДВАЛ С ФУНКЦЯМИ
//***************************************************

//----------**********************----------
// прерывание по INT0 - обработчик ККД

void sdr_prog()
{
  if(cntl==0)
  {
    switch (cnth)
    {
     case 0:
       //do something when var equals 0
// гашение по анодам
// пауза задержки отключения силовых ключей
     pinMode(sa_line0,INPUT); pinMode(sa_line1,INPUT);
     pinMode(sa_line2,INPUT); pinMode(sa_line3,INPUT);
      break;
     case 1:
       //do something when var equals 1
// загрузка текущего содержимого сегментного кода в порт вывода
// согласно содержимого ячейки массива v_ram, на которую указывает
// текущее значение cntk
      digitalWrite(segline_a,bitRead(v_ram[cntk], 0));
      digitalWrite(segline_b,bitRead(v_ram[cntk], 1));
      digitalWrite(segline_c,bitRead(v_ram[cntk], 2));
      digitalWrite(segline_d,bitRead(v_ram[cntk], 3));
      digitalWrite(segline_e,bitRead(v_ram[cntk], 4));
      digitalWrite(segline_f,bitRead(v_ram[cntk], 5));
      digitalWrite(segline_g,bitRead(v_ram[cntk], 6));
      digitalWrite(segline_h,bitRead(v_ram[cntk], 7));
// внутренний switch (cntk) для включения соответствующего анода
// и заполнения буфера маски для текущей кнопки lvk_mask
       switch (cntk)
         {
         case 0:
           //do something when var equals 0
           pinMode(sa_line0,OUTPUT); lvk_mask=mask_sa0;
           break;
         case 1:
           //do something when var equals 1
           pinMode(sa_line1,OUTPUT); lvk_mask=mask_sa1;
           break;
         case 2:
           //do something when var equals 2
           pinMode(sa_line2,OUTPUT); lvk_mask=mask_sa2;
           break;
         case 3:
           //do something when var equals 3
           pinMode(sa_line3,OUTPUT); lvk_mask=mask_sa3;
           break;
         default:
           // if nothing else matches, do the default
           // default is optional
           break;
         }
      break;

//----------

     case (hlq-1): //9 //25
       //do something when var equals 25
      cntk++; // счетчик позиций +1

// все дальнейшее проводится только в последнем кадре строки
      if (cntk==nump)
       { cntk=0;

// анализ флага qf_refram и перезапись данных
// из pp_ram в v_ram со сбросом qf_refram=0
        if (qf_refram)
        {
          for (byte cnt=0; cnt<=3; cnt++)
          {
            v_ram[cnt]=pp_ram[cnt];
          }
         qf_refram=0;
        }

// проверка флага наличия нажатия в строке qf_sn_press
       if (qf_sn_press)
       {
        if (lvk_dold==lvk_data)
        {
          qf_sn_stabl=1; // при совпадении установить
                  // флаг наличия подтвержденных данных
        }
        else
        {
          lvk_dold=lvk_data; // при несовпадении заместить
                 // содержимое в lvk_dold
          qf_sn_stabl=0; // и сбросить флаг
                 // наличия подтвержденных данных
        }
     // сброс флага qf_sn_press, обнуление lvk_data и выход из проверки
        qf_sn_press=0; lvk_data=0;
       }
// если НЕТ (qf_sn_press=0) тогда
// qf_sn_press=0; lvk_data=0; по умолчанию (таковы при входе)
       else
        {
         if (lvk_dold==lvk_data)
         {
           qf_sn_stabl=0; // сбросить флаг наличия подтвержденных данных
         }
         else
         {
           lvk_dold=lvk_data; // антидребезг статуса "все кнопки отпущены"
         }
        }
       }
      break;

     default:
       // if nothing else matches, do the default
       // default is optional
// все остальные значения используются для опроса ЛВК
      if (!digitalRead(lvk_line))
      {
        lvk_data = lvk_data | lvk_mask; qf_sn_press = 1;
      }
     break;
   }
  }
  cntl++;
  if (cntl == llq) //10
  {
    cntl=0; cnth++;
    if (cnth == hlq) //10 //26
    {
      cnth=0;
    }
  }
}


//----------


//---------- файла/end of file---------------------

возможно не все комментарии подчищены "по факту".
:write:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Котуинко
СообщениеДобавлено: Пт окт 23, 2020 20:43:06 
Друг Кота
Аватар пользователя

Карма: 93
Рейтинг сообщений: 1351
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 14062
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
Весьма интересный алгоритмик получился...
Вложение:
csdts_1.zip [46.26 KiB]
Скачиваний: 134

Надо будет его как-то "окультурить" в библиотечку...
:hunger:
В СКОТче-тесте при кратковременном нажатии - в крайней правой позиции высвечивается комбинация нажатых кноп (от 1 до F) оставшееся сдвигается влево.
При длительном удержании идет непрерывный сдвиг влево номера кода комбинации.
Но то уже тестовый фрагмет, а не базовый обработчик контроллера совмещенного дисплея-клавиатуры. Его можно завернуть как угодно.
8)
На том мой интерес и завершился - ибо в теме-источнике вопрос сам-собой решился, а мне продолжать уже и не интересно - базовый результат получен. Отзыв кнопок вполне приятный (ежли контактная группа нормальная).
Обработчик подразумевает поля сменных указателей на функцию...
:beer:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Котуинко
СообщениеДобавлено: Сб окт 31, 2020 19:09:34 
Друг Кота
Аватар пользователя

Карма: 93
Рейтинг сообщений: 1351
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 14062
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
Подправил чуток антидребезг
Вложение:
ts_ksd4.zip [48.22 KiB]
Скачиваний: 141

Кнопочки, качество индикации устраивают...
:roll:
Однако... вытянуть все в отдельный файл мозгов явно не хватает...
Собственно из-за использования функций от референса как части инициализации развертки, основанной на генераторе частоты и обработчике прерывания.
:(
Так что "пока отложим" до подходящего момента.
8)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Котуинко
СообщениеДобавлено: Пн ноя 02, 2020 00:15:34 
Друг Кота
Аватар пользователя

Карма: 93
Рейтинг сообщений: 1351
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 14062
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
Еще один вариант дисплея/клавиатуры (схема аналогична ранее приведенной).
Вложение:
ksd4_rt.zip [48.02 KiB]
Скачиваний: 153

Движок основан на приеме, вычитанном в одной из книж, автор которой (согласно текста в книже) сам позаимствовал его где-то тут: robotosha.ru
Суть в использовании прерывания по совпадению у Т0.
Однако... такой прием возможен только для МК, имеющих OCR0A - платок с МК вида мега328, мега168...
Для мега8 это НЕПРИМЕНИМО.
И все же... прием сам по себе весьма интересен - вроде ни на какие функции референса не влияет...
:roll:
Качество отображения и реакция на нажатие кноп соответствует предыдущему варианту, но чуток поменьше и внешней перемычки не требуется.
:hunger:
Возможно таки его удастся и в вариант библиотечки выдернуть...
Позже поглядямс...
:write:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Котуинко
СообщениеДобавлено: Пн ноя 02, 2020 09:29:31 
Друг Кота
Аватар пользователя

Карма: 32
Рейтинг сообщений: 482
Зарегистрирован: Сб сен 10, 2011 17:46:25
Сообщений: 3832
Рейтинг сообщения: 0
позаимствовал его где-то тут
И все же... прием сам по себе весьма интересен - вроде ни на какие функции референса не влияет...

Код:
// ИНИЦИАЛИЗАЦИЯ ТАЙМЕРА (режим совпадения по OCR0A)
OCR0A = 140;
TIMSK0 |= (1 << OCIE0A);

а какже
Цитата:
Это уже из "дополнительных библиотек" (MsTimer2).
В рамки "абсолютного референса" не входит. А мне интерес на минимуме соорудить, с тем, что ВСЕГДА под когти попадает.

:shock:
такая "инициализацмя" не ардуиновый путь - проще сразу на чистом Си писать.
з.ы. мега8 можно таймер0 использовать для индикации и пр. прерывание по переполнению, записывая в регистр счетчика таймера нужное значение там же в прерывании


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Котуинко
СообщениеДобавлено: Пн ноя 02, 2020 09:42:43 
Друг Кота
Аватар пользователя

Карма: 93
Рейтинг сообщений: 1351
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 14062
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
В принципе использование незадействованных в референсе ресурсов вполне оправдано - как вариант для определенных платформ.
Ибо вставка метода класса в функцию прерывания гораздо муторнее...
Бибилиотека MsTimer2 делает его (Т2) непригодным для "стандартного" использования в функционале референса, а вот тот вариант, что я выше выложил вроде ни на что (со слов автора книжи) влиять не может - в том и "изюминка".
Хотя тоже... я ж в "потроха" IDE настолько глубоко не лазил - верим автору книжи и его ссылкам...
В принципе на меге8 (а это NG or older) регистров сравнения у Т0 не имелось - можно предположить, что посему они так и остались неиспользуемыми в "старших" моделях на 168й-328й мегах...
:roll:
А в остальном - еще одно подтверждение принципа подхода к ардуиноподобным - для прикладной конкретики удобнее таки использовать внешнюю "периферию с мозгами", имеющую более/менее "стандартные" протоколы последовательного обмена.
8)

Касательно отдельного счетчика, основанного на "системной сетке частот" ( millis() и micros() ) - удобно конечно, но там еще переполнение счетчика системных тиков отслеживать надо... а энто... ЛЕЕНЬ.... ибо "стандартное решение" и не во всех случаях оптимально...
8)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Котуинко
СообщениеДобавлено: Пн ноя 02, 2020 10:52:58 
Друг Кота
Аватар пользователя

Карма: 32
Рейтинг сообщений: 482
Зарегистрирован: Сб сен 10, 2011 17:46:25
Сообщений: 3832
Рейтинг сообщения: 0
делает его (Т2) непригодным для "стандартного"...

еще хуже такое использование Timer0:
Цитата:
Настраивая прерывания на Timer 0 вы теряете:
перестают работать функции времени (delay(), millis()…), не работает генерация ШИМ на пинах D5 и D6, перестают работать все библиотеки, так или иначе завязанные на системном времени


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Котуинко
СообщениеДобавлено: Пн ноя 02, 2020 13:02:12 
Друг Кота
Аватар пользователя

Карма: 93
Рейтинг сообщений: 1351
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 14062
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
Вот как раз в данном случае - ничего не теряется.
Если оставить предположение, что ШИМ от Т0 делается программно (на меге 8 иначе не сделать), то использование режима "прерывание по совпадению" посредством OCR0A даст так сказать "параллельный процесс" формирования той же самой 1 миллисекундной последовательности.
Но... обрабатываемой на другом векторе прерывания.
Я ж сказал - "взял на веру" написанное в книже.
Да и макет подтверждает правильность работы.
Правда без ШИМ на D5 и D6...
Проверить предположение о влиянии на ШИМ на D5 и D6 можно или перекопав начинку IDE(не моё) или задав тест на макете...
МНДЯ...
:roll:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Котуинко
СообщениеДобавлено: Пн ноя 02, 2020 13:28:06 
Друг Кота
Аватар пользователя

Карма: 32
Рейтинг сообщений: 482
Зарегистрирован: Сб сен 10, 2011 17:46:25
Сообщений: 3832
Рейтинг сообщения: 0
использование режима "прерывание по совпадению" посредством OCR0A даст так сказать "параллельный процесс" формирования той же самой 1 миллисекундной последовательности.

все эти milis и 1 милисекунда летят в далекую даль, пока мы находимся в прерывании по совпадению (приоритетных прерываний же нет).
Это прерывание будет исполнятся долгонько, судя по многократным digitalWrite и pinMode - в это время милисы это же ясно - тормозят
да еще и в прерывании delayMicroseconds(5);


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Котуинко
СообщениеДобавлено: Пн ноя 02, 2020 13:49:03 
Друг Кота
Аватар пользователя

Карма: 93
Рейтинг сообщений: 1351
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 14062
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
Как это "приоритетных прерываний нет"???
Собственно приоритет определяется положением адреса вектора в таблице векторов.
Другое дело, что нет разрешения вложенных прерываний.
Однако... за одну миллисекунду при 16 мегагерцах успеет выполнится как минимум 16000 команд,
а прерывание по совпадению примерно в половине интервала.
Т.е. между обработчиками допустимый интервал примерно в 4 тысячи команд.
По сему, чтоб произошла накладка обработчиков и "снесло" сетку частот от Т0 надо уж очень постараться.
Да и прерывания по переполнению и по совпадению (на одном и том же таймере) ЧЕТКО СЛЕДУЮТ ДРУГ ЗА ДРУГОМ.
У меня и посложнее использование цифровых компараторов было (еще и с регулируемым периодом) - все устойчиво работает.
Далее - участок инициализации это совершенно независимый от всяких прерываний фрагмент.
Собственно по прерыванию отрабатывает только SIGNAL(TIMER0_COMPA_vect)
А там чего-то длиннее чем на 2000 команд вряд-ли накопается при всем желании даже при помощи компилятора Си.
При том, что основной таймер НЕ ОСТАНАВЛИВАЕТСЯ, а продолжает далее преспокойненько тикать и отработает свою миллисекунду по переполнению.
8)
delayMicroseconds(5); - НЕ ИСПОЛЬЗУЕТ ТАЙМЕРЫ и прерывания - может применяться внутри прерываний.
:wink:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Котуинко
СообщениеДобавлено: Пн ноя 02, 2020 14:02:52 
Друг Кота
Аватар пользователя

Карма: 32
Рейтинг сообщений: 482
Зарегистрирован: Сб сен 10, 2011 17:46:25
Сообщений: 3832
Рейтинг сообщения: 0
заходим в прерывание по совпадению
1. допустим находимся там 5 мкс
2. через 1 мкс срабатывает прерывание по переполнению
3. но мы будем находится в прерывании по совпадению еще 4 мкс
4. выходим из прерывания по совпадению
5. попадаем в прерывание по переполнению
1мс+4мкс != 1мс
или я AVR уже подзабыл :(
з.ы. один digitalWrite() 5.47 microseconds.
http://codius.ru/articles/%D0%A2%D1%8E% ... 1%82%D1%8B


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Котуинко
СообщениеДобавлено: Пн ноя 02, 2020 14:42:04 
Друг Кота
Аватар пользователя

Карма: 93
Рейтинг сообщений: 1351
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 14062
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
СТОП!!!
У нас же ОДИН ЕДИНЫЙ СЧЕТНЫЙ РЕГИСТР.
Т.е. и совпадение и переполнение на его тиках основано.
Если переполнение =226, а совпадение допустим на половине этого интервала =150,
то уж никак прерывания друг на дружку не наскочат. Тут главное, чтоб длина обработчика была хотя бы не более половины интервала между прерываниями - где-то четверть миллисекунды. Ну и можно туда-сюда точку прерывания по совпадению подвигать в разумных пределах (нельзя сдвигать ближе, чем интервал исполнения обработчика предыдущего прерывания).
Другое дело, когда таймеры РАЗНЫЕ - там все что угодно будет, вплоть до "пришли одновременно" и ждут окончания текущего прерывания.
А вот когда оно завершится и одна команда после будет выполнена начнется соревнование - "а кому тапки"?
Вот тут ранг размещения вектора (приоритет) и скажет своё МЯВ...
8)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Котуинко
СообщениеДобавлено: Пн ноя 02, 2020 15:26:35 
Друг Кота
Аватар пользователя

Карма: 32
Рейтинг сообщений: 482
Зарегистрирован: Сб сен 10, 2011 17:46:25
Сообщений: 3832
Рейтинг сообщения: 0
посмотрел исходник ядра - думал там будет хуже
Код:
// the prescaler is set so that timer0 ticks every 64 clock cycles, and the
// the overflow handler is called every 256 ticks.
#define MICROSECONDS_PER_TIMER0_OVERFLOW (clockCyclesToMicroseconds(64 * 256))

1) 8 МГц это 125нс умножаем на 64 = 8мкс
2) от 150 до 255 это 105 тиков
3) 8 * 105 = 840 мкс - главное не находится в прерывании по совпадению дольше. 10 digitalWrite() на 8МГц испортят картину.
я б в прерывании по совпадению один одинешенек флаг бы выставил (индикация в теле), и вообще зачем на этом несчастном таймере два прерывания организовывать, согласно "референсу" одного хватает для индикации и пр.
Еще и милисы прерывания вырубают, жуть
Код:
unsigned long millis()
{
   unsigned long m;
   uint8_t oldSREG = SREG;

   // disable interrupts while we read timer0_millis or we might get an
   // inconsistent value (e.g. in the middle of a write to timer0_millis)
   cli();
   m = timer0_millis;
   SREG = oldSREG;

   return m;
}


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 2071 ]     ... , , , 59, , , ...  

Часовой пояс: UTC + 3 часа


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

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y