Обсуждаем контроллеры компании Atmel.
Ответить

Re: OLED на Attiny13

Чт фев 07, 2019 16:39:04

zöner
молодец, надо как то попробовать, так как тинек много безхозых и экраны есть.

Re: OLED на Attiny13

Пт фев 08, 2019 00:34:47

Супер. Схемку бы.

Re: OLED на Attiny13

Пт фев 08, 2019 08:56:45

для большей точности добавлен опорник для питания контроллера (напряжение задается в исходнике константой ADC_REF)

Изображение Изображение Изображение

Re: OLED на Attiny13

Пт фев 08, 2019 12:52:11

А все это редкое у нас зверье REF3033 MCP1541 MCP170 XC6220 чем-нибудь, например, в из линейки 1117-3.3, 1117-5.0 заменить никак?

Re: OLED на Attiny13

Пт фев 08, 2019 15:03:34

1117 выигрыша в точности не даст - запитайте контроллер прямо от 78L05
или возьмите 3.3В с OLED модуля

Re: OLED на Attiny13

Пт фев 08, 2019 16:58:54

т.е., вопрос питания большей частью умозрительно-философский :) .

Re: OLED на Attiny13

Пт фев 08, 2019 19:02:33

зависит от требуемой точности - у 7805 ошибка до 5%
еще можно замерять питание и перекомпилировать прошивку з заменой ADC_REF

Re: OLED на Attiny13

Пт фев 08, 2019 19:20:00

zöner красава!
Что там насчёт
Физически невозможно...

И? Я когда писал, что физически невозможно, подразумевалось, что будет мало мальски серьёзное устройство. Как минимум, интерфейс, кнопки, меню. Именно в этом случае НЕВОЗМОЖНО впихнуться в 1 кБ флеша. В случае же ТС-а, это просто показометр. Я поглядел код. Ни усреднения, ничего. Очень много усилий на то, что влезть в ограниченный объем флеша ради показометра, который что то там показывает. Годно как устройство для личного употребления, тренировки впихнуться в крайне ограниченные ресурсы мк. Но не годно для массового тиража. Графический дисплей избыточен в показометре.
Лично я не стал бы изьебываться с си. И писал бы программу на асме. Так как знаю этот язык и архитектуру авр на достаточном уровне. Но! Для устройства класса показометр взял бы семисегментники.

Re: OLED на Attiny13

Пт фев 08, 2019 19:28:23

пишите, кто мешает... кстати, на асме много не выиграете - С компилится довольно компактно, а критичная часть - умножение - и так написано на асме...
зачем вольтметру кнопки и меню? мне - не нужно. 7-сегментники тянут за собой еще кучу выводов, резисторов и транзисторов
делалось для себя как замена китайскому го.ну, т.к. задолбала подсветка сегментов и медленное измерение, плюс нужно было несколько каналов, и OLEDы и Tiny валялись в загашнике...

Re: OLED на Attiny13

Пт фев 08, 2019 21:17:43

зависит от требуемой точности
Во всяком случае, в процессе пайки/тестирования можно ставить то, что есть в наличии, что есть хорошо, улучшить можно позже, неспеша поискав комплектующие согласно схеме.
это просто показометр
А бОльшего в подавляющем большинстве случаев и не требуется. И усреднять далеко не всегда есть хорошо. По стоимости вольтметрик получается сопоставим с нищебродскими китайскими поделками на LED, а по точности их переплюнет, на всех четырех каналах. Да еще и выглядит не в пример гламурнее. Да, мне важен гламур :))) .

А желаете проф.прибор для репликации в промышленных масштабах - пачку баксов в карман, и вэлкам к ТС в личку :))) .

Re: OLED на Attiny13

Сб фев 09, 2019 05:37:31

Посмотрел код. Можно ещё оптимальное сделать. При преобразования hex-dec единица не нужна. Когда отнял десятки, единицы выводятся как есть.
Спойлер
Код:
#ifndef BCD_H
#define BCD_H

#include "bcd.h"

#include "main_def_func.h"

//==================
extern char num_str_buf [];
extern char tmp_num_str_buf [];
//==================

//==================
typedef enum
{
   VAL_08_BIT = 0,
   VAL_16_BIT,
   VAL_32_BIT,
} type_val_t;

void val_to_str (u32 value, type_val_t type_val);

u16 str_to_int (void);
u32 str_to_long (void);
//==================

//==================
void clr_tmp_num_str_buf (void);
void clr_num_str_buf (void);
//==================

#endif //BCD_H


Спойлер
Код:
//==================
#include "bcd.h"
//==================

//==================
char num_str_buf [11];
char tmp_num_str_buf [11];
//==================

//==================
void clr_num_str_buf (void)
{
   char *ptr = num_str_buf;
   u08 cnt = 10;

   while (cnt)
   {
      *ptr++ = ' ';
      cnt--;
   }
   *ptr = 0;
}
//==================

//==================
void clr_tmp_num_str_buf (void)
{
   char *ptr = tmp_num_str_buf;
   u08 cnt = 10;

   while (cnt)
   {
      *ptr++ = ' ';
      cnt--;
   }
   *ptr = 0;
}
//==================

//==================
__flash u32 tab_hex_dec [] =
{
   1000000000U,
   100000000U,
   10000000U,
   1000000U,
   100000U,
   10000U,
   1000U,
   100U,
   10U,
};
//==================

