-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.cpp
76 lines (54 loc) · 1.93 KB
/
main.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
// Arduino AVR utils
#include <avr/io.h>
#include <util/delay.h>
#include <stdio.h>
/* Register map */
// When addressing I/O Registers as data space using LD and ST instructions, 0x20 must be added to these addresses.
const uint8_t register_offset = 0x20U;
// Direction register
uint8_t ddrb_register = 0x17U + register_offset;
// Output register
uint8_t portb_register = 0x18U + register_offset;
// Pin direction value
const uint8_t p1_led_pin = 0b00000010U;
// General timer register
uint8_t gtccr_register = 0x2CU + register_offset;
uint8_t tccr0a_register = 0x2AU + register_offset;
// Timer register
uint8_t tcnt0_register = 0x32U + register_offset;
// General timer values
const uint8_t tcm_mask = 0b10000000U;
const uint8_t psr0_mask = 0b00000001U;
static inline uint8_t register_read(uint8_t reg)
{
return *reinterpret_cast<uint8_t *>(reg);
}
static inline void register_write(uint8_t reg, uint8_t val)
{
*reinterpret_cast<uint8_t *>(reg) = val;
}
int main (void)
{
// Set digital I/O on port B to output
register_write(ddrb_register, p1_led_pin);
// Create a timer
register_write(gtccr_register, register_read(gtccr_register) | tcm_mask | psr0_mask);
// Bring timer out of reset
register_write(gtccr_register, register_read(gtccr_register) & ~psr0_mask);
register_write(tccr0a_register, 0);
// What is our timer at?
uint8_t volatile timer_val = register_read(tcnt0_register);
// TODO: create a timer like so: https://www.gadgetronicx.com/attiny85-timer-tutorial-generating-time-delay-interrupts/
for (;;)
{
// Toggle High
register_write(portb_register, register_read(portb_register) | p1_led_pin);
// Delay with timer
timer_val = register_read(tcnt0_register); // What is our timer at
// Toggle Low
register_write(portb_register, register_read(portb_register) & ~p1_led_pin);
}
#endif
printf("Print something!");
return 0;
}