This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

CCS: SCI : Receiving Data From Arduino Uno

Other Parts Discussed in Thread: C2000WARE

Tool/software: Code Composer Studio

Hi.
I will send char data from arduino uno using keypad, For example, I send data 15, I want to make an arithmetic program on TI where TI receives the data and share it with 5. I hope the data that appears on PuTTY is 3 (because 15/5) .

What I want to achieve is the number or data that has been received will control the output, such as speed, angle, etc. But, first I want the data sent by Arduino to be calculated on TI and TI can display the results in PuTTY. I use Example code: sci_echoback.

I use the default program and I want to ask which one I need to change to get what I mean as above?

here my ccs code :

//###########################################################################
//
// FILE: Example_2806xScia_Echoback.c
//
// TITLE: SCI Echo Back Example
//
//! \addtogroup f2806x_example_list
//! <h1>SCI Echo Back(sci_echoback)</h1>
//!
//! This test receives and echo-backs data through the SCI-A port.
//!
//! The PC application 'hypterterminal' can be used to view the data
//! from the SCI and to send information to the SCI. Characters received
//! by the SCI port are sent back to the host.
//!
//! \b Running \b the \b Application
//! -# Configure hyperterminal:
//! Use the included hyperterminal configuration file SCI_96.ht.
//! To load this configuration in hyperterminal
//! -# Open hyperterminal
//! -# Go to file->open
//! -# Browse to the location of the project and
//! select the SCI_96.ht file.
//! -# Check the COM port.
//! The configuration file is currently setup for COM1.
//! If this is not correct, disconnect (Call->Disconnect)
//! Open the File-Properties dialog and select the correct COM port.
//! -# Connect hyperterminal Call->Call
//! and then start the 2806x SCI echoback program execution.
//! -# The program will print out a greeting and then ask you to
//! enter a character which it will echo back to hyperterminal.
//!
//! \note If you are unable to open the .ht file, you can create
//! a new one with the following settings
//! - Find correct COM port
//! - Bits per second = 9600
//! - Date Bits = 8
//! - Parity = None
//! - Stop Bits = 1
//! - Hardware Control = None
//!
//! \b Watch \b Variables \n
//! - \b LoopCount, for the number of characters sent
//! - ErrorCount
//!
//! \b External \b Connections \n
//! Connect the SCI-A port to a PC via a transceiver and cable.
//! - GPIO28 is SCI_A-RXD (Connect to Pin3, PC-TX, of serial DB9 cable)
//! - GPIO29 is SCI_A-TXD (Connect to Pin2, PC-RX, of serial DB9 cable)
//
//###########################################################################
// $TI Release: F2806x Support Library v2.04.00.00 $
// $Release Date: Tue Jun 26 03:13:59 CDT 2018 $
// $Copyright:
// Copyright (C) 2009-2018 Texas Instruments Incorporated - http://www.ti.com/
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
//
// Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//
// Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the
// distribution.
//
// Neither the name of Texas Instruments Incorporated nor the names of
// its contributors may be used to endorse or promote products derived
// from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// $
//###########################################################################

//
// Included Files
//
#include "DSP28x_Project.h" // Device Headerfile and Examples Include File

//
// Function Prototypes
//
void scia_echoback_init(void);
void scia_fifo_init(void);
void scia_xmit(int a);
void scia_msg(char *msg);

//
// Globals
//
Uint16 LoopCount;
Uint16 ErrorCount;
Uint16 ReceivedChar;

//
// Main
//
void main(void)
{

char *msg;

//
// Step 1. Initialize System Control:
// PLL, WatchDog, enable Peripheral Clocks
// This example function is found in the F2806x_SysCtrl.c file.
//
InitSysCtrl();

//
// Step 2. Initalize GPIO:
// This example function is found in the F2806x_Gpio.c file and
// illustrates how to set the GPIO to its default state.
//
//InitGpio(); Skipped for this example

//
// For this example, only init the pins for the SCI-A port.
// This function is found in the F2806x_Sci.c file.
//
InitSciaGpio();

//
// Step 3. Clear all interrupts and initialize PIE vector table:
// Disable CPU interrupts
//
DINT;

//
// Initialize PIE control registers to their default state.
// The default state is all PIE interrupts disabled and flags
// are cleared.
// This function is found in the F2806x_PieCtrl.c file.
//
InitPieCtrl();

//
// Disable CPU interrupts and clear all CPU interrupt flags
//
IER = 0x0000;
IFR = 0x0000;

//
// Initialize the PIE vector table with pointers to the shell Interrupt
// Service Routines (ISR).
// This will populate the entire table, even if the interrupt
// is not used in this example. This is useful for debug purposes.
// The shell ISR routines are found in F2806x_DefaultIsr.c.
// This function is found in F2806x_PieVect.c.
//
InitPieVectTable();

//
// Step 4. Initialize all the Device Peripherals:
// This function is found in F2806x_InitPeripherals.c
//
//InitPeripherals(); // Not required for this example

//
// Step 5. User specific code
//
LoopCount = 0;
ErrorCount = 0;

scia_fifo_init(); // Initialize the SCI FIFO
scia_echoback_init(); // Initalize SCI for echoback

msg = "\r\n\n\nHello World!\0";
scia_msg(msg);

msg = "\r\nYou will enter a character, and the DSP will echo it back! \n\0";
scia_msg(msg);

for(;;)
{
msg = "\r\nEnter a character : \0";
scia_msg(msg);

//
// Wait for inc character
//
while(SciaRegs.SCIFFRX.bit.RXFFST ==0 )
{
//
// wait for XRDY =1 for empty state
//
}

//
// Get character
//
ReceivedChar = SciaRegs.SCIRXBUF.all;

//
// Echo character back
//
msg = " Data A': \0";
scia_msg(msg);
scia_xmit(ReceivedChar);

LoopCount++;
}
}

