My first DT_INT code has a problem.....

Closed Thread
Results 1 to 3 of 3
  1. #1
    Join Date
    Apr 2009

    Default My first DT_INT code has a problem.....

    This is my first attempt at using a USART with DT's INT's and I ran into a problem that I can't figure out. I was using my LCD for debugging and everything was working fine until I remmed out the LCDOUT line. Now it turns the received characters into garbage. If I put back the LCDOUT line the received characters are fine.
    Can anyone explain to me why it does this, I must be doing something fundamentally wrong.
    Ed Kizer

    <font color="#000080"><i>'DEVICE 16F882
    </i></font><font color="#008000">@ __config _CONFIG1, _HS_OSC &amp; _WDT_ON &amp; _MCLRE_ON &amp; _LVP_OFF &amp; _CP_OFF
    </font><b>DEFINE </b>OSC 16
    <b>DEFINE </b>LCD_EREG PORTC <font color="#000080"><i>' SET ENABLE PORT
    </i></font><b>DEFINE </b>LCD_EBIT 3 <font color="#000080"><i>' SET ENABLE BIT
    </i></font>OPTION_REG.7=0      <font color="#000080"><i>' TURN ON PORTB WEAK PULL-UPS
    </i></font>ANSELH=0       <font color="#000080"><i>'  DISABLE PORT B ANALOG, ENABLE DIGITAL I/O
    </i></font>CM1CON0=0     <font color="#000080"><i>' TURN OFF COMPARATORS PORTA(1)
    </i></font>CM2CON0=0        <font color="#000080"><i>' TURN OFF COMPARTORS PORTB(2)
    </i></font>VRCON=0          <font color="#000080"><i>' A/D Voltage reference disabled
    </i></font>ANSEL=0           <font color="#000080"><i>' TURN OFF PORT A A/D, ENABLE DIGITAL I/O
    </i></font>TRISA=0 <font color="#000080"><i>'set portA to OUTPUTS
    </i></font>TRISB=$FF <font color="#000080"><i>' set port b TO ALL INPUTS  %11111111
    </i></font>TRISC=$80  <font color="#000080"><i>' SET PORT C BIT 7 TO INPUT  %10000000
     '******************* USE MPASM TO ASSEMBLE **************
    </i></font><b>INCLUDE </b><font color="#FF0000">&quot;DT_INTS-14.bas&quot;     </font><font color="#000080"><i>; Base Interrupt System
    </i></font><b>INCLUDE </b><font color="#FF0000">&quot;ReEnterPBP.bas&quot;     </font><font color="#000080"><i>; Include if using PBP interrupts
    </b><font color="#008000">INT_LIST  macro    </font><font color="#000080"><i>; IntSource,   Label,  Type, ResetFlag?
            </i></font><font color="#008000">INT_Handler    RX_INT,  _ISR,   PBP,  yes
        INT_CREATE               </font><font color="#000080"><i>; Creates the interrupt processor
    </b><font color="#008000">@   INT_ENABLE   RX_INT     </font><font color="#000080"><i>; enable EUSART (INT) interrupts
    '*************** DT's BAUD SETUP ROUTINE *************************
    </b><font color="#008000">USART_Init  macro  Baud
        CHK?RP  TXSTA
        clrf    TXSTA
    _SPBRG = (OSC * 1000000) / 16 / Baud - 1     </font><font color="#000080"><i>; calc SPBRG @ High baud rate
        </i></font><font color="#008000">if _SPBRG &gt; 255                          </font><font color="#000080"><i>; if SPBRG is too high
    </i></font><font color="#008000">_SPBRG = (OSC * 1000000) / 64 / Baud - 1     </font><font color="#000080"><i>; calc for Low baud rate
            </i></font><font color="#008000">bcf   TXSTA, BRGH                    </font><font color="#000080"><i>; Set BRGH to Low Speed
            </i></font><font color="#008000">if _SPBRG &gt; 255
    _SPBRG = 255
            bsf   TXSTA, BRGH                    </font><font color="#000080"><i>; Set BRGH to High Speed
        </i></font><font color="#008000">endif
        bsf     TXSTA, TXEN                      </font><font color="#000080"><i>; Set Transmit Enable bit
        </i></font><font color="#008000">movlw   _SPBRG          
        CHK?RP  SPBRG
        movwf   SPBRG                            </font><font color="#000080"><i>; load the calulated SPBRG
        </i></font><font color="#008000">movlw   B'10010000'                      </font><font color="#000080"><i>; enable USART
        </i></font><font color="#008000">CHK?RP  RCSTA
        movwf   RCSTA
    </b><font color="#000080"><i>'****************************************************************************
    </i></font>OERR <b>VAR </b>RCSTA.1 <font color="#000080"><i>' Alias USART over-run bit
    </i></font>CREN <b>VAR </b>RCSTA.4 <font color="#000080"><i>' Alias USART continuous receive enable bit
    </i></font>RCIF <b>VAR </b>PIR1.5 <font color="#000080"><i>' Alias USART received character interrupt flag bit
    </i></font>BytesIn <b>VAR BYTE</b>[16]
    ByteCnt <b>VAR BYTE
    </b>Got <b>VAR BYTE
    </b>Problem <b>VAR BYTE
    </b>Prob_Cnt <b>VAR BYTE
    </b>Stx <b>VAR BYTE
    </b>String <b>VAR BYTE
    </b>SW1 <b>VAR </b>PORTB.0
    SW2 <b>VAR </b>PORTB.1
    Reps <b>VAR WORD
    </b><font color="#000080"><i>'***********************************************************************
    <b>PAUSE </b>1000 <font color="#000080"><i>' LCD start-up delay
    LCDOUT </b>$FE,1
    <b>LCDOUT </b>$FE,$80,<font color="#FF0000">&quot; PLEASE &quot;
    </font><b>LCDOUT </b>$FE,$C0,<font color="#FF0000">&quot;  WAIT  &quot; 
    </font><b>PAUSE </b>500
    <b>LCDOUT </b>$FE,$80,<font color="#FF0000">&quot;        &quot;   </font><font color="#000080"><i>' CLEARS SCREEN BETTER THAN $FE,1
    </i></font><b>LCDOUT </b>$FE,$C0,<font color="#FF0000">&quot;        &quot;
    <b>IF </b>!OERR <b>THEN </b>LOOP <font color="#000080"><i>' If OERR=0 no over-run condition's present
        </i></font>CREN = 0 <font color="#000080"><i>' Disable receive
        </i></font>CREN = 1 <font color="#000080"><i>' Re-enable &amp; clear OERR &quot;over-run&quot; flag
    </i></font><b>GOTO </b>MAIN <font color="#000080"><i>' start over, including the count
    <font color="#008000">@ USART_Init  9600           ' SET BAUDRATE
        </font>Stx=($01)                <font color="#000080"><i>' SET START OF TEXT CHARACTOR
        </i></font>String=8                 <font color="#000080"><i>' SET LENGTH OF SERIAL STRING
        </i></font>Prob_Cnt=56             <font color="#000080"><i>' SET # OF BYTES TO TRIGGER &quot;SETUP PROBLEM&quot; DISPLAY
    </i></font><b>LCDOUT </b>$FE,$80,32       <font color="#FF0000"><i>' ^^^^^^BREAKS IF REMMED OUT (GARBAGE DATA)^^^^^^^^
    </i></font><b>IF </b>Got=1 <b>THEN 
    GOSUB </b>Show_Routine_One
    IF </b>Problem=&gt;Prob_Cnt <b>THEN
    GOSUB </b>Prob_Disp
    GOTO </b>LOOP
    Show_Routine_One:           <font color="#000080"><i>' DISPLAY DATA
    </i></font><b>LCDOUT </b>$FE,$80,32,32,BytesIn(1),BytesIn(2),BytesIn(4),BytesIn(5),BytesIn(7),32
    <b>LCDOUT </b>$FE,$C0,<font color="#FF0000">&quot;       &quot;     </font><font color="#000080"><i>' BLANK SECOND ROW ON LCD
    <b>LCDOUT </b>$FE,$80,32,<font color="#FF0000">&quot;SETUP&quot;</font>,32,32
    <b>LCDOUT </b>$FE,$C0,<font color="#FF0000">&quot;PROBLEM&quot;
    <b>LCDOUT </b>$FE,$80,32,32,32,<font color="#FF0000">&quot;NO&quot;</font>,32,32,32
    <b>LCDOUT </b>$FE,$C0,32,32,<font color="#FF0000">&quot;DATA&quot;</font>,32
    </b><font color="#000080"><i>'======================== INTERRUPT SERVICE ROUTINE===========================
    <b>IF </b>RCIF <b>THEN </b><font color="#000080"><i>' If RCIF=1 there's a new character in RCREG
        </i></font>BytesIn[ByteCnt]=RCREG <font color="#000080"><i>' Yes. Then store it in array
        </i></font>ByteCnt=ByteCnt+1 <font color="#000080"><i>' Increment array index pointer    
    IF </b>BytesIn&lt;&gt;Stx <b>THEN
    IF </b>ByteCnt=&gt;String <b>THEN
         </b>Got=1  <font color="#000080"><i>'INDICATE THAT THIS IS A NEW PACKET                    
    </b><font color="#000080"><i>'***************************************************************************
    </i></font><font color="#008000">@ INT_RETURN
    </font><font color="#000080"><i>'**************************************************************************

  2. #2
    Join Date
    Sep 2004
    montreal, canada

    Did you find this post helpful? Yes | No


    I would think it's because you set the baudrate within this loop, and it need some time for the USART to initialize/settle. Usually, you want to set the USART at the top and only once. So my guess is to move the @ USART_Init 9600 line before the main.

    You could still place the following lines at the top of your code (with all other register init), and forget @ USART_Init
    RCSTA = $90 ' Enable serial port & continuous receive
    TXSTA = $20 ' Enable transmit, BRGH = 0
    SPBRG = 25  ' 9600 Baud @ 16MHz, 0.16%

    It's not a bug, it's a random feature.
    There's no problem, only learning opportunities.

  3. #3
    Join Date
    Apr 2009

    Did you find this post helpful? Yes | No


    Thanks Steve,

    I'll look into that.

Similar Threads

  1. Reading in Manchester code
    By brid0030 in forum Code Examples
    Replies: 0
    Last Post: - 10th March 2009, 21:55
  2. 16F883 Code Verify Problem
    By munromh in forum mel PIC BASIC Pro
    Replies: 4
    Last Post: - 19th February 2009, 11:47
  3. Making Program Code Space your playground...
    By Melanie in forum Code Examples
    Replies: 15
    Last Post: - 19th July 2008, 08:26
  4. problem with my code
    By civicgundam in forum mel PIC BASIC Pro
    Replies: 0
    Last Post: - 3rd February 2008, 01:52
  5. Code problem
    By chai98a in forum mel PIC BASIC Pro
    Replies: 0
    Last Post: - 20th May 2006, 04:43

Members who have read this thread : 0

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts