Autor Tema: comunicacion pic16f84a A7  (Leído 1251 veces)

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

Desconectado tomasguido

  • PIC10
  • *
  • Mensajes: 13
comunicacion pic16f84a A7
« en: 22 de Junio de 2018, 19:38:13 »
Gente estoy comunicando  el pic16f84a con el modulo A7, bajo la norma rs-232, el oscilador es de 20 MHz y la comunicación es a 115200 baudios, puedo enviar sms y realizar llamadas el problema esta cuando intento recibir un sms y leerlo con el pic, ya que solo puedo leer unos 15 caracteres, y el modulo me envía mas de 30 caracteres, que puedo hacer para lograr leer una cadena larga de mas de 30 o 40 caracteres??.

En síntesis como puedo lograr leer una cadena de mas de 40 caracteres, para poder leer al modulo A7, que se les ocurre??
Intente:
1-baje la velocidad de transmision al minimo 2400, pero solo logro leer unos 25 caracteres.
2-cambie a un pic18f2550 y trabaje a 48MHz, pero ni siquiera logro llamar o enviar sms, asi que menos recibir. 
No se si es necesario cargar el código, solo necesito saber como recibir cadenas muy largas, y de poder lograrlo me gustaría compartirlo con la comunidad.

Gracias y espero que puedan ayudarme...

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8077
Re:comunicacion pic16f84a A7
« Respuesta #1 en: 22 de Junio de 2018, 22:47:44 »
Citar
No se si es necesario cargar el código, solo necesito saber como recibir cadenas muy largas, y de poder lograrlo me gustaría compartirlo con la comunidad.

Recibir cadenas largas la unica "precaucion" que deberias tener pienso que es tener el minimo error en los baudios.

Otra limitante puede ser la RAM, tenes 68 bytes de RAM en ese PIC, es poco realmente, y seria no solo mas facil irse a un PIC18F, sino tambien usar C en ves de ASM.

Desconectado tomasguido

  • PIC10
  • *
  • Mensajes: 13
Re:comunicacion pic16f84a A7
« Respuesta #2 en: 24 de Junio de 2018, 15:28:50 »
Voy a detallar un poco mas la rutina que utilizo para leer los datos es la siguiente:

;-------------lee dato serial-------------       
RS232_LeeDato:
    MOVLW           d'8'                        ; Número de bits a recibir.
    MOVWF     RS232_ContadorBits
RS232_EsperaBitStart:
    BTFSC           RS232_Entrada          ; Lee la entrada y espera a que sea "0".
    GOTO           RS232_EsperaBitStart           ; No, pues espera el nivel bajo.
    CALL            retardoserial              ; El primer bit debe leerlo un tiempo igual a una
    CALL             medioretardoserial
RS232_LeeBit:
    BCF           STATUS,C         ; Ahora lee el pin. En principio supone que es 0.
    BTFSC           RS232_Entrada         ; ¿Realmente es cero?
    BSF           STATUS,C         ; No, pues cambia a "1".
    RRF           RS232_Dato,F         ; Introduce el bit en el registro de lectura.
    CALL           retardoserial              ; Los siguientes bits los lee un periodo más tarde.
    DECFSZ    RS232_ContadorBits,F        ; Comprueba que es el último bit.
    GOTO        RS232_LeeBit         ; Si no es el último bit pasa a leer el siguiente.
    CALL           retardoserial              ; Espera un tiempo igual al los 1 bits de Stop. 
    MOVF           RS232_Dato,W                ; El resultado en el registro W.
    RETURN

;------------------------------------------------------
El problema aquí es que yo entre dato y dato a leer, tengo que comparar para que de acuerdo al sms enviado haga determinada tarea, y entonces ese tiempo que tardo en comparar hace que se me desfase los tiempos de lectura, y que depues del 15 carácter no los lea correctamente.
Mi idea era poder controlar el modulo con un pic sencillo y económico, pero creo que no sera posible.
Entonces como decís vos creo que me convendría cambiar a un pic, mas potente, que tenga modulo usart, y guardar los datos leídos en un buffer y por ultimo comparar.
Ahora porque decís que me conviene C y no ASM???
En conclusión voy a cambiar de pic, y probar con el modulo usart, saludos.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8077
Re:comunicacion pic16f84a A7
« Respuesta #3 en: 24 de Junio de 2018, 15:55:06 »
Entonces el problema no es recibir muchos caracteres, sino el que no posees el tiempo para revisarlo..

Si vos estas esperando una trama de forma exacta, entonces mejor es buscar otra alternativa, te voy a hacer un pseudocodigo.

Supongamos que recibimos el texto: ATM+123,2321,"Aca texto SMS"

Y vos esperas el ATM+123, y queres guardar el '2321,"Aca texto SMS"'

Entonces en ves de guardar todo, y comenzar a revisar todos los caracteres, cada ves que recibis uno. lo haces asi, cada ves que recibis una letra tenes algo asi:


Código: [Seleccionar]
Estado 0:
    ( Recibi una A ?  )
       Si->   Estado = 1
       No->  Salgo
Estado 1:
    ( Recibi una T ?  )
       Si->   Estado = 2
       No->  Estado = 0
Estado 2:
    ( Recibi una M ?  )
       Si->   Estado = 3
       No->  Estado = 0

Lo podes implementar de 2 formas.. una de la forma literal a como la plantee yo.
La otra es que tu varible "estado" sea tu INDICE, supongamos que tenes una tabla.

Código: ASM
  1. TABLA:
  2.    ADDWF PCL, F
  3.    DT "ATM+123",0x00

Comenzas con estado en 0, llega el primer caracter, pones ESTADO en W, y llamas a la tabla. La tabla te devuelve una 'A'
Comparas lo que llego con la A, si son iguales incrementas ESTADO en 1. Si NO son iguales pones estado en 0.

