Страница 1 из 2
ATTINY 13 опрос двух каналов АЦП
Добавлено: Вс июл 11, 2021 09:14:07
kote52
Всем привет! Потребовалось обуздать стеклоподьеники в авто, управление по средствам ацп мк attiny13, т.к. есть уже провода в дверях по одному и не нужно ни чего прокладывать по новой это важно. Накидал схему в протусе для отладки

, светодиоды как бы взамен соленоидам реле, схема подключения кнопок резистивно-параллельная. Столкнулся с тем - что есть коротковременные срабатывания других портов выхода, которые в данный момент времени должны оставаться в покое. К примеру на картинке изображен случай когда нажатие коротковременно кнопки водительского стекла ВВЕРХ - почем то сработал еще порт для команды ВНИЗ вод.стекла.
Так же может сработать и порты для пассажирского стекла... пример следующий

- где нажимал кнопка водительского стекла ВНИЗ и были коротковременные срабатывания портов выхода для пассажирского стекла. Принципиально использую два порта АЦП для обработки нажатий кнопок, один для вод. двери другой для пассажирской. Попытался побороть с помошью флагов событий но без успешно. Прошу помощи как правильней обработать нажатие кнопки.
Код: Выделить всё
*****************************************************
#include <tiny13.h>
#include <delay.h>
unsigned int adc0, adc2;
unsigned int adc_tmp0, adc_tmp2;
char adc_counter0, adc_counter2;
bit f1, f2, f3, f4, f5, f6;
#define FIRST_ADC_INPUT 0
#define LAST_ADC_INPUT 2
unsigned int adc_data[LAST_ADC_INPUT-FIRST_ADC_INPUT+1];
// Bandgap Voltage Reference: Off
#define ADC_VREF_TYPE ((0<<REFS0) | (0<<ADLAR))
// ADC interrupt service routine
// with auto input scanning
interrupt [ADC_INT] void adc_isr(void)
{
static unsigned char input_index=0;
// Read the AD conversion result
adc_data[input_index]=ADCW;
// Select next ADC input
if (++input_index > (LAST_ADC_INPUT-FIRST_ADC_INPUT))
input_index=0;
ADMUX=(FIRST_ADC_INPUT | ADC_VREF_TYPE)+input_index;
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=(1<<ADSC);
}
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
TCNT0=0x6A;
if(adc_counter0 < 20){ adc_tmp0+= adc_data[0]; adc_counter0++;} //аля антидребезг
else {adc0 = adc_tmp0/20; adc_counter0=0; adc_tmp0=0;}
if(adc_counter2 < 20){ adc_tmp2+= adc_data[2]; adc_counter2++;}
else {adc2 = adc_tmp2/20; adc_counter2=0; adc_tmp2=0;}
}
void reley(void){
//Водительскя дверь------------------------------
//Водительское стекло-------------------
if(f1==0 && f4==0 && f6==0){ //Если флаги f1 и f4 пассажиского стекла вод двери
if(adc2>220 && adc2<300) {PORTB.0=1; f5=1;}
else {PORTB.0=0;f5=0;}
}
if(f1==0 && f4==0 && f5==0){
if(adc2>320 && adc2<370) {PORTB.3=1; f6=1;}
else {PORTB.3=0;f6=0;}
}
//Пассажирское стекло-------------------
if(f2==0 && f3==0 && f5==0 && f6==0){
if(adc2 > 400 && adc2 < 460) {f1=1;PORTB.1=1;}
else {PORTB.1=0;f1=0;}
}
if(f2==0 && f3==0 && f5==0 && f6==0){
if(adc2 > 490 && adc2 < 515) {f4=1;PORTB.2=1;}
else {PORTB.2=0;f4=0;}
}
//-----------------------------------------------------------
//Пассажирская дверь-Пассажирское стекло
if(f1==0 && f4==0 && f3==0){
if(adc0 > 400 && adc0 < 460) {f2=1;PORTB.1=1;}
else {PORTB.1=0;f2=0;}
}
if(f4==0 && f1==0 && f2==0){
if(adc0 > 490 && adc0 < 515) {f3=1;PORTB.2=1;}
else {PORTB.2=0;f3=0;}
}
}
void main(void)
{
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=(1<<CLKPCE);
CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0);
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
// Input/Output Ports initialization
// Port B initialization
// Function: Bit5=In Bit4=In Bit3=Out Bit2=Out Bit1=Out Bit0=Out
DDRB=(0<<DDB5) | (0<<DDB4) | (1<<DDB3) | (1<<DDB2) | (1<<DDB1) | (1<<DDB0);
// State: Bit5=T Bit4=T Bit3=0 Bit2=0 Bit1=0 Bit0=0
PORTB=(0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 150,000 kHz
// Mode: Normal top=0xFF
// OC0A output: Disconnected
// OC0B output: Disconnected
// Timer Period: 1 ms
TCCR0A=(0<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (0<<WGM01) | (0<<WGM00);
TCCR0B=(0<<WGM02) | (0<<CS02) | (1<<CS01) | (1<<CS00);
TCNT0=0x6A;
OCR0A=0x00;
OCR0B=0x00;
// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=(0<<OCIE0B) | (0<<OCIE0A) | (1<<TOIE0);
// ADC initialization
// ADC Clock frequency: 150,000 kHz
// ADC Bandgap Voltage Reference: Off
// ADC Auto Trigger Source: ADC Stopped
// Digital input buffers on ADC0: On, ADC1: On, ADC2: On, ADC3: On
DIDR0|=(0<<ADC0D) | (0<<ADC2D) | (0<<ADC3D) | (0<<ADC1D);
ADMUX=FIRST_ADC_INPUT | ADC_VREF_TYPE;
ADCSRA=(1<<ADEN) | (1<<ADSC) | (0<<ADATE) | (0<<ADIF) | (1<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (0<<ADPS0);
ADCSRB=(0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0);
#asm("sei")
while (1){
reley();
}
}
Re: ATTINY 13 опрос двух каналов АЦП
Добавлено: Вс июл 11, 2021 09:45:47
Jack_A
DIDR0|=(0<<ADC0D) | (0<<ADC2D) | (0<<ADC3D) | (0<<ADC1D);
"Уж сколько раз твердили миру..." ©
https://radiokot.ru/forum/viewtopic.php ... 1#p4058681
Re: ATTINY 13 опрос двух каналов АЦП
Добавлено: Вс июл 11, 2021 11:21:10
kote52
[uquote="Jack_A",url="/forum/viewtopic.php?p=4059065#p4059065"]
DIDR0|=(0<<ADC0D) | (0<<ADC2D) | (0<<ADC3D) | (0<<ADC1D);
[/uquote]
Дайте пожалуста развернутый ответ, я не совсем понял что неверно в это строке кода.
Re: ATTINY 13 опрос двух каналов АЦП
Добавлено: Вс июл 11, 2021 11:39:23
ST7FOX
Вы смещаете ноль на какое-то количеств разрядов, значение этого количества в ADC0D и т.д.
Затем делаете ИЛИ с нулём
В итоге всю кучу также ИЛИ с DIDR0.
Это всё - бессмысленные действия.
Изучите логические и битовые операции.
Re: ATTINY 13 опрос двух каналов АЦП
Добавлено: Вс июл 11, 2021 12:22:53
Jack_A
Вдобавок к ST7FOX даю ответ развёрнутей некуда: нулевой бит, сколько и куда его ни двигай, по ИЛИ не меняет ни-че-го. Как сбрасывать определённый бит регистра - по моей ссылке + 1 пост выше от slav0n
Совет правильный: для понимания сути нужно изучить элементарные логические операции (с арифметическими, надеюсь, проблем нет? хотя в целочисленной арифметике тоже нужно иметь в виду определённые нюансы) .
Re: ATTINY 13 опрос двух каналов АЦП
Добавлено: Вс июл 11, 2021 14:10:08
Dimon456
Jack_A писал(а):Вдобавок к ST7FOX даю ответ развёрнутей некуда: нулевой бит, сколько и куда его ни двигай
Это не решит проблему.
Re: ATTINY 13 опрос двух каналов АЦП
Добавлено: Вс июл 11, 2021 14:52:13
kote52
[uquote="Dimon456",url="/forum/viewtopic.php?p=4059211#p4059211"]
Jack_A писал(а):Вдобавок к ST7FOX даю ответ развёрнутей некуда: нулевой бит, сколько и куда его ни двигай
Это не решит проблему.[/uquote]
что же решит или вы видите в другом проблему?
Добавлено after 24 minutes 2 seconds:
[uquote="Jack_A",url="/forum/viewtopic.php?p=4059139#p4059139"]Вдобавок к
ST7FOX даю ответ развёрнутей некуда: нулевой бит, сколько и куда его ни двигай, по ИЛИ не меняет ни-че-го. Как сбрасывать определённый бит регистра - по моей ссылке + 1 пост выше от
slav0n
Совет правильный: для понимания сути нужно изучить элементарные логические операции (с арифметическими, надеюсь, проблем нет? хотя в целочисленной арифметике тоже нужно иметь в виду определённые нюансы) .[/uquote]
Не так давно сидел перечитывал лог.операции, со шпаргалкой разбираюсь что и куда. В чем соль с нолем мне понятна. Как это отражается на работе кода не могу понять, и это ли вносит такие проблемы что я описал в первом своем сообщение?
Из вашей подсказки делаю вывод что ту строку правильнее было бы писать так:
DIDR0&=~((1<<ADC0D) | (1<<ADC2D) | (1<<ADC3D) | (1<<ADC1D));
Но что это мне даст, по даташиту это буфер цифрового входа, рекомендует биты ставить в лог 1 в том случае когда используется аналоговый вход, тем самым снижает потребление энергии.
Проблема моя этим никак не решилась((
Re: ATTINY 13 опрос двух каналов АЦП
Добавлено: Вс июл 11, 2021 14:59:11
Dimon456
У ATTINY13 памяти мало, всего 1кБайт.
Вот как пример, кое как уместилСпойлер
#include <tiny13.h>
#include <delay.h>
volatile unsigned int adc0, adc2;
volatile bit f1, f2, f3, f4, f5, f6;
#define FIRST_ADC_INPUT 0
#define LAST_ADC_INPUT 2
volatile unsigned int adc_data[LAST_ADC_INPUT-FIRST_ADC_INPUT+1];
// Bandgap Voltage Reference: Off
#define ADC_VREF_TYPE ((0<<REFS0) | (0<<ADLAR))
// ADC interrupt service routine
// with auto input scanning
interrupt [ADC_INT] void adc_isr(void)
{
static unsigned char input_index=0;
// Read the AD conversion result
adc_data[input_index]=ADCW;
// Select next ADC input
if (++input_index > (LAST_ADC_INPUT-FIRST_ADC_INPUT))
input_index=0;
ADMUX=(FIRST_ADC_INPUT | ADC_VREF_TYPE)+input_index;
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=(1<<ADSC);
}
union BytByte {
struct {
unsigned char b0: 1;
unsigned char b1: 1;
unsigned char b2: 1;
unsigned char b3: 1;
unsigned char b4: 1;
unsigned char b5: 1;
unsigned char b6: 1;
} bit_t;
unsigned char byte;
};
#define BTN_LOCK_TIME 20
bit flag1;
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
TCNT0=0x6A;
flag1 = !flag1;
}
void reley(void){
static unsigned char pauza0;
static unsigned char pauza1;
static unsigned char pauza2;
static unsigned char pauza3;
static unsigned char pauza4;
static unsigned char pauza5;
union BytByte flag_g;
if(flag1){
adc0 = adc_data[0];
adc2 = adc_data[2];
flag1=0;
flag_g.byte =0;
if(adc2>220 && adc2<300) {
if(pauza0 < BTN_LOCK_TIME) pauza0++;
else flag_g.bit_t.b0=1;
} else { if(pauza0) pauza0--;
}
if(adc2>320 && adc2<370) {
if(pauza1 < BTN_LOCK_TIME) pauza1++;
else flag_g.bit_t.b1=1;
} else { if(pauza1) pauza1--;
}
if(adc2>400 && adc2<460) {
if(pauza2 < BTN_LOCK_TIME) pauza2++;
else flag_g.bit_t.b2=1;
} else { if(pauza2) pauza2--;
}
if(adc2>490 && adc2<515) {
if(pauza3 < BTN_LOCK_TIME) pauza3++;
else flag_g.bit_t.b3=1;
} else { if(pauza3) pauza3--;
}
if(adc0>400 && adc0<460) {
if(pauza4 < BTN_LOCK_TIME) pauza4++;
else flag_g.bit_t.b4=1;
} else { if(pauza4) pauza4--;
}
if(adc0>490 && adc0<515) {
if(pauza5 < BTN_LOCK_TIME) pauza5++;
else flag_g.bit_t.b5=1;
} else { if(pauza5) pauza5--;
}
//Водительскя дверь------------------------------
//Водительское стекло-------------------
if(f1==0 && f4==0 && f6==0){ //Если флаги f1 и f4 пассажиского стекла вод двери
if(flag_g.bit_t.b0) {PORTB.0=1; f5=1;}
else {PORTB.0=0;f5=0;}
}
if(f1==0 && f4==0 && f5==0){
if(flag_g.bit_t.b1) {PORTB.3=1; f6=1;}
else {PORTB.3=0;f6=0;}
}
//Пассажирское стекло-------------------
if(f2==0 && f3==0 && f5==0 && f6==0){
if(flag_g.bit_t.b2) {f1=1;PORTB.1=1;}
else {PORTB.1=0;f1=0;}
}
if(f2==0 && f3==0 && f5==0 && f6==0){
if(flag_g.bit_t.b3) {f4=1;PORTB.2=1;}
else {PORTB.2=0;f4=0;}
}
//----------
//Пассажирская дверь-Пассажирское стекло
if(f1==0 && f4==0 && f3==0){
if(flag_g.bit_t.b4) {f2=1;PORTB.1=1;}
else {PORTB.1=0;f2=0;}
}
if(f4==0 && f1==0 && f2==0){
if(flag_g.bit_t.b5) {f3=1;PORTB.2=1;}
else {PORTB.2=0;f3=0;}
}
}
}
void main(void)
{
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=(1<<CLKPCE);
CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0);
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
// Input/Output Ports initialization
// Port B initialization
// Function: Bit5=In Bit4=In Bit3=Out Bit2=Out Bit1=Out Bit0=Out
DDRB=(0<<DDB5) | (0<<DDB4) | (1<<DDB3) | (1<<DDB2) | (1<<DDB1) | (1<<DDB0);
// State: Bit5=T Bit4=T Bit3=0 Bit2=0 Bit1=0 Bit0=0
PORTB=(0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 150,000 kHz
// Mode: Normal top=0xFF
// OC0A output: Disconnected
// OC0B output: Disconnected
// Timer Period: 1 ms
TCCR0A=(0<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (0<<WGM01) | (0<<WGM00);
TCCR0B=(0<<WGM02) | (0<<CS02) | (1<<CS01) | (1<<CS00);
TCNT0=0x6A;
OCR0A=0x00;
OCR0B=0x00;
// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=(0<<OCIE0B) | (0<<OCIE0A) | (1<<TOIE0);
// ADC initialization
// ADC Clock frequency: 150,000 kHz
// ADC Bandgap Voltage Reference: Off
// ADC Auto Trigger Source: ADC Stopped
// Digital input buffers on ADC0: On, ADC1: On, ADC2: On, ADC3: On
DIDR0 =(0<<ADC0D) | (0<<ADC2D) | (0<<ADC3D) | (0<<ADC1D);
ADMUX=FIRST_ADC_INPUT | ADC_VREF_TYPE;
ADCSRA=(1<<ADEN) | (1<<ADSC) | (0<<ADATE) | (0<<ADIF) | (1<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (0<<ADPS0);
ADCSRB=(0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0);
#asm("sei")
while (1){
reley();
}
}
Re: ATTINY 13 опрос двух каналов АЦП
Добавлено: Вс июл 11, 2021 15:17:33
ST7FOX
kote52, всё просто:
Вы должны знать битовые и логические операции сами по себе, без применения к чему-либо.
Например, необходимо знать, что 1 & 0 = 0, а 1 | 0 = 1 и т.д. То есть, разницу между И и ИЛИ.
Что число в микроконтроллере, а точнее, некая переменная, или некая область в памяти, на которую указывает переменная и где хранится число, представляет собой некий набор битов. Переменная типа byte - это 8 битов, и в этом случае, если в ней хранится 1, то полная запись 00000001, а когда Вы пишите, например, 0 << 5, то Вы приказываете контроллеру в 0000000 пять раз сдвинуть правый ноль влево, то есть, бессмысленно.
Регистры в микроконтроллере, как правило, такие же байты. То есть, регистр АЦП может выглядеть как 01111111, где левый (старший бит) - управляет вкл-выкл преобразованием (я описываю мифический микроконтроллер), а следующие - номер канала, какие-то опции. Непосредственно изменить бит не всегда возможно (например, можно в ассемблере, нельзя в Си), но можно изменить весь байт, добавив к нему такой байт и таким образом, что нужные биты изменять значения, а ненужные - не изменят.
Это всё описано в куче книжек. Это надо читать в них. Написание здесь очередной книги не имеет смысла, приведенный выше текст показывает лишь, что всё надо изучать с азов.
Отсутствие элементарных знаний делает невозможным объяснить Вам суть Вашей ошибки.
Добавлено after 1 minute 44 seconds:
Dimon456, 1 кБ - это очень много. И код просто ужасный, примером быть не может ни в коем разе.
Добавлено after 10 minutes 51 second:
kote52, и что касается аппаратной части: у Вас 6 кнопок, 4 повесили на один АЦП, а 2 на другой... Что мешало посадить 3 на один и 3 на другой? С точки зрения программной части разницы не будет, но Вы получаете гораздо большую дельту в напряжении для определения кнопки, а значит, минимизируете ложные срабатывания, когда контакты начнут окисляться.
Re: ATTINY 13 опрос двух каналов АЦП
Добавлено: Вс июл 11, 2021 15:47:59
kote52
[uquote="ST7FOX",url="/forum/viewtopic.php?p=4059238#p4059238"]kote52, и что касается аппаратной части: у Вас 6 кнопок, 4 повесили на один АЦП, а 2 на другой... Что мешало посадить 3 на один и 3 на другой? С точки зрения программной части разницы не будет, но Вы получаете гораздо большую дельту в напряжении для определения кнопки, а значит, минимизируете ложные срабатывания, когда контакты начнут окисляться.[/uquote]
Спасибо за теорию, многое знал, на чем расширили мои представления для понимания процессов в мк. Но что в коде дает ложные срабатывания на других портах?
Проводка в авто, писал в самом начале, в одной двери два переключателя пассажиркое и водительское стекло(т.е. 4 кнопки) заложен один провод, в пассажирской двери один переключатель т. е. Две кнопки, тоже заложен один провод.
Re: ATTINY 13 опрос двух каналов АЦП
Добавлено: Вс июл 11, 2021 15:51:54
parovoZZ
В машине всё это будет дичайше глючить. Особенно весело будет, когда контакты кнопок чуть-чуть подзасрутся и их сопротивление будет непредсказуемым.
Ну и дребезг. Здесь есть защита от него?
Я бы смотрел в сторону оптопар и сдвигового регистра, если не хочется ставить жирный МК.
Re: ATTINY 13 опрос двух каналов АЦП
Добавлено: Вс июл 11, 2021 15:56:33
ST7FOX
Я бы смотрел в сторону "как разрабатывать электронику для автомобилей", а не оптопар и сдвиговых регистров, они тут примерно так же нужны, как мясорубка и чулки.
Re: ATTINY 13 опрос двух каналов АЦП
Добавлено: Вс июл 11, 2021 16:15:58
kote52
[uquote="ST7FOX",url="/forum/viewtopic.php?p=4059278#p4059278"]Я бы смотрел в сторону "как разрабатывать электронику для автомобилей", а не оптопар и сдвиговых регистров, они тут примерно так же нужны, как мясорубка и чулки.[/uquote]
Есть уже готовые решения на лог микросхемах... Но мне диктует то что уже есть в машине, и разбирать дверь и тянуть проводку там где это не возможно еще та задача!
Добавлено after 5 minutes 37 seconds:
[uquote="parovoZZ",url="/forum/viewtopic.php?p=4059273#p4059273"]В машине всё это будет дичайше глючить. Особенно весело будет, когда контакты кнопок чуть-чуть подзасрутся и их сопротивление будет непредсказуемым.
Ну и дребезг. Здесь есть защита от него?
Я бы смотрел в сторону оптопар и сдвигового регистра, если не хочется ставить жирный МК.[/uquote]
В машине был условно тупой код, на delay_ms когда то собран... Я думаю вы в своей теории больше боитесь, чем в практику применять! подобное я смотрел осциллографом, дребезга там столько, как в нормальной тактовой кнопке! Посмотрите мой код в самом первом сообщение, как вам подобный аля антидребезг?
Re: ATTINY 13 опрос двух каналов АЦП
Добавлено: Вс июл 11, 2021 16:22:10
slav0n
parovoZZ писал(а):Ну и дребезг. Здесь есть защита от него?
для решения этой задачи антидребезг неактуален, как и вообще применение МК
достаточно банальных реле
Re: ATTINY 13 опрос двух каналов АЦП
Добавлено: Вс июл 11, 2021 16:32:53
ST7FOX
kote52, дребезг есть везде, как и решений по нему. Но это не главное и легко устранимое.
Главное - помехи в автомобиле вообще, и температурные условия (показания напряжения могут плавать). В приложенном файле описаны основные моменты (необязательно даже знать английский, достаточно глянуть картинки).
Это не сильно влияет на Вашу текущую проблему с кодом, но знать необходимо.
Re: ATTINY 13 опрос двух каналов АЦП
Добавлено: Вс июл 11, 2021 16:35:55
Dimon456
ST7FOX писал(а):И код просто ужасный
А с чем сравнивали? Где образец для подражания?
Re: ATTINY 13 опрос двух каналов АЦП
Добавлено: Вс июл 11, 2021 16:37:28
Ivanoff-iv
1) в условиях четко расставь очерёдность операций - расставь скобки.
ты уверен, что, например, команда:
if(adc2 > 490 && adc2 < 515)
разворачивается в
if((adc2 > 490) && (adc2 < 515))
а не в
if(((adc2 > 490) && adc2) < 515) ?
лучше жестко закрепи нужный порядок скобками.
2) добавь фильтрацию измерений:
на каждый ацп добавь буфер и счётчик, если новое измерение отличается от буфера не больше, чем на Х - то инкрементируй счётчик (с проверкой на переполнение), если больше - сбрасывай счётчик и обновляй буфер.
А потом принимай решение о нажатии только когда счётчик достигнет величины У
(Х и У - константы)
3) чтоб код стал компактней используй АЦП в 8битном режиме - операции с 8 битами занимают меньше места. (регистр ADLAR).
Re: ATTINY 13 опрос двух каналов АЦП
Добавлено: Вс июл 11, 2021 16:44:36
ST7FOX
[uquote="Dimon456",url="/forum/viewtopic.php?p=4059304#p4059304"]
ST7FOX писал(а):И код просто ужасный
А с чем сравнивали? Где образец для подражания?[/uquote]
Я как-то не стараюсь подражать, но образцом являются Кнут, Тейксейра, Пачеко, Рихтер и другие умные люди, да и просто msdn.
Re: ATTINY 13 опрос двух каналов АЦП
Добавлено: Вс июл 11, 2021 17:21:21
kote52
[uquote="ST7FOX",url="/forum/viewtopic.php?p=4059301#p4059301"]
kote52, дребезг есть везде, как и решений по нему. Но это не главное и легко устранимое.
Главное - помехи в автомобиле вообще, и температурные условия (показания напряжения могут плавать). В приложенном файле описаны основные моменты (необязательно даже знать английский, достаточно глянуть картинки).
Это не сильно влияет на Вашу текущую проблему с кодом, но знать необходимо.[/uquote]
Еще раз спасибо вам за файл, и информацию. Но мое направление как раз и связано с диагостикой автомобилей автоосцилографом(мотортестором), я представляю как выглядят помехи... И могу вам сказать, практически посмотрев как отрабатывают кнопки и что помех нет... Погонял печку, кондей и т.д. то что дейсвительно в борт сеть дает мусор. Катушки зажигания больше под капотом вредят. Было принято решение доделать эту штуку поумному.
Добавлено after 2 minutes 27 seconds:
[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=4059306#p4059306"]1) в условиях...
2) добавь фильтрацию измерений...
3) чтоб код стал компактней используй АЦП в 8битном режиме - операции с 8 битами занимают меньше места. (регистр ADLAR).[/uquote]
Я постараюсь практически все ващи советы применить, тогда и отпишу по результату!
Добавлено after 3 minutes 12 seconds:
[uquote="Dimon456",url="/forum/viewtopic.php?p=4059304#p4059304"]
ST7FOX писал(а):И код просто ужасный
А с чем сравнивали? Где образец для подражания?[/uquote]
Спасибо вам, у увидел смысл подачи, тоже буду сидеть вникать!
Re: ATTINY 13 опрос двух каналов АЦП
Добавлено: Вс июл 11, 2021 17:46:17
Рязанцев Владислав
А еще можно повесить все кнопки на одну линию, и использовать один АЦП.