#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
__CONFIG( FOSC_XT & WDTE_OFF & PWRTE_ON & BOREN_ON );
#define _XTAL_FREQ 4000000 // Velocidad clock en Hz
#define LONGITUD_CADENA_DATOS_USART 32
near struct Datos_USART {
unsigned int PosTX;
unsigned int PosRX;
char TX[LONGITUD_CADENA_DATOS_USART];
char RX[LONGITUD_CADENA_DATOS_USART];
} datosUSART;
/******************************************************************************
* USART
******************************************************************************/
void activar_USART_TX(void)
{
TRISCbits.TRISC6 = 0; // RC6/TX salida
TRISCbits.TRISC7 = 1; // RC7/RX entrada TXSTAbits.BRGH = 1; // Baud Rate high speed
SPBRG = 0b00001100; // 12 - FOSC 4 MHz 19.200 (19.231) 0.16% Error
TXSTAbits.SYNC = 0; // Modo asincrónico
RCSTAbits.SPEN = 1; // Serial port enabled
//PIE1bits.TXIE = 1; // Enables the USART transmit interrupt
RCSTAbits.RX9 = 0; // Selects 8-bit reception
TXSTAbits.TX9 = 0; // Selects 8-bit transmission
TXSTAbits.TXEN = 1; // activa la transmisión
}
//------------------------------------------------------------------------------
void desactivar_USART_TX(void)
{
TXSTAbits.TXEN = 0; // desactiva la transmisión
}
/******************************************************************************
* Funciones generales
******************************************************************************/
/* Transmisión de datos */
void enviar_datos(void)
{
activar_USART_TX();
for ( char i=0; i<20; i++ )
{
TXREG = datosUSART.TX[ i ]; // carga el dato a enviar
while ( PIR1bits.TXIF == 0 ) ; // 1 = The USART transmit buffer is empty
}
desactivar_USART_TX();
}
/******************************************************************************
* Atención de las interrupciones
******************************************************************************/
/* Escucha todas las interrupciones y las deriva */
void interrupt interrupciones(void)
{
if ( INTCONbits.INTF )
{
enviar_datos();
INTCONbits.INTF = 0;
}
}
/******************************************************************************
* Configuración e inicialización del PIC
******************************************************************************/
void configurar_RB0(void)
{
TRISBbits.TRISB0 = 1; // RB0 como entrada
INTCONbits.INTE = 1; // Activa interrupción en RB0
}
//------------------------------------------------------------------------------
void activar_interrupciones_globales(void)
{
OPTION_REGbits.INTEDG = 1;
INTCONbits.GIE = 1; // Enables all unmasked interrupts
INTCONbits.PEIE = 1; // Enables all unmasked peripheral interrupts
}
//------------------------------------------------------------------------------
void inicializar_variables(void)
{
datosUSART.PosRX = 0;
datosUSART.PosTX = 0;
for ( char i=0; i<LONGITUD_CADENA_DATOS_USART; i++)
{
datosUSART.RX[i] = 0;
datosUSART.TX[i] = 0;
}
datosUSART.TX[ 0 ] = 0b01000001; // A
datosUSART.TX[ 1 ] = 0b01000010; // B
datosUSART.TX[ 2 ] = 0b01000011; // C
datosUSART.TX[ 3 ] = 0b01000100; // D
datosUSART.TX[ 4 ] = 0b01000101; // E
datosUSART.TX[ 5 ] = 0b01000110; // F
datosUSART.TX[ 6 ] = 0b01000111; // G
datosUSART.TX[ 7 ] = 0b01001000; // H
datosUSART.TX[ 8 ] = 0b01001001; // I
datosUSART.TX[ 9 ] = 0b01001010; // J
datosUSART.TX[ 10 ] = 0b01001011; // K
datosUSART.TX[ 11 ] = 0b01001100; // L
datosUSART.TX[ 12 ] = 0b01001101; // M
datosUSART.TX[ 13 ] = 0b01001110; // N
datosUSART.TX[ 14 ] = 0b01001111; // O
datosUSART.TX[ 15 ] = 0b01010000; // P
datosUSART.TX[ 16 ] = 0b01010001; // Q
datosUSART.TX[ 17 ] = 0b01010010; // R
datosUSART.TX[ 18 ] = 0b01010011; // S
datosUSART.TX[ 19 ] = 0b01010100; // T
TXREG = 0;
}
/******************************************************************************
* Main
******************************************************************************/
void main(void)
{
configurar_RB0();
inicializar_variables();
activar_interrupciones_globales();
while ( 1 ) { ; }
}
(char) x (int) 120
(char) x (int) 120
(char) þ (int) -2
(char) x (int) 120
(char) (int) 30
(char) x (int) 120
(char) þ (int) -2
(char) x (int) 120
(char) (int) 30
(char) x (int) 120
(char) à (int) -32
(char) x (int) 120
(char) þ (int) -2
(char) x (int) 120
(char) à (int) -32
(char) x (int) 120
(char) (int) 30
(char) ? (int) 63
(char) x (int) 120
(char) þ (int) -2
(char) ? (int) 63
(char) x (int) 120
(char) (int) 30
(char) ? (int) 63
(char) x (int) 120
(char) þ (int) -2
(char) x (int) 120
(char) (int) 30
(char) ? (int) 63
(char) x (int) 120
(char) (int) 15
(char) À (int) -64
(char) x (int) 120
(char) à (int) -32
(char) x (int) 120
(char) ð (int) -16
(char) ? (int) 63
(char) x (int) 120
(char) à (int) -32
(char) x (int) 120
(char) à (int) -32
(char) x (int) 120
(char) ÿ (int) -1
(char) ? (int) 63
(char) x (int) 120
(char) à (int) -32
(char) ? (int) 63
(char) x (int) 120
(char) x (int) 120
(char) (int) 30
(char) x (int) 120
(char) à (int) -32
(char) x (int) 120
(char) þ (int) -2
Hola fantaxmax,
gracias por responder,
acabo de instalar el CCS v4.109, el código que me pasaste parece muy simple, voy a probar y te cuento,
saludos
(char) ¹ (int) 185
(char) ¬ (int) 172
(char) P (int) 80
(char) ¨ (int) 168
(char) ( (int) 40
(char) T (int) 84
(char) (int) 148
(char) Ô (int) 212
(char) (int) 20
(char) * (int) 42
(char) J (int) 74
(char) j (int) 106
(char) (int) 138
(char) ª (int) 170
(char) Ê (int) 202
(char) ê (int) 234
(char)
(int) 10
(char) (int) 21
(char) % (int) 37
(char) 5 (int) 53
(char) E (int) 69
(char) U (int) 85
(char) e (int) 101
(char) u (int) 117
(char)
(int) 133
(char) ý (int) 253
(char) (int) 173
(char) m (int) 109
(char) P (int) 80
(char) ¨ (int) 168
(char) ( (int) 40
(char) T (int) 84
(char) (int) 148
(char) Ô (int) 212
(char) (int) 20
(char) * (int) 42
(char) J (int) 74
(char) j (int) 106
(char) (int) 138
(char) ª (int) 170
(char) Ê (int) 202
(char) ê (int) 234
(char)
(int) 10
(char) (int) 21
(char) % (int) 37
(char) 5 (int) 53
(char) E (int) 69
(char) U (int) 85
(char) e (int) 101
(char) u (int) 117
(char)
(int) 133
(char) ý (int) 253probablemente sea el max232, voy a pasarlo a un pic, pero no tendria como probarlo con la interrupcion, pero es basicamente lo mismo, aunque no deberia tener problemas al transmitir, yo he usado la funcion rs232 del ccs siempre y nunca me ha fallado, prueba el circuito en el proteus, y si transmite correctamente la cadena es el max232, si no sabes usar el proteus, me preguntas nomas a travez de mi correo, bueno te cuento luego como me fue.con una resistencia de 10k a masa y un cablecito de 1 hilo a los 5v (o 3.5)
También pueden ocurrir esos errores de transmisión con emisor y receptor no están configurados a la misma velocidad.es el de Microchip http://www.microchip.com/pagehandler/en-us/family/mplabx/ (http://www.microchip.com/pagehandler/en-us/family/mplabx/)
XC8 es la nueva versión de HiTech. Busca en el foro que hace un tiempo subi unas rutinas de UART y funcionaban muy bien. Las he simulado en Proteus, probado entre PICs y también de PIC a PC tanto en Windows como en Linux.
Revisa de que calculaste el baudrate en el modo alta velocidad pero no se establece en la configuración. ;-)
TXSTAbits.BRGH = 1; // Baud Rate high speed
SPBRG = 0b00001100; // 12 - FOSC 4 MHz 19.200 (19.231) 0.16% Errorprobablemente sea el max232, voy a pasarlo a un pic, pero no tendria como probarlo con la interrupcion, pero es basicamente lo mismo, aunque no deberia tener problemas al transmitir, yo he usado la funcion rs232 del ccs siempre y nunca me ha fallado, prueba el circuito en el proteus, y si transmite correctamente la cadena es el max232, si no sabes usar el proteus, me preguntas nomas a travez de mi correo, bueno te cuento luego como me fue.con una resistencia de 10k a masa y un cablecito de 1 hilo a los 5v (o 3.5)