AnsweredAssumed Answered

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?

Question asked by Brandon Doucette on Mar 18, 2017
Latest reply on Mar 23, 2017 by Bert Gerlach

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();
}

Outcomes