7seg на hc595 4digit

Обсуждаем контроллеры компании Atmel.
Ответить
Модератор
Аватара пользователя
Сообщения: 19100
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Сообщение Starichok51 »

похоже, я с первого раза недосмотрел. да, получаются пробелы.

Добавлено after 53 minutes 51 second:
кусок кода из первого поста:

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

void dig(unsigned char d1, unsigned char d2) {
  digitalWrite(LATCH_PIN, LOW);
  d(d1);
  d(d2);
  digitalWrite(LATCH_PIN, HIGH);
}

void setup() {
  pinMode(DATA_PIN, OUTPUT);
  pinMode(CLK_PIN, OUTPUT);
  pinMode(LATCH_PIN, OUTPUT);
  Serial.begin(9600);
}
должно быть так:

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

void dig(unsigned char d1, unsigned char d2) {
  d(d1);
  d(d2);
  digitalWrite(LATCH_PIN, HIGH);
  digitalWrite(LATCH_PIN, LOW);
}

void setup() {
  pinMode(DATA_PIN, OUTPUT);
  pinMode(CLK_PIN, OUTPUT);
  pinMode(LATCH_PIN, OUTPUT);

  digitalWrite(CLK_PIN, LOW);
  digitalWrite(LATCH_PIN, LOW);

  Serial.begin(9600);
}
"засветки" и "паразитки" могут быть из-за того, что выход LATCH_PIN оставался в высоком уровне.
при этом из сдвигового регистра входящие данные сразу предавались в выходной регистр.
а импульс на "защелки" нужно подавать после всех принятых бит. тогда не будет "засветок" и "паразиток" .
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 15778
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

По вопросам причин "паразиток" остался еще один момент - смена данных в ОЗУ "видеопамяти" должна производиться после окончания текущей строки развертки (или перед началом развертки новой строки). Это актуально для 595ых (и аппаратного варианта динамической развертки на выводах самого МК), но не для спецконтроллеров типа MAX7219 - в них все "особенности" уже предусмотрены изготовителем.
8)
Реклама
Модератор
Аватара пользователя
Сообщения: 19100
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Сообщение Starichok51 »

я мог выше быть не прав, и не важно, когда произошла подача нуля на вход защелок.
в моем проекте для протеуса вывод в буфер индикации не синхронизирован с окончанием вывода всех 8 символов. тем не менее, я в протеусе не вижу "паразиток".
а вообще, логика в твоих словах о синхронизации правильная.
у меня таймер работает по 2 мс, то есть, частота вывода 500 Гц.
таким образом, полный вывод всей строки из 8 символов происходит с частотой 62,5 Гц.
в принципе, и у меня может быть сбой (паразитка), если вывод в буфер новой информации произойдет в середине вывода строки. но с такой скоростью динамического вывода я сбой не вижу.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Друг Кота
Аватара пользователя
Сообщения: 15778
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

"Проблеск" при произвольной точке обновления зависит от многих причин - тут и время между запросами обновления, зависящее от длины исполняемых фрагментов основной программы между запросами на обновление, количество знакомест, модуль одновременно выводимых позиций (если портов сегментных ключей более одного) и прочие "стечения обстоятельств".
Иногда даже от момента взгляда на индикатор (типа "...уфф! и померещится же!...").
Давно уже все это учтено в спецконтроллерах. А к самодельной динамической индикации разве что для всяких рекламных щитов с "мультипликацией" да изредка бегущих строк (и то там уже давно спецконтроллеры подавляющее преимущество по применению получили) обращаются.
8)
Реклама
Эиком - электронные компоненты и радиодетали
Модератор
Аватара пользователя
Сообщения: 19100
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Сообщение Starichok51 »

если для 74hc595 можно сделать синхронизацию вывода в буфер после окончания вывода всей строки, а как быть со спецконтроллером MAX7219, у него не узнаешь, когда закончен вывод всех 8 разрядов?
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 15778
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

