3-х разрядный ампервольтметр на атмега

Обсуждаем контроллеры компании Atmel.
charchyard
Поставщик валерьянки для Кота
Сообщения: 2466
Зарегистрирован: Сб май 07, 2011 17:52:59

3-х разрядный ампервольтметр на атмега

Сообщение charchyard »

Здравствуйте коты! я, к сожаленью, полнейший нуль в программировании. Помогите скрестить ежа и ужа. Нашёл в Сети видео вольтметра на семисегментном 3-х индикаторе
мк атмега_8 или атмега_16. предел 0...100в с точностью 0,1в... и амперметр 0...100а с точностью 0,1а. шунт 100а 75мВ. Вопрос как правильно скрестить две программы,
чтобы атмега оцифровывала поочерёдно эти переменные на входах PA0 и PA1 и выводила на два 3-х разрядных 7-индикатора ОА. программа для вольтметра и амперметра одна.
А вот как запихнуть эти две функции в одну микру?
Вложения
voltmeter_0_100v.png
(171.44 КБ) 538 скачиваний
ampermeter_0_100a.png
(181.51 КБ) 493 скачивания
av_meter.zip
(45.77 КБ) 443 скачивания
душа человеческая темна и с легкостью обращается ко злу
Аватара пользователя
Martin76
Друг Кота
Сообщения: 20159
Зарегистрирован: Пт фев 04, 2011 17:57:51
Откуда: Рыбинск

Re: 3-х разрядный ампервольтметр на атмега

Сообщение Martin76 »

Вот есть готовая проверенная схема на пике https://vrtp.ru/index.php?act=categorie ... ticle=2792 там прошивка до 99,9А есть.
Аватара пользователя
АлександрЛ
Друг Кота
Сообщения: 43765
Зарегистрирован: Пн ноя 30, 2009 03:00:01
Откуда: Нерезиновая

Re: 3-х разрядный ампервольтметр на атмега

Сообщение АлександрЛ »

А вот как запихнуть эти две функции в одну микру?

Вариант 1 - написать свою программу (прошивку), если умеете.
Вариант 2 - ОПЛАТИТЬ написание своей прошивки
Вариант 3 - Тщательнее искать нужную схему
Вариант 4 - купить готовый AV метр -
https://aliexpress.ru/item/1005001356302861.html
1en2
Собутыльник Кота
Сообщения: 2804
Зарегистрирован: Вс фев 02, 2020 09:12:37

Re: 3-х разрядный ампервольтметр на атмега

Сообщение 1en2 »

5. Раз два индикатора, то ставить две атмеги и ничего никуда не запихивать (раз сам не можешь)...
Аватара пользователя
musor
Друг Кота
Сообщения: 39197
Зарегистрирован: Сб сен 13, 2014 16:27:32
Откуда: СпиртоГонск созвездия Омега

Re: 3-х разрядный ампервольтметр на атмега

Сообщение musor »

5 вариант не лучший...и да я ранше тоже сам паял на 7107 сначала дип а потом QFP
щас тупа заказали мешок разных с алехи и ставлю не парясь..
123 конечно возможен но толка из любви к трудностям=садо маза...
автору пока 4 вариан такого добра наштампованано на любой вкус и цвет ка с жидами так и на LCD
ZМудрость(Опыт и выдержка) приходит с годами.
Все Ваши беды и проблемы, от недостатка знаний.
Умный и у дурака научится, а дураку и ..
Алберт Ейнштейн не поможет и ВВП не спасет.и МЧС опаздает
charchyard
Поставщик валерьянки для Кота
Сообщения: 2466
Зарегистрирован: Сб май 07, 2011 17:52:59

Re: 3-х разрядный ампервольтметр на атмега

Сообщение charchyard »

Александр здравствуйте!
Вариант 2 - ОПЛАТИТЬ написание своей прошивки
если сможете написать, то дайте знать. такие головки я покупал в Китае и они у меня есть. но не подходят.
душа человеческая темна и с легкостью обращается ко злу
Аватара пользователя
АлександрЛ
Друг Кота
Сообщения: 43765
Зарегистрирован: Пн ноя 30, 2009 03:00:01
Откуда: Нерезиновая

Re: 3-х разрядный ампервольтметр на атмега

Сообщение АлександрЛ »

Если бы я умел писать прошивки, то у меня проблем было бы намного меньше.. А так- приходится пользоваться тем, что кто- то написал :facepalm:

