<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>S12 / MagniV MicrocontrollersのトピックRe: Help needed with SCI interrupt function</title>
    <link>https://community.nxp.com/t5/S12-MagniV-Microcontrollers/Help-needed-with-SCI-interrupt-function/m-p/138473#M2758</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;This seems problematic to me:&lt;BR /&gt;&lt;DIV&gt;&lt;DIV class="msg_source_code"&gt;&lt;DIV class="text_smallest"&gt;Code:&lt;/DIV&gt;&lt;PRE&gt;#pragma CODE_SEG BANKEDinterrupt void SCI1Interrupt (void){SCI1_isr_handler();}#pragma CODE_SEG DEFAULT&lt;/PRE&gt;&lt;/DIV&gt;&lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;&lt;/DIV&gt;The ISR will not like being in a banked segment, though I don't know if this is the problem you are seeing.&lt;BR /&gt;&lt;BR /&gt;* I also do not see where you are enabling masked interrupts. The instruction that does it is 'cli', but I don't know if that is in some obsure macro or function in your code. If you use a debugger, finding these details would be real easy.&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;Message Edited by imajeff on &lt;SPAN class="date_text"&gt;2007-06-27&lt;/SPAN&gt; &lt;SPAN class="time_text"&gt;11:06 AM&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Wed, 27 Jun 2007 23:51:51 GMT</pubDate>
    <dc:creator>imajeff</dc:creator>
    <dc:date>2007-06-27T23:51:51Z</dc:date>
    <item>
      <title>Help needed with SCI interrupt function</title>
      <link>https://community.nxp.com/t5/S12-MagniV-Microcontrollers/Help-needed-with-SCI-interrupt-function/m-p/138472#M2757</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;Hello.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;I'm writing a program for an NE64 board, which reads a series of data over the SCI1 port, and then transmits them over the Ethernet port.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Pretty much it's done and works, but due to the amount of data collected on every reading, I have to send out 10-15 packets every time.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;When the function for UDP transmission is executed, some of the data received on the serial port are skipped and lost.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;I understand that in order to overcome this I need to implement an Interrupt function for the SCI1 port.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;I've tried this, but my code gets stuck in an infinite loop when the SCI reading in functions takes place ( SCI1in(); ).&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN style="text-decoration: underline;"&gt;main.c&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;//***********************************&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#include "RXFIFO.H"&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#include "sci.h"&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#include "MC9S12NE64.h"&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;//...and all other required files/libraries&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;extern void SCI1_isr_handler (void);&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;#pragma CODE_SEG BANKED&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;interrupt void SCI1Interrupt (void)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;SCI1_isr_handler();&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#pragma CODE_SEG DEFAULT&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;....&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN style="text-decoration: underline;"&gt;RxFifo.c&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;//************************************&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#include "RxFifo.h"&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;/* Number of characters in the Fifo&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;the FIFO is full when it has FifoSize-1 characters */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;char static volatile *RxPutPt; /* Pointer of where to put next */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;char static volatile *RxGetPt; /* Pointer of where to get next */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;/* FIFO is empty if PutPt=GetPt */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;/* FIFO is full if PutPt+1=GetPt */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;char static RxFifo[RXFIFOSIZE]; /* The statically allocated fifo data */&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;/*----------RxFifo_Init&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Initialize fifo to be empty&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Inputs: none&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Outputs: none */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;void RxFifo_Init(void){unsigned char SaveCCR;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;/* save previous interrupt enable */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;asm tpa&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;asm staa SaveCCR&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;asm sei /* make atomic */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;RxPutPt=RxGetPt=&amp;amp;RxFifo[0]; /* Empty when PutPt=GetPt */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;asm ldaa SaveCCR&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;asm tap /* end critical section */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;/*---------RxFifo_Put&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Enter one character into the fifo&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Inputs: 8-bit data&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Outputs: true if data is properly saved&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Since this is called by interrupt handlers no sei,cli*/&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;int RxFifo_Put(char data){&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;char volatile *tempPt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;tempPt = RxPutPt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;*(tempPt) = data; /* try to Put data into fifo */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;tempPt++;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;if(tempPt == &amp;amp;RxFifo[RXFIFOSIZE]){ /* need to wrap?*/&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;tempPt = &amp;amp;RxFifo[0];&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;if(tempPt == RxGetPt){&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;return(0); /* Failed, fifo was full */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;else{&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;RxPutPt = tempPt; /* Success, so update pointer */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;return(1);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;/*-----------------------RxFifo_Get----------------------------&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Remove one character from the fifo&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Inputs: pointer to place to save 8-bit data&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Outputs: true if data is valid */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;int RxFifo_Get(char *datapt){&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;if(RxPutPt == RxGetPt){&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;return(0); /* Empty if PutPt=GetPt */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;else{&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;*datapt = *(RxGetPt);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;RxGetPt++;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;if(RxGetPt == &amp;amp;RxFifo[RXFIFOSIZE]){&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;RxGetPt = &amp;amp;RxFifo[0];&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;return(1);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN style="text-decoration: underline;"&gt;sci.c&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;//************************************&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#include&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#include "ne64debug.h"&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#include "MC9S12NE64.h"&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#include "sci.h"&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#include "RXFIFO.H"&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;unsigned short RxHistogram[RXFIFOSIZE]; // collected before put&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;void SCI1Init(void){&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;//Debugt("Initializing my SCI1 function\r\n");&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define ECLK 25000000 // this is BUSCLK&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define BAUD_RATE 9600&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;PTG_PTG2 = 0;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#define BAUD_DIV ECLK/16/BAUD_RATE&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;SCI1BD= BAUD_DIV;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;SCI1CR1= 0;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;SCI1CR2= SCI1CR2_TE_MASK | SCI1CR2_RE_MASK | SCI1CR2_RIE;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;RxFifo_Init();&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;asm cli&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;//------SCI1 interrupt handler&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;interrupt void SCI1_isr_handler(void){&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;if(SCI1SR1 &amp;amp; SCI1SR1_RDRF_MASK){&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;RxHistogram[RxFifo_Size()]++;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;RxFifo_Put(SCI1DRL); // clears RDRF&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;//-----Start of SCI1In&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;// Wait for new serial port input, return ASCII code for key typed&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;char SCI1In(void){&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;char letter;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;while (RxFifo_Get(&amp;amp;letter) == 0){&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;PTG_PTG0 = 0; // &lt;/SPAN&gt;&lt;SPAN style="color: #FF0000; font-family: 'Times New Roman'; font-size: +2;"&gt;Where my code stucks&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;};&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;PTG_PTG0 = 1;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;return(letter);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;My program is based on the Freescale's Connector_App, so similar initilizations take place.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;I'm new at this, and I had a really hard time finding information and examples using SCI Rx interrupts. Can somebody indicate me what i'm doing wrong please?&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Your help will be trully appreciated.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Thank you&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 27 Jun 2007 22:41:06 GMT</pubDate>
      <guid>https://community.nxp.com/t5/S12-MagniV-Microcontrollers/Help-needed-with-SCI-interrupt-function/m-p/138472#M2757</guid>
      <dc:creator>Ryu</dc:creator>
      <dc:date>2007-06-27T22:41:06Z</dc:date>
    </item>
    <item>
      <title>Re: Help needed with SCI interrupt function</title>
      <link>https://community.nxp.com/t5/S12-MagniV-Microcontrollers/Help-needed-with-SCI-interrupt-function/m-p/138473#M2758</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;This seems problematic to me:&lt;BR /&gt;&lt;DIV&gt;&lt;DIV class="msg_source_code"&gt;&lt;DIV class="text_smallest"&gt;Code:&lt;/DIV&gt;&lt;PRE&gt;#pragma CODE_SEG BANKEDinterrupt void SCI1Interrupt (void){SCI1_isr_handler();}#pragma CODE_SEG DEFAULT&lt;/PRE&gt;&lt;/DIV&gt;&lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;&lt;/DIV&gt;The ISR will not like being in a banked segment, though I don't know if this is the problem you are seeing.&lt;BR /&gt;&lt;BR /&gt;* I also do not see where you are enabling masked interrupts. The instruction that does it is 'cli', but I don't know if that is in some obsure macro or function in your code. If you use a debugger, finding these details would be real easy.&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;Message Edited by imajeff on &lt;SPAN class="date_text"&gt;2007-06-27&lt;/SPAN&gt; &lt;SPAN class="time_text"&gt;11:06 AM&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 27 Jun 2007 23:51:51 GMT</pubDate>
      <guid>https://community.nxp.com/t5/S12-MagniV-Microcontrollers/Help-needed-with-SCI-interrupt-function/m-p/138473#M2758</guid>
      <dc:creator>imajeff</dc:creator>
      <dc:date>2007-06-27T23:51:51Z</dc:date>
    </item>
  </channel>
</rss>

