String of characters(array) to decimal value


Closed Thread
Results 1 to 21 of 21

Hybrid View

  1. #1
    Join Date
    Jun 2011
    Location
    Philippines
    Posts
    223


    Did you find this post helpful? Yes | No

    Default Re: String of characters(array) to decimal value

    Hi, I guess I need to start reading DT's interrupt and study some examples before going back to this issue I'm having with my setup...and post here the results.

    Kind regards,
    tacbanon

  2. #2
    Join Date
    Jun 2011
    Location
    Philippines
    Posts
    223


    Did you find this post helpful? Yes | No

    Default Re: String of characters(array) to decimal value

    Hi, I have a working code(serial communication w/ DT's interrupt) from Mr_e. But I noticed when Sending 3-5 bytes it works great but when beyond 5-10 or more characters it seems corrupted. Displays 4 or 5 characters most of the time and only once.
    I need to send at least 20-30 characters...can anyone explain/suggest a better approach?
    I'm using Pic18F4550 @ 20Mhz(external)
    Code:
     '::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
                         'Hserin with Darryl Taylor's Instant Interrupts
     '::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
    asm
        __CONFIG    _CONFIG1L, _PLLDIV_5_1L & _CPUDIV_OSC1_PLL2_1L & _USBDIV_2_1L
        __CONFIG    _CONFIG1H, _FOSC_HSPLL_HS_1H & _FCMEN_OFF_1H & _IESO_OFF_1H
        __CONFIG    _CONFIG2L, _PWRT_ON_2L & _BOR_ON_2L  & _BORV_2_2L  & _VREGEN_ON_2L   
        __CONFIG    _CONFIG2H, _WDT_OFF_2H 
        __CONFIG    _CONFIG3H, _MCLRE_ON_3H & _LPT1OSC_OFF_3H & _PBADEN_OFF_3H & _CCP2MX_ON_3H 
        __CONFIG    _CONFIG4L, _STVREN_ON_4L & _LVP_OFF_4L & _ICPRT_OFF_4L  & _XINST_OFF_4L & _DEBUG_OFF_4L 
    endasm
    
    
            
            
            DEFINE OSC 48       
            DEFINE HSER_RCSTA 90h ' enable serial port, 
            DEFINE HSER_TXSTA 20h  ' enable transmit,                  
            DEFINE HSER_BAUD 9600
            DEFINE HSER_CLOERR  1 ' automatic clear overrun error  
            
            TRISC  = 000000    ' PORTC.7 is the RX input, PORTC.6 is the TX output
                                  
        
        '   Serial communication definition
        '   ===============================
            '
      ADCON1 = 001111      'Set up ADCON1 register no matter what you're doing!!!!!!
    '::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
    
    
    INCLUDE "MODEDEFS.BAS"       ' Include Shiftin/out modes
    INCLUDE "DT_INTS-18.bas"     ' Base Interrupt System
    INCLUDE "ReEnterPBP-18.bas"  ' Include if using PBP interrupts
    '::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
        '   Variable definition
    '::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
    PortB = 000000
    TRISB = 000000        
    RCIF       VAR     PIR1.5     ' Receive  interrupt flag (1=full , 0=empty)
    TXIF       VAR     PIR1.4     ' Transmit interrupt flag (1=empty, 0=full)
    led        var     PORTC.0
    led1        var     PORTC.1
    holdoff    var     word
    SerialData var     byte
    SerialInput var    byte[50]
    PortB = 0
    c var byte
    i var byte
    c = 0
    clear
    
    
            '((((((((((((((((((((((((((((((((((((((()))))))))))))))))))))))))))))))))))))))
    ASM
    INT_LIST  macro    ; IntSource,        Label,  Type, ResetFlag?
            INT_Handler   RX_INT,    _Getbytes,    PBP,  no
        endm
        INT_CREATE               ; Creates the interrupt processor
    ENDASM
    
    
    @   INT_ENABLE  RX_INT     ; enable RX_INT interrupts
    
    
    
    
            '((((((((((((((((((((((((((((((((((((((()))))))))))))))))))))))))))))))))))))))
                       ' Subroutine to slow loop down some and toggle heartbeat
            '((((((((((((((((((((((((((((((((((((((()))))))))))))))))))))))))))))))))))))))
    Mainloop:
     c = 1
            for holdoff = 1 to 100
            pause 1
            next holdoff
            toggle led           'toggle led every loop for heartbeat  
            goto Mainloop
    
    
    
    
            '((((((((((((((((((((((((((((((((((((((()))))))))))))))))))))))))))))))))))))))
               'ISR for RX_int interrupt 
            '((((((((((((((((((((((((((((((((((((((()))))))))))))))))))))))))))))))))))))))
    
    
    Getbytes:
           
           While RCIF = 1     ' clear the buffer
           c = c+1
           HSERIN [Serialdata] ' take it
           HSEROUT [Serialdata,#c,13] ' take it out   
           Wend
          
           toggle led       'led to confirm program went to RX ISR
    
    
    @ INT_RETURN
    
    
    
    
    error:
          Toggle led1
    @ INT_RETURN
     end
    Thanks in advance,
    tacbanon

  3. #3
    Join Date
    Oct 2005
    Location
    Sweden
    Posts
    3,610


    Did you find this post helpful? Yes | No

    Default Re: String of characters(array) to decimal value

    Hi,
    I think the problem is that you're trying to send three bytes while inside the ISR. Sending these three bytes holds up the CPU long enough for the RX-buffer of the USART to overflow. As a test try echoing Serialdata alone, I think it'll work then.

    /Henrik.

  4. #4
    Join Date
    Jun 2011
    Location
    Philippines
    Posts
    223


    Did you find this post helpful? Yes | No

    Default Re: String of characters(array) to decimal value

    @Henrik
    I got it now thanks....but I bumped into another wall how can I clear the content of an array? In my set up I can not use CLEAR command.

    Regards,
    tacbanon

  5. #5
    Join Date
    Oct 2005
    Location
    Sweden
    Posts
    3,610


    Did you find this post helpful? Yes | No

    Default Re: String of characters(array) to decimal value

    Code:
    ArrayLength CON 25
    
    myArray VAR BYTE[ArrayLength]
    i VAR BYTE
    
    For i = 0 to (ArrayLength - 1)
      myArray[i] = 0
    NEXT
    /H.

  6. #6
    Join Date
    Jun 2011
    Location
    Philippines
    Posts
    223


    Did you find this post helpful? Yes | No

    Default Re: String of characters(array) to decimal value

    Hi, just to remind everyone that the following code is a running LED matrix display.. I can now add text coming from the serial communicator. But I'm still having trouble clearing the array...initially it displays "HELLO WORLD" and when I type and send it via serial communicator using '^' as the end terminator it only adds to the initial string.
    Kindly check if there is anything obvious causing trouble to what I'm doing.
    Code:
    '****************************************************************
    '*  Name    : HSERIN-LedMatrix-4550 @ 20Mhz                     *
    '*  Author  : [select VIEW...EDITOR OPTIONS]                    *
    '*  Notice  : Copyright (c) 2012 [select VIEW...EDITOR OPTIONS] *
    '*          : All Rights Reserved                               *
    '*  Date    : 6/15/2012                                         *
    '*  Version : 1.0                                               *
    '*  Notes   :                                                   *
    '*          :                                                   *
    '****************************************************************
     '::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
                         'Hserin with Darryl Taylor's Instant Interrupts
     '::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
    
    
    
    asm
        __CONFIG    _CONFIG1L, _PLLDIV_5_1L & _CPUDIV_OSC1_PLL2_1L & _USBDIV_2_1L
        __CONFIG    _CONFIG1H, _FOSC_HSPLL_HS_1H & _FCMEN_OFF_1H & _IESO_OFF_1H
        __CONFIG    _CONFIG2L, _PWRT_ON_2L & _BOR_ON_2L  & _BORV_2_2L  & _VREGEN_ON_2L   
        __CONFIG    _CONFIG2H, _WDT_OFF_2H 
        __CONFIG    _CONFIG3H, _MCLRE_ON_3H & _LPT1OSC_OFF_3H & _PBADEN_OFF_3H & _CCP2MX_ON_3H 
        __CONFIG    _CONFIG4L, _STVREN_ON_4L & _LVP_OFF_4L & _ICPRT_OFF_4L  & _XINST_OFF_4L & _DEBUG_OFF_4L 
    endasm
    
            
            
            DEFINE OSC 48       
            DEFINE HSER_RCSTA 90h ' enable serial port, 
            DEFINE HSER_TXSTA 20h  ' enable transmit,                  
            DEFINE HSER_BAUD 9600
            DEFINE HSER_CLOERR  1 ' automatic clear overrun error  
            
            TRISC  = %10000000    ' PORTC.7 is the RX input, PORTC.6 is the TX output
                                  
        
        '   Serial communication definition
        '   ===============================
            '
    ADCON1 = %00001111      'Set up ADCON1 register no matter what you're doing!!!!!!
    '::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
    
    INCLUDE "MODEDEFS.BAS"       ' Include Shiftin/out modes
    INCLUDE "DT_INTS-18.bas"     ' Base Interrupt System
    INCLUDE "ReEnterPBP-18.bas"  ' Include if using PBP interrupts
    '::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
        '   Variable definition
    '::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
    c var byte
    c = 0
    clear
    
    g var byte
    g=0
    
    flag1 var byte
    flag1 = 0
    myArray VAR BYTE[300]
    Reset:
    
    ;((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((9 
                select case flag1
                case 1
                clear
                HSEROUT ["Flag1=1 ",13]
                               
                                myArray[0]="P"   ' When you do this the string is stored in RAM    
                                myArray[1]="I"
                                myArray[2]="C"
                                myArray[3]="B"
                                myArray[4]="A"
                                myArray[5]="S"
                                myArray[6]="I"
                                myArray[7]="C"
                                myArray[8]="2"
                                myArray[9]="."
                                myArray[10]="6" 
                                flag1 = 1
                                
                                
                case 2
                clear
                HSEROUT ["Flag1=2 ",13]
                               
                                myArray[0]="M"   ' When you do this the string is stored in RAM    
                                myArray[1]="I"
                                myArray[2]="C"
                                myArray[3]="R"
                                myArray[4]="C"
                                myArray[5]="H"
                                myArray[6]="I"
                                myArray[7]="P"
                                myArray[8]=" "
                                myArray[9]="C"
                                myArray[10]="P"
                                flag1 = 2
                                
                 case 0
                 clear
                 HSEROUT ["Flag1=0 ",13]
                               
                                myArray[0]="H"   ' When you do this the string is stored in RAM    
                                myArray[1]="E"
                                myArray[2]="L"
                                myArray[3]="L"
                                myArray[4]="O"
                                myArray[5]=" "
                                myArray[6]="W"
                                myArray[7]="O"
                                myArray[8]="R"
                                myArray[9]="L"
                                myArray[10]="D"
                                flag1 = 0
                case 3
                
                HSEROUT ["Flag1=3 ",13]
                flag1=3                        
                g = 0                
                
                End select 
       
    ;((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 
    
    
    ADCON1 = 15               ' Set all I/Os to Digital      
    CMCON = 7                 ' Disable Comparators
    
    TRISA = %00000000
    TRISE = %00000000
    TRISD = %00000000
    PORTD = %00000000
    TRISB = %00000000    ' Set Keypad I/O 
    TRISC = %10000000    ' Set Keypad I/O 
    PORTC = 0   
    PORTB = 0             ' Set columns LOW  
    PortA = 0
    PORTD = 0   
    PORTE = 0   
    HSEROUT ["Restart ",13]
    
    harf_reg var byte
    adres_sec var byte
    yinele var byte
    sutun_reg var byte[300]
    veri var byte
    yazi_reg var byte 
    i VAR BYTE
    x var byte
    z var byte
    y var byte
    t var byte
    q var byte
    sure var byte
    yedek var byte
    ;myArray VAR BYTE[11]
    '*****************************************************************************     
    RCIF       VAR     PIR1.5     ' Receive  interrupt flag (1=full , 0=empty)
    TXIF       VAR     PIR1.4     ' Transmit interrupt flag (1=empty, 0=full)
    led        var     PORTC.0
    led1        var     PORTC.1
    led5        var     PORTC.5
    holdoff    var     word
    SerialData var     byte
    SerialInput var    byte[50]
    portd=255:sure=200 
    
    
    ASM
    INT_LIST  macro    ; IntSource,        Label,  Type, ResetFlag?
            INT_Handler   RX_INT,    _Getbytes,    PBP,  no
        endm
        INT_CREATE               ; Creates the interrupt processor
    ENDASM
    
    @   INT_ENABLE  RX_INT     ; enable RX_INT interrupts
    
    
            '((((((((((((((((((((((((((((((((((((((()))))))))))))))))))))))))))))))))))))))
                       ' Subroutine to slow loop down some and toggle heartbeat
            '((((((((((((((((((((((((((((((((((((((()))))))))))))))))))))))))))))))))))))))
    Mainloop:
    
            GOTO oku:
    
    oku:
    if flag1 < 3 then
    z=10
    else
    z = c
    ENdif
    
    
    
        for i=0 to z
        '**************************************************************************        
        '*************************************************************************  
           if flag1 < 3 then        
            harf_reg = myArray[i]
            else
            harf_reg = SerialInput[i]
            Endif
            
            GOSUB data_sec
            
            for y=0 to yinele
               GOSUB datalar
                sutun_reg[t]=veri  :  t=t+1
                adres_sec=adres_sec+1
            next y
        next i
    t=0
     
    goto gonder
    gonder:
    
    
    FOR Q=0 TO 5
        for i=0 to 15
            portb=sutun_reg[t]  :  t=t+1
            porta=i
            
            portd=%111111110:PAUSEUS sure:portd=%11111111
            
        next i
    
     for i=0 to 15
            portb=sutun_reg[t]  :  t=t+1
            porta=i
            portd=%11111101:pauseus sure:portd=%11111111
        next i
     for i=0 to 15
            portb=sutun_reg[t]  :  t=t+1
            porta=i
            portd=%11111011:pauseus sure:portd=%11111111
        next i
     
     for i=0 to 15
            portb=sutun_reg[t]  :  t=t+1
            porta=i
            portd=%11110111:pauseus sure:portd=%11111111
        next i
     
     for i=0 to 11
            portb=sutun_reg[t]  :  t=t+1
            porta=i
            portd=%11101111:pauseus sure:portd=%11111111
        next i
      
    t=0   
    
    NEXT Q
    goto kaydir
            gosub datadisplay
              
            goto Mainloop
    
    
            '((((((((((((((((((((((((((((((((((((((()))))))))))))))))))))))))))))))))))))))
               'ISR for RX_int interrupt 
            '((((((((((((((((((((((((((((((((((((((()))))))))))))))))))))))))))))))))))))))
    
    Getbytes:
            
           While RCIF = 1     ' clear the buffer
           c = c + 1
           HSERIN 100,error,[Serialdata] ' take it
          
           HSEROUT [Serialdata] ' take it out 
           select case Serialdata          ' What to do with that data???
                                    
               case "A"            ' User selection = 1
                    HSEROUT ["Change to A message",13] ' take it out 
                    flag1 = 1 
                    goto Reset
               case "B"
                    HSEROUT ["Change to B message",13] ' take it out 
                    flag1 = 2 
                    goto Reset
               case "C"
                    HSEROUT ["Change to C message",13] ' take it out 
                    flag1 = 0 
                    goto Reset
               case "^"
                    HSEROUT ["Change to Custom message",13] ' take it out  
                    flag1 = 3 
                    For i = 0 to (10)
                      myArray[i] = 0
                    NEXT
                    goto Reset  
                    
               case else 
                          
                   SerialInput[c] = Serialdata  
             End select    
            
            
                
           Wend
           toggle led       'led to confirm program went to RX ISR
           '*******************************************************************************
    
    
    @ INT_RETURN
    
    
    error:
          Toggle led1
    @ INT_RETURN
     end
     
     
     ;*****************************************************************************
    datadisplay: 
    
    
    
    kaydir:
    '''''''''''''''''''''''''''''''''''''''''''''''''''''
    'serout2 PortC.5,T9600,[254,129,myArray] 'myArray[i]
    ;serout PortC.5,T9600,[254,192,"MicroBox"]
    '''''''''''''''''''''''''''''''''''''''''''''''''''''
    
        yedek=sutun_reg[0]
        for i=0 to 239
          sutun_reg[i]=sutun_reg[i+1]  ' this is for moving characters
        next i
          sutun_reg[240]=yedek
    '  ----------goback to main
    goto gonder
    return
    
    data_sec:
    select case harf_reg
    case "A"
    adres_sec=0  :  yinele=5  :  return
    case "B"
    adres_sec=6  :  yinele=5  :  return
    case "C"
    adres_sec=12  :  yinele=5  :  return
    case "D"
    adres_sec=18  :  yinele=5  :  return
    case "E"
    adres_sec=24  :  yinele=5  :  return
    case "F"
    adres_sec=30  :  yinele=5  :  return
    case "G"
    adres_sec=36  :  yinele=5  :  return
    case "H"
    adres_sec=42  :  yinele=5  :  return
    case "I"
    adres_sec=48  :  yinele=3  :  return
    case "i"
    adres_sec=52  :  yinele=3  :  return
    case "J"
    adres_sec=56  :  yinele=5  :  return
    case "K"
    adres_sec=62  :  yinele=5  :  return
    case "L"
    adres_sec=68  :  yinele=5  :  return
    case "M"
    adres_sec=74  :  yinele=5  :  return
    case "N"
    adres_sec=80  :  yinele=5  :  return
    case "O"
    adres_sec=86  :  yinele=5  :  return
    case "P"
    adres_sec=92  :  yinele=5  :  return
    case "Q"
    adres_sec=98  :  yinele=5  :  return
    case "R"
    adres_sec=104  :  yinele=5  :  return
    case "S"
    adres_sec=110  :  yinele=5  :  return
    case "T"
    adres_sec=116  :  yinele=5  :  return
    case "U"
    adres_sec=122  :  yinele=5  :  return
    case "ü"
    adres_sec=128  :  yinele=5  :  return
    case "V"
    adres_sec=134  :  yinele=5  :  return
    case "W"
    adres_sec=140  :  yinele=5  :  return
    case "X"
    adres_sec=146  :  yinele=5  :  return
    case "Y"
    adres_sec=152  :  yinele=5  :  return
    case "Z"
    adres_sec=158  :  yinele=5  :  return
    case " "
    adres_sec=164  :  yinele=5  :  return
    case "0"
    adres_sec=170  :  yinele=5  :  return
    case "1"
    adres_sec=176  :  yinele=3  :  return
    case "2"
    adres_sec=180  :  yinele=5  :  return
    case "3"
    adres_sec=186  :  yinele=5  :  return
    case "4"
    adres_sec=192  :  yinele=5  :  return
    case "5"
    adres_sec=198  :  yinele=5  :  return
    case "6"
    adres_sec=204  :  yinele=5  :  return
    case "7"
    adres_sec=210  :  yinele=5  :  return
    case "8"
    adres_sec=216  :  yinele=5  :  return
    case "9"
    adres_sec=222  :  yinele=5  :  return
    end select
    
    datalar:
    
     lookup adres_sec,[$7C,$0A,$09,$0A,$7C,0_      ;A
                       ,$7F,$49,$49,$49,$36,0_      ;B
                       ,$3E,$41,$41,$41,$22,0_      ;C
                       ,$7F,$41,$41,$41,$3E,0_      ;D
                       ,$7F,$49,$49,$49,$41,0_      ;E
                       ,$7F,$09,$09,$09,$01,0_      ;F
                       ,$3E,$41,$49,$49,$3A,0_      ;G
                       ,$7F,$08,$08,$08,$7F,0_      ;H
                       ,$41,$7F,$41,0_              ;I
                       ,$44,$7D,$44,0_              ;Ý
                       ,$20,$40,$41,$3F,$01,0_      ;J
                       ,$7F,$08,$14,$22,$41,0_      ;K
                       ,$7F,$40,$40,$40,$40,0_      ;L
                       ,$7F,$02,$04,$02,$7F,0_      ;M
                       ,$7F,$04,$08,$10,$7F,0_      ;N
                       ,$3E,$41,$41,$41,$3E,0_      ;O
                       ,$7F,$09,$09,$09,$06,0_      ;P
                       ,$3E,$41,$51,$61,$3E,0_      ;Q
                       ,$7F,$09,$19,$29,$46,0_      ;R
                       ,$26,$49,$49,$49,$32,0_      ;S
                       ,$01,$01,$7F,$01,$01,0_      ;T
                       ,$3F,$40,$40,$40,$3F,0_      ;U
                       ,$1E,$41,$01,$41,$1E,0_      ;Ü
                       ,$1F,$20,$40,$20,$1F,0_      ;V
                       ,$3F,$40,$30,$40,$3F,0_      ;W
                       ,$63,$14,$08,$14,$63,0_      ;X
                       ,$07,$08,$70,$08,$07,0_      ;Y
                       ,$61,$51,$49,$45,$43,0_      ;Z
                       ,$00,$00,$00,$00,$00,0_      ;Space
                       ,$3E,$51,$49,$45,$3E,0_      ;0
                       ,$42,$7F,$40,0_              ;1
                       ,$62,$51,$49,$45,$42,0_      ;2    
                       ,$22,$49,$49,$49,$36,0_      ;3
                       ,$18,$14,$12,$7F,$10,0_      ;4
                       ,$2F,$49,$49,$49,$31,0_      ;5
                       ,$3E,$49,$49,$49,$32,0_      ;6
                       ,$61,$11,$09,$05,$03,0_      ;7
                       ,$36,$49,$49,$49,$36,0_      ;8
                       ,$26,$49,$49,$49,$3E,0],veri ;9
    return
    Kind regards,
    tacbanon
    Last edited by tacbanon; - 19th June 2012 at 15:41.

  7. #7
    Join Date
    Jun 2011
    Location
    Philippines
    Posts
    223


    Did you find this post helpful? Yes | No

    Default Re: String of characters(array) to decimal value

    Hi, the way it worked for me is to reset it before sending a new string of character...
    @ RESET did the trick.
    Thanks everyone for helping me out.

    regards,
    tacbanon

Members who have read this thread : 1

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