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

Re: Алгоритм сглаживания шумов АЦП микроконтроллера.

Вс фев 05, 2023 21:16:00

20 . или нет ?

Добавлено after 8 minutes 16 seconds:
как бы в средней школе если 0 мандаринок или бананов - то считается что их нет. А в адресации массива в программировании , это считается адрес=1 .

Re: Алгоритм сглаживания шумов АЦП микроконтроллера.

Вс фев 05, 2023 21:18:45

20?

Правильно. То есть в последнем цикле, где принимает участие индекс i+1 вы получите перестановку 21-го элемента. Классическая ошибка адреса.

Добавлено after 2 minutes 12 seconds:
А в адресации массива в программировании , это считается адрес=1 .

С какого перепуга? Адрес в массиве - это индекс. Вы его задали начальным значением равным НУЛЮ. Правильно задали. Нулевой адрес массива - это указатель на массив.

Re: Алгоритм сглаживания шумов АЦП микроконтроллера.

Вс фев 05, 2023 21:19:19

Нет же.

Re: Алгоритм сглаживания шумов АЦП микроконтроллера.

Вс фев 05, 2023 21:21:45

Нет

Это не ваш день. Точно. Идите спать, а завтра откроете любой учебник по Си и прочитаете про нумерацию элементов в массиве.
Керниган вместе со своим неразлучным Ритчи вещают нам:
Изображение
Последний раз редактировалось КРАМ Вс фев 05, 2023 21:25:38, всего редактировалось 1 раз.

Re: Алгоритм сглаживания шумов АЦП микроконтроллера.

Вс фев 05, 2023 21:22:57

КРАМ писал(а):i+1 вы получите перестановку 21-го элемента

for (i=0;i<20;i++) // цикл
максимальное i может быть только 19, а если +1 то 20 .

Re: Алгоритм сглаживания шумов АЦП микроконтроллера.

Вс фев 05, 2023 21:26:44

если +1 то 20 .

Правильно, но счет в массиве С НУЛЯ. Скрин я вам выше привел.
Боюсь это принципиальная ваша уязвимость... :facepalm:
Последний раз редактировалось КРАМ Вс фев 05, 2023 21:28:14, всего редактировалось 1 раз.

Re: Алгоритм сглаживания шумов АЦП микроконтроллера.

Вс фев 05, 2023 21:27:33

Alex_641, for (i=0;i<20;i++) mass[i]=read_adc(9); //счтываем 20 значений ацп помещаем в массив mass
какой индекс i у первого элемента массива и у последнего?

Re: Алгоритм сглаживания шумов АЦП микроконтроллера.

Вс фев 05, 2023 21:30:21

Ну так то да .... надо подумать ...

Re: Алгоритм сглаживания шумов АЦП микроконтроллера.

Вс фев 05, 2023 21:31:46

надо подумать ...

Я вам скрин из отцов-основателей Си привел. Этого мало? :)))
Вы с легкостью дорабатываете традиционный алгоритм пузырька и не сомневаетесь в себе. А с нумерацией массива у вас очевидные проблемы... оксюморон кокойты...

Re: Алгоритм сглаживания шумов АЦП микроконтроллера.

Вс фев 05, 2023 21:39:09

Всмысле прога постоянно сканирует из несуществущего элемента массива 19+1 , меняет местами и ставит флаг что всё хорошо ?

Добавлено after 31 second:
поэтому и висит ?

Re: Алгоритм сглаживания шумов АЦП микроконтроллера.

Вс фев 05, 2023 21:40:49

Всмысле прога постоянно сканирует

Осталось посмотреть порядок объявления переменных и понять что там по соседству с потерпевшим массивом находится... :)))

Re: Алгоритм сглаживания шумов АЦП микроконтроллера.

Вс фев 05, 2023 21:45:38

если хочешь ?

Re: Алгоритм сглаживания шумов АЦП микроконтроллера.

Вс фев 05, 2023 21:47:14

Это не я хочу, это вы хотите узнать причину зацикливания. Лишний элемент не может быть причиной, а вот чужое значение очень даже может...

Re: Алгоритм сглаживания шумов АЦП микроконтроллера.

Вс фев 05, 2023 21:51:25

хорошо.
Я попробую спрятать под спойлер. Если получится. Ещё не делал этого.