У MAX7219 это уже заложено в его внутренней прошивке - это же не просто регистр, а спецконтроллер динамической индикации.
К примеру, кусочек из моей самодельной библиотеки с описанием его программно доступных ресурсов:
Спойлер

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

#define addp0 1 // значение адреса регистра данных позиции 1 дисплея
#define addp1 2 // значение адреса регистра данных позиции 2 дисплея
#define addp2 3 // значение адреса регистра данных позиции 3 дисплея
#define addp3 4 // значение адреса регистра данных позиции 4 дисплея
#define addp4 5 // значение адреса регистра данных позиции 5 дисплея
#define addp5 6 // значение адреса регистра данных позиции 6 дисплея
#define addp6 7 // значение адреса регистра данных позиции 7 дисплея
#define addp7 8 // значение адреса регистра данных позиции 8 дисплея

#define No_Op 0 // значение адреса регистра No_Op
// регистр No_Op используется исключительно при каскадировании max7219
#define Dec_Mod 9// значение адреса регистра Decode_Mode
#define Intensit 0x0A // значение адреса регистра Intensity
#define Sc_Lim 0x0B // значение адреса регистра Scan_Limit
#define Shut_Dn 0x0C // значение адреса регистра Shut_Down
#define Disp_ts 0x0F // значение адреса регистра Display_test

#define Com_DM_0 0 // Dec_Mod, все позиции только под знакосинтез DM отключен
#define Com_DM_1 1 // Dec_Mod, B_fntN только для позиции 0, поз. 1-7 под знакосинтез
#define Com_DM_2 2 // Dec_Mod, B_fntN для позиций 0-3, поз. 4-7 под знакосинтез
#define Com_DM_3 3 // Dec_Mod, B_fntN для позиций 0-7

#define Com_int_0 0 // Intensit, уровень яркости 1/32 (минимальный)
#define Com_int_1 1 // Intensit, уровень яркости 3/32
#define Com_int_2 2 // Intensit, уровень яркости 5/32
#define Com_int_3 3 // Intensit, уровень яркости 7/32
#define Com_int_4 4 // Intensit, уровень яркости 9/32
#define Com_int_5 5 // Intensit, уровень яркости 11/32
#define Com_int_6 6 // Intensit, уровень яркости 13/32
#define Com_int_7 7 // Intensit, уровень яркости 15/32
#define Com_int_8 8 // Intensit, уровень яркости 17/32
#define Com_int_9 9 // Intensit, уровень яркости 19/32
#define Com_int_A 10 // Intensit, уровень яркости 21/32
#define Com_int_B 11 // Intensit, уровень яркости 23/32
#define Com_int_C 12 // Intensit, уровень яркости 25/32
#define Com_int_D 13 // Intensit, уровень яркости 27/32
#define Com_int_E 14 // Intensit, уровень яркости 29/32
#define Com_int_F 15 // Intensit, уровень яркости 31/32 (максимальный)

#define Com_SL_0 0 // Sc_Lim, индикация только в позиции 0 (max s I 10mA!)
#define Com_SL_1 1 // Sc_Lim, индикация только в позиции 0,1 (max s I 20mA!)
#define Com_SL_2 2 // Sc_Lim, индикация только в позиции 0,1,2 (max s I 30mA!)
#define Com_SL_3 3 // Sc_Lim, индикация только в позиции 0,1,2,3
#define Com_SL_4 4 // Sc_Lim, индикация только в позиции 0,1,2,3,4
#define Com_SL_5 5 // Sc_Lim, индикация только в позиции 0,1,2,3,4,5
#define Com_SL_6 6 // Sc_Lim, индикация только в позиции 0,1,2,3,4,5,6
#define Com_SL_7 7 // Sc_Lim, индикация только в позиции 0,1,2,3,4,5,6,7

