Autor Tema: comunicacion serie por interrupcion  (Leído 2913 veces)

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

Desconectado josico_66

  • PIC10
  • *
  • Mensajes: 5
comunicacion serie por interrupcion
« en: 19 de Agosto de 2004, 01:18:00 »
Buenas:

   Es la primera vez que escribo en este foro y tengo una preguntilla para vosotros.

He hecho un programilla para 16F84 en pic basic pro que simplemente espera a recibir un caracter por puerto serie y lo reenvia, hasta ahi todo bien. el problema viene cuando quiero que el PIC haga otras cosas y se le interrumpa para recibir el caracter. Entonces el primer caracter recibido esta mal, el resto bien.

El programa recibe por RB0/INT y envia por RB1.

include "modedefs.bas"
valor var byte
output portb.1
input portb.0

main:
serin2 portb.0,84,[valor]
serout2 portb.1,84,[valor]
goto main

Este es el que funciona bien, pero, ¿Como deberia meterlo en una interrupcion para que me enviase bien todos los caracteres, incluso el primero?

                   Gracias por adelantado

Desconectado cucaracha

  • PIC24H
  • ******
  • Mensajes: 1409
    • CUCAWEB
RE: comunicacion serie por interrupcion
« Respuesta #1 en: 19 de Agosto de 2004, 13:04:00 »
Mira, yo de basic ni papa... pero te comento que es lo que he hecho yo en un proyecto donde entra en juego comunicación serie a través de una interrupción.
Yo he usado las señales RTS (request to send) y CTS (clear to send), osea, controlo el flujo de datos a través de estas dos señales.

Bien, te explico... La señal RTS del pc irá a la interrupción, con las resistencias de pull-up internas activas, ya que debe de estar a nivel alto normalmente. O colocar una pull-up externa, como veas. Una vez que el PC quiera comunicarse se pondrá a nivel bajo y entrará en la interrupción. Entonces escribes desde el pic sobre la señal CTS del puerto, poniéndola a nivel bajo, indicando así que estás listo. Y a recibir... Recibes un dato, y dejas como estaba (nivel alto) el pin CTS del PIC... y sigues recibiendo hasta el final. Cuando acabes saldrá de la interrupción... y vuelta a esperar.
En tu caso, como en el mío, veo que la trama es algo fijo. Osea, recibes un dato, haces eco y se acabo... a esperar un nuevo envío. Si es así esto funcionará. Lo mejor es que te montes tu propio protocolo. Osea, el primer bit por ejemplo para indicar comienzo de comunicación. El segundo el número de datos que vas a enviar. Luego los datos y al final un simple CRC, que si quieres te explico uno muy simple que funciona bien.
Por ejemplo:  # 5 45 255 3 5 57(<-CRC)
También puedes usar un separador entre bytes, por ejemplo |
Sería: #|5|45|255|3|5|57|(<-CRC)
Esto sobre todo si usas el hiperterminal para recibir, que si lo haces en ASCII es complicado luego saber donde empieza un numero y donde acaba para empezar el otro. Si te fijas en la primera trama, quita los espacios que he puesto para que diferencies cada número y ahora dime cual es cual.... imposible verdad. Por eso, en ese caso es mejor poner un separador.
Espero no haberme equivocado en nada... lo hago medio de memoria.
Mira esta página donde te describen cada pin:
http://juandeg.tripod.com/conectordb9.htm

Suerte!!

PD: se me olvidaba!. No olvides colocar el max232 (mejor el max233), que adecua los niveles, pero además los invierte. Esto último es importante, por lo que te explico arriba, los niveles a los que se crea la interrupción, al que hay que contestar...
Saludos desde Huelva (ESPAÑA)

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
RE: comunicacion serie por interrupcion
« Respuesta #2 en: 19 de Agosto de 2004, 13:09:00 »
Muy buena la página cuca.
Un saludo

Desconectado RGL

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 634
RE: comunicacion serie por interrupcion
« Respuesta #3 en: 19 de Agosto de 2004, 14:53:00 »
Hay un post en este foro donde se hace mención al funcionamiento del puerto serie con interrupciones diferente a la propuesta de Cuca, que siendo válida, complica el tema con las señales de control. No recuerdo el título del post pero esta en este foro y creo que lo desarrolló abago.

Tambien puedes ver un ejemplo en www.melabs.com

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
RE: comunicacion serie por interrupcion
« Respuesta #4 en: 20 de Agosto de 2004, 03:01:00 »
Creo que te refieres a este, Ricky.
http://miarroba.com/foros/ver.php?temaid=1673107&foroid=8826

(Por cierto, bienvenido de nuevo. Ya hacía unos días que no se te veía el pelo)

Desconectado RGL

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 634
RE: comunicacion serie por interrupcion
« Respuesta #5 en: 21 de Agosto de 2004, 05:35:00 »
Estoy de vacaciones todavía, pero a veces me escapo al "internet corner" del hotel.

Saludos
Ricky

Desconectado josico_66

  • PIC10
  • *
  • Mensajes: 5
RE: comunicacion serie por interrupcion
« Respuesta #6 en: 27 de Agosto de 2004, 02:10:00 »
Parece que esta solucionado, creo que el problema era definir los pines como salida y entrada respectivamente antes de transmitir y recibir.

Desconectado gemur3x

  • PIC10
  • *
  • Mensajes: 8
RE: comunicacion serie por interrupcion
« Respuesta #7 en: 25 de Septiembre de 2005, 04:41:00 »
Un año tarde pero...tal vez a alguien le sirva. Es para un 16F84

Include "modedefs.bas"

dato var byte
trisB=%00000001

        OPTION_REG = %10000000        

        On Interrupt Goto myint
        INTCON = %10010000      

ciclo:
        pauseus 1
goto ciclo

        Disable
myint:  Serin portB.0,T1200,dato
        Serout portB.1,T1200,[dato]
        INTCON.1 = 0            
        Resume                  
        Enable

Desconectado mendop

  • PIC10
  • *
  • Mensajes: 15
RE: comunicacion serie por interrupcion
« Respuesta #8 en: 07 de Octubre de 2005, 10:46:00 »
La verdad es que no importa si es tarde o no, andaba buscando algo como esto, lo pruebo y comento, muchas gracias.