А чем вас китайские ампервольтметры не устраивают?
У меня тоже пара таких валяется, когда я их проверял, там амперметр, даже после попытки его настроить, врал раза в 1,5.. Но как- бы, проблемы с их использованием нет.. :dont_know:
Аватара пользователя
Карбофос
Опытный кот
Сообщения: 760
Зарегистрирован: Сб окт 22, 2016 17:33:32
Откуда: кг

Re: 3-х разрядный ампервольтметр на атмега

Сообщение Карбофос »

На AREF лучше опорник на TL431.
Естественно, программа в живую не проверялась.
Спойлер

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

#define F_CPU 1000000uL // частота тактирования мк
// ATmega16

#include <avr/io.h>
#include <avr/interrupt.h> // библиотека прерываний включена   коды символов для индикатора
#include <string.h>
                                                    // 0    1   2    3    4    5   6    7   8    9  нет
uint8_t code_numbers_indicator[11] =                { 40, 235, 49, 161, 226, 164, 36, 233, 32, 160, 255 };

 // кол-во каналов
#define nChannels 2
// доп.разрядов на измерение каждого канала
#define nExtraBit 3
// кол-во измерений каждого канала
#define nMeasPerCh (1 << nExtraBit)
// массив с результатами работы АЦП по каналам
volatile uint16_t auRawADC[nChannels];
// флаг окончания цикла по каналам
volatile uint8_t bADCcomplete;

ISR(ADC_vect)
{
  static uint8_t nMeasure = 0;
  // номер текущего канала АЦП
  uint8_t nNowConv = ADMUX & 0b111;
  // получаем значение из регистра данных
  auRawADC[nNowConv] += ADCW;
  if(++nMeasure < nMeasPerCh) {
    // очередной запуск измерения текущего канала
    ADCSRA |= 1 << ADSC;
  } else {
    // обнуляем счетчик кол-ва измерений
    nMeasure = 0;
    // усредняем значение
    auRawADC[nNowConv] += (1 << (nExtraBit - 1));
    auRawADC[nNowConv] >>=nExtraBit;
    // сброс номера канала
    ADMUX &= 0b11100000;
    // если не все каналы оцифрованы
    if(++nNowConv < nChannels) {
      ADMUX |= nNowConv;  // следующий канал АЦП
      ADCSRA |= 1 << ADSC;
    } else {
      // цикл оцифровки каналов окончен
      bADCcomplete = 1;
    }
  }
}

#define NumDigits 6

typedef struct {
  // подключение общего анода индикатора
  volatile uint8_t * ddr;
  volatile uint8_t * port;
  uint8_t pin;
  // сегменты
  uint8_t seg;
} typDigit;

// 2 индикатора 6 цифр по-сегментно
typDigit aDisp[NumDigits] = {
  {&DDRD, &PORTD, 7, 10},
  {&DDRC, &PORTC, 0,  0},
  {&DDRC, &PORTC, 1,  0},
  {&DDRC, &PORTC, 2, 10},
  {&DDRC, &PORTC, 3,  0},
  {&DDRC, &PORTC, 4,  0}
};

void dataProcessing ( void )
{
  // значения
  aDisp[0].seg  = auRawADC[0] / 100;
  aDisp[1].seg  = auRawADC[0] % 100;
  aDisp[2].seg  = aDisp[1].seg % 10;
  aDisp[1].seg /= 10;

  aDisp[3].seg  = auRawADC[1] / 100;
  aDisp[4].seg  = auRawADC[1] % 100;
  aDisp[5].seg  = aDisp[4].seg % 10;
  aDisp[4].seg /= 10;

  // преобразуем числовые значения в набор сегментов
  for(uint8_t i = 0; i < NumDigits; ++i)
    aDisp[i].seg = code_numbers_indicator[aDisp[i].seg];
  // десятичная точка
  aDisp[1].seg &= ~(1<<5);
  aDisp[4].seg &= ~(1<<5);
}

volatile uint8_t nShowDigit;

ISR  (TIMER0_COMP_vect) // прерывание по совпадению таймера T0 работа с разрядами индикатора
{         
  // отключить общий анод предыдущего индикатора
  *aDisp[nShowDigit].port |= (1 << aDisp[nShowDigit].pin);
  // следующая цифра
  if(++nShowDigit >= NumDigits)
    nShowDigit = 0;
  // выставляем сегменты
  PORTB = aDisp[nShowDigit].seg;
  // включаем общий анод
  *aDisp[nShowDigit].port &= ~(1 << aDisp[nShowDigit].pin);
}