//
// scia_echoback_init - Test 1,SCIA DLB, 8-bit word, baud rate 0x0103,
// default, 1 STOP bit, no parity
//
void
scia_echoback_init()
{
//
// Note: Clocks were turned on to the SCIA peripheral
// in the InitSysCtrl() function
//

//
// 1 stop bit, No loopback, No parity,8 char bits, async mode,
// idle-line protocol
//
SciaRegs.SCICCR.all =0x0007;

//
// enable TX, RX, internal SCICLK, Disable RX ERR, SLEEP, TXWAKE
//
SciaRegs.SCICTL1.all =0x0003;

SciaRegs.SCICTL2.bit.TXINTENA = 1;
SciaRegs.SCICTL2.bit.RXBKINTENA = 1;

//
// 9600 baud @LSPCLK = 22.5MHz (90 MHz SYSCLK)
//
SciaRegs.SCIHBAUD =0x0001;
SciaRegs.SCILBAUD =0x0024;

SciaRegs.SCICTL1.all =0x0023; // Relinquish SCI from Reset
}

//
// scia_xmit - Transmit a character from the SCI
//
void
scia_xmit(int a)
{
while (SciaRegs.SCIFFTX.bit.TXFFST ==1 )
{

}
SciaRegs.SCITXBUF = a;
}

//
// scia_msg -
//
void
scia_msg(char * msg)
{
int i;
i = 0;

while (msg[i] != '\0')
{
scia_xmit(msg[i]/5);
i++;
}

}

//
// scia_fifo_init - Initalize the SCI FIFO
//

void
scia_fifo_init()
{
SciaRegs.SCIFFTX.all=0xE040;
SciaRegs.SCIFFRX.all=0x2044;
SciaRegs.SCIFFCT.all=0x0;
}

void
Scia_gpio()
{
#if DSP28_SCIA
InitSciaGpio();
#endif // endif DSP28_SCIA

EALLOW;

/* Enable internal pull-up for the selected pins */
// Pull-ups can be enabled or disabled disabled by the user.
// This will enable the pullups for the specified pins.

GpioCtrlRegs.GPAPUD.bit.GPIO28 = 0; // Enable pull-up for GPIO28 (SCIRXDA)
// GpioCtrlRegs.GPAPUD.bit.GPIO7 = 0; // Enable pull-up for GPIO7 (SCIRXDA)

GpioCtrlRegs.GPAPUD.bit.GPIO29 = 0; // Enable pull-up for GPIO29 (SCITXDA)
// GpioCtrlRegs.GPAPUD.bit.GPIO12 = 0; // Enable pull-up for GPIO12 (SCITXDA)

/* Set qualification for selected pins to asynch only */
// Inputs are synchronized to SYSCLKOUT by default.
// This will select asynch (no qualification) for the selected pins.

GpioCtrlRegs.GPAQSEL2.bit.GPIO28 = 3; // Asynch input GPIO28 (SCIRXDA)
// GpioCtrlRegs.GPAQSEL1.bit.GPIO7 = 3; // Asynch input GPIO7 (SCIRXDA)

/* Configure SCI-A pins using GPIO regs*/
// This specifies which of the possible GPIO pins will be SCI functional pins.

GpioCtrlRegs.GPAMUX2.bit.GPIO28 = 1; // Configure GPIO28 for SCIRXDA operation
// GpioCtrlRegs.GPAMUX1.bit.GPIO7 = 2; // Configure GPIO7 for SCIRXDA operation

GpioCtrlRegs.GPAMUX2.bit.GPIO29 = 1; // Configure GPIO29 for SCITXDA operation
// GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 2; // Configure GPIO12 for SCITXDA operation

EDIS;
}

