Adding all files from Project 1 to start

This commit is contained in:
2026-09-10 10:15:52 +00:00
parent 2bd9fb2ba4
commit a73f7002bc
22 changed files with 786 additions and 0 deletions
+14
View File
@@ -0,0 +1,14 @@
#include <avr/io.h>
#include "digital_in.h"
Digital_in::Digital_in(uint8_t pin) : pin_mask(1<<pin) {}
void Digital_in::init() {
DDRD &= ~pin_mask;
PORTD |= pin_mask;
}
bool Digital_in::is_hi() { return PIND & pin_mask; }
bool Digital_in::is_lo() { return !is_hi(); }
+9
View File
@@ -0,0 +1,9 @@
#include "digital_out.h"
#include <avr/io.h>
Digital_out::Digital_out(uint8_t pin) : pin_mask(1<<pin) {}
void Digital_out::init() { DDRB |= pin_mask; }
void Digital_out::toggle() { PORTB ^= pin_mask; }
void Digital_out::set_hi() { PORTB |= pin_mask; }
void Digital_out::set_lo() { PORTB &= ~pin_mask; }
+23
View File
@@ -0,0 +1,23 @@
#include <avr/io.h>
#include <util/delay.h>
#include <Arduino.h>
#include "rotary_encoder_driver.h"
RotaryEncoderDriver encoder;
int main() {
init();
Serial.begin(9600);
cli();
encoder.begin();
sei();
while (true) {
_delay_ms(50);
Serial.print("Counts per second: ");
Serial.println(encoder.count_per_sec());
}
return 0;
}
+50
View File
@@ -0,0 +1,50 @@
#include <avr/io.h>
#include <util/delay.h>
#include <Arduino.h>
#include "digital_in.h"
#include "digital_out.h"
int main() {
uint8_t cycle{0};
int8_t counter{0};
double ratio;
bool last_lo = false;
Digital_in encoderA{4};
Digital_in encoderB{5};
Digital_out led{5};
encoderA.init();
encoderB.init();
led.init();
Serial.begin(9600);
while (true) {
_delay_us(100);
led.set_lo();
bool curr_hi = encoderA.is_hi();
if (last_lo && curr_hi) {
counter += encoderB.is_lo() ? -1 : 1;
led.set_hi();
}
++cycle;
if (cycle == 255) {
ratio = counter / (0.0255 * 700);
counter = 0;
cycle = 0;
Serial.println(ratio);
}
last_lo = !curr_hi;
}
return 0;
}
+65
View File
@@ -0,0 +1,65 @@
#include <avr/io.h>
#include <util/delay.h>
#include <Arduino.h>
#include "digital_in.h"
#include "digital_out.h"
class RotaryEncoderDriver {
int count{0};
bool last_lo{false};
Digital_out led{5};
Digital_in eA;
Digital_in eB;
public:
RotaryEncoderDriver(unsigned short pin_a = 4, unsigned short pin_b = 5) : eA(pin_a), eB(pin_b) {
led.init();
eA.init();
eB.init();
last_lo = eA.is_lo();
}
int position() {
bool curr_hi = eA.is_hi();
if (last_lo && curr_hi) {
count += eB.is_hi() ? 1 : -1;
led.set_hi();
} else {
led.set_lo();
}
last_lo = !curr_hi;
return count;
}
};
int main() {
uint8_t cycle{0};
RotaryEncoderDriver encoder;
Serial.begin(9600);
int prev_pos = encoder.position();
while (true) {
_delay_us(100);
int curr_pos = encoder.position();
if (cycle++ == 255) {
int delta = curr_pos - prev_pos;
float rpm = delta * 60.0f / (700.0f * 0.0256f);
Serial.print("Count: ");
Serial.print(delta);
Serial.print("\tRPM: ");
Serial.println(rpm);
prev_pos = curr_pos;
}
}
return 0;
}
+68
View File
@@ -0,0 +1,68 @@
#include <avr/io.h>
#include <util/delay.h>
#include <Arduino.h>
#include "digital_in.h"
#include "digital_out.h"
class RotaryEncoderDriver {
volatile int count{0};
Digital_out led{5};
Digital_in eA;
Digital_in eB;
public:
RotaryEncoderDriver(unsigned short pin_a = 4, unsigned short pin_b = 5) : eA(pin_a), eB(pin_b) {
led.init();
eA.init();
eB.init();
EICRA |= (1<<ISC01) | (1<<ISC00);
EIMSK |= (1<<INT0);
}
void update() {
count += eB.is_hi() ? 1 : -1;
led.set_hi();
}
int position() {
led.set_lo();
return count;
}
};
RotaryEncoderDriver encoder{2,5};
int main() {
uint8_t cycle{0};
Serial.begin(9600);
int prev_pos = encoder.position();
sei();
while (true) {
_delay_us(100);
int curr_pos = encoder.position();
if (cycle++ == 255) {
int delta = curr_pos - prev_pos;
float rpm = delta * 60.0f / (700.0f * 0.0256f);
Serial.print("Count: ");
Serial.print(delta);
Serial.print("\tRPM: ");
Serial.println(rpm);
prev_pos = curr_pos;
}
}
return 0;
}
ISR(INT0_vect) {
encoder.update();
}
+56
View File
@@ -0,0 +1,56 @@
#include "rotary_encoder_driver.h"
#include <avr/interrupt.h>
RotaryEncoderDriver* driver = nullptr;
RotaryEncoderDriver::RotaryEncoderDriver()
: cycle(0)
, count(0)
, prev_count(0)
, led(5)
, eA(2)
, eB(5) {}
void RotaryEncoderDriver::begin() {
driver = this;
led.init();
eA.init();
eB.init();
EICRA |= (1<<ISC01) | (1<<ISC00);
EIMSK |= (1<<INT0);
timer.init(100);
}
void RotaryEncoderDriver::update() {
count += eB.is_hi() ? 1 : -1;
led.set_hi();
}
int RotaryEncoderDriver::position() {
led.set_lo();
return count;
}
void RotaryEncoderDriver::update_delta() {
if (++cycle == 0) {
delta = count - prev_count;
prev_count = count;
}
led.set_lo();
}
float RotaryEncoderDriver::count_per_sec() {
return delta / (256.0f * 0.0001f);
}
ISR(INT0_vect) {
driver->update();
}
ISR(TIMER1_COMPA_vect) {
driver->update_delta();
}
+12
View File
@@ -0,0 +1,12 @@
#include "timer_usec.h"
void Timer_usec::init(uint16_t period_us) { // for custom duty cycle duration in ms in part 1
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
OCR1A = period_us * 2 - 1;
TCCR1B |= (1<<WGM12);
TIMSK1 |= (1<<OCIE1A);
TCCR1B |= (1<<CS11);
}