void Setup(void)
{
  // таймер смены отборажения цифр
  // Каждая цифра отображается T = 64*(1+OCR0)/F_CPU = 64*(1+24)/1000000=1.6мсек
  OCR0=24; // число в регистре сравнения COMP                 
  TCCR0=0b00001011; // преддделитель /64; сброс по совпадению чисел в регистрах TCNT0 & OCR0   
  TIMSK|=(1<<1); // вектор прерывания сработает по совпадению 
  // сегменты индикаторов
  PORTB = 255; // выставляем порт PB в единичное состояние
  DDRB = 255; // выставляем порт PB на вывод
  // пины общих анодов на вывод
  for(uint8_t i = 0; i < NumDigits; ++i)
    *aDisp[i].ddr |= (1 << aDisp[i].pin);
  // АЦП
  ADMUX |=(0<<REFS0)|(0<<REFS1)|(0<<MUX3)|(0<<MUX2)|(0<<MUX1)|(0<<MUX0);  // опорное Vref=+AREF(refs0/refs1); входной канал PA0(mux0...mux4)     
  ADCSRA|=(1<<ADEN)|(1<<ADIE)|(1<<ADIF)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); // вкл ацп (aden); разрешение прерывания (adie); предделитель adc /128 (adps0...adps2)
  DDRA &= ~((1<<1)|(1<<0)); // настраиваем 0 и 1 биты порт А на ввод (вход ацп)
}

int main (void)
{
  Setup();
  // обнуляем массив значений каналов
  memset((void*)auRawADC, 0, sizeof(auRawADC));
  // флаг окончания цикла оцифровки каналов
  bADCcomplete = 0;
  // номер цифры для отображения
  nShowDigit = 0;
  sei(); // разрешаем прерывания
  // запуск АЦП
  ADCSRA |= 1 << ADSC;
  while(1) {
    if(nShowDigit == NumDigits - 1 && bADCcomplete) {
      dataProcessing();
      memset((void*)auRawADC, 0, sizeof(auRawADC));
      bADCcomplete = 0;
      // запуск АЦП
      ADCSRA |= 1 << ADSC;
    }
  }         
}
charchyard
Поставщик валерьянки для Кота
Сообщения: 2466
Зарегистрирован: Сб май 07, 2011 17:52:59

Re: 3-х разрядный ампервольтметр на атмега

Сообщение charchyard »

:o вах... так щаз мы её и проверим :solder: а там опорное +5в0 предполагается? а чем опорное питание с 7805 не нравиться?
душа человеческая темна и с легкостью обращается ко злу
charchyard
Поставщик валерьянки для Кота
Сообщения: 2466
Зарегистрирован: Сб май 07, 2011 17:52:59

Re: 3-х разрядный ампервольтметр на атмега

Сообщение charchyard »

не компилирует код атмелстудия... ошибки какие-то... я такое починить не смогу :o :shock:
Вложения
av_meter.rar
(9.11 КБ) 359 скачиваний
душа человеческая темна и с легкостью обращается ко злу
Аватара пользователя
Карбофос
Опытный кот
Сообщения: 760
Зарегистрирован: Сб окт 22, 2016 17:33:32
Откуда: кг

Re: 3-х разрядный ампервольтметр на атмега

Сообщение Карбофос »

Про атмел-студию ничего не могу сказать, т.к. не пользуюсь ей. Может быть, местные обитатели подскажут, как в ней собрать.
Я в командной строке make-ом собираю, avr-gcc компилятор.
Приложил собранный проект.
Аватара пользователя
Serzh2000
Опытный кот
Сообщения: 867
Зарегистрирован: Пт фев 27, 2015 12:00:53
Откуда: Рязанская область

Re: 3-х разрядный ампервольтметр на атмега

Сообщение Serzh2000 »

8)
charchyard писал(а):не компилирует код атмелстудия... ошибки какие-то... я такое починить не смогу :o :shock:
Изображение

скопировал
Спойлер#define F_CPU 1000000uL // частота тактирования мк
// ATmega16