Ahora supongamos que recibiste una 'A' y asi fue que ESTADO termino en 1. Ahora llega un nuevo caracter. Utilizas el mismo codigo de antes.
Pones ESTADO en W, llamas a la tabla, te devuelve la 'T'. Comparas con lo que llego, si habia llegado una 'T' entonces incrementas ESTADO en 1, sino pones ESTADO a 0.

Si recibiste "ATK" por ejemplo, estado va a llegar a 2, y al momento de recibir la K va a volver a 0, por lo que comienza todo de nuevo.

Si prestante atencion, el codigo es el mismo en cada letra, O sea con ese codigo podes hacer cualqueir comparacion. letra a letra, y no todo junto.

¿Como determino cuando termino de comparar y cuando empezar a guardar?

Al crear un DT "ATM+123",0x00 le agrego un 0x00 al final. Esto me indica que si llego a ese punto, todo lo que sigue debe ser guardado.

Citar
Ahora porque decís que me conviene C y no ASM???

Es cierto que C ocupa mucho mas espacio que ASM, pero ya para cosas un poco mas complejas, las cosas se hacen mucho mas rapido.
Es bueno que poseas una base de ASM a mi parecer, pero te sugiero que no te quedes por siempre con ASM, y pases a C cuando puedas.

Desconectado tomasguido

  • PIC10
  • *
  • Mensajes: 13
Re:comunicacion pic16f84a A7
« Respuesta #4 en: 24 de Junio de 2018, 16:31:27 »
Dos opciones o yo no estoy entendiendo lo que has puesto o tu no entiendes mi problema :D.
Voy a detallar un poco mas, la siguiente rutina es la que uso para comparar, los carcateres:
;-----------------------
 verifico_datos:
    CALL         RS232_LeeDato2             
    SUBLW      'A'                                  ;verifico si el dato leído es A
    BTFSS       STATUS,Z
    GOTO        verifico_datos                  ;lo salteo si es el dato correcto
   
    CALL        RS232_LeeDato2
    SUBLW     'T'                                    ;verifico si el dato leído es T
    BTFSS       STATUS,Z
    GOTO        verifico_datos                  ;lo salteo si es el dato correcto

    "tarea que quiero que realice el pic luego de recibir A y T"
;-----------------------------------------------------------------

Ahora si ves mi código desde que espera el bit de stop, hasta verifica que el bit de star sea cero, tengo 8 ciclos maquinas, donde a 20MHz son 0,2 micro segundos por instrucción, entonces 0,2*8= 1,6 micro segundos tardo en comparar cada carácter, y entonces cada carácter leído me hace empezar mas tarde a leer el siguiente carácter, y llega un momento que se desfasa y lee cualquier cosa, y como dato extra, tiempo de retardo a 115200 baudios es aproox 8,6 micro segundos.

Lo que vos me respondiste si estoy entendiendo bien, sigo perdiendo tiempo entre cada carácter leído porque después de cada carácter tengo que comprar si es "A" o lo que sea que diga el msj.

Cuando envío un sms al modulo, el modulo le envía al pic algo como lo siguiente:
----------------

+CMT: "MESSAGE",1

*CMT: "(texto sms)
-----------------
Y son muchos caracteres y me sucede lo que te decía que los primeros 10 los lee bien y luego se desfasa.
Yo creo que con un pic que tenga modulo usart y guardarlo en un buffer no voy a perder tiempo comparando entre cada carácter, ya que voy a guardar todo mientras este enviando la cadena, y cuando finalice recién ahí comparo.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8077
Re:comunicacion pic16f84a A7
« Respuesta #5 en: 24 de Junio de 2018, 17:44:50 »
Perdon pense que estabas usando un RS232 por hardware, lo estas haciendo por software porque el PIC16F84A no tiene UART. No me di cuenta en el momento. Muchas veces me olvido que el PIC16F84A tiene menos que lo basico xD jeje.

Citar
Yo creo que con un pic que tenga modulo usart y guardarlo en un buffer no voy a perder tiempo comparando entre cada carácter, ya que voy a guardar todo mientras este enviando la cadena, y cuando finalice recién ahí comparo.

Tu problema como bien decis esta en los tiempos.
Aunque te parezca algo medio insensato, desde ya te diria que dejaras de renegar y cambia de micro..
A algo mas nuevo y barato, hasta un 18F es mas barato que el 16F84A y tiene muchisimas mas prestaciones.
Por ejemplo aca en argentina el PIC16F84A esta a 3.32 dolares ( 1.75KB flash y 64bytes RAM ) Y luego tenes por ejemplo:
PIC18F14K50-I/P 16KB Flash, 768 RAM, 15 I/O 20PDIP a 3.32 dolares tambien y ni hablar de la diferencia de prestaciones.

Usas la UART + interrupciones, y te olvidas de tus problemas...

Lo comprendo que sea para aprender al PIC16F84A pero pienso que por no gastar un poco de dinero mas te van a salir mas canas y vas a perder mucho mas tiempo. Es mi apreciacion.

Desconectado tomasguido

  • PIC10
  • *
  • Mensajes: 13
Re:comunicacion pic16f84a A7
« Respuesta #6 en: 24 de Junio de 2018, 18:12:11 »
Gracias por responder, voy a cambiar de pic y ver que puedo hacer un saludo..

Desconectado tomasguido

  • PIC10
  • *
  • Mensajes: 13
Re:comunicacion pic16f84a A7
« Respuesta #7 en: 12 de Abril de 2020, 23:42:38 »
Solo quiero agregar que se soluciono utilizando el modulo usart del pic16f628A, y funciona a la perfeccion.... saludoss