Programación Específica > Programación en C
Comunicacion En C Pic16f877
yaneth84:
:D hola a todos
Alguien puede revisar este codigo, que puede estar mal
YA lo hice en asm si funciona, pero en c con interrupciones...
#include<pic.h>
char BUFFER;
void interrupt TX(void);
void main()
{
//--------CONFIG PORTS-------------
TRISC=0b10000000;
TRISD=0;
PORTC=0;
PORTD=0;
//--------CONFIG RS232-------------
TXSTA=0B00100110;//TXSTA bit<5;TXEN>=1; TRASMISION HABILITADA
//TXSTA bit<4;SYNC>=0; MODO ASYNCRONO
//TXSTA bit<2;BRGH>=1; HIGH SPEED
//TXSTA bit<1;TRMT>=1; TSR EMPTY
SPBRG=25; //BAUD RATE 9600bps
SPEN=1; //RCSTA bit<7;SPEN>=1; PORT SERIAL HABILITADO
//-------config interrupciones-----
INTCON=0B11000000; //INTCON bit<7;GIE>=1; HABILITA iNTERRUP GENERAL
//INTCON bit<6;PEIE>=1; HABILITA INTERRUPCIONES //PERIFERICOS
TXIE=1; //PIE1 bit<4;TXIE>=1; HABILITA LA INTERRUPCION USART TRANSMIT
TXIF=0; //PIR1 bit<4;TXIF>=1; FLAG, BUFFER LLENO;
//----------PROGRAM----------------
BUFFER='B';
PORTD=BUFFER;
TXREG=BUFFER;
}
void interrupt TX(void)
{
TXIF=0; //YA SE ENVIO EL DATO? -->tsr estará VACIO, Bit TRMT estará en 1;
}
allisap:
algunas observaciones
veo que solo envias el dato una sola vez... <_< creo que seria mejor enviar datos constantemente para probar la comunicación preferentemente con un timer ;)
y la recepcion de datos pruebala con la interrupcion (no la transmisión)
intenta y luego comenta que paso
yaneth84:
Hola
Gracias por responder antes de todo
Dudas:
1.-La comunicacion la hago constantemente puese el envio en un ciclo While; but
A que te refieres con:... comunicación preferentemente con un timer.
2.-En que casos me convendria utilizar la interrupcion de la trasmision.
3.-Solucione el problema de envio limpiando el TXREG, DE LO CONTRARIO NO ME FUNCIONA, pero no entiendo porque tiene que ser asi, ya que no le veo la necesidad de hacerlo.
void interrupt TX(void)
{
if (TXIF)
{
TXIF=0; //YA SE ENVIO EL DATO? -->tsr estará VACIO, Bit TRMT estará en 1;
TXREG=0;
}
}
allisap:
1.-lo que pasa es que en el codigo que publicaste no esta el while... aunque si esta en el pro.c....
--- Citar ---A que te refieres con:... comunicación preferentemente con un timer.
--- Fin de la cita ---
me refiero a utilizar algun temporizador que se encargara de enviar los datos a una razon de tiempo determinada
2. no veo algun caso de usar la interrupcion de transmision.. porque esta solo la necesitarias para saber cuando termino de transmitir pero tambien podrias usar un while algo asi como:
while (!txif){ // espera hasta que la bandera cambie
}
yaneth84:
:)
Con respecto del uso algun temporizador que se encargara de enviar los datos a una razon de tiempo determinada.
1.- Yo defino eso con los bits <7,ADCS1>,<6,ADCS0> del registro ADCON0 Y
<6,ADCS2> DEL registro ADCON1
2.- Mi duda es entoces;
Te refieres a reemplazar este generador de reloj. O no?
3.- Si es asi, en que casos o aplicaciones se debe de hacer
4.-Y como se debe de implementar, o en que parte talvez del data sheet del 16f877 encuentro mas informacion
Navegación
[#] Página Siguiente
Ir a la versión completa