#include <avr/io.h>
#include <avr/interrupt.h> // библиотека прерываний включена коды символов для индикатора
#include <string.h>
// 0 1 2 3 4 5 6 7 8 9 нет
uint8_t code_numbers_indicator[11] = { 40, 235, 49, 161, 226, 164, 36, 233, 32, 160, 255 };

// кол-во каналов
#define nChannels 2
// доп.разрядов на измерение каждого канала
#define nExtraBit 3
// кол-во измерений каждого канала
#define nMeasPerCh (1 << nExtraBit)
// массив с результатами работы АЦП по каналам
volatile uint16_t auRawADC[nChannels];
// флаг окончания цикла по каналам
volatile uint8_t bADCcomplete;

ISR(ADC_vect)
{
static uint8_t nMeasure = 0;
// номер текущего канала АЦП
uint8_t nNowConv = ADMUX & 0b111;
// получаем значение из регистра данных
auRawADC[nNowConv] += ADCW;
if(++nMeasure < nMeasPerCh) {
// очередной запуск измерения текущего канала
ADCSRA |= 1 << ADSC;
} else {
// обнуляем счетчик кол-ва измерений
nMeasure = 0;
// усредняем значение
auRawADC[nNowConv] += (1 << (nExtraBit - 1));
auRawADC[nNowConv] >>=nExtraBit;
// сброс номера канала
ADMUX &= 0b11100000;
// если не все каналы оцифрованы
if(++nNowConv < nChannels) {
ADMUX |= nNowConv; // следующий канал АЦП
ADCSRA |= 1 << ADSC;
} else {
// цикл оцифровки каналов окончен
bADCcomplete = 1;
}
}
}

#define NumDigits 6

typedef struct {
// подключение общего анода индикатора
volatile uint8_t * ddr;
volatile uint8_t * port;
uint8_t pin;
// сегменты
uint8_t seg;
} typDigit;

// 2 индикатора 6 цифр по-сегментно
typDigit aDisp[NumDigits] = {
{&DDRD, &PORTD, 7, 10},
{&DDRC, &PORTC, 0, 0},
{&DDRC, &PORTC, 1, 0},
{&DDRC, &PORTC, 2, 10},
{&DDRC, &PORTC, 3, 0},
{&DDRC, &PORTC, 4, 0}
};

void dataProcessing ( void )
{
// значения
aDisp[0].seg = auRawADC[0] / 100;
aDisp[1].seg = auRawADC[0] % 100;
aDisp[2].seg = aDisp[1].seg % 10;
aDisp[1].seg /= 10;

aDisp[3].seg = auRawADC[1] / 100;
aDisp[4].seg = auRawADC[1] % 100;
aDisp[5].seg = aDisp[4].seg % 10;
aDisp[4].seg /= 10;

// преобразуем числовые значения в набор сегментов
for(uint8_t i = 0; i < NumDigits; ++i)
aDisp[i].seg = code_numbers_indicator[aDisp[i].seg];
// десятичная точка
aDisp[1].seg &= ~(1<<5);
aDisp[4].seg &= ~(1<<5);
}

volatile uint8_t nShowDigit;

ISR (TIMER0_COMP_vect) // прерывание по совпадению таймера T0 работа с разрядами индикатора
{
// отключить общий анод предыдущего индикатора
*aDisp[nShowDigit].port |= (1 << aDisp[nShowDigit].pin);
// следующая цифра
if(++nShowDigit >= NumDigits)
nShowDigit = 0;
// выставляем сегменты
PORTB = aDisp[nShowDigit].seg;
// включаем общий анод
*aDisp[nShowDigit].port &= ~(1 << aDisp[nShowDigit].pin);
}

void Setup(void)
{
// таймер смены отборажения цифр
// Каждая цифра отображается T = 64*(1+OCR0)/F_CPU = 64*(1+24)/1000000=1.6мсек
OCR0=24; // число в регистре сравнения COMP
TCCR0=0b00001011; // преддделитель /64; сброс по совпадению чисел в регистрах TCNT0 & OCR0
TIMSK|=(1<<1); // вектор прерывания сработает по совпадению
// сегменты индикаторов
PORTB = 255; // выставляем порт PB в единичное состояние
DDRB = 255; // выставляем порт PB на вывод
// пины общих анодов на вывод
for(uint8_t i = 0; i < NumDigits; ++i)
*aDisp[i].ddr |= (1 << aDisp[i].pin);
// АЦП
ADMUX |=(0<<REFS0)|(0<<REFS1)|(0<<MUX3)|(0<<MUX2)|(0<<MUX1)|(0<<MUX0); // опорное Vref=+AREF(refs0/refs1); входной канал PA0(mux0...mux4)
ADCSRA|=(1<<ADEN)|(1<<ADIE)|(1<<ADIF)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); // вкл ацп (aden); разрешение прерывания (adie); предделитель adc /128 (adps0...adps2)
DDRA &= ~((1<<1)|(1<<0)); // настраиваем 0 и 1 биты порт А на ввод (вход ацп)
}

