Statistiques
| Branche: | Révision:

root / Version 0.5 / Panel_reader_controller.X / main.c @ master

Historique | Voir | Annoter | Télécharger (4,033 ko)

1 eae0761b Enzo Niro
/*
2
 * File:   main.c
3
 * Author: Enzo Niro
4
 *
5
 * Created on August 28, 2024, 2:39 PM
6
 */
7
8
9
#define F_CPU   10000000UL
10
11
#include <xc.h>
12
#include <stdint.h>
13
#include <stdbool.h>
14
#include <util/delay.h>
15
16
#include "defValues.h"
17
#include "configuration.h"
18
#include "pins.h"
19
20
21
22
/*
23
 TODO list :
24
 * Test PWM
25
 * ADC for battery
26
 * Add USART0 & USART1 (implement TX and RX method)
27
 
28
 */
29
30
31
32
33
////////////////////////////////////////////
34
//Prototypes & Macros
35
void dimmerSetup(void); //start dimmer
36
void adcInit(void);                           //Init ADC cfg
37
38
#define ADC_START_CONV      ADC0.COMMAND |= 0x01                //Start conversion
39
#define ADC_READ            ADC0.SAMPLE                         //Get sample value
40
#define BLUETOOTH_CONNECTED     ((PORTA.IN & STAT2_PIN) >> 4) //Get Bluetooth connected status
41
////////////////////////////////////////////
42
43
44
45
46
47
48
49
int main(void) {
50
    //PORTA.DIR = 0xFF;
51
    //PORTA.OUT = 0xFF;
52
    //PORTA.PIN4CTRL = 0x08 | 0x03; //PULLUP enable and sense on low level...
53
    //_PROTECTED_WRITE(CLKCTRL.MCLKCTRLA, 0x01); //switch to 20 MHz internal oscillator
54
    //_PROTECTED_WRITE(CLKCTRL.MCLKCTRLB, 0x19); //switch to 20 MHz internal oscillator
55
    //SLPCTRL.CTRLA = (0x02 << 1); //standby sleep mode
56
    //SLPCTRL.CTRLA |= ENABLE_BIT;
57
    
58
    _PROTECTED_WRITE(CLKCTRL.MCLKCTRLB, ENABLE_BIT); //Enable clock prescaler (and divide by 2)
59
    uint16_t counter = 0;
60
    
61
    _delay_ms(1000);
62
    
63
    ////////////////////////////////////////////////
64
    //Basic pins setup
65
    PORTA.OUT = 0x80;
66
    PORTA.DIR = 0x80;
67
    PORTB.OUT = 0x00;
68
    PORTB.DIR = PWM_DIMMER_PIN | BOOT_BL_PIN;   
69
    ////////////////////////////////////////////////
70
    
71
    
72
    ////////////////////////////////////////////////
73
    //USART Setup
74
    #ifdef USE_TWO_SERIAL_PORTS
75
    PORTA.DIR = TX2_PIN; //Only this pin is output, others are input
76
    PORTB.DIR |= TX1_PIN; //Add TX1 pin as output on PORTB
77
    //TODO add a method to configure serial port here
78
    #endif
79
    ////////////////////////////////////////////////
80
    
81
    
82
    ////////////////////////////////////////////////
83
    //Start ADC
84
    //adcInit();
85
    
86
    
87
    /////////////////////////
88
    //Boot Bluetooth module
89
    PORTB.OUT |= BOOT_BL_PIN;
90
    
91
    
92
    /////////////////////////
93
    //Start PWM
94
    dimmerSetup();
95
    
96
    PORTA.OUT = 0x00;
97
    _delay_ms(500);
98
    PORTA.OUT = 0x80;
99
    _delay_ms(500);
100
    
101
    
102
    
103
    while(1)
104
    {
105
        /*
106
        if(!BLUETOOTH_CONNECTED) //Check STAT2 pin if not connected 
107
        {
108
            //Now we accept setup mode
109
        }
110
        */
111
        
112
        /*if((PORTA.IN & 0x10) == 0x00) //button pushed
113
        {
114
            //wait a bit
115
            _delay_ms(500);
116
            _delay_ms(500);
117
            SLPCTRL.CTRLA = (0x01 << 1); //standby sleep mode
118
            SLPCTRL.CTRLA |= ENABLE_BIT;
119
        }
120
        
121
        PORTA.OUT ^= 0x20;
122
        counter++;
123
        _delay_ms(500);*/
124
        
125
    }
126
    
127
    return 0;
128
}
129
130
131
132
void adcInit(void)
133
{
134
    ADC0.CTRLA = ENABLE_BIT; //Enable register
135
    ADC0.COMMAND = (ADC_SINGLE_12BIT << 4); //Just use 12 bit resolution (no differential mode)
136
    ADC0.CTRLB = ADC_PRESCALER; //divide clock for conversion
137
    ADC0.CTRLC = (ADC_TIMEBASE << 3) | ADC_REF; //Set analog reference
138
    ADC0.PGACTRL = (ADC_PGA_GAIN << 5) | (ADC_PGA_BIAS << 3) | (ADC_PGA_SMD << 1) | ENABLE_BIT; //set PGA cfg
139
    ADC0.CTRLE = 0x80; //Set sample duration (SAMPDUR -> p.407)
140
    ADC0.MUXPOS = (ADC_VIA_PGA << 6) | (ADC_MUX_AIN12); //PC0 connected to AIN12
141
    ADC0.MUXNEG = (ADC_VIA_DIRECT << 6) | (ADC_MUXN_GND); //Set reference in common mode
142
}
143
144
uint16_t adcGetSample(void)
145
{
146
    ADC_START_CONV; //as for a conversion
147
    _delay_ms(1); //wait a bit
148
    while(!ADC0.STATUS); //Wait when conversion is now complete
149
    return ADC_READ; //get stored value
150
}
151
152
153
void dimmerSetup(void)
154
{
155
    TCA0.SINGLE.CTRLA = (PWM_DIV << 1) | ENABLE_BIT; //enable register set PWM frequency (datasheet p.209)
156
    TCA0.SINGLE.CTRLB = 0x13; //set output frequency in Single-slope PWM
157
    TCA0.SINGLE.CTRLD = ENABLE_BIT; //enable split mode
158
    TCA0.SINGLE.CMP0 = PWM_RATE; //set duty cycle
159
}