• Sábado 21 de Diciembre de 2024, 09:55

Autor Tema:  Comunicacion En C Pic16f877  (Leído 3129 veces)

yaneth84

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Comunicacion En C Pic16f877
« en: Miércoles 7 de Mayo de 2008, 17:06 »
0
: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

  • Miembro MUY activo
  • ***
  • Mensajes: 259
  • Nacionalidad: mx
    • Ver Perfil
Re: Comunicacion En C Pic16f877
« Respuesta #1 en: Martes 13 de Mayo de 2008, 19:49 »
0
algunas observaciones

veo que solo envias el dato una sola vez...  &lt;_&lt; 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

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Comunicacion En C Pic16f877
« Respuesta #2 en: Martes 13 de Mayo de 2008, 20:05 »
0
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;
    }
}
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.

allisap

  • Miembro MUY activo
  • ***
  • Mensajes: 259
  • Nacionalidad: mx
    • Ver Perfil
Re: Comunicacion En C Pic16f877
« Respuesta #3 en: Martes 13 de Mayo de 2008, 23:01 »
0
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.

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

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Comunicacion En C Pic16f877
« Respuesta #4 en: Martes 13 de Mayo de 2008, 23:14 »
0
:)

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

allisap

  • Miembro MUY activo
  • ***
  • Mensajes: 259
  • Nacionalidad: mx
    • Ver Perfil
Re: Comunicacion En C Pic16f877
« Respuesta #5 en: Miércoles 14 de Mayo de 2008, 00:27 »
0
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,  &lt;_&lt;

en el  datasheet en la seccion de los timer´s  ahi puedes encontrar la forma en como se configuran y su uso :D