//#endif
//===========================================================================
// No more.
//===========================================================================


//
// End of File
//

and this below is my Arduino program :

#include <Keypad.h>
#include <LiquidCrystal.h>
#include <Wire.h>


const byte ROWS = 4;
const byte COLS = 4;

char keys[ROWS][COLS] =
{
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};

byte rowPins[ROWS] = {A2,A3,A4,A5}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {11,10,9,8}; //connect to the column pinouts of the keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

String textFromSerial = "";
boolean stringComplete = false ; // whether the string is complete

const int maxDigits = 6;
char UL[6];
int k=0;
long dtKey;
char key;
int a = ('0'-48);

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd (2,3,4,5,6,7);

void (* resetki) (void)=0; //---------------------PROG RESET-------------------------------------

void setup()
{
Serial.begin(9600);
// set up the LCD's number of columns and rows:
lcd.begin(16,2);

// set the cursor to column 0, line 0
// (note: line 0 is the first row, since counting begins with 0):
displayMenu();
}

void displayMenu()
{
lcd.setCursor(0, 0);
lcd.print("'COR'-Enter Data");
lcd.setCursor(0, 1);
lcd.print("'CAN'-Reset");
}

void serialEvent() //------------------------------------BACA DATA SERIAL ------------------------------------
{
while (Serial.available()>0)
{
lcd.clear();
key = keypad.getKey();
// get the new byte:
char data = Serial.read () ;
// add it to the textFromSerial:
if (data== '\n')
{
lcd.setCursor(0,0);
lcd.print("Data A : ");
//lcd.print(key);
//Serial.print(key);

lcd.setCursor(0,1);
lcd.print("Data A': ");
lcd.print(textFromSerial);
//textFromSerial = "";
}
else
{
if(data!='\r')
{
textFromSerial += data;
}
}
}
}

/*
void baca()
{

dtKey = dtKey*10+key;
dtKey = analogRead(key)/4;
EEPROM.write(addr, dtKey);

address = addr;
value = EEPROM.read(address);

Serial.print("Data A : ");
Serial.print("\t");
Serial.print(value);
Serial.println();

address = address + 1;
if (address == 512)
address=0;

addr = addr+1;
if (addr == 512);
addr = 0;

delay(500);
}
*/

void enter () //---------------------------------ENTER---------------------------------------------
{
key = keypad.getKey();
dtKey = dtKey*10+(key-a);
String send_data;
send_data = String (dtKey);
//Serial.print("Data A : ");
// Serial.print("\t");
Serial.print(send_data);
Serial.print("\t");
Serial.println();
//Serial.print("Data A': ");
//Serial.print("\t");
Serial.print(textFromSerial);
//Serial.println();
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" Data Sent ");
delay(3000);
resetki();
}

int GetNumber() //-----------------------GET NUMBER-------------------------------------
{
key = keypad.getKey();
switch(key)
{
case 'A': // ----------------------INPUT DATA------------------------------
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Data A : ");
lcd.setCursor(0, 1);
lcd.print("Data A': ");
lcd.setCursor(9, 0);
while (k<6)
{
key = keypad.getKey();
if (key)
{
// Print a message to the LCD.
dtKey = dtKey * 10 + (key - '0');
lcd.print(key);
UL[k] = key;
k++;
}
}
break;


case 'C': //--------------------------CLEAR DATA---------------------------------------------
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Data A : ");
lcd.setCursor(9, 0);
lcd.setCursor(0, 1);
lcd.print("Data A': ");

while (k=0)
{
//char key = keypad.getKey();
if (key)
{
lcd.print(0x7f);
UL[k] = 0;
k--;
}
break;

case '*':
resetki(); //------------------------------RESET--------------------------------------------
break;

case 'D':
dtKey=0;
break;


case 'B':
displayMenu();//---------------------------MENU-------------------------------------------
break;

case '#':
enter(); //--------------------------------ENTER-------------------------------------------
break;
}
}
}

void loop() //---------------------------- VOID LOOP -------------------------------------
{
GetNumber();
serialEvent();
}

I have tried my best but still haven't got the solution. So, I really hope for friends and experts to share a bit of your knowledge. Please guide me.

Regards

