String of characters(array) to decimal value


Closed Thread
Results 1 to 21 of 21

Hybrid View

  1. #1
    Join Date
    Aug 2006
    Location
    Look, behind you.
    Posts
    2,818


    Did you find this post helpful? Yes | No

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

    Quote Originally Posted by tacbanon View Post
    Hi, thanks for replying...please see the attached actual code I'm testing below.
    For now my goal is to test if interrupts will work every time there is data in the communication line.

    Thanks in advance,
    tacbanon
    I would bet they don't givin' your use of ON INTERRUPT. Why did you elect not to use Darrel's instant Interrupts? On Interrupt will cause lost characters (I am betting) if it works at all. Assembly interrupts handle the event immediatly, on interrupt has to finish what it's doing before servicing the interrupt.
    If you do not believe in MAGIC, Consider how currency has value simply by printing it, and is then traded for real assets.
    .
    Gold is the money of kings, silver is the money of gentlemen, barter is the money of peasants - but debt is the money of slaves
    .
    There simply is no "Happy Spam" If you do it you will disappear from this forum.

  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 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

  3. #3
    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

  4. #4
    Join Date
    Oct 2005
    Location
    Sweden
    Posts
    3,624


    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.

  5. #5
    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

  6. #6
    Join Date
    Oct 2005
    Location
    Sweden
    Posts
    3,624


    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.

  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, 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 16:41.

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