//==================
void val_to_str (u32 value, type_val_t type_val)
{
   u32 a;

   bool flag = false;

   u08 cnt_1;
   u08 cnt_2;

   u08 displace;

   clr_num_str_buf ();

   switch (type_val)
   {
      case VAL_08_BIT:
         displace = 7;
         cnt_1 = 2;
         break;

      case VAL_16_BIT:
         displace = 5;
         cnt_1 = 4;
         break;

      case VAL_32_BIT:
         displace = 0;
         cnt_1 = 9;
         break;
   }

   char *ptr = num_str_buf + displace;

   u32 __flash *ptr_f = tab_hex_dec + displace;

   while (cnt_1)
   {
      a = *ptr_f;
      cnt_2 = 0;

      while (value >= a)
      {
         value -= a;
         cnt_2++;
      }

      if (flag == false)
      {
         if (cnt_2 == 0)
         {
            *ptr++ = ' '; // Гашение незначащих нулей.
         }
         else
         {
            *ptr++ = (cnt_2 | 0x30);
            flag = true;
         }
      }
      else
      {
         *ptr++ = (cnt_2 | 0x30);
      }

      ptr_f++;
      cnt_1--;
   }
   *ptr++ = (value | 0x30);
   *ptr = 0;
}
//==================



//==================
u16 str_to_int (void)
{
   char *ptr_num = tmp_num_str_buf + 5;
   u32 __flash *ptr_f = tab_hex_dec + 5;
   u16 a;
   u08 cnt = 0;
   u16 tmp_value = 0;

   while (cnt < 4)
   {
      if ((*ptr_num > 0x30) && (*ptr_num < 0x3A))
      {
         a = (*ptr_num - 0x30);

         while (a)
         {
            tmp_value += *ptr_f;
            a--;
         }
      }
      *ptr_num++;
      ptr_f++;
      cnt++;
   }

   return tmp_value += (*ptr_num - 0x30);
}
//==================

//==================
u32 str_to_long (void)
{
   char *ptr_num = tmp_num_str_buf;
   u32 __flash *ptr_tab_10 = tab_hex_dec;
   u32 a;
   u08 cnt = 0;
   u32 tmp_value = 0;

   while (cnt < 9)
   {
      if ((*ptr_num > 0x30) && (*ptr_num < 0x3A))
      {
         a = (*ptr_num - 0x30);

         while (a)
         {
            tmp_value += *ptr_tab_10;
            a--;
         }
      }
      *ptr_num++;
      ptr_tab_10++;
      cnt++;
   }

   return tmp_value += (*ptr_num - 0x30);
}
//==================


Код немного тяжеловат, так как используется гашение незначащих нулей и это единая функция вплоть до 32-разрядного числа.

Кстати, какой компилятор использовался?

Re: OLED на Attiny13

Пн фев 11, 2019 13:05:49

Кстати, какой компилятор использовался?
avr-gcc, выше есть строка компиляции
А бОльшего в подавляющем большинстве случаев и не требуется
10-битный АЦП с соответствующей опорой даст точность 0.2..0.3%, резисторы 0.1% уже не редкость - более чем достаточно для показометра...
если нужно большее разрешение - ads1110/1115 по 1..2$ на Али...

Re: OLED на Attiny13

Вт фев 12, 2019 16:08:03

индикатор оборотов (напр. дрели/микродрели), вход импульсов PB2
Вложения
main.hex
(2.8 KiB) Скачиваний: 487
main.c
(11.5 KiB) Скачиваний: 598
main.h
(2.28 KiB) Скачиваний: 523

Re: OLED на Attiny13

Вт фев 12, 2019 18:41:34

zöner, картинки индикатора оборотов в работе нет?

Re: OLED на Attiny13

Вт фев 12, 2019 21:13:16

5 разрядов:
Изображение

прошивка на 4 разряда:
Вложения
main.hex
(2.8 KiB) Скачиваний: 279

Re: OLED на Attiny13

Вт фев 12, 2019 23:15:12

... какой смысл 5 разрядов, если прошивка на 4 разряда.

Ну и дрель как подключать, чтобы оно обороты/импульсы считало? Или достаточно подать напряжение питания? Обратно же, нет схемки счетчика оборотов, сиречь, тахометра, если я правильно все понял.

Re: OLED на Attiny13

Ср фев 13, 2019 03:41:40

да, это тахометр. прошивка на 5 разрядов была на пост выше.
датчик оборотов - магнитик на вал и датчик Холла сбоку (в некоторых дрелях есть магнит на валу). Или оптопару на просвет / отражение.

Re: OLED на Attiny13

Ср фев 13, 2019 04:59:37

Более простой/доступный вариант для реализации в железе - стробоскоп на светодиоде.

Re: OLED на Attiny13

Ср фев 13, 2019 06:50:48

И? Я когда писал, что физически невозможно, подразумевалось, что будет мало мальски серьёзное устройство. Как минимум, интерфейс, кнопки, меню. Именно в этом случае НЕВОЗМОЖНО впихнуться в 1 кБ флеша. В случае же ТС-а, это просто показометр. Я поглядел код. Ни усреднения, ничего. Очень много усилий на то, что влезть в ограниченный объем флеша ради показометра, который что то там показывает. Годно как устройство для личного употребления, тренировки впихнуться в крайне ограниченные ресурсы мк. Но не годно для массового тиража. Графический дисплей избыточен в показометре.
Лично я не стал бы изьебываться с си. И писал бы программу на асме. Так как знаю этот язык и архитектуру авр на достаточном уровне. Но! Для устройства класса показометр взял бы семисегментники.

Как ПОКАЗОМЕТР для измерения ЧСВ пойдёт? Рекомендую.

Re: OLED на Attiny13

Ср фев 13, 2019 07:24:26

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