4_Ust-vo_poluchenia_velichi.../Encoder.c

72 lines
2.1 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "Encoder.h"
#include <avr/interrupt.h>
#include <avr/io.h>
/* Дефайны */
#define PIND_MASK 0b00001100
/* Переменные */
volatile int32_t next_state, prev_state, up_state, down_state, state;
int sw34; // Передача
int32_t encoder_value = 0;
/* Прерывания */
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; // Обнуляем счетчик(на всякий случай)
encoder_value = state;
}
void timer1_init() {
TCCR1A = 0x00;
TCCR1B |= (1 << CS11); // устанавливаем коэффициент деления 8
TCNT1H = 0x00; // Обнуляем старший и младший байты счетного регистра
TCNT1L = 0x00;
OCR1AH = 0x03; // Настройка регистра сравнения для старшего и младщего байта
OCR1AL = 0xE8;
TIMSK1 |= (1 << OCIE1A);// Разрешаем прерывание таймера по совпадению с OCR1A
}
void ports_init() {
DDRD = 0x00;
PORTD = 0x0C;
}
void encoder_Initialization() {
ports_init(); // Настройка портов
timer1_init(); // Инициализация таймера
sei(); // Разрешаем глобальные прерывания
}
int32_t get_encoder_value() {
return encoder_value;
}