Autor Tema: 16F628A no escucha en comunicacion Serie.  (Leído 3479 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado novatopic

  • PIC10
  • *
  • Mensajes: 3
16F628A no escucha en comunicacion Serie.
« en: 11 de Junio de 2011, 23:53:22 »
Estoy intentando que un Pic 16f628A se comunique con el Pc, he utilizado un max 232 para convertir la señal y un programa creado con visual basic 6 para enviar los datos.
He probado el circuito y el programa utilizando proteus y funciona perfecto, pero al armar el circuito el PIC no reaciona.
Hice puente entre los pines 2 y 3 del cable que utilizo y recibo lo mismo que transmito por lo tanto el programa envia correctamente y el cable esta perfecto. Tambien conecte los pines 11 y 12 del max 232 y nuevamente recibo lo mismo que envio, por lo tanto el max232 esta convirtiendo los niveles 232 a TTL correctamente. He revisado el circuito decenas de veces asi que no creo que sea algo mal conectado. Pense que podria ser el pic que estubiera dañado, pero probe con varios y siguen sin reaccionar, por lo tanto concluyo que el fallo esta en el programa, lamentablemente estoy empezando a programar en C (antes programaba en Basic)  asi que no puedo estar seguro si el codigo esta bien.
Este es el codigo:

Código: [Seleccionar]
#include<16F628A.H>
#fuses HS,NOWDT,NOLVP,MCLR,NOPROTECT


#use delay(clock=20000000)               
#use RS232 (baud=9600, bits=8, parity=N, xmit=PIN_B2, rcv=PIN_B1)
#use fast_io(A)               
#use fast_io(B)                 
#priority timer1,rda           
                           
int Conexion='D';

unsigned long tick;         
unsigned int NSERVO=0;     
short FASE=1;           
short RX_FLAG=0;           
unsigned long CARGA_TMR1;
unsigned int RX_SERVO;     
unsigned long RX_POSICION;     

//VARIABLE DE CONTROL DE LA POSICION DE LOS SERVOS
unsigned long PSERVOS[]={10,90,80};


void config(void){

      set_tris_a(0b10100000);
      set_tris_b(0b00000010);
      output_a(0x00);
      output_b(0x00);
      output_bit(PIN_B3,1);
      setup_comparator(NC_NC_NC_NC);         
      setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
      set_timer1(tick);
      disable_interrupts(INT_TIMER1);
      disable_interrupts(INT_RDA);
      disable_interrupts(GLOBAL);
      delay_ms(200);
}

#INT_TIMER1
void Interrupcion_timer1(void){

      if(FASE==1){             
         bit_set(*5,NSERVO);     
         CARGA_TMR1 = 65536 -((PSERVOS[NSERVO] * 50) + 3000);
         set_timer1(CARGA_TMR1);
         FASE=0;
      }else if(FASE==0){           
         bit_clear(*5,NSERVO);   
         CARGA_TMR1 = 65536 - 12500 + ((PSERVOS[NSERVO] * 50) + 3000);
         FASE=1;
            if(NSERVO>=2){ //SI LLEGA AL ULTIMO SERVO
               CARGA_TMR1 = 65536 - 62500;
               set_timer1(CARGA_TMR1);
               NSERVO=0;
            }else if(NSERVO<2){
               NSERVO++;
            }
      }
      }



#INT_RDA
void Interrupcion_recepcion(void){

      disable_interrupts(INT_TIMER1);
      if(kbhit()){           
         RX_SERVO=getc();           
         RX_POSICION=getc();         
      }
      RX_FLAG=1;   
      set_timer1(get_timer1());     
      enable_interrupts(INT_TIMER1);   
}                             

void main(void){

      config();
      Conexion=getc();
      if(Conexion=='C'){
         printf("---- Conexion Establecida ----\r\n");
       
         output_bit(PIN_B0,1);
         output_bit(PIN_B3,0);
         enable_interrupts(GLOBAL);
         enable_interrupts(INT_TIMER1);
         enable_interrupts(INT_RDA);     
      }

      while(TRUE){
         if(RX_FLAG==1 && NSERVO ==2){
            PSERVOS[RX_SERVO]=RX_POSICION;
            RX_FLAG=0;
            enable_interrupts(INT_RDA);
         }
      };
}


Lo que deberia hacer el pic es iniciar -> encender el led en portb.3 y esperar a recibir por serie el caracter C, para informar que se establecio la comunicacion y empezar a controlar los servos.
He configurado el Comm 1 del pc para que funcione a 9600, he intentado enviar la 'C' como caracter, como hex (43) y como ASCII (67) pero el pic no hace nada, Tambien comprobe la configuracion del programa en basic y esta bien.

El circuito es asi:


y aqui les dejo los archivos en proteus:
http://www.mediafire.com/download.php?wqocdtetyd7bag4

Cualquier consejo o ayuda es bienvenida, seguramente la falla debe ser una tonteria pero me tiene muy frustrado este circuito. Saludos y Gracias.

Desconectado KALLITOS

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1256
Re: 16F628A no escucha en comunicacion Serie.
« Respuesta #1 en: 12 de Junio de 2011, 00:29:44 »
Hola novato.

Las interrupciones no se habilitan hasta que se reciba un 'C' por usart, pero como no se recibe correctamente nunca se habilitan.

Lo que debes hacer es:

Habilitar siempre la usart, cuando se recibe la 'C', colocar un flag en 1, lo cual indica que ya hay conexion.

La interrupcion usart salta cuando hay data en el buffer de recepcion serie por lo que utilizar if(kbhit()) esta demas, ademas utiliza getc() solo una vez en la interrupcio usart.

saludos.
A un microcontrolador hay que sacarle hasta el ultimo byte....(YO)

Cómo puede ser que un pic24EP512 me quede corto de memoria, señores de MICROCHIP saquen pics con más memoria flash

Más de 45 mil lineas de codigo y aun no termino el equipo, asu mare!!

S34ML08G1TFI200 no necesito mas memoria externa.

Desconectado novatopic

  • PIC10
  • *
  • Mensajes: 3
Re: 16F628A no escucha en comunicacion Serie.
« Respuesta #2 en: 12 de Junio de 2011, 17:01:02 »
KALLITOS gracias por responder. Hice los cambios que me sugeriste pero el PIC seguia sin responder. En Proteus funciona perfecto pero en el circuito simplemente no trabajaba, luego por esas cosas de la vida se me ocurrio sacarles los condensadores al cristal y  :shock:, funcionaba.
 No entiendo por que funciona sin los condensadores siendo que siempre he trabajado con condensadores de 22pF con mis cristales de 20 Mhz, ahora estoy probando condensadores de diferentes valores ya que si lo utilizo el Pic sin los condensadores al conectar un servo MG995 el pic se reinicia, solo con un pequeño servo MG 90 funciona apropiadamente.
 Tal como suponia el fallo era una tonteria (sacar los condensadores) :5]  :5], sin embargo todavia no entiendo por que si siempre he utilizado 22pF en mis circuitos y nunca tuve ningun problema, esta es la primera vez. En fin mañana saldre a comprar condensadores de diferentes valores para ver si puedo utilizar mis servos grandes. Si alguien conoce la causa de esta situacion, soy todo oidos. Saludos

Desconectado KALLITOS

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1256
Re: 16F628A no escucha en comunicacion Serie.
« Respuesta #3 en: 12 de Junio de 2011, 17:14:34 »
No veo que realices configuracion de WDT, en los fuses prueba colocando NOWDT, posiblemente el pic se este reseteando por este motivo.

Como que no creo que funcione tu codigo asi como esta.

Aunque el datasheet indica el uso de condensadores, yo no los uso y mis pics van sin problema.

saludos
A un microcontrolador hay que sacarle hasta el ultimo byte....(YO)

Cómo puede ser que un pic24EP512 me quede corto de memoria, señores de MICROCHIP saquen pics con más memoria flash

Más de 45 mil lineas de codigo y aun no termino el equipo, asu mare!!

S34ML08G1TFI200 no necesito mas memoria externa.


 

anything