Compare commits
No commits in common. "documentation" and "master" have entirely different histories.
documentat
...
master
115
main.c
115
main.c
@ -1,67 +1,108 @@
|
||||
/*!
|
||||
* @file main.c
|
||||
* @authors Simon Donnet-Monay & Remi Heredero
|
||||
* @date 14 march 2023
|
||||
* @brief Main is in two part.
|
||||
* First for setup everything
|
||||
* Second for loop on measure and set duty cycle for PWM
|
||||
/**
|
||||
Generated Main Source File
|
||||
|
||||
Company:
|
||||
Microchip Technology Inc.
|
||||
|
||||
File Name:
|
||||
main.c
|
||||
|
||||
Summary:
|
||||
This is the main file generated using PIC10 / PIC12 / PIC16 / PIC18 MCUs
|
||||
|
||||
Description:
|
||||
This header file provides implementations for driver APIs for all modules selected in the GUI.
|
||||
Generation Information :
|
||||
Product Revision : PIC10 / PIC12 / PIC16 / PIC18 MCUs - 1.81.8
|
||||
Device : PIC18F97J60
|
||||
Driver Version : 2.00
|
||||
*/
|
||||
|
||||
/*
|
||||
(c) 2018 Microchip Technology Inc. and its subsidiaries.
|
||||
|
||||
Subject to your compliance with these terms, you may use Microchip 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 "mcc_generated_files/mcc.h"
|
||||
#include "lcd/lcd.h"
|
||||
#include "measure.h"
|
||||
#include "modbus.h"
|
||||
|
||||
#define MAX_COL 16 //!< columns for lcd screen (and 2 rows)
|
||||
#define MAX_COL 16
|
||||
/*
|
||||
Main application
|
||||
*/
|
||||
|
||||
void main(void) {
|
||||
|
||||
/* SETUP FUNCTIONS: */
|
||||
|
||||
// Initialize the system with all mcc default configs
|
||||
extern uint16_t input_registers[2];
|
||||
void main(void)
|
||||
{
|
||||
// Initialize the device
|
||||
SYSTEM_Initialize();
|
||||
EPWM1_LoadDutyValue(0);
|
||||
|
||||
Lcd_Init(); // Initialize lcd screen
|
||||
adc_init(); // Initialize adc for measures
|
||||
modbus_init(0x80); // Initialize all specific modbus function
|
||||
Lcd_Init();
|
||||
adc_init();
|
||||
modbus_init(0x80);
|
||||
uint16_t offsetCurrent = 0;
|
||||
offsetCurrent = measure_current(offsetCurrent);
|
||||
|
||||
// If using interrupts in PIC18 High/Low Priority Mode you need to enable the Global High and Low Interrupts
|
||||
// If using interrupts in PIC Mid-Range Compatibility Mode you need to enable the Global and Peripheral Interrupts
|
||||
// Use the following macros to:
|
||||
|
||||
// Enable the Global Interrupts
|
||||
INTERRUPT_GlobalInterruptEnable();
|
||||
|
||||
// Disable the Global Interrupts
|
||||
//INTERRUPT_GlobalInterruptDisable();
|
||||
|
||||
// Enable the Peripheral Interrupts
|
||||
INTERRUPT_PeripheralInterruptEnable();
|
||||
|
||||
/*
|
||||
* Initialize offset current.
|
||||
* 1. disable load
|
||||
* 2. Measure current without load
|
||||
*
|
||||
* The goal it's to remove the offset due to the electronics parts
|
||||
*/
|
||||
EPWM1_LoadDutyValue(0);
|
||||
const uint16_t offsetCurrent = measure_current(offsetCurrent);
|
||||
// Disable the Peripheral Interrupts
|
||||
//INTERRUPT_PeripheralInterruptDisable();
|
||||
|
||||
// create a char array for display on lcd (with space for '\0')
|
||||
char msg[MAX_COL+1];
|
||||
|
||||
/* LOOP MAIN PROGRAM: */
|
||||
while (1)
|
||||
{
|
||||
|
||||
while (1) {
|
||||
|
||||
// Get the measure and save it and the appropriate register
|
||||
EPWM1_LoadDutyValue(holding_registers[0]);
|
||||
input_registers[0] = measure_voltage();
|
||||
input_registers[1] = measure_current(offsetCurrent);
|
||||
uint16_t valueV = input_registers[0];
|
||||
uint16_t valueI = input_registers[1];
|
||||
|
||||
// Print on the first row of the lcd the Voltage
|
||||
sprintf(msg, "U = %04d [mV] ", input_registers[0]);
|
||||
char msg[MAX_COL+1];
|
||||
//LCD_2x16_WriteCmd(0x01); // clear display
|
||||
|
||||
sprintf(msg, "U = %04d [mV] ", valueV);
|
||||
LCD_2x16_WriteMsg(msg,0);
|
||||
|
||||
// Print on the second row of the lcd the current
|
||||
sprintf(msg, "I = %04d [uA] ", input_registers[1]);
|
||||
sprintf(msg, "I = %04d [uA] ", valueI);
|
||||
LCD_2x16_WriteMsg(msg,1);
|
||||
|
||||
// Write the duty cycle for pwm from the appropriate register
|
||||
EPWM1_LoadDutyValue(holding_registers[0]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
End of File
|
||||
*/
|
71
measure.c
71
measure.c
@ -13,58 +13,55 @@
|
||||
// Number of samples to do the averaging during measures
|
||||
#define AVERAGE_SAMPLES 8
|
||||
|
||||
void adc_init(void) {
|
||||
void adc_init(void)
|
||||
{
|
||||
// TODO -> complete adc initialisation
|
||||
//offsetCurrent = measure_current(0);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Read one ADC channel. This function is only
|
||||
* local to this file.
|
||||
* This function make the average on samples
|
||||
*
|
||||
* @param channel : the channel to be measured
|
||||
* @return the ADC read value with an average
|
||||
* @return the ADC read value
|
||||
*/
|
||||
static uint16_t measure_adc(uint8_t channel) {
|
||||
uint32_t value = 0;
|
||||
static uint16_t measure_adc(uint8_t channel)
|
||||
{
|
||||
return (uint16_t) (ADC_GetConversion(channel));
|
||||
}
|
||||
|
||||
|
||||
|
||||
uint16_t measure_voltage()
|
||||
{
|
||||
uint32_t sum = 0;
|
||||
|
||||
// Make an average
|
||||
for(int i = 0; i < AVERAGE_SAMPLES; i++) {
|
||||
value += (uint16_t) (ADC_GetConversion(channel));
|
||||
sum += measure_adc(VOLTAGE_CHANNEL);
|
||||
}
|
||||
value /= AVERAGE_SAMPLES;
|
||||
return (uint16_t) (value);
|
||||
sum /= AVERAGE_SAMPLES;
|
||||
sum = (sum * ADC_REFH) / ADC_RESOLUTION;
|
||||
return (uint16_t)(sum);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Measure voltage
|
||||
* @return
|
||||
*/
|
||||
uint16_t measure_voltage() {
|
||||
uint32_t value = measure_adc(VOLTAGE_CHANNEL);
|
||||
|
||||
// Convert sum from bits to mV
|
||||
value = (value * ADC_REFH) / ADC_RESOLUTION;
|
||||
return (uint16_t)(value);
|
||||
uint16_t measure_current(uint16_t offset)
|
||||
{
|
||||
uint32_t sum = 0;
|
||||
for(int i = 0; i< AVERAGE_SAMPLES; i++){
|
||||
sum += measure_adc(CURRENT_CHANNEL);
|
||||
}
|
||||
uint32_t m = (sum / AVERAGE_SAMPLES); // m is bits
|
||||
m = (m * ADC_REFH) / ADC_RESOLUTION; // m is mV
|
||||
m *= 1000; // m is uV
|
||||
m /= GAIN;
|
||||
m /= RESISTOR; // m is uA
|
||||
if(m <= offset){
|
||||
m = 0;
|
||||
} else {
|
||||
m -= offset;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param offset
|
||||
* @return
|
||||
*/
|
||||
uint16_t measure_current(uint16_t offset) {
|
||||
uint32_t value = measure_adc(CURRENT_CHANNEL);
|
||||
|
||||
// Convert from bits to uA
|
||||
value = (value * ADC_REFH) / ADC_RESOLUTION; // [mV]
|
||||
value *= 1000; // [uV]
|
||||
value /= GAIN; // [uV]
|
||||
value /= RESISTOR; // [uA]
|
||||
|
||||
// Return value without offset or null if it's too low
|
||||
if(value > offset) return (uint16_t)(value-offset);
|
||||
return 0;
|
||||
return (uint16_t)m;
|
||||
}
|
131
modbus.c
131
modbus.c
@ -1,17 +1,14 @@
|
||||
/*!
|
||||
* @file modbus.c
|
||||
* @authors Simon Donnet-Monay & Remi Heredero
|
||||
* @date 14 march 2023
|
||||
* @brief
|
||||
*/
|
||||
|
||||
#include "modbus.h"
|
||||
#include "crc.h"
|
||||
#include "uart.h"
|
||||
#include <xc.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
|
||||
// Modbus functions
|
||||
#define READ_INPUT_REGISTERS 0x04 // Modbus function for read input register
|
||||
#define READ_HOLDING_REGISTERS 0x03 // Modbus function for read holding register
|
||||
#define WRITE_SINGLE_REGISTER 0x06 // Modbus function for write a single register
|
||||
#define READ_INPUT_REGISTERS 0x04
|
||||
#define READ_HOLDING_REGISTERS 0x03
|
||||
#define WRITE_SINGLE_REGISTER 0x06
|
||||
|
||||
// Modbus data model
|
||||
uint8_t modbusAddress;
|
||||
@ -35,83 +32,47 @@ uint8_t tx_buf[256];
|
||||
// Current position pointer for storing receive position
|
||||
uint8_t recPtr = 0;
|
||||
|
||||
/**
|
||||
* End of MODBUS frame.
|
||||
*/
|
||||
void modbus_timer(void) {
|
||||
INTCONbits.TMR0IF = 0; // Reset flag of the timer0 interrupt
|
||||
recPtr = 0; // Reset position of the char in the frame
|
||||
TMR0_StopTimer(); // Stop timer who detect the end of the frame
|
||||
modbus_analyse_and_answer(); // Run analyse of this frame
|
||||
void modbus_timer(void)
|
||||
{
|
||||
INTCONbits.TMR0IF = 0;
|
||||
recPtr = 0;
|
||||
TMR0_StopTimer();
|
||||
modbus_analyse_and_answer();
|
||||
|
||||
}
|
||||
|
||||
extern uint16_t measure_voltage();
|
||||
|
||||
/**
|
||||
* @brief Analyse the received frame and build an answer
|
||||
* @return The error code if the frame isn't valid (TODO)
|
||||
*/
|
||||
uint8_t modbus_analyse_and_answer(void) {
|
||||
// Init lenght of the answer frame at 0
|
||||
// TODO -> complete the modbus analyse and answer
|
||||
uint16_t length = 0;
|
||||
|
||||
// Check if the received frame is for this device
|
||||
if(rx_buf[0] == modbusAddress){
|
||||
tx_buf[0] = rx_buf[0]; // Copy the address on the tx buffer
|
||||
tx_buf[1] = rx_buf[1]; // Copy the function number on the tx buffer
|
||||
|
||||
// Init the addresse Register local variable
|
||||
tx_buf[0] = rx_buf[0]; // Adress
|
||||
tx_buf[1] = rx_buf[1]; // Function
|
||||
uint16_t adresseRegister = ((uint16_t)rx_buf[2] << 8) | rx_buf[3];
|
||||
|
||||
switch(rx_buf[1]){ // Check the function from rx buffer
|
||||
|
||||
// In case of the function is to read input register:
|
||||
case READ_INPUT_REGISTERS:
|
||||
// Define length as the number of register we want read
|
||||
length = ((uint16_t)rx_buf[4] << 8) | rx_buf[5];
|
||||
|
||||
// Write this length on the tx buffer for the answer
|
||||
tx_buf[2] = (uint8_t)(length*2);
|
||||
|
||||
// For each register, write the value on the tx buffer (register on 16bits)
|
||||
tx_buf[2] = (uint8_t)(length*2); // Data length
|
||||
for(uint16_t i = 0; i < length; i++){ // Data
|
||||
tx_buf[i*2+4] = input_registers[adresseRegister+i];
|
||||
tx_buf[i*2+3] = (input_registers[adresseRegister+i] >> 8);
|
||||
}
|
||||
|
||||
// Transform length as the number of bytes on tx register
|
||||
length*=2; // 2 bytes by register
|
||||
length+=3; // + address + function + length
|
||||
length*=2;
|
||||
length+=3;
|
||||
break;
|
||||
|
||||
|
||||
// In case of the function is to read holding register
|
||||
case READ_HOLDING_REGISTERS:
|
||||
// Define length as the number of register we want read
|
||||
length = ((uint16_t)rx_buf[4] << 8) | rx_buf[5];
|
||||
|
||||
// Write this length on the tx buffer for the answer
|
||||
tx_buf[2] = (uint8_t)(length*2);
|
||||
|
||||
// For each register, write the value on the tx buffer (register on 16bits))
|
||||
for(uint16_t i = 0; i < length; i++){
|
||||
tx_buf[2] = (uint8_t)(length*2); // Data length
|
||||
for(uint16_t i = 0; i < length; i++){ // Data
|
||||
tx_buf[i*2+4] = holding_registers[adresseRegister+i];
|
||||
tx_buf[i*2+3] = (holding_registers[adresseRegister+i] >> 8);
|
||||
}
|
||||
// Transform length as the number of bytes on tx register
|
||||
length*=2; // 2 bytes by register
|
||||
length+=3; // + address + function + length
|
||||
length*=2;
|
||||
length+=3;
|
||||
break;
|
||||
|
||||
|
||||
// In case of the funciton is to write a single register
|
||||
case WRITE_SINGLE_REGISTER:
|
||||
|
||||
// Write the value on rx buffer on the holding register define by the adress register we define before
|
||||
holding_registers[adresseRegister] = ((uint16_t)rx_buf[4] << 8) | rx_buf[5];
|
||||
|
||||
// Copy data on the tx buffer
|
||||
for (uint8_t i = 2; i <= 5; i++) {
|
||||
for (int i = 2; i <= 5; i++) {
|
||||
tx_buf[i] = rx_buf[i];
|
||||
length = i+1;
|
||||
}
|
||||
@ -120,62 +81,38 @@ uint8_t modbus_analyse_and_answer(void) {
|
||||
|
||||
}
|
||||
|
||||
// Clear address on rx buffer (for validate we treat the data)
|
||||
rx_buf[0] = 0;
|
||||
|
||||
// Send the answer frame
|
||||
modbus_send(length);
|
||||
|
||||
// TODO return error code
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Record a char when it's received on the modbus
|
||||
*/
|
||||
void modbus_char_recvd(void) {
|
||||
//! Record the received char on the rx buffer and move position of the record pointer for the next char
|
||||
void modbus_char_recvd(void)
|
||||
{
|
||||
rx_buf[recPtr++] = RCREG1;
|
||||
|
||||
//! Reload and start the timer0 for restart to count the time between char
|
||||
TMR0_Reload();
|
||||
TMR0_StartTimer();
|
||||
}
|
||||
|
||||
/**
|
||||
* Create the CRC and send the tx buffer
|
||||
* @param length lenght of the frame without the CRC
|
||||
*/
|
||||
void modbus_send(uint8_t length) {
|
||||
// Create the CRC
|
||||
void modbus_send(uint8_t length)
|
||||
{
|
||||
|
||||
uint16_t crc = CRC16(tx_buf, length);
|
||||
|
||||
// Write CRC on the tx buffer
|
||||
tx_buf[length] = crc;
|
||||
tx_buf[length+1] = crc >> 8;
|
||||
|
||||
length += 2; //! add 2 CRC bytes for total size
|
||||
length += 2; // add 2 CRC bytes for total size
|
||||
|
||||
// Send each byte of the frame on the tx buffer
|
||||
// For all the bytes to be transmitted
|
||||
for (uint8_t i = 0; i < length; i++){
|
||||
EUSART1_Write(tx_buf[i]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize the modbus with adress and handler function
|
||||
* @param address The adress of this device on modbus protocole
|
||||
*/
|
||||
void modbus_init(uint8_t address) {
|
||||
// Init the modbus adress
|
||||
void modbus_init(uint8_t address)
|
||||
{
|
||||
modbusAddress = address;
|
||||
|
||||
// Save the modbus adress in the dedicated register
|
||||
holding_registers[1] = address;
|
||||
|
||||
// Set the handler for the character detection
|
||||
EUSART1_SetRxInterruptHandler(modbus_char_recvd);
|
||||
|
||||
// Set the handler for the detection of end frame
|
||||
TMR0_SetInterruptHandler(modbus_timer);
|
||||
}
|
2
modbus.h
2
modbus.h
@ -7,8 +7,6 @@
|
||||
#define MODBUS_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <xc.h>
|
||||
#include <stdio.h>
|
||||
|
||||
extern uint8_t modbusAddress;
|
||||
extern uint16_t input_registers[2];
|
||||
|
@ -1,8 +1,14 @@
|
||||
#
|
||||
#Sat Mar 18 16:03:57 CET 2023
|
||||
proj.dir=C\:\\Users\\remi\\MPLABXProjects\\Solar-Panel
|
||||
host.id=aq84-7qg1-w
|
||||
#Tue Mar 14 13:52:25 CET 2023
|
||||
default.languagetoolchain.version=2.40
|
||||
default.Pack.dfplocation=C\:\\Program Files\\Microchip\\MPLABX\\v6.00\\packs\\Microchip\\PIC18F-J_DFP\\1.5.44
|
||||
conf.ids=default
|
||||
default.languagetoolchain.dir=C\:\\Program Files\\Microchip\\xc8\\v2.40\\bin
|
||||
host.id=3awj-afwq-rl
|
||||
configurations-xml=4dc45b219db50423420a0eb2e1f688ad
|
||||
com-microchip-mplab-nbide-embedded-makeproject-MakeProject.md5=bcd6e5453a11ce86aaffd5305e838602
|
||||
default.com-microchip-mplab-mdbcore-snap-SnapToolImpl.md5=eaa336cefb7fc46db8b50b7b2b6e54ca
|
||||
com-microchip-mplab-nbide-embedded-makeproject-MakeProject.md5=6e02ca5e9f5042ffd365b42ab82d3a9b
|
||||
user-defined-mime-resolver-xml=none
|
||||
default.com-microchip-mplab-nbide-toolchain-xc8-XC8LanguageToolchain.md5=ab1e0737b447a24f7366e9fd8fe5a2f0
|
||||
proj.dir=C\:\\Users\\remi\\MPLABXProjects\\solar_panel
|
||||
host.platform=windows
|
||||
conf.ids=
|
||||
|
@ -24,7 +24,7 @@ CLEAN_SUBPROJECTS=${CLEAN_SUBPROJECTS_${SUBPROJECTS}}
|
||||
|
||||
|
||||
# Project Name
|
||||
PROJECTNAME=Solar-Panel
|
||||
PROJECTNAME=solar_panel
|
||||
|
||||
# Active Configuration
|
||||
DEFAULTCONF=default
|
||||
|
@ -6,5 +6,5 @@
|
||||
CND_BASEDIR=`pwd`
|
||||
# default configuration
|
||||
CND_ARTIFACT_DIR_default=dist/default/production
|
||||
CND_ARTIFACT_NAME_default=Solar-Panel.production.hex
|
||||
CND_ARTIFACT_PATH_default=dist/default/production/Solar-Panel.production.hex
|
||||
CND_ARTIFACT_NAME_default=solar_panel.production.hex
|
||||
CND_ARTIFACT_PATH_default=dist/default/production/solar_panel.production.hex
|
||||
|
@ -3,7 +3,14 @@
|
||||
<editor-bookmarks xmlns="http://www.netbeans.org/ns/editor-bookmarks/2" lastBookmarkId="0"/>
|
||||
<open-files xmlns="http://www.netbeans.org/ns/projectui-open-files/2">
|
||||
<group>
|
||||
<file>file:/C:/Users/remi/MPLABXProjects/Solar-Panel/measure.c</file>
|
||||
<file>file:/C:/Program%20Files/Microchip/xc8/v2.40/pic/sources/c99/common/doprnt.c</file>
|
||||
<file>file:/C:/Users/remi/MPLABXProjects/solar_panel/lcd/lcd.c</file>
|
||||
<file>file:/C:/Users/remi/MPLABXProjects/solar_panel/modbus.h</file>
|
||||
<file>file:/C:/Users/remi/MPLABXProjects/solar_panel/main.c</file>
|
||||
<file>file:/C:/Program%20Files/Microchip/xc8/v2.40/pic/sources/c99/common/aomod.c</file>
|
||||
<file>file:/C:/Users/remi/MPLABXProjects/solar_panel/modbus.c</file>
|
||||
<file>file:/C:/Users/remi/MPLABXProjects/solar_panel/crc.c</file>
|
||||
<file>file:/C:/Users/remi/MPLABXProjects/solar_panel/mcc_generated_files/tmr0.c</file>
|
||||
</group>
|
||||
</open-files>
|
||||
</project-private>
|
||||
|
55
old_main.c
Normal file
55
old_main.c
Normal file
@ -0,0 +1,55 @@
|
||||
/************************************************************************//**
|
||||
* \file main.c
|
||||
* \brief Program main file for MODBUS controller
|
||||
***************************************************************************/
|
||||
|
||||
|
||||
#include <xc.h>
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "lcd/lcd.h"
|
||||
#include "pwm.h"
|
||||
#include "measure.h"
|
||||
#include "modbus.h"
|
||||
#include "uart.h"
|
||||
|
||||
#define _XTAL_FREQ 64000000L
|
||||
/**
|
||||
* Initialize clock, buttons, leds and interrupts
|
||||
*/
|
||||
void init_hw()
|
||||
{
|
||||
OSCCON3 = 0; // runs at 64MHz
|
||||
LCD_Init(LCD_2x16);
|
||||
adc_init();
|
||||
modbus_init(0x80);
|
||||
pwm_init();
|
||||
uart_init();
|
||||
// Interrupts configuration
|
||||
PEIE = 1;
|
||||
GIE = 1;
|
||||
}
|
||||
|
||||
uint8_t tmpStr[30];
|
||||
uint16_t u; ///< Voltage in milliovolts
|
||||
uint16_t i; ///< Current in microamperes
|
||||
uint16_t p; ///< Power in microwatts
|
||||
|
||||
uint16_t offset;
|
||||
uint16_t pwm = 512;
|
||||
|
||||
void main(void)
|
||||
{
|
||||
init_hw();
|
||||
|
||||
LCD_2x16_WriteMsg((unsigned char *)"Welcome ! ", 0); // display on line 0
|
||||
LCD_2x16_WriteMsg((unsigned char *)"*-*-*-*-*-*-*-*-", 1); // display on line 1
|
||||
|
||||
// TODO -> complete measure of current offset
|
||||
|
||||
while (true) {
|
||||
// TODO -> complete the main loop
|
||||
}
|
||||
}
|
@ -352,7 +352,7 @@
|
||||
</entry>
|
||||
<entry>
|
||||
<key class="com.microchip.mcc.core.tokenManager.RegisterKey" moduleName="ADC" registerAlias="ADCON2"/>
|
||||
<value>0</value>
|
||||
<value>128</value>
|
||||
</entry>
|
||||
<entry>
|
||||
<key class="com.microchip.mcc.core.tokenManager.RegisterKey" moduleName="ADC" registerAlias="ADRESH"/>
|
||||
@ -396,7 +396,7 @@
|
||||
</entry>
|
||||
<entry>
|
||||
<key class="com.microchip.mcc.core.tokenManager.SettingKey" moduleName="ADC" registerAlias="ADCON2" settingAlias="ADFM"/>
|
||||
<value>left</value>
|
||||
<value>right</value>
|
||||
</entry>
|
||||
<entry>
|
||||
<key class="com.microchip.mcc.core.tokenManager.SettingKey" moduleName="ADC" registerAlias="ADI" settingAlias="enable"/>
|
||||
|
7
uart.c
Normal file
7
uart.c
Normal file
@ -0,0 +1,7 @@
|
||||
#include "uart.h"
|
||||
|
||||
void uart_send(uint8_t *tx_buf, uint8_t length){
|
||||
for (uint8_t i = 0; i < length; i++){
|
||||
EUSART1_Write(tx_buf[i]);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user