The worst programmer ever to grace this forum - ME!


Closed Thread
Results 1 to 40 of 50

Hybrid View

  1. #1
    Join Date
    Mar 2009
    Posts
    653


    Did you find this post helpful? Yes | No

    Default

    ok, I've kludged it...but there's *got* to be an easier way than this...


    'set up some variables....

    turns_required VAR BYTE[3] ; the main input
    UNITS VAR BYTE ' will use this to extract units from above
    TENS VAR BYTE ' will use this to extract tens from above
    HUNDREDS VAR word ' ' will use this to extract hundreds from above
    TURNS_INPUT VAR WORD ' this will be used for the final goal - a useable number!!

    pause 200 ' let things settle down a bit

    HSEROUT ["Enter Number of turns required (3 digits + leading 0)>>>", 13,10] 'prompt for input.

    Main
    HSERIN 5000,finish,[WAIT("0"),STR turns_required \3] 'read in a 3 character string preceded by a '0'
    UNITS = turns_required(2) - 48 'extract the last character (units) & revert it down to a true decimal
    TENS = (turns_required(1) - 48) * 10 'extract the middle character (tens) & revert it down to a true decimal
    HUNDREDS = (turns_required(0) - 48) * 100 ''extract the first character (tens) & revert it down to a true decimal

    TURNS_INPUT = UNITS + TENS + HUNDREDS ' add them all together.



    Using the above, I've turned my keyed in '3 character ASCII code' based string into its numeric equivalent, (that I can use later in the PIC program) ...but like I say, there's got to be an easier way?
    Last edited by HankMcSpank; - 21st May 2009 at 23:32.

  2. #2
    Join Date
    Apr 2009
    Location
    Boise, Id
    Posts
    44


    Did you find this post helpful? Yes | No

    Default

    Instead of reading the HSERIN as STRING, read it as a DEC in to your WORD variable. Also you can use an interupt to know when you have data. If you got the interupt to work on your counter, you are close to getting it to work on data input. Darell Taylor interupts make it pretty easy. What you need is something like this at the begining:

    Code:
     
        INCLUDE "DT_INTS-18.bas"     ; Base Interrupt System
        INCLUDE "ReEnterPBP-18.bas"     ; Include if using PBP interrupts
        INCLUDE "Elapsed_INT-18.bas"  ; Elapsed Timer Routines
    
      ASM
    INT_LIST  macro    ; IntSource,        Label,  Type, ResetFlag?
                INT_Handler    TMR1_INT,  _ClockCount,   PBP,  yes
                INT_Handler    TMR0_INT,  _ToggleLED1,   PBP,  yes
                INT_Handler    RX_INT,     _Check_Command, PBP, yes  
            endm
            INT_CREATE               ; Creates the interrupt processor
        ENDASM
        
       T0CON = %10001000         
    @ INT_ENABLE    TMR1_INT     
    @ INT_ENABLE    TMR0_INT
    @ INT_ENABLE    RX_INT
    When the Pic recieves data it will set the RX_INT flag and jump to the _Check_Command Sub, the pic will save a some data in the UART, so you don't need to be waiting for the data to come, just need to get it when it does. The Check_Command sub looks like this:

    Code:
    Check_Command:
            
        hserin 10,No_Cmd,[Dec In_Val]
    
            
    '*******************************************************
    'Cool code goes here, I was reading single digit numbers and had
    'if statements to reply with different information, FYI calling another sub
    'in an interupt sub was breaking the code.  So be carefull jumping out
    'and expecting things to work as normal on return.         
    '********************************************************
    @ INT_RETURN
    '******************************************
    'Shouldn't make it to No_Cmd, since there was data on RX to get into
    'this sub. The Int_Return above should jump you back to your code
    'after you get your command
    '******************************************
    
    No_Cmd:
        HSEROUT [10,"Made it to No_Cmd: I'm broke",10]
    
    '***************************
    'Don't know if disabling the RX_INT and enabling is needed
    'I was trying to fix the issue of calling a sub from an interupt sub
    'and thought this might help.
    '***************************
    
    @ INT_DISABLE   RX_INT
    @ INT_ENABLE RX_INT
        
    @ INT_RETURN
    I have seen examples of reading strings if data on a single HSERIN command, I haven't ventured that far myself, but you should find examples if you search this forum, I'm sure that's where I saw it.

    Just to summerize, I used this to read single numbers 1-9 and had if statements for the code to react to, I didn't do math, so I might just be lucky that it worked.

    Have Fun
    Shane

  3. #3
    Join Date
    Mar 2009
    Posts
    653


    Did you find this post helpful? Yes | No

    Default

    Quote Originally Posted by ShaneMichael View Post
    Instead of reading the HSERIN as STRING, read it as a DEC in to your WORD variable. Also you can use an interupt to know when you have data. If you got the interupt to work on your counter, you are close to getting it to work on data input. Darell Taylor interupts make it pretty easy. What you need is something like this at the begining:

    Shane
    Hi Shane,

    Thanks for the reply.

    So all I need to do (sorry for the overly noob line of questioning), is instead of...

    turns_required VAR BYTE[3]
    HSERIN 5000,finish,[WAIT("0"),STR turns_required \3]


    I could just do this

    turns_required VAR WORD[2] '(which gives me 4 bytes? ...I actually only need 3 bytes), then this ? .....
    hserin 10,No_Cmd,[Dec turns_required\3]

    I've bolded the bits I'm uncertain about. Presumably the DEC part means the PIC reads the HSERIN info as Decimal (as opposed to a string). But what about where it places the 3 bytes? (I declared 2 words)...how do I pull the individual bytes out again?


    Re the interupts...I actually used DT's interrupt routines to get my PIC counting some 'black stripes triggering a phototransistor' - superb results. As it goes, I don't actually need interupts for my HSERIN, as the PIC will only be asking for user input at the very beginning of its program.

    I would however like a more graceful way of having to enter the data in rather than using a preceding 'trigger' character (in my case a '0'), as per this line though....

    HSERIN 5000,finish,[WAIT("0"),STR turns_required \3][/I]

    ie I'd like my program to start running, then a user just inputs data when prompted & without having to key that extra 0 at the front - it's really a bit cack having to do that!

  4. #4
    Join Date
    Apr 2009
    Location
    Boise, Id
    Posts
    44


    Did you find this post helpful? Yes | No

    Default

    Try it withouth making an array :

    turns_required VAR WORD

    a BYTE = 8 bits = 0 to 255
    a WORD = 16 bits = 0 to 65535

    so my understaning is that turns_required would hold a value up to 65535 without issue.

    You can do some testing by reading the value in as a DEC with HSERIN and "echo" it back with HSEROUT as a DEC or read the value and blink an LED = to the number you entered. I wouldn't test that at 65535 LED blinks. If you do use an array "turns_required VAR WORD[2]" then you would save and retrieve data from turns_required[1] and turns_required[2]. I don't think you need to do that...

    Hope this helps, Good Luck.
    Shane

Similar Threads

  1. Melabs U2 Programmer Command Line Options
    By Robert Wells in forum General
    Replies: 5
    Last Post: - 3rd July 2009, 03:11
  2. problems with USB programmer
    By malc-c in forum General
    Replies: 7
    Last Post: - 10th May 2007, 21:14
  3. USB programmer problems
    By uiucee2003 in forum USB
    Replies: 2
    Last Post: - 16th August 2006, 00:47
  4. General Programmer Questions
    By mslaney in forum General
    Replies: 1
    Last Post: - 17th December 2004, 19:16

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