SoloCodigo
Programación Específica => Microcontroladores => Programación en C => Mensaje iniciado por: yaneth84 en Miércoles 7 de Mayo de 2008, 17:06
-
: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;
}
-
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
-
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;
}
}
-
1.-lo que pasa es que en el codigo que publicaste no esta el while... aunque si esta en el pro.c....
A que te refieres con:... comunicación preferentemente con un timer.
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
}
-
:)
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
-
ADCON0 y ADCON1 ? :blink:
te estas confundiendo el ADCON0 y ADCON1 controlan el reloj del modulo del convertidor analogico a digital que no tiene nada que ver con la velocidad a la transmites datos por el serial, <_<
en el datasheet en la seccion de los timer´s ahi puedes encontrar la forma en como se configuran y su uso :D