Вс дек 20, 2020 16:31:31
Вс дек 20, 2020 16:56:28
Вс дек 20, 2020 18:52:08
Вс дек 20, 2020 18:58:50
Вс дек 20, 2020 20:19:05
Вс дек 20, 2020 22:39:30
если сможете написать, то дайте знать. такие головки я покупал в Китае и они у меня есть. но не подходят.Вариант 2 - ОПЛАТИТЬ написание своей прошивки
Вс дек 20, 2020 22:55:11
Пн дек 21, 2020 20:15:24
#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;
}
}
}
Ср дек 23, 2020 16:58:19
Сб дек 26, 2020 16:18:48
Сб дек 26, 2020 19:24:54
Вс дек 27, 2020 09:44:57
charchyard писал(а):не компилирует код атмелстудия... ошибки какие-то... я такое починить не смогу
Пн дек 28, 2020 13:00:43
Пн дек 28, 2020 19:05:33
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-го индикатора
};
Вт дек 29, 2020 07:11:21
uint8_t code_numbers_indicator[11] ={40, 235, 49, 161, 226, 164, 36, 233, 32, 160, 255 };
//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};
Вт дек 29, 2020 09:46:47
Напряжение на ноге= float(map(AnalogRead(A0),0, 1023, 0,500)/100)
Вывести на индикатор какой у вас там,
все тоже самое для тока
Вт дек 29, 2020 11:16:55
Вт дек 29, 2020 12:33:20
Вт дек 29, 2020 13:19:01
Вт дек 29, 2020 13:21:09