#define Com_Shutdn_md 0 // Shut_Dn, значение данных команды Shutdown_mode
#define Com_Normal_md 1 // Shut_Dn, значение данных команды Normal_mode
#define Com_tst_on_md 1 // Disp_ts, значение данных команды display test on_mode
#define Com_tst_of_md 0 // Disp_ts, значение данных команды display test off_mode

и сама "библиотечка" (сделана "в рамках референса" ардуино)
max72m.zip
(5.17 КБ) 63 скачивания
8)
Реклама
Модератор
Аватара пользователя
Сообщения: 19100
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Сообщение Starichok51 »

удивляюсь я сочинительством библиотек для самых простых дел.
для MAX7219 нужна всего одна подпрограмма (функция) отправки двух байтов команды, и ради этого сочинять библиотеку.
ладно, сочинил библиотеку, сделал, что хотел.
а зачем ты везде сделал задержки по 60 мкс? только тормозить вывод.
микросхема работает до 10 МГц, это значит, что она будет работать даже при тактовой частоте 20 МГц, и без всяких принудительных задержках.
а зачем тебе понадобилось создавать функцию overZnak? а также функцию znak, которая у тебя при выводе не используется?
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Друг Кота
Аватара пользователя
Сообщения: 15778
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

В данном случае можно и простыми Сишными файликами обойтись. Однако неплохая тренировка по созданию класса (это особенность ардуино С++).
Разница там в занимаемом месте в окне IDE - Сишные файлики видны да и в папке проекта обязаны присутствовать, а библиотека (с классом) может быть вынесена. В принципе - кому как удобнее..
Для самодельной функции вывода в случае приложения к MAX7219 в принципе особой разницы нет - там ведь только пересылка данных - регенерацию дисплей сам делает. Да и разницы между самоделкой и встроенной функцией shiftOut особо нету - оная также программным способом выполняется. Плюс перестраховка...
Касательно "обратного знакогенератора" - понадобиться может для ускоренной обработки данных, уже выведенных на дисплей.
К примеру быстрый анализ статуса меню по "беглому курсору" и текущему префиксу - кракозябре (в том же K145M).
Относительно простого знакогенератора - облегчает жизнь при предобработке данных. Использовать или нет - то уже от замысла в основной программе зависит (выводим цифирки или символы/кракозябры).
А вот насчет двух буферных массивов... при "полноценной динамике" на одном МК без обвязки (или с минимальной обвязкой на простейшей "рассыпухе") нужны оба - и "видеопамять" и "предобработка", а для спецконтроллеров только "предобработка" - буфер для вывода содержат сами спецконтроллеры.
То уже несколько иная тема.
Пока что у меня была цель "дистанционно" по схемке да в рамках "референса" ардуино повторить версию алгоритма, хорошо отработанного под ассемблером. Вроде удачно получилось - но "для ограниченной области применений" - адуринка таки для неспешной обработки данных больше годиться, в компании с периферийными спецконтроллерами (от готовых изделий до самодельных из "подоручных" малолапых МК).
8)
Модератор
Аватара пользователя
Сообщения: 19100
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Сообщение Starichok51 »

понятно, что-то сделано на перспективу - а вдруг когда-то и где-то понадобится.
но ты не сказал, зачем ты сделал такие большие и совсем не нужные задержки.
лично мне проще прямо в тексте сделать необходимый минимум, а не выносить одинаковые действия в библиотеку. когда понадобится еще раз, мне проще скопировать нужный блок кода.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Друг Кота
Аватара пользователя
Сообщения: 15778
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Это если маленький проект или необходимо повысить быстродействие - встраиваем в соответствующие места по тексту. В остальном - лучше в отдельной функции сделать.
Разница та же, что и в ассемблере относительно подпрограмм - те места меньше занимают, но по времени еще и вызов/возврат со стековыми операциями добавляется.
По большим задержкам... перестраховка больше. да и средствами референса получить информацию о времени исполнения довольно сложно. Разве что по симулятору или минимум по времени исполнения для нанки/про-мини или уно от Гайвера (тогда я эту инфу еще не видел). Вариант непосредственной работы с регистрами/командами в рамках ассемблера GCC - это "для профессионалов" (или для дальнейшего нескорого изучения) - но концепция ардуино такой подход не приветствует - там несколько разных семейств в обобщенном варианте референса используются - в каждом семействе МК свой спец нужен, доолгоо осваивать надо.
8)
Модератор
Аватара пользователя
Сообщения: 19100
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Сообщение Starichok51 »

