Usart en c18, al recibir por rx programa colapsa

Saludos foreros

Estoy trabajando en la comunicación serial conectando un pic a un terminal en el computador.
Al enviar una frase o lo que sea del pic al pc, puedo visualizarlo sin problemas, pero cuando mando algo del pc al pic prácticamente todo deja de funcionar.

Estoy utilizando un pic 18f67j50 en una placa que viene con un conector tipo UEXT, conectada a un LCD NOKIA 3310 blanco/negro de 84x48 pixeles, viene con un pequeño joystick y ademas ocupo un boton.
(Tarjeta de desarrollo PIC-LCD3310 con PIC18F67J50 y acelerómetro de olimex)

Programo con el compilador c18 de microchip.

En el programa ocupo un menu que me desplazo con el joystick, y que entro y salgo de submenu con el boton. Al enviar datos pic-pc todo funciona ok, pero al momento de recibir un dato cualquiera pic-pc, el lcd se congela, ya no puedo moverme en el menú, y no reaccionan los botones. Solo funcionan dos led que prenden y apagan cada 1s, pero esto esta programado mediante interrupciones.

Al principio había puesto interrupciones para captar datos, pero ocurría lo mismo, así que borre todo código de recepción de datos.
Pense que el pin rx1 podria estar en modo analogo, pero el pic que utilizo no tiene ese problema.

El código es bastante extenso, pero pondré las partes que considero relevante. Gracias por la ayuda desde ya.

Código:
#define MENU_NUMB   6

#include <p18f67j50.h>
#include <stdio.h>
#include "user\user.h"
#include <string.h>

#include <usart.h>
#include <adc.h>

#include    "lcd.h"
//#include    "mmc.h"
#include    "test.h"
#include "system\typedefs.h"                        // Required
#include "system\usb\usb.h"                         // Required
#include "io_cfg.h"                                 // Required
#include "system\usb\usb_compile_time_validation.h" // Optional
#include "user\user.h"                              // Modifiable

#pragma config XINST    = OFF      // Extended instruction set
        #pragma config STVREN   = OFF      // Stack overflow reset
        #pragma config PLLDIV   = 5         // (20 MHz crystal used on this board)
        #pragma config WDTEN    = OFF      // Watch Dog Timer (WDT)
        #pragma config CP0      = OFF      // Code protect
        #pragma config CPUDIV   = OSC1      // OSC1 = divide by 1 mode
        #pragma config IESO     = OFF      // Internal External (clock) Switchover
        #pragma config FCMEN    = OFF      // Fail Safe Clock Monitor
        #pragma config FOSC     = HSPLL      // Firmware must also set OSCTUNE<PLLEN> to start PLL!
        #pragma config WDTPS    = 32768
        #pragma config MSSPMSK  = MSK5
        #pragma config CCP2MX   = DEFAULT




void Timer1ISRHigh(void);
////////////////////////////////////////////////////////////////////////////////////////////
#pragma code high_vector=0x08
void InterruptTimerHigh (void) 
{  _asm    goto Timer1ISRHigh  _endasm
}
#pragma code
////////////////////////////////////////////////////////////////////////////////////////////

#pragma interrupt Timer1ISRHigh
void 
Timer1ISRHigh(void)
{
   //?disable global interrupts prevent second enter to interrupt?
   if(PIR1bits.TMR1IF==1)
      {
      PIR1bits.TMR1IF=0;
      TMR1H=0x80;      //preload for 1 sec 
   //   ToggleLED2();	
      PORTEbits.RE3= !PORTEbits.RE3;
      PORTEbits.RE2= !PORTEbits.RE3;
      }
}


