From 3d12b7066d27b591e0283e20ed066bc66e29fbe4 Mon Sep 17 00:00:00 2001 From: Selene ToyKeeper Date: Fri, 10 Nov 2023 21:34:40 -0700 Subject: refactor checkpoint: splitting MCU-specific code into arch/$MCU.[ch] Phew, that's a lot of changes! And there's still a lot more to do... --- arch/attiny1634.h | 98 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 arch/attiny1634.h (limited to 'arch/attiny1634.h') diff --git a/arch/attiny1634.h b/arch/attiny1634.h new file mode 100644 index 0000000..e01abad --- /dev/null +++ b/arch/attiny1634.h @@ -0,0 +1,98 @@ +// 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 + +///// clock dividers +inline void clock_prescale_set(uint8_t n); + +typedef enum +{ + clock_div_1 = 0, + clock_div_2 = 1, + clock_div_4 = 2, + clock_div_8 = 3, + clock_div_16 = 4, + clock_div_32 = 5, + clock_div_64 = 6, + clock_div_128 = 7, + clock_div_256 = 8 +} 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 +#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_on(); + +inline void mcu_adc_off(); + +// NOP because interrupt flag clears itself +#define mcu_adc_vect_clear() + +inline uint16_t mcu_adc_result(); + +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(); + -- cgit v1.2.3 From e6909adcb1d44797e097dcf93ee7459276a4516a Mon Sep 17 00:00:00 2001 From: Selene ToyKeeper Date: Sun, 19 Nov 2023 01:47:40 -0700 Subject: moved prevent_reboot_loop() and some other junk out of fsm/main.c --- arch/attiny1634.h | 2 ++ 1 file changed, 2 insertions(+) (limited to 'arch/attiny1634.h') diff --git a/arch/attiny1634.h b/arch/attiny1634.h index e01abad..fb89fa8 100644 --- a/arch/attiny1634.h +++ b/arch/attiny1634.h @@ -96,3 +96,5 @@ inline void mcu_pcint_off(); void reboot(); +inline void prevent_reboot_loop(); + -- cgit v1.2.3 From 1b6f40863b4f08365e39236496d687ab7806ed11 Mon Sep 17 00:00:00 2001 From: Selene ToyKeeper Date: Mon, 27 Nov 2023 07:31:56 -0700 Subject: fixed ADC on attiny1634 and related builds --- arch/attiny1634.h | 40 ++++++++++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 14 deletions(-) (limited to 'arch/attiny1634.h') diff --git a/arch/attiny1634.h b/arch/attiny1634.h index fb89fa8..559d04e 100644 --- a/arch/attiny1634.h +++ b/arch/attiny1634.h @@ -13,20 +13,25 @@ #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 { - clock_div_1 = 0, - clock_div_2 = 1, - clock_div_4 = 2, - clock_div_8 = 3, - clock_div_16 = 4, - clock_div_32 = 5, - clock_div_64 = 6, - clock_div_128 = 7, - clock_div_256 = 8 + // 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; @@ -39,11 +44,11 @@ typedef enum #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(); @@ -54,8 +59,6 @@ inline void mcu_adc_sleep_mode(); inline void mcu_adc_start_measurement(); -inline void mcu_adc_on(); - inline void mcu_adc_off(); // NOP because interrupt flag clears itself @@ -63,6 +66,15 @@ inline void mcu_adc_off(); 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(); -- cgit v1.2.3