USART interrupt in PIC16F877A


Closed Thread
Results 1 to 8 of 8
  1. #1
    Join Date
    Aug 2006
    Location
    Iran
    Posts
    94

    Default USART interrupt in PIC16F877A

    Hi,
    i have enabled USART interrupt in pic16f877a and it's interrupt work but other part of my program doesn't work.
    im my program i read keyboard and when interrpt is coming it show the recieved data on lcd.
    when serial data is coming the progran goes to interrupt and shoew the recieved data on lcd but reading keyboard doesn't work.
    just the interrupt program is working.when i push the keys the program should show the number on lcd but it doesn't work and when i disable interrupt the keyboard program is working.
    i enabled USART interrup like this:
    on interrupt goto USART_int
    INTCON = %11000000 'Initializing the INTCON register
    PIE1= %00100000 'Initializing the PIE1 register
    RCSTA= %11010011
    and use this instruction :
    serin PORTC.7,N1200,["A"],y1

    could you help me?
    what should i do?
    maby i have a problem in my program.
    i use micro code studio picbasic pro2.41



    this is my program:

    define OSC 4
    include"modedefs.bas"
    ADCON1=7 ' convert porta from analoge to digital
    TRISA = %00000000 ' set porta as an output
    TRISB = %00001111 'set first 4 bit of portb as an input and last 4 bit as putput
    TRISC = %00000000 ' set portc as output
    '----------------------------------------------------
    ' Define LCD parameters
    ' Set LCD Data port
    DEFINE LCD_DREG PORTD
    ' Set starting Data bit (0 or 4) if 4-bit bus
    DEFINE LCD_DBIT 4
    ' Set LCD Register Select port
    DEFINE LCD_RSREG PORTD
    ' Set LCD Register Select bit
    DEFINE LCD_RSBIT 1
    ' Set LCD Enable port
    DEFINE LCD_EREG PORTD
    ' Set LCD Enable bit
    DEFINE LCD_EBIT 0
    ' Set LCD bus size (4 or 8 bits)
    DEFINE LCD_BITS 4
    ' Set number of lines on LCD
    DEFINE LCD_LINES 2
    '----------------------------------------------
    y1 var byte
    y2 var byte
    y3 var byte
    '-------------------------------------------------
    on interrupt goto USART_int
    INTCON = %11000000 'Initializing the INTCON register
    PIE1= %00100000 'Initializing the PIE1 register
    RCSTA= %11010011
    '------------------------------------------------



    scanning keyboard:


    ''program



    goto scanning keyboard

    USART_int:
    disable
    USART_int:
    serin PORTC.7,N1200,["A"],y1
    serin PORTC.7,N1200,["A"],y2
    serin PORTC.7,N1200,["A"],y3
    '
    if (y2=y3) then
    lcdout $fe,1,#y2
    pause 4000
    lcdout $fe,1
    PORTC.4=1
    pause 4000
    PORTC.4=0
    endif
    INTCON = %11000000
    PIE1= %00100000
    RCSTA= %11010011
    resume
    enable
    end
    delay:
    for i=1 to 2000
    pause 1
    next i
    return


    the program that i show you befor is an example but my main prigram is this that it is vey long.
    about my hardware i connected keyboard to PORTB(row to RB0 to RB3 and
    columns RB4 to RB7) and connect the RB0 to RB3 a 10k resister and i set the columns to 1 and read the rows rapidly to find which key is pushed.
    i connected the DS1307 to RA0 and RA1(SDA to RA0 and SCL to RA1).
    my program is about the reviever of a wireless weather station.
    in my program i use haming codes to find and correct errors.
    i connect a RF reciever to PORTC.7 but i my program it is on PORTA.5 that i corrert it in my harware and my software.
    my program is very long abpot 1000 lines that i can't put it here and my keyboard program is long too and it has alot of subrotins.
    what's the difference between serin and hserin instructions?

  2. #2
    Join Date
    Aug 2006
    Location
    Iran
    Posts
    94


    Did you find this post helpful? Yes | No

    Default

    Hi,
    i write my program with ondebug goto instruction too but i have a same problem.in this case just interrupt rotine just work and other part of my program doesn't work.
    what's the reason?

  3. #3
    Join Date
    Aug 2006
    Location
    Iran
    Posts
    94


    Did you find this post helpful? Yes | No

    Default

    can i use RB0 interrupt instead of USART?
    for example i enable RB0 interrupt for falling edge and send 10101010....
    for about five bytes and then send my data from transmitter and when RF reciever transfer it to micro then the interrupt happen and goes to interrupt rotine to get serial data with serin instruction(in interrup rotine).
    is it a good idea?

  4. #4
    Join Date
    Aug 2006
    Location
    Iran
    Posts
    94


    Did you find this post helpful? Yes | No

    Default

    Hi,
    i enabled RB0 interrupt it works but my problem didn't solve.i have a same problem as i had in
    USART interrupt.
    in RB0 interrupt also just interrupt routine works and other part of my program don't work.
    i write a simple program to turn on and off led and when serial data is coming the RB0 interrupt
    occur (because i send 10101010 befor my data) .
    so when serial data is coming the program goes to interrupt routine and show the revieved data on lcd but led doen't turn on or off.
    just interrupt routine works.
    what's the reason?
    i have a same problem in USART interrupt too.
    i use micro code studio picbasic pro2.41

    this is my simple program:


    define OSC 20
    include"modedefs.bas"
    ADCON1=7 ' convert porta from analoge to digital
    TRISA = %00000000 ' set porta as an output
    TRISB = %00001111 'set first 4 bit of portb as an input and last 4 bit as putput
    TRISC = %00000000 ' set portc as output
    '----------------------------------------------------
    ' Define LCD parameters
    ' Set LCD Data port
    DEFINE LCD_DREG PORTD
    ' Set starting Data bit (0 or 4) if 4-bit bus
    DEFINE LCD_DBIT 4
    ' Set LCD Register Select port
    DEFINE LCD_RSREG PORTD
    ' Set LCD Register Select bit
    DEFINE LCD_RSBIT 1
    ' Set LCD Enable port
    DEFINE LCD_EREG PORTD
    ' Set LCD Enable bit
    DEFINE LCD_EBIT 0
    ' Set LCD bus size (4 or 8 bits)
    DEFINE LCD_BITS 4
    ' Set number of lines on LCD
    DEFINE LCD_LINES 2
    pause 100
    lcdout $fe,1
    i var word
    y1 var byte
    y2 var byte
    y3 var byte

    on interrupt goto int
    OPTION_REG = %10000000
    INTCON = %10010000
    TRISB = %11111111
    start:
    for i=1 to 1000
    PORTC.3=0
    pause 1
    next i
    for i=1 to 1000
    PORTC.3=1
    pause 1
    next i
    goto start
    disable
    int:
    serin PORTB.0,N1200,["A"],y1
    serin PORTB.0,N1200,["A"],y2
    serin PORTB.0,N1200,["A"],y3
    '
    if (y2=y3) then
    lcdout $fe,1,#y2
    pause 4000
    lcdout $fe,1
    PORTC.4=1
    pause 4000
    PORTC.4=0
    endif
    OPTION_REG = %10000000
    INTCON = %10010000
    resume
    enable
    end

  5. #5
    Join Date
    Aug 2006
    Location
    Iran
    Posts
    94


    Did you find this post helpful? Yes | No

    Default

    i found that two interrupts(USART and RB0) are working and when i turn on micro it goes to interrupt routine.
    for RB0 i should connect a pull up resistor but when i connect the out put of the RF reciever to it interrupt occurs.
    i don't know why?
    maby the noise of RF reciever (when we don't have data) is the reason.
    for USART interrupt ,i have the same problem but in this case , there is no deference between connecting and not connecting the RF reciever.
    when i turn on micro it goes to interrupt routine.
    what is the reason?
    what should i do?

  6. #6
    Join Date
    Aug 2006
    Location
    Iran
    Posts
    94


    Did you find this post helpful? Yes | No

    Default

    Hi,
    i found that two interrupts(USART and RB0) are working and when i turn on micro it goes to interrupt routine.
    for RB0 i should connect a pull up resistor but when i connect the out put of the RF reciever to it interrupt occurs.
    i don't know why?
    maby the noise of RF reciever (when we don't have data) is the reason.
    for USART interrupt ,i have the same problem but in this case , there is no deference between connecting and not connecting the RF reciever.
    when i turn on micro it goes to interrupt routine.
    what is the reason?
    what should i do?

  7. #7
    Join Date
    Aug 2006
    Location
    Iran
    Posts
    94


    Did you find this post helpful? Yes | No

    Default

    Hi,
    as you saw my program.
    after define oscillator and lcd i enabled USART interrupt and then start to turn on and off led that connected to PORTC.3
    so when interrupt occures the program goes to interrupt routine and shows the recieved data on lcd.
    but in my program if i connect the output of the RF reciever to micro or if i don't connect it,after turning on micro it goes to interrupt routine and it comes back to mian program and befor execute the mian program it goes to interrupt routine again.
    so it's just execute the interrupt routine.
    maby i hve a problem to enable the USART interrupt
    but i have try it many times and i don't know what should i do.
    please help me


    this is my simple program:
    define OSC 20
    'include"modedefs.bas"
    ADCON1=7 ' convert porta from analoge to digital
    TRISA = %00000000 ' set porta as an output
    TRISB = %00001111 'set first 4 bit of portb as an input and last 4 bit as putput
    TRISC = %00000000 ' set portc as output
    '----------------------------------------------------
    ' Define LCD parameters
    ' Set LCD Data port
    DEFINE LCD_DREG PORTD
    ' Set starting Data bit (0 or 4) if 4-bit bus
    DEFINE LCD_DBIT 4
    ' Set LCD Register Select port
    DEFINE LCD_RSREG PORTD
    ' Set LCD Register Select bit
    DEFINE LCD_RSBIT 1
    ' Set LCD Enable port
    DEFINE LCD_EREG PORTD
    ' Set LCD Enable bit
    DEFINE LCD_EBIT 0
    ' Set LCD bus size (4 or 8 bits)
    DEFINE LCD_BITS 4
    ' Set number of lines on LCD
    DEFINE LCD_LINES 2
    pause 100
    lcdout $fe,1
    i var word
    y1 var byte
    y2 var byte
    y3 var byte
    'PIR1=%00000000
    on interrupt goto USART_int
    INTCON = %11000000 'Initializing the INTCON register
    PIE1= %00100000 'Initializing the PIE1 register
    RCSTA= %11011001 'Initializing the RCSTA register
    start:

    for i=1 to 1000
    PORTC.3=0
    pause 1
    next i
    for i=1 to 1000
    PORTC.3=1
    pause 1
    next i
    goto start
    disable
    USART_int:
    include"modedefs.bas"
    serin PORTB.0,N1200,["A"],y1
    serin PORTB.0,N1200,["A"],y2
    serin PORTB.0,N1200,["A"],y3
    '
    if (y2=y3) then
    lcdout $fe,1,#y2
    pause 4000
    lcdout $fe,1,"salam"
    pause 4000
    PORTC.4=1
    pause 4000
    PORTC.4=0
    endif
    PIR1=%00000000
    INTCON = %11000000 'Initializing the INTCON register
    PIE1= %00100000 'Initializing the PIE1 register
    RCSTA= %11011001 'Initializing the RCSTA register
    resume
    enable
    end
    'delay:
    'for i=1 to 2000
    'pause 1
    'next i
    'return

  8. #8
    Join Date
    Aug 2006
    Location
    Iran
    Posts
    94


    Did you find this post helpful? Yes | No

    Default

    Hi,
    i can solve my problem. it works but i have another problem.when i use this interrupt with a simple program it works but when i use this in a big one(my program is about 1000 lines) it doesn't work.
    i also use 20M crystal but it doesn't work too.
    what's the reason?

Similar Threads

  1. Can't ID interrupt source with this IntHandler??
    By jellis00 in forum mel PIC BASIC Pro
    Replies: 7
    Last Post: - 3rd June 2009, 02:35
  2. Help with Analog Interrupt
    By brid0030 in forum mel PIC BASIC Pro
    Replies: 7
    Last Post: - 13th February 2008, 18:14
  3. USART interrpt in PIC16F877A
    By amindzo in forum Serial
    Replies: 3
    Last Post: - 28th August 2006, 16:07
  4. PIC Basic PRO 16F877 USART Interrupt TX
    By BigH in forum Serial
    Replies: 8
    Last Post: - 9th January 2006, 23:26
  5. USART interrupt not interrupting right
    By Morpheus in forum mel PIC BASIC Pro
    Replies: 12
    Last Post: - 6th March 2005, 01:07

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