Добавлено after 1 minute 30 seconds:
Спойлер
Код:
/*******************************************************
Date    : 05.02.2023
Chip type               : ATtiny26
AVR Core Clock frequency: 4,000000 MHz
*******************************************************/

#include <alcd.h>
#include <delay.h>
#include <tiny26.h>
#define key PORTB.0     /// вход кнопка выкл. и переключение диаппазона 500/1000   
#define red PORTB.1     // питание красный светодиод индикация состояния акб
#define green PORTB.2   // питание зелёный светодиод индикация состояния акб
#define sw_off PORTB.3   // выход отключения питания
#define l_h PORTB.4      //500/1000
unsigned char i;   // вспомогательные переменные
unsigned int mass[20],z,tim,bat;
int a;


#define ADC_VREF_TYPE ((0<<REFS1) | (1<<REFS0) | (0<<ADLAR)) // Voltage Reference: AREF pin


unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | ADC_VREF_TYPE;
delay_us(10);
ADCSR|=(1<<ADSC);
while ((ADCSR & (1<<ADIF))==0);
ADCSR|=(1<<ADIF);
return ADCW;
}

void main(void)
{
 
DDRA=(1<<DDA7) | (1<<DDA6) | (1<<DDA5) | (1<<DDA4) | (0<<DDA3) | (1<<DDA2) | (1<<DDA1) | (1<<DDA0);
PORTA=(0<<PORTA7) | (0<<PORTA6) | (0<<PORTA5) | (0<<PORTA4) | (0<<PORTA3) | (0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0);

DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0);
PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (1<<PORTB0);

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 3,906 kHz
TCCR0=(1<<CS02) | (0<<CS01) | (1<<CS00);
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 0,244 kHz
// Timer Period: 1,0486 s
PLLCSR=(0<<PCKE) | (0<<PLLE) | (0<<PLOCK);

TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<PWM1A) | (0<<PWM1B);
TCCR1B=(0<<CTC1) | (0<<PSR1) | (1<<CS13) | (1<<CS12) | (1<<CS11) | (1<<CS10);
TCNT1=0x00;
OCR1A=0x00;
OCR1B=0x00;
OCR1C=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=(0<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (0<<TOIE0);

// ADC initialization
// ADC Clock frequency: 62,500 kHz
// ADC Voltage Reference: AREF pin
//ADMUX=ADC_VREF_TYPE;
//ADCSR=(1<<ADEN) | (0<<ADSC) | (0<<ADFR) | (0<<ADIF) | (0<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (0<<ADPS0);


// Alphanumeric LCD initialization
// Connections are specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTA Bit 0
// RD - PORTB Bit 7
// EN - PORTA Bit 1
// D4 - PORTA Bit 2
// D5 - PORTA Bit 4
// D6 - PORTA Bit 5
// D7 - PORTA Bit 6
// Characters/line: 16
sw_off=1; // удерживаем питание включенным ( защёлка механической кнопки на полевом ключе)
lcd_init(16);
lcd_gotoxy(0,0);  //инициализация лсд
lcd_putsf("U=500V "); //вывод на жки
lcd_gotoxy(8,0);
lcd_putsf("R=");
lcd_gotoxy(0,1);
lcd_putsf("BAT=");
delay_ms(3000);
while (1)
      {
       
      for (i=0;i<20;i++) mass[i]=read_adc(9);  // +++++++++++++++++++++++++счтываем 20 значений ацп помещаем в массив mass
                         
      while (a>0)    // сортировка массива методом пузырька кол-во элементов 20    //+++++++++++++++расчёт измерений АЦП+++++++++++++++++++++
               {
                  for (i=0;i<20;i++)   // цикл
                      {
                       a=0;             // флаг окончания сравнений сбросить
                        if (mass[i]>mass[i+1])  // если элемент меньше следующего то
                                       {
                                        z=mass[i];          // поменять
                                         mass[i]=mass[i+1]; // их
                                          mass[i+1]=z;      // местами
                                           a=1;             // установить флаг ( сортировка еще не закончена)
                                       }
               
                      }
               }
              lcd_putsf("BAT=");
           TCNT1=0;// так надо ????????????????????????   
           z=0;   
           for (i=4;i<15;i++) z+=mass[i]; //суммируем 10 значений ( с 5-го по 14 )
            z=z/10; // находим среднее арифметическое
            lcd_gotoxy(10,0);// выводим значение на LCD
            lcd_putchar(z/100+48); //сотые
            lcd_putchar((z%100)/10+48);// десятые
            lcd_putchar(z%10+48);  // единицы
            lcd_putsf("M  ");  // в конце выведенного числа буква "М" ( мегаом) с пробелами для затирания предыдущего показания
                                   // в дальнейшем буду исключать незначащие нули.
           
            if (key==0) {tim+=TCNT1; if (tim>10) sw_off=0; }//проверяем нажата ли кнопка если нажата более 2 сек отключаем питание
             
            else if (tim>1 && tim<5) {                                // если не нажата но счётчик времени нажатия не равен нулю значит было
                                        tim=0;                        // отпускание кнопки и если время нажатия входит в пределы
                                        lcd_gotoxy(2,0);                   
                                         if (l_h==0) {l_h=1;lcd_putsf("1000V");} else {l_h=0;lcd_putsf("500V ");} // изменяем состояние выхода 500/1000 вольт
                                      };//

           bat=read_adc(8); // замеряем напряжение на батарее питания
            lcd_gotoxy(1,4);  // выводим на табло
             lcd_putchar(bat/100+48); //вольт
              lcd_putsf(",");   
               lcd_putchar((bat%100)/10+48);// десятые   
                lcd_putchar(bat%10+48);  // единицы
                 lcd_putsf("V "); 
               
            if ( bat<334) {red=1;green=0;}   // если напруга акб < 6,6 В ( два лития ) зажеч красный потушить синий
            if (bat>333 && bat<360) {red=1;green=1;}// ну и так далее
            if ( bat>359) {red=0;green=1;}
               

      }
}

