Autor Tema: Ayuda con dsPIC30F4013 y envio de datos por rs232  (Leído 3235 veces)

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

Desconectado ale210

  • PIC10
  • *
  • Mensajes: 1
Ayuda con dsPIC30F4013 y envio de datos por rs232
« en: 16 de Junio de 2009, 08:59:23 »
Hola a todos, soy Alejandro de España y  estoy finalizando mi protecto fin de carrera, y tengo un problema.

Necesito enviar una cadena por el serie del tipo parecido a esto: P0S00000.
He estado mirando post de esta pagina y me ha ayudado bastante pero aun necesito un empujoncito, basicamente lo que necesito es enviar a mi placa esa cadena y luego enviarla de nuevo por el puerto serie al PC, todas las veces que quiera, lo que he conseguido es enviar varios carácteres, pero luego se van añadiendo. Utilizo el programa terminal rs232 by br@y y el MPlab ide v8.30

pego el código.

Espero que me puedan decir porque me pasa eso y como lo puedo solucionar.
gracias

Código: [Seleccionar]
#include "p30f4013.h" //Indica el micro a utilizar
#include <string.h>


// Macros para fijar el registro de configuracion (Guardado en FLASH de forma permanente)
// Las distintas opciones se pueden consultar en el fichero:
// C:\Archivos de programa\Microchip\MPLAB C30\support\h\p30f4013.h
//Fuente del oscilador   Temporizador POWER-UP  Watch-dog
_FOSC(CSW_FSCM_OFF & FRC_PLL16); //Oscilador / 2 * 8   20 MHz /2 * 8 = 80 MHz
//Tcy= 80 /4 = 20 MHz y 20 Minstrucciones/s
_FWDT(WDT_OFF);            //Watch-Dog desconectado.
_FBORPOR(MCLR_EN & PWRT_OFF);   //Permite reset por el pin MCLR y
     // desconecta la temporización del reset por POWER-UP
_FGS(CODE_PROT_OFF);                      //Inhibe la proteccion del código

// Definiciones: Cuando el compilador se encuentra la palabra OUT_1
// la sustituye por PORTBbits.RB9 y así con todos los #define


#define OUT_1 LATBbits.LATB9
#define OUT_2 LATBbits.LATB10
#define OUT_3 LATBbits.LATB11
#define OUT_4 LATBbits.LATB4
#define OUT_5 LATDbits.LATD0
#define OUT_6 LATBbits.LATB5
#define OUT_7 LATDbits.LATD1
#define OUT_8 LATBbits.LATB8

#define LED_TEST LATBbits.LATB12
#define LED_TEST_OFF 1
#define LED_TEST_ON 0

#define IN_1 PORTFbits.RF4
#define IN_2 PORTFbits.RF5
#define IN_3 PORTFbits.RF2
#define IN_4 PORTFbits.RF3
#define IN_5 PORTAbits.RA11
#define IN_6 PORTFbits.RF6
#define IN_7 PORTDbits.RD9
#define IN_8 PORTDbits.RD8


// Prototipo de la función

void InitInOut(void);
void InitTimer1(void);
void LedTest(void);
void CuentaMs(void);
void InitSerie(void);

//static char mensaje[512]="Hola, como estas\n\r"; //inicializa un array en memoria de programa
// No se puede modificar en ejecucion
unsigned int milisegundo,segundo;
unsigned char rebut,fl_rebut,array;

static char teclado[]={'P','P','0','S','0','0','0','0','\0'};

char Buf[80];
char * Receiveddata = Buf;


int main(void)
{
char contador;
unsigned long contador2;
InitInOut();
InitSerie();
InitTimer1();

contador=0;
contador2=0;

while (1) // bucle sin fin
{

if (fl_rebut)
{
contador2++;
contador=0;

sprintf(mensaje,"He recibido %4ld %s \n\r",contador2,Buf);
*Buf=NULL;
do
{
if (U1STAbits.UTXBF == 0)
{
U1TXREG=mensaje[contador];
contador++;
}
} while (mensaje[contador] != 0);
fl_rebut=0;
}
}
}


// Vamos a enviar caracteres sin interrupcion y no vamos a recibir
// La velocidad sera de 9600 bps

void InitSerie(void)
{
U1MODEbits.UARTEN=1; //Habilita la UART
U1MODEbits.USIDL=0; // No funciona en modo IDLE (Da igual pues es emodo no lo utilizamos)
U1MODEbits.ALTIO=1; // Usamos los pines alternativos en vez de los normales. Usamos  U1ATX y U1ARX
U1MODEbits.WAKE=0; // No permitir despertar al recibir un caracter
U1MODEbits.LPBACK=0; // No modo loopback (para pruebas)
U1MODEbits.ABAUD=0; // El IC1 no esta unido al puerto serie
U1MODEbits.PDSEL=0b00; //8 bits sin paridad
U1MODEbits.STSEL=0; // 1 bit de stop

U1STAbits.UTXISEL=0; // No utilizamos interrupciones para transmitir y nos da igual el valor de ese bit.
U1STAbits.UTXBRK=0; // No fijamos un nivel alto (break). Estamos en funcionamiento normal
U1STAbits.UTXEN=1; // Habilitada la transmisión (UARTEN debe estar a 1)
U1STAbits.URXISEL=0b00; // La interrupcion en recepcion se produce cuando llega un caracter
U1STAbits.ADDEN=0; // No se utiliza el modo de deteccion de direccion

U1BRG=194; // Segun la tabla para que a 30 MHz la velocidad sea 9600

IEC0bits.U1TXIE=0; // No queremos interrupcion en la transmision
IPC2bits.U1TXIP=0b000; //Prioridad minima de interrupcion
IEC0bits.U1RXIE=1; // Queremos interrupcion en la recepcion
IFS0bits.U1RXIF=0; // Borra el flag de interrupcion
IPC2bits.U1RXIP=0b010; //Prioridad baja de interrupcion
}


