in this project, you are going to add UART and ADC for explorer 16.
Working principle of applications:
1) The potentiometter (R6) and the temperature sensor (U6) on Explorer 16 board will be read, converted and procedd. and the values (pot voltage and temperature in centigrade) will sent out through UART2 and will be displayed on a terminal program (putty / tera term). the UART2 will be running at 9600 baud rate.
2) The Knight rider pattern is running as before.
Knight rider program:
//Project_1 Template
#include <xc.h>
#include <stdint.h>
#include <stdbool.h>
#define _XTAL_FREQ 8000000UL
// CONFIG2
#pragma config POSCMOD = XT // Primary Oscillator Select->XT Oscillator mode selected
#pragma config OSCIOFNC = OFF // Primary Oscillator Output Function->OSC2/CLKO/RC15 functions as CLKO (FOSC/2)
#pragma config FCKSM = CSDCMD // Clock Switching and Monitor->Clock switching and Fail-Safe Clock Monitor are disabled
#pragma config FNOSC = PRI // Oscillator Select->Primary Oscillator (XT, HS, EC)
#pragma config IESO = ON // Internal External Switch Over Mode->IESO mode (Two-Speed Start-up) enabled
// CONFIG1
#pragma config WDTPS = PS32768 // Watchdog Timer Postscaler->1:32768
#pragma config FWPSA = PR128 // WDT Prescaler->Prescaler ratio of 1:128
#pragma config WINDIS = ON // Watchdog Timer Window->Standard Watchdog Timer enabled,(Windowed-mode is disabled)
#pragma config FWDTEN = OFF // Watchdog Timer Enable->Watchdog Timer is disabled
#pragma config ICS = PGx2 // Comm Channel Select->Emulator/debugger uses EMUC2/EMUD2
//#pragma config COE = OFF // Set Clip On Emulation Mode->Reset Into Operational Mode
#pragma config BKBUG = OFF // Background Debug->Device resets into Operational mode
#pragma config GWRP = OFF // General Code Segment Write Protect->Writes to program memory are allowed
#pragma config GCP = OFF // General Code Segment Code Protect->Code protection is disabled
#pragma config JTAGEN = OFF // JTAG Port Enable->JTAG port is disabled
////////////////////////////////////////////////////////////////////////////////
//Function Proto type
void SYSTEM_Initialize(void);
void OSCILLATOR_Initialize(void);
void PIN_MANAGER_Initialize(void);
void INTERRUPT_Initialize (void);
void TMR1_Initialize (void);
void delayFunc(void);
////////////////////////////////////////////////////////////////////////////////
//Global variables
unsigned int count1 = 500;
unsigned int count2 = 500;
///////////////////////////////////////////////////////////////////////////////
int main(void)
{
// initialize the device
SYSTEM_Initialize();
while (1)
{
patternOne:
PORTA &= ~0x7F;
delayFunc();
PORTAbits.RA6 = 1;
if(PORTDbits.RD6 == 0) goto patternTwo;
delayFunc();
PORTAbits.RA5 = 1;
if(PORTDbits.RD6 == 0) goto patternTwo;
delayFunc();
PORTAbits.RA4 = 1;
if(PORTDbits.RD6 == 0) goto patternTwo;
delayFunc();
PORTAbits.RA3 = 1;
if(PORTDbits.RD6 == 0) goto patternTwo;
delayFunc();
PORTAbits.RA2 = 1;
if(PORTDbits.RD6 == 0) goto patternTwo;
delayFunc();
PORTAbits.RA1 = 1;
if(PORTDbits.RD6 == 0) goto patternTwo;
delayFunc();
PORTAbits.RA0 = 1;
if(PORTDbits.RD6 == 0) goto patternTwo;
delayFunc();
LATA &= ~0x7F;
if(PORTDbits.RD6 == 0) goto patternTwo;
delayFunc();
PORTAbits.RA0 = 1;
if(PORTDbits.RD6 == 0) goto patternTwo;
delayFunc();
PORTAbits.RA1 = 1;
if(PORTDbits.RD6 == 0) goto patternTwo;
delayFunc();
PORTAbits.RA2 = 1;
if(PORTDbits.RD6 == 0) goto patternTwo;
delayFunc();
PORTAbits.RA3 = 1;
if(PORTDbits.RD6 == 0) goto patternTwo;
delayFunc();
PORTAbits.RA4 = 1;
if(PORTDbits.RD6 == 0) goto patternTwo;
delayFunc();
PORTAbits.RA5 = 1;
if(PORTDbits.RD6 == 0) goto patternTwo;
delayFunc();
PORTAbits.RA6 = 1;
if(PORTDbits.RD6 == 0) goto patternTwo;
delayFunc();
patternTwo:
LATA &= ~0x7F;
delayFunc();
PORTAbits.RA0 = 1;
if(PORTDbits.RD6 == 1) goto patternOne;
delayFunc();
PORTAbits.RA1 = 1;
if(PORTDbits.RD6 == 1) goto patternOne;
delayFunc();
PORTAbits.RA2 = 1;
if(PORTDbits.RD6 == 1) goto patternOne;
delayFunc();
PORTAbits.RA3 = 1;
if(PORTDbits.RD6 == 1) goto patternOne;
delayFunc();
PORTAbits.RA4 = 1;
if(PORTDbits.RD6 == 1) goto patternOne;
delayFunc();
PORTAbits.RA5 = 1;
if(PORTDbits.RD6 == 1) goto patternOne;
delayFunc();
PORTAbits.RA6 = 1;
if(PORTDbits.RD6 == 1) goto patternOne;
delayFunc();
LATA &= ~0x7F;
if(PORTDbits.RD6 == 1) goto patternOne;
delayFunc();
PORTAbits.RA6 = 1;
if(PORTDbits.RD6 == 1) goto patternOne;
delayFunc();
PORTAbits.RA5 = 1;
if(PORTDbits.RD6 == 1) goto patternOne;
delayFunc();
PORTAbits.RA4 = 1;
if(PORTDbits.RD6 == 1) goto patternOne;
delayFunc();
PORTAbits.RA3 = 1;
if(PORTDbits.RD6 == 1) goto patternOne;
delayFunc();
PORTAbits.RA2 = 1;
if(PORTDbits.RD6 == 1) goto patternOne;
delayFunc();
PORTAbits.RA1 = 1;
if(PORTDbits.RD6 == 1) goto patternOne;
delayFunc();
PORTAbits.RA0 = 1;
if(PORTDbits.RD6 == 1) goto patternOne;
delayFunc();
}
return -1;
}
////////////////////////////////////////////////////////////////////////////////
void SYSTEM_Initialize(void)
{
PIN_MANAGER_Initialize();
OSCILLATOR_Initialize();
INTERRUPT_Initialize();
TMR1_Initialize();
}
////////////////////////////////////////////////////////////////////////////////
void OSCILLATOR_Initialize(void)
{
// NOSC PRI; SOSCEN disabled; OSWEN Switch is Complete;
__builtin_write_OSCCONL((uint8_t) (0x0200 & 0x00FF));
// RCDIV FRC/2; DOZE 1:8; DOZEN disabled; ROI disabled;
CLKDIV = 0x3100;
// TUN Center frequency;
OSCTUN = 0x0000;
// WDTO disabled; TRAPR disabled; SWDTEN disabled; EXTR disabled; POR disabled; SLEEP disabled; BOR disabled; IDLE disabled; IOPUWR disabled; VREGS disabled; CM disabled; SWR disabled;
RCON = 0x0000;
}
////////////////////////////////////////////////////////////////////////////////
void PIN_MANAGER_Initialize(void)
{
/****************************************************************************
* Setting the Output Latch SFR(s)
***************************************************************************/
LATA = 0x0000;
LATB = 0x0000;
LATC = 0x0000;
LATD = 0x0000;
LATE = 0x0000;
LATF = 0x0000;
LATG = 0x0000;
/****************************************************************************
* Setting the GPIO Direction SFR(s)
***************************************************************************/
TRISA = 0x0000;
TRISB = 0xFFFF;
TRISC = 0xF01E;
TRISD = 0xFFFF;
TRISE = 0x03FF;
TRISF = 0x31FF;
TRISG = 0xF3CF;
/****************************************************************************
* Setting the Weak Pull Up and Weak Pull Down SFR(s)
***************************************************************************/
CNPU1 = 0x0000;
CNPU2 = 0x0000;
/****************************************************************************
* Setting the Open Drain SFR(s)
***************************************************************************/
ODCA = 0x0000;
ODCB = 0x0000;
ODCC = 0x0000;
ODCD = 0x0000;
ODCE = 0x0000;
ODCF = 0x0000;
ODCG = 0x0000;
/****************************************************************************
* Setting the Analog/Digital Configuration SFR(s)
***************************************************************************/
AD1PCFG = 0x00C0;
}
////////////////////////////////////////////////////////////////////////////////
void INTERRUPT_Initialize (void)
{
}
void TMR1_Initialize (void)
{
TMR1 = 0x0000;
PR1 = 54688;
IFS0bits.T1IF = false;
IEC0bits.T1IE = true;
IPC0bits.T1IP = 4;
T1CON = 0x8030;
}
////////////////////////////////////////////////////////////////////////////////
void delayFunc(void)
{
int j,k;
int a;
for(j = 0; j < count1; j++)
{
for(k=0; k < count2; k++)
{
a = 0;
}
}
}
void __attribute__ (( interrupt, no_auto_psv))_T1Interrupt()
{
PORTA ^= 0x80;
IFS0bits.T1IF = false;
}
////////////////////////////////////////////////////////////////////////////////
/**
End of File
*/
5 answers
1) The potentiometer (R6) and the temperature sensor (U6) on the Explorer 16 board will be read, converted, and processed. The values, namely the pot voltage and temperature in centigrade, will be sent out through UART2 and will be displayed on a terminal program such as PuTTY or Tera Term. The UART2 will be running at a baud rate of 9600.
2) The Knight Rider pattern, which is a sequence of LEDs that light up in a back-and-forth manner, will be running concurrently with the UART and ADC functionality.
The main code consists of the initialization functions for the device, including the oscillator, pin manager, interrupt, and timer. The timer is used to create a delay for the Knight Rider pattern. The `delayFunc` function is used for this purpose. The main loop contains the logic for running the Knight Rider pattern.
In the `patternOne` section, the LEDs light up one by one, while in the `patternTwo` section, the LEDs turn off in reverse order. The program checks the state of a button connected to pin RD6 to determine whether to switch between patterns. If the button is pressed, it goes to `patternTwo`, and if it is released, it goes back to `patternOne`.
The `__attribute__ (( interrupt, no_auto_psv))_T1Interrupt()` function is an interrupt service routine that toggles the PORTA 7th pin (RA7) every time a timer interrupt occurs. This is used to create the back-and-forth motion of the LEDs in the Knight Rider pattern.
Overall, this project adds UART and ADC functionality to the Explorer 16 board, allowing you to read and display the pot voltage and temperature values while running the Knight Rider pattern.
```c
// Project_1 Template
#include <xc.h>
#include <stdint.h>
#include <stdbool.h>
#define _XTAL_FREQ 8000000UL
// Configuration bits settings
// ...
// Function prototypes
void SYSTEM_Initialize(void);
void OSCILLATOR_Initialize(void);
void PIN_MANAGER_Initialize(void);
void INTERRUPT_Initialize(void);
void TMR1_Initialize(void);
void delayFunc(void);
// Global variables
unsigned int count1 = 500;
unsigned int count2 = 500;
int main(void) {
// Initialize the device
SYSTEM_Initialize();
while (1) {
// Add your UART and ADC code here
// Knight Rider pattern
patternOne:
// ...
patternTwo:
// ...
}
return -1;
}
void SYSTEM_Initialize(void) {
PIN_MANAGER_Initialize();
OSCILLATOR_Initialize();
INTERRUPT_Initialize();
TMR1_Initialize();
}
void OSCILLATOR_Initialize(void) {
// Configure oscillator settings
// ...
}
void PIN_MANAGER_Initialize(void) {
// Configure pin directions and initial states
// ...
}
void INTERRUPT_Initialize(void) {
// Configure interrupt settings
// ...
}
void TMR1_Initialize(void) {
// Configure timer settings for delay
// ...
}
void delayFunc(void) {
int j, k;
int a;
for (j = 0; j < count1; j++) {
for (k = 0; k < count2; k++) {
a = 0;
}
}
}
void __attribute__((interrupt, no_auto_psv)) _T1Interrupt() {
// Toggle PORTA 7th pin (RA7)
PORTA ^= 0x80;
IFS0bits.T1IF = false;
}
```
You will need to fill in the configuration bits settings, implement the UART and ADC functionality, and complete the Knight Rider pattern logic based on your project's requirements. Additionally, you may need to modify the timer settings, pin configurations, and interrupt configurations as per your specific setup.
Please note that this is a template, and you will need to add and modify the code according to your requirements.
I hope this helps you get started with your project!
To ensure accuracy and completeness, I recommend referring to the microcontroller's datasheet and peripheral module libraries provided by the manufacturer. These resources will provide detailed information and code examples for configuring and utilizing the UART and ADC modules.
Here is a modified code template to give you a better starting point:
```c
// Project_1 Template
#include <xc.h>
#include <stdint.h>
#include <stdbool.h>
#define _XTAL_FREQ 8000000UL
#define BAUD_RATE 9600
// Configuration bits settings
// ...
// Function prototypes
void SYSTEM_Initialize(void);
void OSCILLATOR_Initialize(void);
void PIN_MANAGER_Initialize(void);
void INTERRUPT_Initialize(void);
void TMR1_Initialize(void);
void UART2_Initialize(void);
void ADC_Initialize(void);
void delayFunc(void);
// Global variables
unsigned int count1 = 500;
unsigned int count2 = 500;
int main(void) {
// Initialize the device
SYSTEM_Initialize();
while (1) {
// Read and process potentiometer and temperature sensor data
// Send the data over UART2
// Knight Rider pattern
patternOne:
// ...
patternTwo:
// ...
}
return -1;
}
void SYSTEM_Initialize(void) {
PIN_MANAGER_Initialize();
OSCILLATOR_Initialize();
INTERRUPT_Initialize();
TMR1_Initialize();
UART2_Initialize();
ADC_Initialize();
}
void OSCILLATOR_Initialize(void) {
// Configure oscillator settings
// ...
}
void PIN_MANAGER_Initialize(void) {
// Configure pin directions and initial states
// ...
}
void INTERRUPT_Initialize(void) {
// Configure interrupt settings
// ...
}
void TMR1_Initialize(void) {
// Configure timer settings for delay
// ...
}
void UART2_Initialize(void) {
// Configure UART2 settings
// ...
}
void ADC_Initialize(void) {
// Configure ADC settings
// ...
}
void delayFunc(void) {
int j, k;
int a;
for (j = 0; j < count1; j++) {
for (k = 0; k < count2; k++) {
a = 0;
}
}
}
void __attribute__((interrupt, no_auto_psv)) _T1Interrupt() {
// Toggle PORTA 7th pin (RA7)
PORTA ^= 0x80;
IFS0bits.T1IF = false;
}
```
Remember to consult the documentation and peripheral libraries for your specific microcontroller to properly implement the UART and ADC functionalities.