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.
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){}