Autor Tema: Usart en c18, al recibir por rx programa colapsa  (Leído 1700 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Galfox

  • PIC10
  • *
  • Mensajes: 2
Usart en c18, al recibir por rx programa colapsa
« en: 13 de Agosto de 2013, 16:27:41 »
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: [Seleccionar]
#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){}


Desconectado Galfox

  • PIC10
  • *
  • Mensajes: 2
Re: Usart en c18, al recibir por rx programa colapsa
« Respuesta #1 en: 13 de Agosto de 2013, 23:35:07 »
(solucionado en la practica no en lo teorico)

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?