4_Ust-vo_poluchenia_velichi.../Encoder.c

68 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 <avr/interrupt.h>
#include <avr/io.h>
/* Дефайны */
#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<<CS11); // устанавливаем коэффициент деления 8
TCNT1H = 0x00; // Обнуляем старший и младший байты счетного регистра
TCNT1L = 0x00;
OCR1AH = 0x03; // Настройка регистра сравнения для старшего и младщего байта
OCR1AL = 0xE8;
// Разрешаем прерывание таймера по совпадению с OCR1A
TIMSK1 |= (1<<OCIE1A);
}
int main(void) {
Serial.begin(9600);
int s;
DDRD = 0x00;
PORTD = 0x0C;
timer1_init(); // Инициализация таймера1
sei(); // Разрешаем глобальные прерывания
while (1) {
if (state != s)
{
Serial.println(s);
s = state;
}
}
}