View previous topic :: View next topic |
Author |
Message |
onuruygur
Joined: 17 Jul 2009 Posts: 7
|
PIC16F88 UART interrupt problem? |
Posted: Fri Jul 17, 2009 8:47 am |
|
|
Hi all,
I am working on PIC16F88. Here is the project task:
When the right id is received on UART HW RX, PIC16F88 will send a sensor measurement word.
I have to use HW UART because i need INT_RDA routine. But when I simulate the code on ISIS and send any character on virtual terminal, I receive the error: logic contentions.
"This message has been generated because one or more logic contentions have occurred on the specified net. A logic contention occurs when two or more outputs of the same strength attempt to drive the net into opposing logic states. A logic contention is also reported if a strong logic state is overridden by a generator or power rail. "
PIC doesn't run the code in the int_rda routine and goes to main's loops.
This is a basic application I guess...? what is the problem?
Here is my basic HW_UART code:
Code: |
#include <16F88.h>
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //High speed Osc (> 4mhz)
#FUSES NOPUT //No Power Up Timer
#FUSES MCLR //Master Clear pin enabled
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#FUSES NODEBUG //No Debug mode for ICD
#FUSES PROTECT //Code protected from reads
#FUSES NOFCMEN //Fail-safe clock monitor disabled
#FUSES NOIESO //Internal External Switch Over mode disabled
#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_B5,rcv=PIN_B2,bits=8,stream=MODEM,errors)
|
and the C file is:
Code: |
#int_RDA
RDA_isr()
{
output_bit(PIN_B1,1); //This is just for indication.
}
void main()
{
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_OFF);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
setup_oscillator(False);
// TODO: USER CODE!!
while(TRUE){
fprintf(MODEM,"hi all");
delay_ms(500);}
} |
Thanks in advance.
|
|
|
mkuang
Joined: 14 Dec 2007 Posts: 257
|
|
Posted: Fri Jul 17, 2009 9:06 am |
|
|
You are using the standard hardware uart ports on this PIC. You can omit the stream name MODEM in your #use RS232 declaration. In your main code you can just use printf instead.
Also you need to enable serial interrupt. Add these lines of code in main():
Code: |
clear_interrupt(INT_RDA);
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL); |
|
|
|
dyeatman
Joined: 06 Sep 2003 Posts: 1934 Location: Norman, OK
|
|
Posted: Fri Jul 17, 2009 9:40 am |
|
|
They will also have to perform a getc() in the ISR to clear the interrupt.
Code: | byte inputchar;
inputchar=getc(); |
_________________ Google and Forum Search are some of your best tools!!!! |
|
|
onuruygur
Joined: 17 Jul 2009 Posts: 7
|
|
Posted: Fri Jul 17, 2009 11:23 am |
|
|
Thank you for your replies,
I am sorry that I have forgotten to put the codes related with enabling interrupts although I was already placed in my own code. Here is the new code which also includes your advices. But nothing have changed.
Would you share your comments pls?
Code: |
#include <16F88.h>
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT //No Power Up Timer
#FUSES NOMCLR //Master Clear pin used for I/O
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#FUSES NODEBUG //No Debug mode for ICD
#FUSES PROTECT //Code protected from reading
#FUSES NOFCMEN //Fail-safe clock monitor disabled
#FUSES NOIESO //Internal External Switch Over mode disabled
#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_B5,rcv=PIN_B2,bits=8,errors)
|
and the main.c is:
Code: |
#include "f88_hw_uart.h"
byte inputchar;
#int_RDA
void RDA_isr(void)
{
output_bit(PIN_B1,1);
inputchar=getc();
}
void main()
{
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_OFF);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
clear_interrupt(INT_RDA);
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
//Setup_Oscillator parameter not selected from Intr Oscillator Config tab
// TODO: USER CODE!!
printf("Hi all!\n\r");
while(TRUE){
delay_ms(500);
putc(inputchar);
}
}
|
The problem is same on ISIS:
At startup:
CFGWORD2 not implemented,
and when any char is sent over virtual terminal :
Logic contention is detected on PIC_RX.
Thanks is advance... |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Fri Jul 17, 2009 11:34 am |
|
|
Quote: |
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_OFF);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
|
That line sets the TRIS for the hardware SPI pins. The SPI module
shares the SDO pin with the Rx pin for the UART. The SDO pin is
an output pin, but the Rx pin is an input pin. This is causing the
"logic contention". Remove the line shown in bold. |
|
|
onuruygur
Joined: 17 Jul 2009 Posts: 7
|
|
Posted: Fri Jul 17, 2009 1:41 pm |
|
|
PCM programmer wrote: | Quote: |
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_OFF);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
|
That line sets the TRIS for the hardware SPI pins. The SPI module
shares the SDO pin with the Rx pin for the UART. The SDO pin is
an output pin, but the Rx pin is an input pin. This is causing the
"logic contention". Remove the line shown in bold. |
Very good orientation! That solved the problem. Thank you very much to all, of course to PCM Programmer also. |
|
|
|