int main (void)
{
Setup();
// обнуляем массив значений каналов
memset((void*)auRawADC, 0, sizeof(auRawADC));
// флаг окончания цикла оцифровки каналов
bADCcomplete = 0;
// номер цифры для отображения
nShowDigit = 0;
sei(); // разрешаем прерывания
// запуск АЦП
ADCSRA |= 1 << ADSC;
while(1) {
if(nShowDigit == NumDigits - 1 && bADCcomplete) {
dataProcessing();
memset((void*)auRawADC, 0, sizeof(auRawADC));
bADCcomplete = 0;
// запуск АЦП
ADCSRA |= 1 << ADSC;
}
}
}


вставил Atmel Studio 7.0 все, ничего там собирать не надо.
charchyard
Поставщик валерьянки для Кота
Сообщения: 2466
Зарегистрирован: Сб май 07, 2011 17:52:59

Re: 3-х разрядный ампервольтметр на атмега

Сообщение charchyard »

да код рабочий :beer: теперь осталось понять куда в шпротеусе подключать вход делителя вольтметра и выход усилка амперметра и как индикаторы к меге подключать :shock: ну вот же тупой бл :?
душа человеческая темна и с легкостью обращается ко злу
Аватара пользователя
Карбофос
Опытный кот
Сообщения: 760
Зарегистрирован: Сб окт 22, 2016 17:33:32
Откуда: кг

Re: 3-х разрядный ампервольтметр на атмега

Сообщение Карбофос »

Вход делителя вольтметра и выход усилка амперметра - PA0, PA1.
Катоды (сегменты) всех индикаторов - как и в оригинальной схеме, через токоограничительные резисторы к порту PB.
Общие аноды 1-го 3-х разрядного индикатора - как в оригинальной схеме, через транзисторные ключи, старший PD7, средний PC0, младший PC1.
Общие аноды 2-го 3-х разрядного индикатора - так-же через транзисторные ключи, старший PС2, средний PC3, младший PC4.

Подключение сегментов жестко задано - порт PB с привязкой каждого сегмента к конкретному пину.

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

uint8_t code_numbers_indicator[11] ={40, 235, 49, 161, 226, 164, 36, 233, 32, 160, 255 };

Подключение общих анодов задано массивом

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

// 2 индикатора 6 цифр по-сегментно
typDigit aDisp[NumDigits] = {
  {&DDRD, &PORTD, 7, 10}, // общий анод старшего разряда 1-го индикатора
  {&DDRC, &PORTC, 0,  0}, // общий анод среднего разряда 1-го индикатора
  {&DDRC, &PORTC, 1,  0}, // общий анод младшего разряда 1-го индикатора
  {&DDRC, &PORTC, 2, 10}, // общий анод старшего разряда 2-го индикатора
  {&DDRC, &PORTC, 3,  0}, // общий анод среднего разряда 2-го индикатора
  {&DDRC, &PORTC, 4,  0}  // общий анод младшего разряда 2-го индикатора
};
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Re: 3-х разрядный ампервольтметр на атмега

Сообщение Ivanoff-iv »

Подключение сегментов жестко задано - порт PB с привязкой каждого сегмента к конкретному пину.

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

uint8_t code_numbers_indicator[11] ={40, 235, 49, 161, 226, 164, 36, 233, 32, 160, 255 };
Меня както ARV научил как это писать правильней...
Спойлер

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

//Digits
//Описание цифр семисегментного индикатора

//соответствие сегмента и номера ноги порта
#define N_A  0
#define N_B  2
#define N_C  4
#define N_D  6
#define N_E  7
#define N_F  1
#define N_G  3
#define N_DP 5

//расстановка единиц в маске
#define _A  (1<<N_A)
#define _B  (1<<N_B)
#define _C  (1<<N_C)
#define _D  (1<<N_D)
#define _E  (1<<N_E)
#define _F  (1<<N_F)
#define _G  (1<<N_G)
#define _DP (1<<N_DP)

