From 86375cea8f128fdda7f0ba25e024c9ef0e4f2a0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D1=80=D1=82=D1=91=D0=BC=20=D0=9D=D0=BE=D0=B2=D0=B8?= =?UTF-8?q?=D0=BA=D0=BE=D0=B2?= Date: Sun, 25 Jun 2023 17:35:07 +0000 Subject: [PATCH] =?UTF-8?q?=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B8=D0=BB(?= =?UTF-8?q?=D0=B0)=20=D0=BD=D0=B0=20'Encoder.c'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Загрузил нужную версию файла --- Encoder.c | 140 ++++++++++++++++++++++++++---------------------------- 1 file changed, 67 insertions(+), 73 deletions(-) diff --git a/Encoder.c b/Encoder.c index f0b6c10..e108bdc 100644 --- a/Encoder.c +++ b/Encoder.c @@ -1,74 +1,68 @@ -#include -#include -/* Дефайны */ -#define F_CPU 1000000UL // тактовая частота -#define PIND_MASK 0b00001100 // Маска для сравнения с PIND -/* Переменные */ -volatile uint8_t next_state, prev_state, up_state, down_state; -int sw34; // Передача -/* Прерывания */ -ISR(TIMER1_COMPA_vect) { - next_state = PIND & PIND_MASK; // Считываем текущее значение битов - if (next_state != prev_state) { - switch (prev_state) { - case 8: { - if (next_state == 12) up_state++; - if (next_state == 0) down_state++; - break; - } - case 0: { - if (next_state == 8) up_state++; - if (next_state == 4) down_state++; - break; - } - case 4: { - if (next_state == 0) up_state++; - if (next_state == 12) down_state++; - break; - } - case 12: { - if (next_state == 4) up_state++; - if (next_state == 8) down_state++; - break; - } - default: { - break; - } - } - prev_state = next_state; // Присваиваем текущему состоянию предыдущее - } - TCNT1H = 0x00; - TCNT1L = 0x00; // Обнуляем счетчик(на всякий случай) -} -void timer1_init() { - TCCR1A = 0x00; - TCCR1B |= (1«CS11); // устанавливаем коэффициент деления 8 - TCNT1H = 0x00; // Обнуляем старший и младший байты счетного регистра - TCNT1L = 0x00; - OCR1AH = 0x03; // Настройка регистра сравнения для старшего и младщего байта - OCR1AL = 0xE8; - - // Разрешаем прерывание таймера по совпадению с OCR1A - TIMSK1 |= (1«OCIE1A); -} -int main(void) { - Serial.begin(9600); - int s = 0; - DDRD = 0x00; - PORTD = 0x0C; - timer1_init(); // Инициализация таймера1 - sei(); // Разрешаем глобальные прерывания - while (1) { - if (up_state >= 4) // 1 раз за 4 импульса изменяем состояние передачи - { - sw34++; // Передача + - up_state = 0; - Serial.println(sw34); - } - if (down_state >= 4) { - sw34--; // Передача - - down_state = 0; - Serial.println(sw34); - } - } +#include +#include +/* Дефайны */ +#define F_CPU 1000000UL // тактовая частота +#define PIND_MASK 0b00001100 // Маска для сравнения с PIND +/* Переменные */ +volatile uint8_t next_state, prev_state, up_state, down_state, state; +int sw34; // Передача +/* Прерывания */ +ISR(TIMER1_COMPA_vect) { + next_state = PIND & PIND_MASK; // Считываем текущее значение битов + if (next_state != prev_state) { + switch (prev_state) { + case 8: { + if (next_state == 3) state++; + if (next_state == 0) state--; + break; + } + case 0: { + if (next_state == 2) state++; + if (next_state == 1) state--; + break; + } + case 4: { + if (next_state == 0) state++; + if (next_state == 3) state--; + break; + } + case 12: { + if (next_state == 1) state++; + if (next_state == 2) state--; + break; + } + default: { + break; + } + } + prev_state = next_state; // Присваиваем текущему состоянию предыдущее + } + TCNT1H = 0x00; + TCNT1L = 0x00; // Обнуляем счетчик(на всякий случай) +} +void timer1_init() { + TCCR1A = 0x00; + TCCR1B |= (1<