Hola
Estoy con el proyecto de final de carrera y tengo que usar el PIC16F877, solamente tiene una UART y yo necesito dos, asi que he tenido que implementar una por software.
Hoy la he estado probando con el hyperterminal, enviar si que envía, porque antes de este codigo probe un programa aunque el hyperterminal no me mostraba exactamente lo que le envio ( yo le envio 10101010 y el hyperterminal recibía 101010, supongo que sera por la velocidad o algo relacionado ), pero el problema ha llegado cuando he hecho este codigo, no se si estara bien implementada la UART, a ver si me podeis echar una mano porque ya no se si es problema del hyperterminal o del programa.
Para enviar una 'A' por el hyperterminal simplemente es Shift+A y luego ENTER ¿no?, se que parece trivial pero quiero descartar las tonterias que te puedes tirar mucho tiempo mirando que es lo que falla...
Debajo del codigo dejo un poco la explicacion del codigo.
El codigo es este ( compilador Hi tech ):
#include "htc.h"
#include "stdio.h"
#define _XTAL_FREQ 10000000
__CONFIG(0x3F72);
int i=0;
char recibido=0;
char auxiliar=0;
void interrupt isr(void){
if(INTF==1){
INTF=0;
INTE=0;
__delay_us(100);
for(i=0;i<8;i++){
if(RB0)recibido|= 0x80;
recibido>>1;
__delay_us(100);
}
if(recibido=='A'){
auxiliar='O';
RB1=0;
__delay_us(100);
for(i=0;i<8;i++){
if(auxiliar&0x01){
RB1=1;
}else{
RB1=0;
}
auxiliar>>1;
__delay_us(100);
}
RB1=1;
}else{
auxiliar='P';
RB1=0;
__delay_us(100);
for(i=0;i<8;i++){
if(auxiliar&0x01){
RB1=1;
}else{
RB1=0;
}
auxiliar>>1;
__delay_us(100);
}
RB1=1;
}
}
INTE=1;
}
void main()
{
GIE=1;
PEIE=1;
INTF=0;
INTEDG=0;
INTE=1;
RB1=1;
TRISB=0b11111101;
TRISC=0b10111111;
BRGH=1;
TXEN=1;
SPBRG=64;
RP0=0;
SPEN=1;
CREN=1;
while(1);
}
Vale, pues he cogido la interrupcion en el pin RB0 para cada flanco de bajada, para que de esta manera simule a la UART, cuando le llegue el '0' de START empiezo a recoger el caracter. También tengo cosas activadas de la otra UART pero de momento la dejaremos de lado me interesa que funcione la UART por software por probar la comunicacion simplemente.
Bueno, RB0 como he dicho es mi "RX" y RB1 mi "TX". Estoy usando la velocidad típica, 9600 baudios, serían 104 us de retardo entre bit y bit pero como he escuchado que no es bueno acercarse tanto al valor por eso he puesto 100us.
El programa es sencillo, si lo que he recibido es una 'A' devuelvo 'O' y sino he recibido una 'A' pues envío una 'P'. Donde mas dudas tengo es en los operadores de bits, a ver si algun experimentado en este tipo de operadores me echa un cable confirmandome que esta bien o que esta mal jeje. Y lo de como enviar por el hyperterminal... que puede parecer una tonteria pero a veces los fallos mas tontos son los mas puñeteros, para enviar la 'A' simplemente he puesto en el hyperterminal A y he pulsado enter. No me ha devuelto nada al hyperterminal.
He tenido en cuenta que primero se envia/recibe el bit menos significativo.
A ver si me podeis echar un cable una vez mas ya que estoy algo agobiado con el proyecto.
Un saludo y muchas gracias de antemano
EDITO: Me acabo de dar cuenta que las rotaciones solamente pongo "recibido>>1;", ¿con eso basta o hace falta poner "recibido=recibido>>1;"? Mañana lo probare a ver hoy ya no me da tiempo...