TODOPIC
Microcontroladores PIC => dsPIC => Mensaje iniciado por: PIPE09 en 10 de Marzo de 2009, 17:51:28
-
bueno pues leyendo el post anterior de comunicacion UART logramos despejar muchas dudas q teniamos, y sin embargo.. al probar el codigo casi tal cual como estaba en el post anterior, al compilar el programa, este presenta errores y parecen tener que ver con la libreria UART.H asi que en el proyecto tambien agregamos los library files para este pic
El programa completo es el siguiente.. y la idea es simplemente hacer una prueba de comunicacion UART.
/* Archivos cabecera para las funciones y definiciones */
#include <p30f4011.h>
#include <uart.h>
#define FCY 30000000
/* Prototipos de funciones*/
void tiempo(void);
/************* START OF MAIN FUNCTION ***************/
int main ( void ){
unsigned int baudvalue;
unsigned int U1MODEvalue;
unsigned int U1STAvalue;
char TEXTO[] = {'H','e','l','l','o',' ','U','A','R','T','\n','\r','\0'},
CloseUART1();
ConfigIntUART1( UART_RX_INT_DIS &
UART_RX_INT_PR6 &
UART_TX_INT_DIS &
UART_TX_INT_PR2);
U1MODEvalue = UART_EN &
UART_IDLE_CON &
UART_DIS_WAKE &
UART_DIS_LOOPBACK &
UART_DIS_ABAUD &
UART_NO_PAR_8BIT &
UART_1STOPBIT &
UART_RX_TX;
U1STAvalue = UART_INT_TX_BUF_EMPTY &
UART_TX_PIN_NORMAL &
UART_TX_ENABLE &
UART_INT_RX_CHAR &
UART_ADR_DETECT_DIS &
UART_RX_OVERRUN_CLEAR;
baudvalue =390; //=30000000/(16*BaudRate)-1
OpenUART1(U1MODEvalue, U1STAvalue, baudvalue);
TRISDbits.TRISD0=0;
while(1){
LATDbits.LATD0=1;
putsUART1 ((unsigned int *)TEXTO);
while(BusyUART1());
tiempo();
LATDbits.LATD0=0;
tiempo();
}
}
/*Funcion delay paraq tiempo*/
void tiempo(void){
int unsigned contador;
int unsigned cont;
for(cont=1;cont<20;cont++)
for(contador=1;contador<0xFFFF;contador++);
return;
}
y al compilar, presenta los siguientes errores.. todos de las funciones de UART.H
Clean: Deleting intermediary and output files.
Clean: Done.
Executing: "C:\Archivos de programa\Microchip\MPLAB C30\bin\pic30-gcc.exe" -mcpu=30F4011 -c -x c "bla.c" -o"bla.o" -g
bla.c: In function 'main':
bla.c:26: error: conflicting types for 'CloseUART1'
c:/archivos de programa/microchip/mplab c30/bin/bin/../../support/peripheral_30F_24H_33F/uart.h:299: error: previous declaration of 'CloseUART1' was here
bla.c:40: error: 'UART_RX_TX' undeclared (first use in this function)
bla.c:40: error: (Each undeclared identifier is reported only once
bla.c:40: error: for each function it appears in.)
Halting build on first failure as requested.
BUILD FAILED: Tue Mar 10 14:49:38 2009
por favor cualquier ayuda serviria de MUCHOO!
-
ya logramos compilar el programa pero al conectar a la RS232 no sale nada el la hyperterminal... pensamos q el problema puede ser el baudrate q esta calculado con un FCY de 30M.. y entonces ahora la pregunta es: es necesario conectar un cristal de ese valor???? como me aseguro de que el oscilador interno del 30F4011 se encuentre en ese valor.. y q lo este usando???
-
que tal PIPE09, pues por ahora lo que puedo hacer es ponerte un codigo para el mismo micro que estas utilizando, lo probe en su tiempo y funciona, prueba a compilarlo y ver lo que sucede, esta hecho para oscilador interno.
#define __dsPIC30F4011__
#include <p30f4011.h>
// _FOSC(CSW_FSCM_OFF & HS);
_FOSC( CSW_FSCM_OFF & FRC_PLL16);
_FWDT(WDT_OFF);
_FBORPOR(PBOR_ON & PWRT_OFF & MCLR_DIS);
#include <uart.h>
#include <stdio.h>
//////////////////////////////////////////////////////////
void DelayUs(unsigned int v) { // pierde 8+2
while(v != 0){
asm("nop");asm("nop");
asm("nop");asm("nop");
asm("nop");asm("nop");
asm("nop");asm("nop");
asm("nop");asm("nop");
asm("nop");asm("nop");
asm("nop");asm("nop");
asm("nop");asm("nop");
asm("nop");asm("nop");
asm("nop");asm("nop");
asm("nop");asm("nop");
asm("nop");asm("nop");
asm("nop");asm("nop");
v--;
}
}
//////////////////////////////////////////////////////////
void DelayMs(unsigned int v) {
//////////////////////////////////////////////////////////
while (v != 0 ){ DelayUs(1000); v--;}
}
//////////////////////////////////////////////////////////
void __attribute__((__interrupt__)) _U1TXInterrupt(void)
{
IFS0bits.U1TXIF = 0;
}
//////////////////////////////////////////////////////////
void InicializaUART1()
{
unsigned int baud;
unsigned int U1MODEvalue;
unsigned int U1STAvalue;
CloseUART1();
ConfigIntUART1(UART_RX_INT_DIS & UART_RX_INT_PR0 & UART_TX_INT_DIS & UART_TX_INT_PR0);
U1MODEvalue = UART_EN & UART_IDLE_CON & UART_DIS_WAKE & UART_DIS_LOOPBACK &
UART_DIS_ABAUD & UART_NO_PAR_8BIT & UART_1STOPBIT & UART_RX_TX;
U1STAvalue = UART_INT_TX_BUF_EMPTY & UART_TX_PIN_NORMAL & UART_TX_ENABLE &
UART_INT_RX_CHAR & UART_ADR_DETECT_DIS & UART_RX_OVERRUN_CLEAR;
baud=194;//9600 194 38400 48
OpenUART1(U1MODEvalue, U1STAvalue, baud);
}
//////////////////////////////////////////////////////////
void InicializaUART2()
{
unsigned int baud;
unsigned int U1MODEvalue;
unsigned int U1STAvalue;
CloseUART2();
ConfigIntUART2(UART_RX_INT_DIS & UART_RX_INT_PR0 & UART_TX_INT_DIS & UART_TX_INT_PR0);
U1MODEvalue = UART_EN & UART_IDLE_CON & UART_DIS_WAKE & UART_DIS_LOOPBACK &
UART_DIS_ABAUD & UART_NO_PAR_8BIT & UART_1STOPBIT & UART_RX_TX;
U1STAvalue = UART_INT_TX_BUF_EMPTY & UART_TX_PIN_NORMAL & UART_TX_ENABLE &
UART_INT_RX_CHAR & UART_ADR_DETECT_DIS & UART_RX_OVERRUN_CLEAR;
baud=194;//9600
OpenUART2(U1MODEvalue, U1STAvalue, baud);
}
//////////////////////////////////////////////////////////
int main ()
{
TRISB=0xFFFF;
TRISBbits.TRISB1=0;
ADPCFG=0xFFFF;
InicializaUART2();
InicializaUART1();
while(1)
{
WriteUART2(0x42);
WriteUART1(0x42);
printf ("A Chinga \n\r");
LATBbits.LATB1 = 1;
DelayMs(100);
LATBbits.LATB1 = 0;
DelayMs(100);
WriteUART1(0x45);
WriteUART2(0x45);
}
}
pues si no te funciona ya veremos paso a paso que es lo que sucede, un saludo.
-
Gracias por la respuesta.. ya logramos compilar el programa.. y agregamos la instruccion (U1STAbits.UTXEN=1) para habilitar el pin de transmision.. y con este codigo podemos hacer DEBUG desde el ICD2.. pero al probar el programa, no vemos cambios de voltaje en el pin al utilizar el osciloscopio.. y obviamente no aparece nada en la hyperterminal...
ALGUNA IDEA?