// Este es el nombre que debe llevar la función que atiende a
// la interrupción del Temporizador 1
void __attribute__((interrupt, auto_psv)) _U1RXInterrupt(void)
{

while (U1STAbits.URXDA)
{
//*teclado=U1RXREG;
( *(Receiveddata)++) = U1RXREG;
fl_rebut=1;
}
if(U1STAbits.OERR) U1STAbits.OERR=0; //si hay error de overflow es borrado
IFS0bits.U1RXIF=0;
}


// Funcion de inicializar las entradas y salidas
// Esta función está realizada para la placa de prácticas
void InitInOut(void)
{
LATB = 0b0000000000000000; // Prepara los pines del puerto B para que valgan 0 cuando sean salidas.
LATD = 0b0000000000000000; // Prepara los pines del puerto D para que valgan 0 cuando sean salidas
TRISB = 0b1110000011001111;   // Indica que pines del puerto Bson salidas=0 y cuales entradas=1
TRISD = 0b1111111111111100;  // Indica que pines del puerto Bson salidas=0 y cuales entradas=1
ADPCFG=0xFFFF; // Indica que no vamos a utilizar ningún pin como entrada analógica
}


// Este es el nombre que debe llevar la función que atiende a
// la interrupción del Temporizador 1
void __attribute__((interrupt, auto_psv)) _T1Interrupt(void)
{
CuentaMs(); // incrementa la variable milisegundo.
LedTest(); // Comprueba si el LED_TEST debe estar encendido o apagado
IFS0bits.T1IF = 0; // Borra el flag de interrupcion. Si no se borra no habrá
// más interrupciones de este temporizador
}

// Durante los primeros 50 ms de cada segundo enciende el led.
void LedTest(void)
{
if (milisegundo<50)
{
LED_TEST=LED_TEST_ON;
}
else
{
LED_TEST=LED_TEST_OFF;
}
}

// Incrementa milisegundos y si llega a 1000 lo pone a 0
void CuentaMs(void)
{
milisegundo++;
if (milisegundo>=1000)
{
milisegundo=0;
segundo++;
if (segundo>=10)
{
segundo=0;
}
}
}

void InitTimer1(void) // 1ms Frec = 20 MHz /2 * 8 = 80 MHz         /4 = 20 MHz = 50 ns
{
IFS0bits.T1IF = 0; // Borra el flag de interrupcion. Cuando de la vuelta el
// temporizador, se pondrá a 1
OSCCONbits.LPOSCEN=0; // No conectamos el oscilador externo
T1CONbits.TGATE=0; // No utilizamos el temporizador en el modo GATE
T1CONbits.TCKPS=0b00; // Preescaler = 1
T1CONbits.TSYNC=0; // No sincronizamos. Cuando contamos Tcy no hace falta
T1CONbits.TCS=0; // El temporizador usa el reloj interno Tcy
TMR1=0; // Ponemos el contador a 0. No es necesario
PR1=20000; // Cuando el temporizador llegue a 20000 se pondrá a 0
IPC0bits.T1IP = 7; // Fija la prioridad de la interrupción a 7 = máxima
IEC0bits.T1IE = 1; // Habilita la interrupción del temporizador 1
T1CONbits.TON = 1; // Activamos el temporizador
}


« Última modificación: 16 de Junio de 2009, 09:02:45 por ale210 »

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: Ayuda con dsPIC30F4013 y envio de datos por rs232
« Respuesta #1 en: 18 de Junio de 2009, 20:14:45 »
Hola!

No entiendo muy bien el problema ...

De que tipo es la variable mensaje?? ... veo que esta declarada como static char pero dentro de un comentario ....

Saludos!
Control Automático, DSP & Microcontroladores

Desconectado sansanoloko

  • PIC10
  • *
  • Mensajes: 48
Re: Ayuda con dsPIC30F4013 y envio de datos por rs232
« Respuesta #2 en: 22 de Junio de 2009, 12:23:55 »
Holas ale210

En este momento estoy trabajando con el dsPIC-dem2 de la Microchip, con el mismo micro que tienes tu. En mi caso, para no reinventar la rueda, tomé el programa de ejemplo que trae el disco que acompaña al kit, el cual utiliza conversion ADC, comunicación SPI, interrupciones por timer y transmision por RS232 (por interrupción), todo al mismo tiempo!!
Tomé ese código, y empecé a jugar con él, modificando parámetros, variables, etc. En si es muy sencillo y fácil de entender, en especial si sabes programar bien en C, yo apenas estoy aprendiendo recien y algo le entiendo.
Busca ese codigo de ejemplo en las páginas de la Microchip, sino avisame para postearlo aquí.

Saludos a quienes nos leen.


 

anything