Amir

  • Amir,

    What you need to do is configure the SCI to receive the data/characters, and then trigger an ISR to perform the calculations on the data. Finally, the SCI will be used to send the data. To learn more about using interrupts with the SCI, please see the scia_loopback_interrupts example in C2000Ware.

    In general, we do not write, review, or debug user code, but we will provide assistance to you with specific issues relating to our devices and development tools. This includes clarifying the behavior of any bit, register, or features when designing with our devices. Please note that all peripherals have example code in C2000Ware. We suggest comparing your code to the example code as a guide or for determining where a problem may exist. It is recommended to follow standard and logical debugging techniques. Please continue to work on and debug your code and feel free to use this forum to ask specific questions. The more specific the question, the better we can assist you.

    I hope this helps. If this answers your question, please click the green "Verified Answer" button. Thanks.

    - Ken
  • Please use the code facility to post your code.

    What is this:
    scia_xmit(msg[i]/5);

    supposed to do? You take an ascii character (for example, the character '5' is decimal 53, and then divide it by 5, which yields the decimal 10, which is a line feed, '\n'.

    You need to convert the ascii characters to numbers, do the math, and then reconvert to characters.

    Hint: '5' - '0' is a C idiom that yields decimal 5.

    Good luck with your homework!
  • Example_2806xSci_Echoback.c
    Fullscreen
    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
    //###########################################################################
    //
    // FILE: Example_2806xScia_Echoback.c
    //
    // TITLE: SCI Echo Back Example
    //
    //! \addtogroup f2806x_example_list
    //! <h1>SCI Echo Back(sci_echoback)</h1>
    //!
    //! This test receives and echo-backs data through the SCI-A port.
    //!
    //! The PC application 'hypterterminal' can be used to view the data
    //! from the SCI and to send information to the SCI. Characters received
    //! by the SCI port are sent back to the host.
    //!
    //! \b Running \b the \b Application
    //! -# Configure hyperterminal:
    //! Use the included hyperterminal configuration file SCI_96.ht.
    //! To load this configuration in hyperterminal
    //! -# Open hyperterminal
    //! -# Go to file->open
    //! -# Browse to the location of the project and
    //! select the SCI_96.ht file.
    //! -# Check the COM port.
    //! The configuration file is currently setup for COM1.
    //! If this is not correct, disconnect (Call->Disconnect)
    //! Open the File-Properties dialog and select the correct COM port.
    //! -# Connect hyperterminal Call->Call
    //! and then start the 2806x SCI echoback program execution.
    //! -# The program will print out a greeting and then ask you to
    //! enter a character which it will echo back to hyperterminal.
    //!
    //! \note If you are unable to open the .ht file, you can create
    //! a new one with the following settings
    //! - Find correct COM port
    //! - Bits per second = 9600
    //! - Date Bits = 8
    //! - Parity = None
    //! - Stop Bits = 1
    //! - Hardware Control = None
    //!
    //! \b Watch \b Variables \n
    //! - \b LoopCount, for the number of characters sent
    //! - ErrorCount
    //!
    //! \b External \b Connections \n
    //! Connect the SCI-A port to a PC via a transceiver and cable.
    //! - GPIO28 is SCI_A-RXD (Connect to Pin3, PC-TX, of serial DB9 cable)
    //! - GPIO29 is SCI_A-TXD (Connect to Pin2, PC-RX, of serial DB9 cable)
    //
    //###########################################################################
    // $TI Release: F2806x Support Library v2.04.00.00 $
    // $Release Date: Tue Jun 26 03:13:59 CDT 2018 $
    // $Copyright:
    // Copyright (C) 2009-2018 Texas Instruments Incorporated - http://www.ti.com/
    //
    // Redistribution and use in source and binary forms, with or without
    // modification, are permitted provided that the following conditions
    // are met:
    //
    // Redistributions of source code must retain the above copyright
    // notice, this list of conditions and the following disclaimer.
    //
    // Redistributions in binary form must reproduce the above copyright
    // notice, this list of conditions and the following disclaimer in the
    // documentation and/or other materials provided with the
    // distribution.
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

  • No, I meant when you are creating a post, hit the "Insert Code, Attach Files and more" link and that has a facility to insert code. In any case, did you understand my suggestion?
  • yes, i did....

    So,

    Sir Barkley, i want to multiply  the data from arduino by 2. I already try. But, it didn't work. If i don't multiply it, it is going well (i input data from arduino '2222' and hyperterminal show the same data). But if i multiply the data by 2, the hyperterminal shows 'dddd'. maybe it was coming from d=100, 100 from 50*2 and i gues 50 is the decimal from 2 ascii.

    i want hyperterminal shows '4444' if i multiply '2222' by 2.

    Down below is my code that i already captured.

    Do you know something, Sir?

    Regards,

    Amir

  • Again, You need to convert the chars '2222' into an integer, multiply that by 2 and convert that integer into a char, sprintf() would be easiest.

    for example ('2' - '0')*1000 + ('2'-'0')*100+('2'-'0')*10+('2' - '0')
  • Amirullah,

    It's been a while since we have heard from you last. Therefore, we are assuming you were able to resolve your issue. If this isn’t the case, please reject this resolution or reply to this thread. If this thread locks, please make a new thread describing the current status of your issue. Thank you.

    - Ken