Алгоритм сглаживания шумов АЦП микроконтроллера.
Re: Алгоритм сглаживания шумов АЦП микроконтроллера.
20 . или нет ?
Добавлено after 8 minutes 16 seconds:
как бы в средней школе если 0 мандаринок или бананов - то считается что их нет. А в адресации массива в программировании , это считается адрес=1 .
Добавлено after 8 minutes 16 seconds:
как бы в средней школе если 0 мандаринок или бананов - то считается что их нет. А в адресации массива в программировании , это считается адрес=1 .
Не спрашивай по ком звонит колокол, он звонит по тебе !
- Реклама
- КРАМ
- Друг Кота
- Сообщения: 25389
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Алгоритм сглаживания шумов АЦП микроконтроллера.
[uquote="Alex_641",url="/forum/viewtopic.php?p=4367115#p4367115"]20?[/uquote]
Правильно. То есть в последнем цикле, где принимает участие индекс i+1 вы получите перестановку 21-го элемента. Классическая ошибка адреса.
Добавлено after 2 minutes 12 seconds:
[uquote="Alex_641",url="/forum/viewtopic.php?p=4367115#p4367115"]А в адресации массива в программировании , это считается адрес=1 .[/uquote]
С какого перепуга? Адрес в массиве - это индекс. Вы его задали начальным значением равным НУЛЮ. Правильно задали. Нулевой адрес массива - это указатель на массив.
Правильно. То есть в последнем цикле, где принимает участие индекс i+1 вы получите перестановку 21-го элемента. Классическая ошибка адреса.
Добавлено after 2 minutes 12 seconds:
[uquote="Alex_641",url="/forum/viewtopic.php?p=4367115#p4367115"]А в адресации массива в программировании , это считается адрес=1 .[/uquote]
С какого перепуга? Адрес в массиве - это индекс. Вы его задали начальным значением равным НУЛЮ. Правильно задали. Нулевой адрес массива - это указатель на массив.
Re: Алгоритм сглаживания шумов АЦП микроконтроллера.
Нет же.
Не спрашивай по ком звонит колокол, он звонит по тебе !
- КРАМ
- Друг Кота
- Сообщения: 25389
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Алгоритм сглаживания шумов АЦП микроконтроллера.
[uquote="Alex_641",url="/forum/viewtopic.php?p=4367127#p4367127"]Нет[/uquote]
Это не ваш день. Точно. Идите спать, а завтра откроете любой учебник по Си и прочитаете про нумерацию элементов в массиве.
Керниган вместе со своим неразлучным Ритчи вещают нам:

Это не ваш день. Точно. Идите спать, а завтра откроете любой учебник по Си и прочитаете про нумерацию элементов в массиве.
Керниган вместе со своим неразлучным Ритчи вещают нам:
Последний раз редактировалось КРАМ Вс фев 05, 2023 21:25:38, всего редактировалось 1 раз.
Re: Алгоритм сглаживания шумов АЦП микроконтроллера.
for (i=0;i<20;i++) // циклКРАМ писал(а):i+1 вы получите перестановку 21-го элемента
максимальное i может быть только 19, а если +1 то 20 .
Не спрашивай по ком звонит колокол, он звонит по тебе !
- Реклама
- КРАМ
- Друг Кота
- Сообщения: 25389
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Алгоритм сглаживания шумов АЦП микроконтроллера.
[uquote="Alex_641",url="/forum/viewtopic.php?p=4367134#p4367134"]если +1 то 20 .[/uquote]
Правильно, но счет в массиве С НУЛЯ. Скрин я вам выше привел.
Боюсь это принципиальная ваша уязвимость...
Правильно, но счет в массиве С НУЛЯ. Скрин я вам выше привел.
Боюсь это принципиальная ваша уязвимость...
Последний раз редактировалось КРАМ Вс фев 05, 2023 21:28:14, всего редактировалось 1 раз.
-
Novice user
- Мудрый кот
- Сообщения: 1704
- Зарегистрирован: Вт янв 05, 2016 10:14:25
- Откуда: поселок Мелеуз
Re: Алгоритм сглаживания шумов АЦП микроконтроллера.
Alex_641, for (i=0;i<20;i++) mass=read_adc(9); //счтываем 20 значений ацп помещаем в массив mass
какой индекс i у первого элемента массива и у последнего?
какой индекс i у первого элемента массива и у последнего?
Re: Алгоритм сглаживания шумов АЦП микроконтроллера.
Ну так то да .... надо подумать ...
Не спрашивай по ком звонит колокол, он звонит по тебе !
- КРАМ
- Друг Кота
- Сообщения: 25389
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Алгоритм сглаживания шумов АЦП микроконтроллера.
[uquote="Alex_641",url="/forum/viewtopic.php?p=4367141#p4367141"]надо подумать ...[/uquote]
Я вам скрин из отцов-основателей Си привел. Этого мало?
Вы с легкостью дорабатываете традиционный алгоритм пузырька и не сомневаетесь в себе. А с нумерацией массива у вас очевидные проблемы... оксюморон кокойты...
Я вам скрин из отцов-основателей Си привел. Этого мало?
Вы с легкостью дорабатываете традиционный алгоритм пузырька и не сомневаетесь в себе. А с нумерацией массива у вас очевидные проблемы... оксюморон кокойты...
Re: Алгоритм сглаживания шумов АЦП микроконтроллера.
Всмысле прога постоянно сканирует из несуществущего элемента массива 19+1 , меняет местами и ставит флаг что всё хорошо ?
Добавлено after 31 second:
поэтому и висит ?
Добавлено after 31 second:
поэтому и висит ?
Не спрашивай по ком звонит колокол, он звонит по тебе !
- КРАМ
- Друг Кота
- Сообщения: 25389
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Алгоритм сглаживания шумов АЦП микроконтроллера.
[uquote="Alex_641",url="/forum/viewtopic.php?p=4367151#p4367151"]Всмысле прога постоянно сканирует[/uquote]
Осталось посмотреть порядок объявления переменных и понять что там по соседству с потерпевшим массивом находится...
Осталось посмотреть порядок объявления переменных и понять что там по соседству с потерпевшим массивом находится...
Re: Алгоритм сглаживания шумов АЦП микроконтроллера.
если хочешь ?
Не спрашивай по ком звонит колокол, он звонит по тебе !
- КРАМ
- Друг Кота
- Сообщения: 25389
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Алгоритм сглаживания шумов АЦП микроконтроллера.
Это не я хочу, это вы хотите узнать причину зацикливания. Лишний элемент не может быть причиной, а вот чужое значение очень даже может...
Re: Алгоритм сглаживания шумов АЦП микроконтроллера.
хорошо.
Я попробую спрятать под спойлер. Если получится. Ещё не делал этого.
Добавлено after 1 minute 30 seconds:
Я попробую спрятать под спойлер. Если получится. Ещё не делал этого.
Добавлено 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;}
}
}
Не спрашивай по ком звонит колокол, он звонит по тебе !
- КРАМ
- Друг Кота
- Сообщения: 25389
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Алгоритм сглаживания шумов АЦП микроконтроллера.
Зачем прятать? Всего то нужно показать объявление самого массива и то, что непосредственно за ним.
Ну либо тот же скрин с map-файла проекта.
Добавлено after 2 minutes 55 seconds:
[uquote="Alex_641",url="/forum/viewtopic.php?p=4367162#p4367162"]хорошо......unsigned int mass[20],z,tim,bat;[/uquote]
Итого имеем. Вы портите значение z.
Можете сами проанализировать...
То есть по факту во второй строке mass=z;, а в третьей z=z;
Ну либо тот же скрин с map-файла проекта.
Добавлено after 2 minutes 55 seconds:
[uquote="Alex_641",url="/forum/viewtopic.php?p=4367162#p4367162"]хорошо......unsigned int mass[20],z,tim,bat;[/uquote]
Итого имеем. Вы портите значение z.
Можете сами проанализировать...
Код: Выделить всё
z=mass[i]; // поменять
mass[i]=mass[i+1]; // их
mass[i+1]=z; // местами
Последний раз редактировалось КРАМ Вс фев 05, 2023 21:58:08, всего редактировалось 1 раз.
Re: Алгоритм сглаживания шумов АЦП микроконтроллера.
[uquote="КРАМ",url="/forum/viewtopic.php?p=4367111#p4367111"][uquote="Alex_641",url="/forum/viewtopic.php?p=4367089#p4367089"]но проходов 19 ![/uquote]
Даладна...
От 0 до 19 - это сколько будет?
1 класс средней школы...[/uquote]
"От 0 до 19" будет 19
Даладна...
Код: Выделить всё
for (i=0;i<20;i++) // цикл1 класс средней школы...[/uquote]
"От 0 до 19" будет 19
- КРАМ
- Друг Кота
- Сообщения: 25389
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Алгоритм сглаживания шумов АЦП микроконтроллера.
Еще один йуморист...

-
Novice user
- Мудрый кот
- Сообщения: 1704
- Зарегистрирован: Вт янв 05, 2016 10:14:25
- Откуда: поселок Мелеуз
Re: Алгоритм сглаживания шумов АЦП микроконтроллера.
А так?
{a=0; // флаг окончания сравнений сбросить
for (i=0;i<19;i++) // цикл
{
if (mass>mass[i+1]) // если элемент меньше следующего то
{
z=mass; // поменять
mass=mass[i+1]; // их
mass[i+1]=z; // местами
a=1; // установить флаг ( сортировка еще не закончена)
}
}
}
Спойлер
while (a>0) // сортировка массива методом пузырька кол-во элементов 20 //+++++++++++++++расчёт измерений АЦП+++++++++++++++++++++{a=0; // флаг окончания сравнений сбросить
for (i=0;i<19;i++) // цикл
{
if (mass>mass[i+1]) // если элемент меньше следующего то
{
z=mass; // поменять
mass=mass[i+1]; // их
mass[i+1]=z; // местами
a=1; // установить флаг ( сортировка еще не закончена)
}
}
}
Последний раз редактировалось Novice user Вс фев 05, 2023 22:08:47, всего редактировалось 1 раз.
Re: Алгоритм сглаживания шумов АЦП микроконтроллера.
А разница то какая ? Z - просто переменная промежуточная .
Не спрашивай по ком звонит колокол, он звонит по тебе !
- КРАМ
- Друг Кота
- Сообщения: 25389
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Алгоритм сглаживания шумов АЦП микроконтроллера.
[uquote="Alex_641",url="/forum/viewtopic.php?p=4367174#p4367174"]А разница то какая ?[/uquote]
Я вам причел что по факту получилось. А получилось ОТСУТСТВИЕ СОРТИРОВКИ в 20-м проходе.
Я вам причел что по факту получилось. А получилось ОТСУТСТВИЕ СОРТИРОВКИ в 20-м проходе.
Последний раз редактировалось КРАМ Вс фев 05, 2023 22:13:07, всего редактировалось 1 раз.