Re: Алгоритм сглаживания шумов АЦП микроконтроллера.

Вс фев 05, 2023 21:54:26

Зачем прятать? Всего то нужно показать объявление самого массива и то, что непосредственно за ним.
Ну либо тот же скрин с map-файла проекта.

Добавлено after 2 minutes 55 seconds:
хорошо......unsigned int mass[20],z,tim,bat;

Итого имеем. Вы портите значение z.
Можете сами проанализировать... :tea:
Код:
                                      z=mass[i];          // поменять
                                         mass[i]=mass[i+1]; // их
                                          mass[i+1]=z;      // местами

То есть по факту во второй строке mass[i]=z;, а в третьей z=z;
Последний раз редактировалось КРАМ Вс фев 05, 2023 21:58:08, всего редактировалось 1 раз.

Re: Алгоритм сглаживания шумов АЦП микроконтроллера.

Вс фев 05, 2023 21:58:03

но проходов 19 !

Даладна... :))) :))) :)))
Код:
for (i=0;i<20;i++)   // цикл

От 0 до 19 - это сколько будет?
1 класс средней школы...

"От 0 до 19" будет 19

Re: Алгоритм сглаживания шумов АЦП микроконтроллера.

Вс фев 05, 2023 21:59:09

Еще один йуморист... :))) :))) :)))

Re: Алгоритм сглаживания шумов АЦП микроконтроллера.

Вс фев 05, 2023 22:01:20

А так?
Спойлерwhile (a>0) // сортировка массива методом пузырька кол-во элементов 20 //+++++++++++++++расчёт измерений АЦП+++++++++++++++++++++
{a=0; // флаг окончания сравнений сбросить

for (i=0;i<19;i++) // цикл
{
if (mass[i]>mass[i+1]) // если элемент меньше следующего то
{
z=mass[i]; // поменять
mass[i]=mass[i+1]; // их
mass[i+1]=z; // местами
a=1; // установить флаг ( сортировка еще не закончена)
}

}
}
Последний раз редактировалось Novice user Вс фев 05, 2023 22:08:47, всего редактировалось 1 раз.

Re: Алгоритм сглаживания шумов АЦП микроконтроллера.

Вс фев 05, 2023 22:06:47

А разница то какая ? Z - просто переменная промежуточная .

Re: Алгоритм сглаживания шумов АЦП микроконтроллера.

Вс фев 05, 2023 22:08:39

А разница то какая ?

Я вам причел что по факту получилось. А получилось ОТСУТСТВИЕ СОРТИРОВКИ в 20-м проходе.
Последний раз редактировалось КРАМ Вс фев 05, 2023 22:13:07, всего редактировалось 1 раз.
Ответить