//знакогенератор
#define _0 ~(_A|_B|_C|_D|_E|_F   )
#define _1 ~(   _B|_C            )
#define _2 ~(_A|_B|   _D|_E|   _G)
#define _3 ~(_A|_B|_C|_D|      _G)
#define _4 ~(   _B|_C|      _F|_G)
#define _5 ~(_A|   _C|_D|   _F|_G)
#define _6 ~(_A|   _C|_D|_E|_F|_G)
#define _7 ~(_A|_B|_C            )
#define _8 ~(_A|_B|_C|_D|_E|_F|_G)
#define _9 ~(_A|_B|_C|_D|   _F|_G)
//#define _a ~(_A|_B|_C|   _E|_F|_G)
//#define _b ~(      _C|_D|_E|_F|_G)
//#define _c ~(_A|      _D|_E|_F|  )
//#define _d ~(   _B|_C|_D|_E|   _G)
//#define _e ~(_A|      _D|_E|_F|_G)
//#define _f ~(_A|         _E|_F|_G)
#define _Z ~(0                   )   //выключенный разряд
#define _N ~(                  _G)   // "-"

flash unsigned char code_numbers_indicator[]={_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_Z};
Всё это можно вынести в отдельный файл и приинклюдить.
(Номера твоих пинов я сюда не подставлял)
Чтобы изменить порядок ног сегментов теперь достаточно переписать их номера в первых 8ми строках и весь знакогенератор будет пересчитан автоматически.
Не спорю, наверно можно ещё правильней написать, например для ОА/ОК дисплеев автоматизировать перерисовку...
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Аватара пользователя
Рязанцев Владислав
Мудрый кот
Сообщения: 1781
Зарегистрирован: Пн июн 24, 2013 23:00:42
Откуда: Казахстан

Re: 3-х разрядный ампервольтметр на атмега

Сообщение Рязанцев Владислав »

Берете ардуину, пишете 10 строк, готово)
при условии AREF =5В

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

Напряжение на ноге= float(map(AnalogRead(A0),0, 1023, 0,500)/100)
Вывести на индикатор какой у вас там,
все тоже самое для тока
Изображение
Ваши хотелки за ваши деньги
Аватара пользователя
Карбофос
Опытный кот
Сообщения: 760
Зарегистрирован: Сб окт 22, 2016 17:33:32
Откуда: кг

Re: 3-х разрядный ампервольтметр на атмега

Сообщение Карбофос »

Ivanoff-iv, вы, наверное, не смотрели 1-ый пост темы. Этот массив определен в приложенной к нему исходному коду программы в соответствии с приципиальной схемой. Предложенное вами решение, конечно-же, более универсальное. Что я и постарался сделать с ОА.
Но, "лишние" 44 строки текста при текущих 147 всей программы???

Рязанцев Владислав, а что готово-то?
Аватара пользователя
Рязанцев Владислав
Мудрый кот
Сообщения: 1781
Зарегистрирован: Пн июн 24, 2013 23:00:42
Откуда: Казахстан

Re: 3-х разрядный ампервольтметр на атмега

Сообщение Рязанцев Владислав »

а что готово-то?

А что не готово? :)))
В среде ардуино все делается обычно подключением готовых библиотек. Можно за индикатор тот же TM1637 взять готовым модулем. Добавить библиотеку одна строка, вывести на него еще одна строка)
Изображение
Ваши хотелки за ваши деньги
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Re: 3-х разрядный ампервольтметр на атмега

Сообщение Ivanoff-iv »

этот код не усложнит чтение кода (т.к. лежит в отдельном файле) и не утяжеляет прошивку (т.к. обсчитывается на этапе компиляции)...
Ну... если проект окончательный и обжалованию... изменению не подлежит, то и ладно...
(в конце концов - кто код пишет, тот имена переменным и придумывает :))) :))) :))) )
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Аватара пользователя
Serzh2000
Опытный кот
Сообщения: 867
Зарегистрирован: Пт фев 27, 2015 12:00:53
Откуда: Рязанская область

Re: 3-х разрядный ампервольтметр на атмега

Сообщение Serzh2000 »

charchyard киньте пожалуйста ссылку на первоисточник откуда вы взяли эти схемы и код.
Ответить

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