void main(void)
{

	Open1USART(USART_TX_INT_OFF & USART_RX_INT_ON &
					USART_ASYNCH_MODE & USART_EIGHT_BIT &
					USART_CONT_RX & USART_BRGH_HIGH,129);
		
				//  ANSELCbits.ANSC7 = 0; 
				ADCON1=0x0F;

				Kbhit=0; 


		 TRISEbits.TRISE3 = 0;
         TRISEbits.TRISE2 = 0;
         IPR1bits.TMR1IP=1; //TMR1 High priority
         RCONbits.IPEN = 1; //enable interrupt level priority

         //Timer1 RTC configuration
         TMR1H=0x80;      //preload for 1 sec 
         TMR1L=0x0;
         T1CONbits.T1CKPS1=0;
         T1CONbits.T1CKPS0=0;//prescaler 1:1 value
         
         T1CONbits.T1OSCEN=1;//enable Timer 1 Oscillator
         T1CONbits.T1SYNC=1; //do not synchronize external clock
         T1CONbits.TMR1CS=1;   //select external clock source
         T1CONbits.TMR1ON=1; //enable Timer 1
      
         PIE1bits.TMR1IE=1;      //enable Timer 1 interrupt
         INTCONbits.GIEL = 1;   //enable peripheral interrupts 
         INTCONbits.GIEH = 1;   //enable global interrupts

		 INTCONbits.PEIE=1;     //habilita interrupcion de perifericos  puesto para USART
		 RCSTA1bits.CREN=1;     //enable receiver
		 RCSTA1bits.SPEN=1;      //enable serial port
		 RCSTA1bits.SREN = 1;  // serial port enable 
		 BAUDCON1bits.RCIDL = 1; // receiving operation is active    
		 /* Make receive interrupt high priority */
  			IPR1bits.RCIP = 1;

	//		TRISC=0XFF;
	//		LATC=0X00;
  TRISCbits.TRISC6=0; TRISCbits.TRISC7=1;  // RC6 out (tx), RC7 in (rx)
 
  TXSTA =  0b00100110;
 RCSTA = 0b10010000;

         TRISB=0XFF;
         LATB=0X00;
         PORTBbits.RB3=0;   //configuro como entrada
         PORTBbits.RB2=0;   

		 PORTBbits.RB7=0;

		 INTCON2bits.INTEDG2 = 1;//configura interrupcion por flanco de subida para la interrupcion en RB2
										
         INTCON2bits.INTEDG2=1;     //configuro interrupcion por flanco de subida
         INTCON2bits.INTEDG3=1;
	 	 INTCON3bits.INT2IE=1; // activa la interrupción externa por flanco del pin RB2
		 INTCON3bits.INT2IP=0; // selecciona la interrupción de baja prioridad del pin RB2


while(1){}
 
que funcion estas usando para recivir datos(n bytes entinedo) del PC?

usando las librerias por defecto que trae el C18
por ejemplo yo,programado para el 2550

void getsUSART(char *buffer, unsigned char len)

esa funcion, usa la funcion "getcUSART()" (lee un byte) y se QUEDA AHI!! hasta que llegen n bytes para completar "len" definido en getsUSART

y lo que este haciendo el pic en todo ese tiempo, primero debe esperar a que llegen todos los bytes para completar la cadena, ya que constantemente pregunta por getcUSART()
 
Primero probe con una interrupcion tipo

Código:
if(PIR1bits.RCIF==1)
{
Data=getc1USART();
Kbhit=1;
PIR1bits.RCIF=0;
}

Pero al ver que no funcionaba la borre, en cualquier parte de mi programa al enviar un dato este se cuelga. Ahora que me dijiste eso, pensé que podría no estar entrando la interrupción, así que metí el código de arriba a un while(1) y lo mismo, se cuelga.

Esto no se si de ideas del problema o solo sirva para confundir mas como lo hizo conmigo.
Al estar el aire el pin RX1 el lcd no inicia, o muestra caracteres random. Si conecto el pin a tierra o a voltaje, el lcd se comporta de manera correcta. Pero al cambiar de estado del pin rx, se cuelga como siempre.
 
pon un breakpoint en if(PIR1bits.RCIF==1) dentro de la interrupcion, para ver que pasa!! el C18 es muy versatil trabajando en conjunto con el MPLAB, suponiendo que todo lo demas este bien..y si creo que esta bien(solo he dado un vistazo a tu codigo)
 
Muchas gracias BKAR, tenias toda la razon =D.

En mi programa tenia varias interrupciones, algunas de alta prioridad y otras de baja.
En alta tenia una interrupción de timer para contar de 1 en 1 segundo, y en baja puse la de getcUSART. a estas le dije que cambiara el estado de unos led.

Solo cambio el estado del led del timer. Así que cambie las prioridades a la inversa, y ahora cambiaba de estado el led de getcUSART y no se quedaba pegado por recibir un dato, pero no entraba ahora la interrupción del timer y se volvía a pegar el programa pero por otra razón.

puse RCONbits.IPEN = 0; para ignorar prioridades, pero seguia pasando lo mismo.

Finalmente las dos interrupciones las deje en alta prioridad, y las dos funcionaron.
Así que el problema era ese. Aunque me quedo con la duda pq una en alta y en otra en baja no pueden trabajar en equipo.

(sin contar detallitos como que un botón me dejo de funcionar, y creo que hasta me cuelga el programa, pero ya trabajare en eso mañana)

pd. no encontré algún comando que me sirva para darle una especie timeout al recibir un dato, existe?
 
Última edición:
Atrás
Arriba