я проекты делаю для себя, для домашних нужд. поэтому можно назвать их маленькими.
мои самые большие проекты - чуть более 4 кБ кода.
как я говорил ранее, пишу только на ассемблере. с написанием для ардуино я вообще не знаком - мне это не нужно.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Друг Кота
Аватара пользователя
Сообщения: 15778
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

На таком же принципе динамическая развертка и в этом проекте на аттини2313 под ассемблером сделана:
extdi_2313.zip
(49.2 КБ) 59 скачиваний
использованы возможности таймера Т1 и его дополнительных регистров.
Индикатор работает сам по себе, а основная программа сама по себе. Использовал эту самоделку в одном из проектов как "внешний удаленный дисплей".
8)
Друг Кота
Аватара пользователя
Сообщения: 15778
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Это только для ПИКовых...
8)
Друг Кота
Аватара пользователя
Сообщения: 3794
Зарегистрирован: Ср дек 24, 2008 09:58:58

Сообщение Ser60 »

[uquote="Martian",url="/forum/viewtopic.php?p=4544398#p4544398"]понравилась RTOS OSA Виктора Тимофеева.[/uquote]Эта тема меня интересует и я прочитал несколько страниц на их сайте. Однако, нигде не нашёл сколько она требует RAM/Flash памяти в какой-либо минимальной конфигурации и сравнения чем она отличается, хотя-бы от той-же FreeRTOS. Есть у Вас ссылки где это можно почитать?
Друг Кота
Аватара пользователя
Сообщения: 15778
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Martian
Большинство прикладных - бытовых самоделок обычно с одной задачей.
Разве что динамическая индикация без совмещения с обработчиком кнопок может идти "псевдо параллельным" процессом.
Многофункционалки не слишком хорошо воспринимаются домашним потребителем - слишком моного действий (выбор режима, настройки значений и прочие...) перед употреблением снижает полезность с точки зрения "хозяек домашнего очага" (в отличии от авторов таких конструкций).
8)
А делать какой-либо аналог бытового "псевдокомпьютера" при огромном наличи обычных устройств (начиная с мобилки и далее...) на сегодня желающих весьма мало. Тем более после разгромно - ошеломляющего "оглушения адуринкой", когда стало возможным и "несведущему школяру" создать без труда сложные устройства (часто за счет плагиата).
Вот п приходится (кому из спортивна интересу, кому "через начально негативно восприятие") с той адуринкой таки знакомиться. Да уже не со школярским подходом - но то ведь время нужно на освоение (хотя бы на уровне "продвинутого пользователя").
:wink: :beer:
Друг Кота
Аватара пользователя
Сообщения: 15778
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Ну уж в таком случае интереснее для каждого своего изделия соответствующий вариант "операционной системы" (или диспетчера/распределителя задач) самому написать.
Иногда даже не зная о том, что создал "операционную систему" или еще чего красиво называемого.
8)
Кстати... адуринка в этом неплохо мозги тренировать заставляет, ежли не копипастом заниматься, а самому искать решения в жестко заданных рамках типового ее "референса".
:roll:
Поставщик валерьянки для Кота
Сообщения: 1972
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария

Сообщение veso74 »

