Тут мои избранные видосики ардуино.
Последний раз редактировалось: AlexDarkTech (Вс Окт 27, 2024 4:40 am), всего редактировалось 1 раз(а)
Последний раз редактировалось: AlexDarkTech (Вс Окт 27, 2024 4:40 am), всего редактировалось 1 раз(а)
Код:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
#define LED0 PB0 // OC0A
#define LED1 PB1 // OC0B
volatile unsigned char filter;//используется для задержки отпускания ноги при срабатывании ацп чтобы ногу не колбасило.
volatile unsigned char filter2;
// Обработчик прерывания по завершению преобразования АЦП
ISR(ADC_vect) //выполняется когда ацп завершил преобразование.
{
unsigned char A = ADCL;//читаем данные ацп.
unsigned char i = ADCH;
i= A; //делаем так потому что из-за какого-то сглюка компилятора ардуино зависает ацп и нихрена не работает.
if (i >= 1) { //если на ацп есть сигнал
// PORTB |= (1 << PB2);// ЗАЖИГАЕМ СВЕТОДИОД НА 7
PORTB &= ~(1 << PB1);// гасим светодиод на 6 ноге
filter = 12; // установка задержки активации светодиода значение устанавливается когда прилетел сигнал на ацп.
} else {
if (filter !=0){// счетчик обратного отсчета если нет сигнала на ацп.
filter2--;
if (filter2 ==0){
filter--;
}
}else{ // если счётчик дотикал до нуля а сигнала так и не пришло.
// PORTB &= ~(1 << PB2);// гасим светодиод на 7 ноге
PORTB |= (1 << PB1);// ЗАЖИГАЕМ СВЕТОДИОД НА 6
}
}
}
void setup() {
WDTCR = (1<<WDP3)|(1 << WDP0); //сторожевой таймер в 8 секунд.
ACSR |= (1 << ACD); //ВЫРУБАЕМ КОМПОРАТОР
// Светидиоды:
DDRB |= (1 << PB2)|(1 << PB1); // выходы НОГА 7 И НОГА 6
PORTB &= ~((1 << PB2)|(1 << PB1)); // по умолчанию отключены = 0
// Перем. резистор:
DDRB &= ~((1 << PB3)|(1<<PB4)); // НОГИ 2И 3 НА ВХОД АЦП
PORTB &= ~((1 << PB3)|(1<<PB4));
// Настройка АЦП:
ADCSRA = 0;
ADMUX = (1 << REFS0)|(0 << ADLAR)|(1 << MUX1); // опорное напряжение - ВНУТРЕННИЙ ОПОРНЫЙ ВХОД ПОКА 3 НОГА.
ADCSRA = (1 << ADEN)|(1 << ADSC)|(0 << ADATE)|(1 << ADIE)|(1 << ADPS0); // АЦП включен, запуск преобразования, режим автоизмерения, прерывание по окончанию преобразования, частота CLK/2
ADCSRB = 0x00; // режим автоизмерения: постоянно запущено
DIDR0 = (1 << ADC3D)|(1 << ADC2D); // запрещаем цифровой вход на ноге аналогового входа
sleep_enable();//активируем слип.
MCUSR = (1 << SE)|(1 << SM0); //СОН В РЕЖИМ ПОДАВЛЕНИЕ ШУМА.
delay(200);//задержка чтобы ацп доработал и инициализировался и ничего не сглюкнуло.
sei(); //разрешаем глобально прерывания
}
void loop() {
// сюда можно засунуть лббой код которвый будет выполняться до ухода контроллера в спящий режим но это снизит частоту опроса ацп.
asm("sleep");//запускаем преобразование ацп в режиме подавления шума
}
|
|