Interupts and Command string


Closed Thread
Results 1 to 14 of 14

Hybrid View

  1. #1
    Join Date
    Feb 2005
    Location
    Essex, UK
    Posts
    154

    Default Interupts and Command string

    Hi,

    I am trying to alter the below piece of code for an interupt driven serial device.

    I would like the 'Main' part of the program to run up until a serial command is received. I would also like the device to send comms back to VB, this is the reason i have inserted 'flags'.

    The interrupts are only working with a single character. How would i use the interrupt so that it receives a string of commands.

    ie using the SERIN command i would use SERIN RxD,baud,[WAIT(254), hrs, min, sec], can someone assist how would i achieve this using interrupts. I would like it so that when the command (254) is received it then stores the received hrs, min and sec variables in EEPROM.

    If i can achieve this then it should be a good starting block to the rest of the code.

    Code:
        '
        '   Simple program to handle USART interrupt using PIC16F877 @20MHZ
        '   ===============================================================
        '
        '   This program will Blink a LED on PORTB.0 to show
        '   that the PIC is running.  
        '
        '   This program also allow the user to activate or deactivate 
        '   a LED connected on PORTB.1 pin by sending command from a PC
        '   terminal software using 9600,n,8,1 setting
        '
        '   User command:
        '   =============
        '                1. If character "1" is received => enable the LED
        '                2. if character "2" is received => disable the LED
        '
        '
        DEFINE LOADER_USED 1        ' using bootloader
        DEFINE OSC 20               ' running at 20 MHZ
        ADCON1 = %00001111
        
        '    PORT setting
        '    ============
             '
             TRISC=%10000000        ' RC.7 => USART RX pin set to input
                                    ' all other pin set to output
                                    '
             TRISB=0                ' RB<7:0> set to output
        
        '    USART setting
        '    =============
             ' Since we will not use HSERIN/HSEROUT, we must
             ' write directly to internal PIC register
             ' 
             TXSTA=$24              ' enable transmit and SPBRGH=1
             RCSTA=$90              ' Enable USART and continuous receive
             SPBRG=129              ' BAUD RATE = 9600 BAUDS
       
        '    Interrupt definition
        '    ====================
             '
             PIE1.5   =1            ' enable USART receive interrupt
             INTCON.6 =1            ' enable peripheral interrupt
        
        '    Alias definition
        '    ================
             '
             RCIF      var PIR1.5   ' receiver interrupt
             StatusLED var PORTB.0  ' the LED who show a 'running process'
             UserLED   var PORTB.1  ' the LED that user want to control
             
        '    Variable definition
        '    ===================
             '
             Delay      var word     ' 
             DataIn     var word     ' use to store RCREG content
             Discard    var byte     ' use to erase RCREG register
             storedloop var byte
             Flag       var byte
            
        '    Hardware/software initialisation
        '    ================================
             '
             PORTB=0                ' clear PORTB         
             on interrupt goto USARTInterrupt
    
            
    Start:
        '    Main program loop that make the user happy to
        '    see a LED flashing to mean that something is 
        '    running 
        '
        If flag = 1 then hserout [" Device Connected"]
        if flag = 2 then hserout [" LED is Flashing"]
        if flag = 3 then hserout [" LED is ON"]    
        If flag = 4 then hserout [" LED is OFF"]
        flag = 0
        
        toggle statusled
        for delay = 1 to 5000       ' use a loop delay to ensure
          pauseus 5                 ' getting interrupt as fast as
          next                      ' possible
        goto start
        
    
    disable interrupt
    USARTInterrupt:
        '    Here's the interrupt routine who will make the user
        '    much happy by giving him the feeling to have the 
        '    control on the machine when the status of the user
        '    LED will change
        '
        RCSTA=0                     ' Disable serial port AND
                                    ' clear possible error (FERR,OERR)
                                    
        datain=RCREG                ' Get data
                                    
        while RCif                  ' wait untill the RCREG is empty
              discard=RCREG         ' by reading it and store result in a
        wend                        ' don't care variable
                                    
        select case datain          ' What to do with that data???
                                    
               case "#"             ' User selection = 1
                    userled=1       '      => Enable the LED
                    FLAG = 3         '      => disable the LED
               case "2"             ' User selection =2
                    userled=0       '      => disable the LED
                    flag = 4
               case "3"             ' User selection =321
                    For storedloop = 1 to 5
                        High userled
                        Pause 50
                        Low userled
                        Pause 50
                    Next storedloop
                    flag = 2
                case "9"             ' User selection =2
                    FLAG = 1         '      => disable the LED
                                    
               end select
                   
        RCSTA=$90                   ' Re-enable the serial PORT AND
        resume                      ' get out of here
    enable interrupt
    Many thanks for any help offered.

    Steve

  2. #2
    Join Date
    Sep 2004
    Location
    montreal, canada
    Posts
    6,898

    Default

    I remind that code...You remove my name on the top header

    Well why not simply use HSERIN in the USARTInterrupt section?
    Steve

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

  3. #3
    Join Date
    Feb 2005
    Location
    Essex, UK
    Posts
    154

    Default

    Your quite correct Steve, it was your code which i found at http://www.picbasic.co.uk/forum/show...6F877+%4020MHZ

    I didn't remove any of your signatures from the top header as they weren't on the code i found as above. All credits recognised though ;-).

    Would you be kind enough to give an example of what you mean using the HSERIN command.

    As in the interrupt code you are disabling the serial port first. Are you saying remove these lines, and then treat it with just the HSERIN command.

    I am new to serial comms and often learn better from a quick example (if you could oblidge).

    Many thanks,

    Steve

  4. #4
    Join Date
    Sep 2004
    Location
    montreal, canada
    Posts
    6,898

    Default

    Yup that's what i think... just an idea.

    So you already figured something like
    Code:
    Disable 
    USARTInterrupt:
        HSERIN [Data1, Data2,....]
        '
        '    Data processing or not here
        '
        Resume
    Enable
    Just read the HSERIN section. You may also use STR modifier too. Dpending what kind of data format you'll use.
    Steve

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

  5. #5
    Join Date
    Feb 2005
    Location
    Essex, UK
    Posts
    154

    Default

    Excellent help, thanks.

    I have now managed to get variables sent from VB to PIC.

    The code now looks like this:

    Code:
    Start:
        '    Main program loop that make the user happy to
        '    see a LED flashing to mean that something is 
        '    running 
        '
        
        Hserout [hours, minutes, seconds]
        
        toggle userled
        for delay = 1 to 5000       ' use a loop delay to ensure
          pauseus 5                 ' getting interrupt as fast as
          next                      ' possible
        goto start
        
    
    disable interrupt
    USARTInterrupt:
        '    Here's the interrupt routine who will make the user
        
        HSERIN [hours, minutes, seconds]
    
        Write 5, hours
        Write 6, minutes
        Write 7, seconds
      
        resume                      ' get out of here
    enable interrupt
    However, i can only send over single numerals, ie 0-9. But in the timing functions for Hrs, Mins and Sec it could be upto 59. How do i get the PIC to reconise the double figures. If i try to send them the PIC just hangs.

    The write command is to just store the variables in EEPROM for later use.

    Thanks for your help,

    Steve

  6. #6
    Join Date
    Sep 2004
    Location
    montreal, canada
    Posts
    6,898

    Default

    Suppose the actual time is 1:33:56
    Send it as 013356

    actual time is 1:02:01
    send it as 010201

    THEN you use the DEC2 modifier
    HSERIN [DEC2 hour, DEC2 Minute, DEC2 Second]
    Steve

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

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