-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.c
128 lines (116 loc) · 3.37 KB
/
main.c
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/*
* \file main.c
*
* \brief Main source file.
*
* (c) 2020 Microchip Technology Inc. and its subsidiaries.
*
* Subject to your compliance with these terms,you may use this software and
* any derivatives exclusively with Microchip products.It is your responsibility
* to comply with third party license terms applicable to your use of third party
* software (including open source software) that may accompany Microchip software.
*
* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER
* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED
* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A
* PARTICULAR PURPOSE.
*
* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE,
* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND
* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS
* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE
* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN
* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
*/
#include <avr/io.h>
#include <avr/sleep.h>
#include <avr/interrupt.h>
#include <opamp.h>
#include <port.h>
#include <tca.h>
typedef enum {
SINGLE=1,
VOLTAGE_FOLLOWER,
NON_INVERTING_PGA,
INVERTING_PGA,
DIFFERENTIAL_AMPLIFIER,
INSTRUMENTATION_AMPLIFIER
}opamp_config_t;
volatile opamp_config_t opamp_confg;
volatile uint8_t opamp_config_flag=1;
void LED0_blink(uint8_t config)
{
tca0_set_cmp_value(config);
tca1_enable();
}
int main(void)
{
port_init();
opamp_init();
/*Configure main clock to run at 32.768 kHz*/
_PROTECTED_WRITE(CLKCTRL.MCLKCTRLA, CLKCTRL.MCLKCTRLA | CLKCTRL_CLKSEL_OSC32K_gc);
tca_init();
set_sleep_mode(SLEEP_MODE_STANDBY);
sei();
while (1)
{
/*Read the configuration set by the user externally with pull downs on the
OPAMP_CONFIG_PORT and configure the op amps with the appropriate settings*/
if (opamp_config_flag)
{
opamp_confg = GET_OPAMP_CONFIG();
switch(opamp_confg)
{
case SINGLE:
default:
LED0_blink(SINGLE);
opamp_single_config();
break;
case VOLTAGE_FOLLOWER:
LED0_blink(opamp_confg);
opamp_voltage_follower_config();
break;
case NON_INVERTING_PGA:
LED0_blink(opamp_confg);
opamp_non_inverting_pga_config();
break;
case INVERTING_PGA:
LED0_blink(opamp_confg);
opamp_inverting_pga_config();
break;
case DIFFERENTIAL_AMPLIFIER:
LED0_blink(opamp_confg);
opamp_differential_amplifier_config();
break;
case INSTRUMENTATION_AMPLIFIER:
LED0_blink(opamp_confg);
opamp_instrumentation_amplifier_config();
break;
}
opamp_config_flag=0;
}
/*Set device in sleep*/
sleep_mode();
}
}
ISR(TCA0_CMP0_vect)
{
/*Disable blinking*/
tca1_disable();
/*Reset counter*/
TCA0.SINGLE.CNT = 1;
/*Clear interrupt flag*/
TCA0.SINGLE.INTFLAGS = TCA_SINGLE_CMP0_bm;
opamp_config_flag=0;
/*Enable PORTB interrupt again to accept reconfiguration*/
PORTB.PIN2CTRL |= PORT_ISC_FALLING_gc;
}
ISR(PORTB_PORT_vect){
/*Clear interrupt flag*/
PORTB.INTFLAGS = PIN2_bm;
opamp_config_flag=1;
/*Turn off PORTB PIN2(SW0) interrupts until
blinking is done (TCA0 compare match ISR triggers)*/
PORTB.PIN2CTRL &= ~PORT_ISC_FALLING_gc;
}