То, что делается с помощью RTOS, можно сделать и без RTOS :). Снижает "мышление" по управленя (и время создания проекта). Потерянный ресурс невелик, но его стоит предвидеть (PIC-C Compiler и STM32 HAL, пробовал несколько раз, в основном для динамической индикации и проверки датчика).
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 15778
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Опять мы от исходной темы отклонились.
:tea:
Надо бы поглядеть, можно ли для решения исходной задачи таймером Т1 пожертвовать (чего при этом потеряю в рамках функций "референса")...
Та же тест-прожка с движком динамической индикации, но в приложении к устройству на аттини2313 или атмега8 и прерывании от Т1.
Да и схемку "удавить" - без внешних регистров но с дополнительным обработчиком кнопок (вроде там их 4 штуки поставить можно).
То уже попозже наверно попробую...
:roll:
Собутыльник Кота
Аватара пользователя
Сообщения: 2977
Зарегистрирован: Сб май 21, 2016 11:04:52
Откуда: Беларусь

Сообщение olegue »

я тут было хотел с часов на индикатор вывести, но вот беда ничего не выводится. Может кто-то навскидку скажет в чем проблема:
Спойлер

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

#include "RTClib.h"
RTC_DS1307 rtc;

#include <GyverNTC.h>
GyverNTC therm(0, 10000, 3950);
//---- ПИНЫ ----
byte SCLK = 7;
byte RCLK = 6;
byte DIO = 5;
//---- ПИНЫ ----

#include <TM74HC595Display.h>
#include <TimerOne.h>
TM74HC595Display disp(SCLK, RCLK, DIO);
unsigned char SYM[18];
unsigned long dispIsrTimer, countTimer;

void setup() {
  
}
//char displayTime[4];
void loop() {
  
  if (millis() - countTimer > 1000) {   // каждые 50 миллисекунд ("прозрачный" аналог delay)
    
     DateTime now = rtc.now();
      int displaytime = ((now.hour() * 100) + now.minute());

  disp.digit4(displaytime); 


    countTimer = millis();            // сбросить таймер
  }

  disp_isr();                         // динамическая индикация
}

void disp_isr() {
  if (micros() - dispIsrTimer > 300) {       // таймер динамической индикации (по-русски: КОСТЫЛЬ!)
    disp.timerIsr();                         // "пнуть" дисплей
    dispIsrTimer = micros();                 // сбросить таймер
  }
}

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

  int displaytime = ((now.hour() * 100) + now.minute());

  disp.digit4(displaytime); 
не выводит часы миниты, вообще на экране ни одно сегмента не горит
предполагается что now.hour() и now.minute() типа int
если просто пишу

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

disp.digit4(2024); 
нормально выводит

порядок работы с библиотекой:
/*
Основные методы библиотеки:
disp.set(X, port); // вывести 16 ричный код X в порт port (либо элемент массива SYM!!!)

// вывести двухзначное число value на порт port (0 - первый и второй порт, 2 - 2 и 3, 3 - 3 и 4 порты))
disp.digit2(value, port);

disp.digit4(value); // вывести число value
disp.digit4showZero(value); // вывести число value с нулями СЛЕВА

disp.float_dot(value, pos); // вывести float число value с точкой СПРАВА по счёту pos
disp.int_dot(value, pos); // вывести int число value с точкой СПРАВА по счёту pos

disp.clear(); // очистить дисплей
*порты идут справа налево! (3 2 1 0)
*/
в сериалпорт время нормально выводит.

Добавлено after 7 minutes 5 seconds:
может есть мысли как подобраться к решению, в чем может быть проблем, что попробовать, чем проэкспериментировать?

Добавлено after 1 hour 5 minutes 1 second:
Блин,от баран. Понимаю ж сам что чудес не бывает:
забыл дописать:

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

rtc.begin();
Добавлено after 22 minutes 20 seconds:
теперь надо как-то заставить мигать dp, ну типа тчо бы было похоже на часы
Друг Кота
Аватара пользователя
Сообщения: 15778
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

С секундной точкой достаточно ее инвертирование по прерыванию от RTC задать.
Но то довольно медленно работает. удачнее инверсия раз в 0,5 секунды - к сожалению такой вариант заметно сложнее - зависит от организации отсчета выводимых показаний.
:roll:
Ответить

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