#include <16f877A.h>
#FUSES XT,NOWDT
#USE delay (clock = 4M)
#USE RS232(UART1,baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#BYTE TRISB = 0x86
#BYTE PORTB = 0x06
#define LCD_ENABLE_PIN PIN_B0
#define LCD_RS_PIN PIN_B1
#define LCD_RW_PIN PIN_B2
#define LCD_DATA4 PIN_B4
#define LCD_DATA5 PIN_B5
#define LCD_DATA6 PIN_B6
#define LCD_DATA7 PIN_B7
#include <lcd.c>
char ch;
#int_rda // Interrupción por dato recibido por rs232
void serial_isr(){
ch = getc();
putchar(ch);
}
void main(){
// Habilito las interrupciones
enable_interrupts(GLOBAL);
enable_interrupts(INT_RDA);
lcd_init();
lcd_gotoxy(1,1);
lcd_putc ("Prueba RS232");
while(true){
lcd_gotoxy(1,2);
printf(lcd_putc, "ch = %c", ch);
}
}
Con el cristal que estás usando ponle mejor HS y no XT en el fuse y prueba.
Más bien menos a 4 Mhz es cuando hay que usar XT. Para 4 Mhz puedes usar cualquiera, yo prefiero HS.
Otra prueba que puedes hacer es eliminar las dos resistencias pullup que has puesto a los pines tx y rx del micro. La usart no los necesita y puede darte error.
Cuando recibas un byte inmediatamente lee el registro RCSTA
Mira si uno de los bits 1 y 2 se ha puesto a 1. Especialmente el bit 2 (Frame error)
Si es así, puede que el macro #use rs232 esté configurando SPBRG para modo BRGH = 0
Es que así el error es casi un 7%. Muchísimo.
Si puedes poner manualmente en tu main un valor al bit TXSTA.BRGH = 1 y al registro SPBRG = 129
Prueba con esa configuración. De ese modo el error sería un 0,16
Todo esto entiendo que debería hacerlo bien el compilador mediante el macro #use rs232 pero ante la duda.
Quita lo de UART1 de La macro , no es necesario ponerlo en un micro que solo tiene una uart. Es por ir descartando.
Que tal javalenciab90,
He probado tu código tal como lo tienes y funciona perfectamente en mi caso. He realizado la simulación en proteus sin ningún problema. Es probable que lo que tengas es un error en el hardware. Asegúrate que tus conexiones estén correctas. Que tu conversor USB a serial funcione correctamente.
Saludos,
elreypic.
¿Qué software estás usando para enviar el dato serial desde la computadora? ¿Hyperterminal?
¿Cuál es la configuración que estás usando para ese software?
elreypic
#include <16f877A.h>
#FUSES XT,NOWDT
#USE delay (clock = 4M)
#USE RS232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#BYTE TRISB = 0x86
#BYTE PORTB = 0x06
#define LCD_ENABLE_PIN PIN_B0
#define LCD_RS_PIN PIN_B1
#define LCD_RW_PIN PIN_B2
#define LCD_DATA4 PIN_B4
#define LCD_DATA5 PIN_B5
#define LCD_DATA6 PIN_B6
#define LCD_DATA7 PIN_B7
#include <lcd.c>
char valor;
#int_rda // Interrupción por dato recibido por rs232
void serial_isr(){
valor = getc();
putc(valor);
}
void main(){
TRISB = 0x00;
// Habilito las interrupciones
enable_interrupts(GLOBAL);
enable_interrupts(INT_RDA);
lcd_init();
lcd_gotoxy(1,1);
lcd_putc ("Prueba RS232");
while(true){
lcd_gotoxy(1,2);
printf(lcd_putc, "ch = %c", valor);
delay_ms(2000);
}
}
Yo es que los simuladores no los he usado jamás por que no. Prefiero siempre usar tarjetas de desarrollo, ni siquiera protoboard.
Yo es que los simuladores no los he usado jamás por que no. Prefiero siempre usar tarjetas de desarrollo, ni siquiera protoboard.
Yo también detesto los simuladores, no los he utilizado en mi vida, donde se ponga la placa real con tu Debug, no hay nada mejor.
En mi caso, no uso protoboards, pero tampoco me gustan las tarjetas de desarrollo, salvo el Teensy que lo he usado en algunos casos.
Prefiero diseñar la placa y enviar a fabricar el PCB a los chinos, por unos pocos dólares tienes la placa en tu casa en una semana. Muchas veces, por comodidad, he pedido placas que solo iban a servir para pruebas, aunque luego vayan al cajón de los recuerdos o a la basura. No vale la pena liarse con una protoboard con mil cablecitos o con una tarjeta de desarrollo que también lleva su curro.
Bueno gracias a todos por la colaboración, lamentablemente no pude hacer la comunicación serial.
// CONFIG
#pragma config FOSC = EXTRC // Oscillator Selection bits (RC oscillator)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = ON // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3/PGM pin has PGM function; low-voltage programming enabled)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
#define _XTAL_FREQ 4000000
#include <xc.h>
#include "config.h"
void main(void) {
char x = 65;
TRISCbits.TRISC6 = 0;
PORTC = 0;
//Configuracion Serie
TXSTAbits.TX9 = 0; // Modo 8-bits
TXSTAbits.TXEN = 1; // habilito transmision
TXSTAbits.SYNC = 0; // Tx asincrona
TXSTAbits.BRGH = 0; // Tx Lenta
RCSTAbits.SPEN = 1; // Habilito puerto serie
// Baud rate
SPBRG = (unsigned char) (((_XTAL_FREQ / 9600) / 64) - 1); //baudios = 9600
while(1){
for(x=65; x<=90; x++){
TXREG = x;
while(TXSTAbits.TRMT == 0); // Mientras este lleno buffer
__delay_ms(500);
}
}
return;
}
Bit SPEN (RCSTA<7>) and bits TRISC<7:6> have to be set in order to configure pins RC6/TX/CK and RC7/RX/DT as the Universal Synchronous Asynchronous Receiver Transmitter.
Un par de cosas a corregir:Código: C
#pragma config FOSC = EXTRC // Oscillator Selection bits (RC oscillator)
Pero.... estas usando un cristal.. XTAL por los ( 4Mhz ) y por las fotos que veo.
Otras cosa:CitarBit SPEN (RCSTA<7>) and bits TRISC<7:6> have to be set in order to configure pins RC6/TX/CK and RC7/RX/DT as the Universal Synchronous Asynchronous Receiver Transmitter.
En le datasheet tenes una tablas, y si observas para 4Mhz, es mejor usar el BGRH = 1, ya que posee menos error ( 0.16% frente a los 7% de error que tenias con BGRH = 0)Código: C
#define _XTAL_FREQ 4000000 #include <xc.h> #include "config.h" void main(void) { TRISCbits.TRISC6 = 1; // Esto no tiene sentido, ya que de por si esta en 1 TRISCbits.TRISC7 = 1; //Configuracion Serie // Baud rate SPBRG = (unsigned char) (((_XTAL_FREQ / 9600) / 16) - 1); //baudios = 9600, Deberia cargarse con el numero 25 TXSTAbits.BRGH = 1; // Baud Rate /16 TXSTAbits.TX9 = 0; // Modo 8-bits TXSTAbits.SYNC = 0; // Tx asincrona TXSTAbits.TXEN = 1; // habilito transmision RCSTAbits.SPEN = 1; // Habilito puerto serie while(1){ char x; for(x='A'; x<='Z'; x++){ TXREG = x; while(!TXSTAbits.TRMT); // Mientras este lleno buffer __delay_ms(500); } } }
#define _XTAL_FREQ 8000000
#include <xc.h>
#include "config.h"
void main(void) {
OSCCON = 0x71;
// Baud rate
BAUDCTLbits.BRG16 = 0;
TXSTAbits.BRGH = 1; // Tx Rapida
SPBRG = 51; //baudios = 9600
//Configuracion Serie
TXSTAbits.TX9 = 0; // Modo 8-bits
TXSTAbits.SYNC = 0; // Tx asincrona
TXSTAbits.TXEN = 1; // habilito transmision
RCSTAbits.SPEN = 1; // Habilito puerto serie
while(1){
char x;
for(x='A'; x<='Z'; x++){
TXREG = x;
while(TXSTAbits.TRMT == 0); // Mientras este lleno buffer
__delay_ms(1000);
}
}
return;
}
Pero en la parte física no me da aún. Salen así ej: AAAAAAAAAAAABCDþþÑGHIJKÿPQRSXYZEFGLMNSTUZ Sale eso tal cual, en uno de los intentos que realicé. Voy a probar otras velocidades a ver que tal, quiero descartar el modulo rs232 igualmente probando otro que compré. estaré avisando.
((:-))Gracias