Вс фев 05, 2023 21:16:00
Вс фев 05, 2023 21:18:45
Вс фев 05, 2023 21:19:19
Вс фев 05, 2023 21:21:45
Вс фев 05, 2023 21:22:57
КРАМ писал(а):i+1 вы получите перестановку 21-го элемента
Вс фев 05, 2023 21:26:44
Вс фев 05, 2023 21:27:33
Вс фев 05, 2023 21:30:21
Вс фев 05, 2023 21:31:46
Вс фев 05, 2023 21:39:09
Вс фев 05, 2023 21:40:49
Вс фев 05, 2023 21:45:38
Вс фев 05, 2023 21:47:14
Вс фев 05, 2023 21:51:25
/*******************************************************
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;}
}
}
Вс фев 05, 2023 21:54:26
z=mass[i]; // поменять
mass[i]=mass[i+1]; // их
mass[i+1]=z; // местами
Вс фев 05, 2023 21:58:03
for (i=0;i<20;i++) // цикл
Вс фев 05, 2023 21:59:09
Вс фев 05, 2023 22:01:20
Вс фев 05, 2023 22:06:47
Вс фев 05, 2023 22:08:39