How do I extract the ASCII characters from a stream coming from an external chip using SCI Rx (PTB0) and put them in the data buffer?

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

How do I extract the ASCII characters from a stream coming from an external chip using SCI Rx (PTB0) and put them in the data buffer?

684 Views
brandondoucette
Contributor I

Our MCU is MC9S08QG8CFFE. The data sheet is at http://www.nxp.com/assets/documents/data/en/data-sheets/MC9S08QG8.pdf 

We are using CodeWarrior I.D.E v 5.9.0.

We are unable to get the ASCII characters into the data buffer.

Our code is:

/******************************************************************************
* Copyright (C) 2005 Freescale Semiconductor, Inc.
* All Rights Reserved
*
* Filename: DEMO9S08QG8_Test.c
* Author: r1aald
* Revision: 1.0
*
* Description: This is the test code that will reside in the QG8 demo
* to provide an out of the box experience. This simple code
* blinks LED2 and toggles LED1 when SW1 is pressed.
*
* Notes: Also serves as an example for the 9S08QG8 demo board.
* Created using CodeWarrior 5.0 for HC(S)08.
******************************************************************************/


#include <hidef.h> /* for EnableInterrupts macro */
#include "derivative.h" /* include peripheral declarations */
#include "demo9S08QG8.h" /*include demo board declarations */


void InitPorts()
{
// Enable pull-ups on all input pins
//PTAPE = 0xFF;
//PTBPE = 0xFF;

PTAD = 0b00010000;
PTBD = 0b00001011;
PTADD = 0b11011111;
PTBDD = 0b11111010;

SCIBDH = 0b00000000;
SCIBDL = 0x33;
SCIC1 = 0b00000000;
SCIC2 = 0b00101100;
//SCIS1 = 0b00000000;
SCIS2 = 0b00000000;
SCIC3 = 0b00000000;
SCID = 0b00000000;

} //end InitPorts



char RecChar()
{
byte rec_char;

if (SCIS1_RDRF) // 1st half of RDRF clear procedure
rec_char = SCID; // 2nd half of RDRF clear procedure

SCIC2_RE = 1; // enable Rx

while(!SCIS1_RDRF)
{
__RESET_WATCHDOG();
};

rec_char = SCID; // get recieved character
//SendChar(rec_char); // echo received character

return SCID;
}



void main(void)
{
byte rec_char;

DisableInterrupts;

asm
{
rsp
};

InitPorts();
SOPT1 = 0b11100011; // b7 COP enabled, long timeout, stop mode enabled pta4 is output

//***
// I think something needs to be cleared before data will be sent
// not sure what though
//***
if (SCIS1_RDRF) // 1st half of RDRF clear procedure
{
rec_char = SCID; // 2nd half of RDRF clear procedure
}

SCIC2_RE = 1; // enable Rx
SCIC2_ILIE = 1; // enable receiver interrupt

EnableInterrupts; /* enable interrupts */



//***
// this is all stuff for the LED demo I'm leaving in here
//***
// ICSC2_BDIV = 3;
// LED1 =0;
// LED2 =0; /* Port B7 is connected to LED 2 */

//PTBDD_PTBDD7 = 1; /* Set PTB7 as an output */
//PTBDD_PTBDD6 = 1;

/** mtim_setup */
//MTIMCLK_PS = 8;
//MTIMCLK_CLKS = 0;
//MTIMMOD = 112;

//MTIMMOD = 0; /* modulo = 50 */
//MTIMSC = 0x60; /* reset and start MTIM, enable ints */

/** KBI Set Up foe SW1 */
//KBIPE_KBIPE2 =1; /* Enable Keyboard Pin */
//KBISC_KBIE = 1; /* Enable Keyboard Interrupts */
//KBISC_KBACK = 1; /* Clear Pending Keyboard Interrupts */
//PTAPE_PTAPE2 = 1; /* Enable Pullup for Keyboard pin */


for(;;)
{
__RESET_WATCHDOG(); /* feeds the dog */
} /* loop forever */
}

/** KBI ISR */

//interrupt 18 void KBI_ISR(void)
//{
// KBISC_KBACK = 1; /* Clear Pending Keyboard Interrupts */
// LED1 = ~LED1; /* toggle Port */
//}


/** MTIM_ISR - ISR that accompanies the MTIM PWM routine. */
//interrupt 12 void MTIM_ISR(void) {
// MTIMSC_TOF=0; /* clear TOF */
// LED2 = ~LED2; /* toggle Port */
//}


interrupt VectorNumber_Vscirx void VSCIRX_ISR(void)
{
//***
// I'm not really doing anything here... I just needed a place to put a breakpoint
// to see if it ever enters this interrupt function
//***
char input;
RecChar();
}

0 Kudos
1 Reply

479 Views
Bert2
Contributor II

//**************** SCI1 receiver interrupt **********************************
__interrupt void isrVsci1rx(void){ //SCI
while(!SCI1S1_RDRF);
sci_rx_buffer[sci_i]=SCI1D;
SCI1S2_RXEDGIF=0x1;
if((sci_i>0) && (sci_rx_buffer[sci_i]==0x00)){
buildCommandQueue();
sci_i=0;
memset(sci_rx_buffer,0,SCI_RX_BUFFLENGTH);
executeCommandQueue();
}
else sci_i++;
}

/***************************************************************************
**************** Initialize the SCIs ***************************************
***************************************************************************/
void initSci(void){
SCI1BDL = 0x34; //19200 baud @ 16MHz BusClk
SCI1BDH = 0x00;
SCI1C1 = 0x00;
SCI1C2 = 0x2C;
SCI1C3 = 0x00;
}

maybe that helps...

0 Kudos