aboutsummaryrefslogtreecommitdiff
path: root/arch/attiny1634.h
blob: 559d04ef74c156ac08a8b41b8bcdbcffc3e415c2 (plain)
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
// arch/attiny1634.h: attiny1634 support header
// Copyright (C) 2014-2023 Selene ToyKeeper
// SPDX-License-Identifier: GPL-3.0-or-later
#pragma once

// fill in missing values from Atmel's headers
#define PROGMEM_SIZE  16384
#define EEPROM_SIZE   256

////////// clock speed / delay stuff //////////

#define F_CPU  8000000UL
#define BOGOMIPS  (F_CPU/4000)
#define DELAY_ZERO_TIME  1020

inline void mcu_clock_speed();

///// clock dividers
inline void clock_prescale_set(uint8_t n);

// TODO? allow hwdef to define a base clock speed,
//       and adjust these values accordingly
typedef enum
{
    // datasheet 6.5.2, CLKPR - Clock Prescale Register
    clock_div_1   = 0,  // 8 MHz
    clock_div_2   = 1,  // 4 MHz
    clock_div_4   = 2,  // 2 MHz
    clock_div_8   = 3,  // 1 MHz
    clock_div_16  = 4,  // 500 kHz
    clock_div_32  = 5,  // 250 kHz
    clock_div_64  = 6,  // 125 kHz
    clock_div_128 = 7,  // 62.5 kHz
    clock_div_256 = 8,  // 31.75 kHz
} clock_div_t;


////////// ADC voltage / temperature //////////

#define V_REF REFS1
//#define VOLTAGE_ADC_DIDR DIDR0  // set this in hwdef

// DS table 19-3, 19-4, 1.1V ref / VCC
#define ADMUX_VCC 0b00001101
// (1 << V_REF) | (THERM_CHANNEL)
// DS table 19-3, 19-4, internal sensor / 1.1V ref
// [refs1, refs0, refen, adc0en, mux3, mux2, mux1, mux0]
// refs=0b10 : internal 1.1V ref
// mux=0b1110 : internal temperature sensor
#define ADMUX_THERM 0b10001110

#define hwdef_set_admux_therm  mcu_set_admux_therm
inline void mcu_set_admux_therm();

#define hwdef_set_admux_voltage mcu_set_admux_voltage
inline void mcu_set_admux_voltage();

inline void mcu_adc_sleep_mode();

inline void mcu_adc_start_measurement();

inline void mcu_adc_off();

// NOP because interrupt flag clears itself
#define mcu_adc_vect_clear()

inline uint16_t mcu_adc_result();

// return Volts * 40, range 0 to 6.375V
#define voltage_raw2cooked  mcu_vdd_raw2cooked
inline uint8_t mcu_vdd_raw2cooked(uint16_t measurement);
inline uint8_t mcu_vdivider_raw2cooked(uint16_t measurement);

// return (temp in Kelvin << 6)
#define temp_raw2cooked  mcu_temp_raw2cooked
inline uint16_t mcu_temp_raw2cooked(uint16_t measurement);

inline uint8_t mcu_adc_lsb();


////////// WDT //////////

inline void mcu_wdt_active();

inline void mcu_wdt_standby();

inline void mcu_wdt_stop();

// NOP because interrupt flag clears itself
#define mcu_wdt_vect_clear()


////////// PCINT - pin change interrupt (e-switch) //////////

// set these in hwdef
//#define SWITCH_PORT  PINA
//#define SWITCH_VECT  PCINT0_vect

// NOP because interrupt flag clears itself
#define mcu_switch_vect_clear()

inline void mcu_pcint_on();

inline void mcu_pcint_off();


////////// misc //////////

void reboot();

inline void prevent_reboot_loop();