does not work

This commit is contained in:
Maix0 2026-04-18 00:13:52 +02:00
parent 8d79cc7812
commit 508ba6e857
12 changed files with 826 additions and 0 deletions

79
ex02/src/main.c Normal file
View file

@ -0,0 +1,79 @@
#include <avr/io.h>
#include <util/delay.h>
#include "interupt.h"
#include "mystd.h"
#include "timer_global.h"
#include "uart.h"
#include "timer0.h"
#include "timer1.h"
#include "timer2.h"
volatile uint8_t counter = 0;
#define LED_MASK (_BV(PB0) | _BV(PB1) | _BV(PB2) | _BV(PB4));
void display_counter(void) {
PORTB &= ~LED_MASK;
PORTB |= ((counter & 0b111) | ((counter & 0b1000) << 1));
}
// interrupt for INT0 (external interrupt)
void __attribute__((signal, used)) __vector_1(void) {
EIMSK &= ~_BV(INT0);
EIFR |= _BV(INTF0);
// clear the register "pending" bit
t1_interrupt(TO_A, true);
counter++;
display_counter();
// uart_tx('I');
}
// external interupt
void __attribute__((signal, used)) __vector_5(void) {
EIMSK &= ~_BV(INT0);
EIFR |= _BV(INTF0);
// clear the register "pending" bit
t1_interrupt(TO_A, true);
counter++;
display_counter();
// uart_tx('I');
}
// timer1 compare match A
void __attribute__((signal, used)) __vector_11(void) {
static uint8_t prev_state = 0;
}
// timer1 overflow match B
int main(void) {
uart_init();
t1_init_ctc_4(PRESCALER_1024);
t1_interrupt(TO_B, true);
t1_set_ocr(TO_A, (F_CPU / (1024 * 20)) - 1);
DDRB |= LED_MASK;
DDRD &= ~(_BV(PD2) | _BV(PD4));
// Set INT0 to trigger on falling edge
EICRA &= ~(_BV(ISC00) | _BV(ISC01));
EICRA |= _BV(ISC01);
// yes we want the INT0 interupt !
EIMSK |= _BV(INT0);
// PD4
// Enable Pin Change Interrupt group for PORTD (PCINT[23:16])
PCICR |= (1 << PCIE2);
// Enable interrupt specifically for PD4 (PCINT20)
PCMSK2 |= (1 << PCINT20);
my_sei();
while (1) {
}
}

103
ex02/src/uart.c Normal file
View file

@ -0,0 +1,103 @@
#include "uart.h"
#include <avr/io.h>
#include "mystd.h"
#include "utils.h"
#define BAUD_RATE 115200
#define UBRR_VALUE ((F_CPU / (8UL * BAUD_RATE)) - 1)
// uart is 115200 baud rate, 8 bits per word, no parrity and 1 stop bit
// 115200 8N1
void uart_init(void) {
// Set baud rate
UBRR0H = (uint8_t)(UBRR_VALUE >> 8);
UBRR0L = (uint8_t)(UBRR_VALUE);
UCSR0A |= _BV(U2X0);
// Enable transmitter
UCSR0B = _BV(TXEN0) | _BV(RXEN0);
// Set frame format: 8 data bits, no parity, 1 stop bit
UCSR0C = _BV(UCSZ01) | _BV(UCSZ00);
// Set TX (PD1) as output
DDRD |= _BV(PD1);
}
void uart_tx(char data) {
// wait for transmit buffer to be empty
while (!(UCSR0A & _BV(UDRE0)))
;
// load data into transmit register
UDR0 = data;
}
char uart_rx(void) {
while (!(UCSR0A & _BV(RXC0)))
;
return UDR0;
}
void uart_sendstring(const char* str) {
if (!str)
return;
while (*str) {
uart_tx(*str);
str++;
}
}
void uart_send_u8(uint8_t val) {
char buf[4] = {0, 0, 0, 0};
uint8_t idx = 0;
bool print = false;
uint8_t modulus = 100;
while (modulus) {
uint8_t digit = val / modulus;
if (print || digit != 0) {
print = true;
buf[idx++] = '0' + digit;
}
val %= modulus;
modulus /= 10;
}
uart_sendstring(buf);
}
void uart_send_u16(uint16_t val) {
char buf[6] = {0, 0, 0, 0, 0, 0};
uint8_t idx = 0;
bool print = false;
uint16_t modulus = 10000;
while (modulus) {
uint8_t digit = val / modulus;
if (print || digit != 0) {
print = true;
buf[idx++] = '0' + digit;
}
val %= modulus;
modulus /= 10;
}
uart_sendstring(buf);
}
void uart_send_u8_hex(uint8_t val) {
char buf[3] = {0, 0, 0};
buf[0] = "0123456789abcdef"[(val >> 4) & 0x0F];
buf[1] = "0123456789abcdef"[(val >> 0) & 0x0F];
uart_sendstring(buf);
}
void uart_send_u16_hex(uint16_t val) {
char buf[5] = {0, 0, 0, 0, 0};
buf[0] = "0123456789abcdef"[(val >> 12) & 0x0F];
buf[1] = "0123456789abcdef"[(val >> 8) & 0x0F];
buf[2] = "0123456789abcdef"[(val >> 4) & 0x0F];
buf[3] = "0123456789abcdef"[(val >> 0) & 0x0F];
uart_sendstring(buf);
}

39
ex02/src/utils.c Normal file
View file

@ -0,0 +1,39 @@
#include "utils.h"
#include "mystd.h"
// this just burns cycles.
// the volatile is important, it means that the cpu can't optimize any
// read/writes for the value
static inline void spin_loop(volatile uint16_t counts) {
while (counts)
counts--;
}
void delay_ms(uint16_t ms) {
while (ms) {
// this value was taken using a delay of 500ms, and just recording the led
// blinking. it seems to be high enough such that each loop of delay_loop
// takes 1ms :D
spin_loop((F_CPU) / 5000);
ms--;
}
}
void ft_bzero(void* data, uint16_t size) {
char* d = data;
while (size) {
*d = 0;
d++;
size--;
}
}
uint8_t ft_stridx(const char* str, char chr) {
if (!str)
return -1;
for (uint8_t i = 0; str[i]; i++) {
if (str[i] == chr)
return i;
}
return -1;
}