Autor Tema: comunicacion  (Leído 5485 veces)

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

Desconectado neosud

  • PIC12
  • **
  • Mensajes: 51
comunicacion
« en: 21 de Diciembre de 2004, 17:56:00 »
estoy tratando de establecer comunicacion entre un pic16f877 como master y dos del mismo tipo pero como esclavos, he estado revisando los datasheet de estos pics y he visto q tienen dos pines el RC6 y RC7 para la comunicacion USART, aun no he realizado ninguna alicacion al respecto, son mis primeros en este tipo de programas.
Como puedo utilizar las instrucciones del pbp para comunicar el master con los dos esclavos?
que se envie un estado alto del master a cualquier de los esclavos, cada esclavo tendria un codigo (IDE) de identificacion, como establezco la velocidad de transferencia en baudios?, como establezco los bits de paridad?, como les comento recien estoy tratando de entender el manejo de estos recursos del pic, sorry si las preguntas resultan muy obvias para uds, luego les comento como me fue en mis primeras pruebas.

Gracias pòr sus ayudas, saludos

Desconectado Lager.

  • Moderadores
  • PIC18
  • *****
  • Mensajes: 477
RE: comunicacion
« Respuesta #1 en: 21 de Diciembre de 2004, 18:13:00 »
Que onda pana  neosud, en este post puse algo parecido, peroe s entre un 16f877 y un 16f628,(maestro y esclavo) seria cosa de adaptar el otro con el modelo 16f877 y agregarle el segundo 16f877. Aqui os dejo el post que te serviria de base:
http://miarroba.com/foros/ver.php?foroid=8826&temaid=3035670
Aqui te pongo para 1 maestro y uno esclavo:
-------------------------------------------------------------------------------------------------------
Para el 16f877(como Maestro a 2.4 kbs):
-------------------------------------------------------------------------------------------------------
DEVICE 16F877
XTAL 4
ALL_DIGITAL TRUE
DIM VAR1[29]AS BYTE
DIM C AS BYTE
DECLARE LCD_DTPIN PORTA.0
DECLARE LCD_ENPIN PORTB.3
DECLARE LCD_RSPIN PORTA.4
PORTB_PULLUPS=TRUE
TRISB.1=1 "BOTON DE ENVIO DE DATOS
SYMBOL BOTON=PORTB.1
SPBRG=103
PIE1.4=1
RCSTA=%10000000
TXSTA=%10110000
STR VAR1="MAESTRO=16F877ESCLAVO=16F628A" "PAQUETE DE DATOS
ESPERA:IF BOTON=1 THEN ESPERA "ESPERAMOS INICIO DE ENVIO
FOR C=0 TO 29
TXREG= VAR1[C]
ESPERA2:IF PIR1.4=0 THEN ESPERA2 "TERMINÓ DE ENVIAR??
NEXT
PRINT " MENSAJE ",$FE, $C0," ENVIADO "
END

--------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------
Para el 16f877(como esclavo):
--------------------------------------------------------------------------------------------------------
DEVICE 16F877
XTAL 4
ALL_DIGITAL ON
PORTB_PULLUPS ON
DECLARE LCD_DTPIN PORTA.0
DECLARE LCD_ENPIN PORTB.3
DECLARE LCD_RSPIN PORTA.4
DIM VAR2[29] AS BYTE
DIM A AS BYTE
CLEAR
PIE1.5=1
TXSTA = %00010000
RCSTA = %10010000
ESPERA:IF PIR1.5=0 THEN ESPERA
FOR A=0 TO 28
VAR2[A]=RCREG
ESPERA2:IF PIR1.5=0 THEN ESPERA2
NEXT
CLS
PRINT STR VAR214
PRINT $FE, $C0
FOR A=14 TO 28
PRINT VAR2[A]
NEXT
END
--------------------------------------------------------------------------------------------------------
La conecion seria del RC6 del maestro al RC6 del esclavo y del RC7 al RC7.
Salu2 pana

Desconectado neosud

  • PIC12
  • **
  • Mensajes: 51
RE: comunicacion
« Respuesta #2 en: 05 de Enero de 2005, 11:19:00 »
HOLA AMIGOS  PARA SALUDARLES POR ESTE NUEVO AÑO Y DESEARLES Q TODAS SUS METAS SE CUMPLAN.

GRACIAS AMIGO LAGER POR RESPONDERME, SABES CUANDO HICE LA CONSULTA NO HABIA REVISADO MUCHO DEL USART DEL PIC16F877, EN ESTOS DIAS DE DESCANSO HE PODIDO LEER UN POCO Y HE REALIZADO ALGUNAS PRUEBAS CON PROGRAMAS Q HE REALIZADO PERO NO ME HAN FUNCIONADO.

HE IMPLEMENTADO TRES PLACAS:
1 MASTER Y 2 ESCLAVOS.
HE ESTADO REVISANDO LA INFORMACION DEL USART Y HE LEIDO EL LIBRO DEL AUTOR ANGULO (LIBRO PIC16F87X), HE SEGUIDO SUS EJEMPLOS PERO NO HE PODIDO CONCRETAR LA TRANSMISION.

POR EJEMPLO HAY UN EJEMPLO EN ESTE LIBRO Q AHORA CITO:

CLRF      PORTC
BSF      STATUS,RP0
BCF      STATUS,RP1
MOVLW                   B’10101111’      ;AQUI REALICE UN CAMBIO
MOVWF                   TRISC
BCF      STATUS,RP0

BSF      RCSTA,SPEN
MOVLW                   B’00100000’                  ;8 BITS Y BAJA VELOCIDAD
MOVWF                   TXSTA
MOVLW                  .103
MOVWF                   SPBRG         ;BAUDIOS=600

BSF      TXSTA,TXEN
MOVLW                  .48
MOVWF                   TXREG


HE INTENTADO TRANSMITIR ESTE DATO PERO NO LO HE LOGRADO, PODRIAN AYUDARME AL RESPECTO

LO QUE DICE EL LIBRO ES Q CONFIGURANDO EL USART Y CARGANDO EL DATO EN EL REGISTRO TXREG PREVIA HABILITACION DEL USART BASTARÀ PARA TRANSMITIR EL DATO.
DEL REGISTRO TXREG PASA AL TSR EN CUANTO SE HAYA TRANSMITIDO EL BIT DE
PARADA, EN CUANTO A ELLO QUISIERA SABER SI TANTO ESTE BIT DE PARADA COMO EL DE START SE GENERAN CON LA CONFIGURACION CITADA EN LAS LINEAS ANTERIORES DEL EJEMPLO DEL LIBRO O TENGO Q GENERAR RUTINAS PARA UNO Y OTRO BIT DE FORMA SEPARADA?
LUEGO EN EL MISMO LIBRO DICE Q LA TRANSFERENCIA DEL REGISTRO TXREG A TSR SE REALIZA EN UN CICLO DE INSTRUCCION OSEA 1 usegundo Y Q EL BIT TXIF DE PIR1 SE PONE A 1 PARA INDICAR Q TXREG SE HA VACIADO, ES POSIBLE CAPTURAR ESTE FLAG Y VISUALIZARLO EN UN LED O EL CAMBIO ES MUY RAPIDO Q NO ES PUEDE APRECIAR ESTE CAMBIO DE ENCENDIDO, APAGADO DEL LED?
EL REGISTRO TSR ES EL REGISTRO DE DESPLAZAMIENTO DONDE ENTIENDO Q TEMPORALMENTE SE ALMACENA EL A DATO A TRANSMITIR, EL TIEMPO DE PERMANENCIA DEL DATO EN ESTE REGISTRO ES CONSIDERABLE COMO PARA PODER VISUALIZARLO EN LEDS? O ES MUY RAPIDO.

LA VERDAD TENGO MUCHAS DUDAS AL RESPECTO Y SOLO EN LA ETAPA DE TRANSMISION, AUN NO HE VISTO LA ETAPA DE RECEPCION.

EN CUANTO A LA RECEPCION, ES NECESARIO Q EL PROGRAMA Q TRANSMITA TAMBIEN RECEPCIONE PARA Q FUNCIONE BIEN LA TRANSMISION?

OTRO DUDA Q TENGO ES CUANTO, SI BIEN ESTOY TRANSMITIENDO Y TENGO CONFIGURADO RC6 COMO SALIDA Y RC7 ENTRADA, ES NECESARIO EN EL PROCESO DE SOLO TRANSMISION COLOCAR ALGUN ESTADO LOGICO EN EL PIC RC7 PARA Q FUNCIONE BIEN LA TRNASMISION?

EL CONTAR CON UN ESPACIO DONDE COLGAR MIS DUDAS YA ES BASTANTE AYUDA, PUES PARA PODER EXPRESARLO TENGO Q ANALIZAR LO Q DESEO SOLUCIONAR Y ELLO HACE Q INVESTIGUE DE TAL FORMA DE EXPRESAR DE FORMA EXPLICITA CUESTIONES TECNICAS EN ESTE MARAVILLOSO MUNDO DE LOS PICS, GRACIAS DESDE YA POR SUS AYUDA.

SALUDOS


Desconectado RALF2

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2062
RE: comunicacion
« Respuesta #3 en: 07 de Enero de 2005, 20:32:00 »
Hola amigo lo del libro te comento: cuando despues de configurado la usart y haber habilitado la transmision, colocando txen=1, vasta solo con colocar el dato que desees enviar en txreg y este lo transferira al tsr y lo ira sacando bit a bit esto lo realiza la usart del pic de manera automatica, por lo que te no tienes que hacer mas nada. una vez que hallan salido todos los bit contenidos en tsr se activara el bit de parada dentro del usart y el flag (bandera) txif se pondra a 1 (txif=1) indicando que el txreg se a vaciado. Para enviar otro dato basta con cargar nuevamente en el txreg con el dato nuevo, lo que producira que el flag txif se vaya a cero (txif=0) Señalando que fue cargado un valor en txreg y vuelve a comenzar de nuevo la transmision, como indique arriba.
El bit txif lo puedes monitorear por el software no obstante los bit contenidos en el registro tsr NO, como lo indica el autor del libro.
Nota: la transmision no comenzara hasta que hallas cargado un valor en txreg.

Espero que te halla servido mi explicacion sobre la transmision de datos.
Si tienes alguna duda sobre lo explicado avisame y en cuanto a la recepcion si aun tienes dudas me dices.

Lo que tu estas intentando realizar es parecido a algo que estoy haciendo, pero comunicandome con un pic 16f876a y el pc por el puerto serial.
mañana voy a probar el circuito para ver que tal me funciona.
En el libro que comentas es presisamente lo que voy a realizar y se ve desde el punto mio que esta bien, lo alli explicado.
Pero no desesperes amigo te voy a hechar una ayudita, ya que tengo en mente hacer lo que tu estas haciendo tambien.

Una pregunta, ya probaste el programa que aparese en el libro?, te funciono?.
Si quieres pasame por privado el programa que estas haciendo o mejor pon lo en el foro para que te ayudemos entre todos.

saludos! Giño

Desconectado Lager.

  • Moderadores
  • PIC18
  • *****
  • Mensajes: 477
RE: comunicacion
« Respuesta #4 en: 07 de Enero de 2005, 21:07:00 »
Pana neosud,
ya conectaste el Max232 al pic y este(el max) al pc???,  acuerdate que como usas el USART del  pic este no esta enviando los pulsos de forma directa,  por eso TIENE que llevar el max232. Tambien que la hiperterminal donde recives la info, este a los baudios que estes transmitiendo y la configuracion que empleaste(8 o 9 bits,etc)
Si el ejemplo viene en el libro emplealo directamente para tu micro solo con los  cambio s concernientes a el modelo que uses. Por lo que veo lo estas haciendo en ASM, y no me especificaste a la hora de poner el post  que lo querias en asm. Los ejemplos anteriormente mensionados son para proton, y funcionan a la perfeccion, y es basicamente lo mismo, ya que si te das cuenta cargo directamente el registro TXREG.
///////////////////CORRECCION ESTA FORMA NO ES LA QUE NECESITAS NEOSUD///////
//////////////////  EN EL POST SIGUIENTE TE PONGO PARA LA TRANSMISION////////////
///////////////// Y RECEPCION QUE ESTAS PIDIENDO°°°°°°°°°°°°°°°°°°°°/////////////
///////////////// GRACIAS PANA RALF2 POR AYUDARME A CORREGIRLO   Rebotado /////////////
Basicamente para una transmision ASINCRONA se requiere lo siguiente:

1)inicializar el SPBRG al baudrate(tu quieres 9600) apropiado con menos de 3% de error para evitar problemas , con brgh a cero(TXSTA.2=0) con xtal a 4mhz no se puede, con brgh a 1 logico(TXSTA.2=1)  a xtal de 4mhz  el valor de SPBRG es de  25(mas info LEER el DS).

2)Limpiar el bit del SYNC y SETEAR el bit SPEN (TXSTA.4=0 y RCSTA.7=1)
***OPCIONALES:
                        a)Si se desea interrupciones setear el bit TXIE(PIE1..4=1)
                        b)Si la transmision es de 9 bits setear el bit TX9(TXSTA.6=1)

3)HABILITAR la transmision seteando el bit TXEN(txsta.5=1) y  el bit TXIF estara setado (PIR1.4=1), indicando que esta vaciao el buffer(para no confundiros!)

                         c)Si se uso 9 bits de transmision el noveno bit debe ser cargado en el bit TX9D(RCSTA=valor[0 o 1], es usado tambien para el bit de paridad)

4)POR ULTIMO cargas el valor en el registro que te mencione TXREG(TXREG=valor)

Siguiendo este sencillo sistema NO PUEDES equivocarte, como ves es muy sencillo y estos pasos vienen en el DS.

Para ver si ya termino de transmitir, se puede hacer sencillamentecon el chekeo del  registro del buffer de transmision del USART chekando si esta vacio o lleno(si esta lleno [en 0 logico] espera a que estevacio [en 1 logico] para volver a transmitir otro dato ) con un btfXX del registro PIR1.4 (bandera de transmision, si el buffer esta lleno esta en 1 si esta en cero esta vacio y se puede continuar enviando) . Analiza el codigo que puse en el post anterior y te dara cuenta que es lo mismo, solo que yo use 2400 BAUDIOS.
/**********(por ahi podria venir tu error.............)******************/

Salu2 pana

Desconectado RALF2

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2062
RE: comunicacion
« Respuesta #5 en: 07 de Enero de 2005, 21:35:00 »
Hola de nuevo, pana lager creo que el amigo quiere comunicar un pic master con dos pic slave, por lo que no necesita el max232, el que necesita utilizar el max232 soy yoMuchas risas y lo estoy utilizandolo para comunicarme con el PC. Mañana voy a realizar la prueba y les comento.
Otra cosita que se te chispoteo para HABILITAR LAS INTERRUPCIONES DEBES COLOCAR EL TXIE A UNO (TXIE=1) Y NO EL TXIFGiño Hago esta aclaracion para no confundir al pana neosub, espero que no te molestes por esto, master lager!.

En el post inicial que envio el amigo neosub, indicaba que lo queria el programa hecho en pbp, pero luego parese que se cambio a asm,loco podrias indicarnos neosug en que lo quieres (asm, pbp o proton)
Otra cosita neosub leete bien el libro alli aparese detallado lo que te comente, pero en asm, y lo que dice el !master lager!. no tiene caida.
Saludos ;-
 

Desconectado Lager.

  • Moderadores
  • PIC18
  • *****
  • Mensajes: 477
RE: comunicacion
« Respuesta #6 en: 07 de Enero de 2005, 21:57:00 »
Que onda pana RALF2 ,
Tienes razon, no me di cuenta de eso Sonrisa .
Por otro lado, aun mas facil..
Ahora pongo aqui los pasos para la Transmision Sincrona modo MASTER:

1) Inicializar el registro SPBRG al BAUD apropiado... (explicado en el post anterior)

2) Habilitar le modo Maestro sincronico seteando los bits SYNC,SPEN Y CSRC.(TXSTA.4=1,RCSTA.7=1,TXSTA.7=1)

                 a) Si se desean interrupciones setear el TXIE(PIE1.4=1)
                  b) para 9 bits de transmision setear el TX9(TXSTA.6=1)
3) Habilitar la transmision seteando el TXEN(TXSTA.5=1)
                  c)si se usa 9 bit de transmision poner el noveno bit en TX9D(TXSTA.0=X)
4)Por ultimo cargar el registro TXREG con el valor!!!!!

Recepcion ESCLAVO sincrona:

1)Habilitarlo seteando los bits SYNC y SPEN y limpiando el CSRC (explicado anteriormente)

                 a) Si se usa interrupcion, setear RCIE(PIE1.5=1)
                  b) Si se transmiten 9 bits setear RX9(exp. anteriormente)
2)Habilitamos recepcion seteando CREN(RCSTA.4=1)

Cuando la recpecion se halla completado el bit RCIF(PIR1.5=1) SERA SETEADO (para saber cuando terminamos de recivir info..... y prepararse para recivir otro dato) (Esto si el bit RCIE fue seteado)
                     c) En caso de transmisiones con paridad o de 9 bits de datos leer el
                         bit RX9D(RCSTA.0)  , este tambien determina si hubo error en la
                         recpecion.
3) LEER el dato recivido del registro RCREG!!, (en caso de error  borrar el bit CREN)


Ahora si! Sonrisa Gigante  , por cierto pana Ralf2, Muchas risasMuchas risasMuchas risas no digas chistes que de master no tengo nada , solo traduje la parte que le intereza al pana neosud.. y ni eso pude hacer bien  Sonrisa Gigante

Salu2 panas

Desconectado RALF2

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2062
RE: comunicacion
« Respuesta #7 en: 07 de Enero de 2005, 22:26:00 »
Al fin llevo 20min intentado llegar aqui no se que pasa con el servidor del forodesquiciado
Bueno mi pana lager la informacion que colocaste esta muy buena, de seguro que al pana neosug le gustara, ya que la misma no la tiene el libroMuchas risas
Si el circuito me funciona voy a programarlo en pbp, actualmente el programa lo hice en asm. Para asi comenzar a utilizar el pic basic pro.
En cuanto a programar con el proton cuando tenga el monton de billetes que vale, lo comenzare a utilizar.Giño
 

Desconectado Lager.

  • Moderadores
  • PIC18
  • *****
  • Mensajes: 477
RE: comunicacion
« Respuesta #8 en: 07 de Enero de 2005, 22:31:00 »
jajajajaja, creo que si viene Llorando , pero bueno, ahi esta la traduccion directa en vivo desde el DS  jajajaja Muchas risas .

Un abrazo pana

Desconectado RALF2

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2062
RE: comunicacion
« Respuesta #9 en: 07 de Enero de 2005, 22:42:00 »
Eso es lo que se yo llamo lager una traduccion en vivo y directo via satelite o sera via DS (data sheet).Muchas risas
Voy aprovechando el circuito que tengo montado en el proto board a comenzar a realizar unas pruebas utilizzando todas las instrucciones que tiene el pbp para comunicacion serial (rs232), solo para irme empapando con ellas y luego le agregare una lcd la cual le tendre que quitar primero el polvo y las telarañas que tiene por la falta de uso, para que la informacion que le envie la computadora al pic lo muestre en la lcd, vamos a ver que tal me va!.
Si se me tranca el serrucho espero tu ayuda y la de los amigos del foroGiño

Desconectado RALF2

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2062
RE: comunicacion
« Respuesta #10 en: 10 de Enero de 2005, 07:02:00 »
Mis panas les digo que ya probe la comunicacion via rs232 entre el pic y la computadora y trabaja de maravillas, pero tuve que realizar la prueba en modo ms-dos (tengo windows 98) y utilizando un programa llamado terminal.
El hyperterminal me dio problemas, no se si sera porque estaba trabajando con el com1 del raton y quisas eso me dio el problema, voy a probar con el com2 a ver si logro resolver el problema.
Saludos a todos!!!

Desconectado Lager.

  • Moderadores
  • PIC18
  • *****
  • Mensajes: 477
RE: comunicacion
« Respuesta #11 en: 10 de Enero de 2005, 11:16:00 »
Perfecto pana!!!!!!!!!! RebotadoRebotadoRebotado , la verdad no se por que te da ese problema, pero puedes empezar probando conectandolo al COM libre, haber que resultados tienes.Reviza bien la configuracion que manejas y si es por hard o software.

Un abrazo pana Sonrisa

Desconectado neosud

  • PIC12
  • **
  • Mensajes: 51
RE: comunicacion
« Respuesta #12 en: 10 de Enero de 2005, 20:32:00 »
hola amigos Lager y Ralf2 por sus respuestas
Probe el programa de Lager y funciono bien tanto la transmision y recepcion.
Pude observar q el amigo Lager estaba colocando a 1 el bit TXIF para la interrupcion en la recepcion.

En base al programa de Lager he realizado uno un tanto diferente pero manteniendo como base el programa de Lager y tambien funcionò, aqui los escribo:


PARA LA PLACA TRANSMISORA:

DEVICE 16F877
XTAL=4

ALL_DIGITAL TRUE


DIM  TEMPO AS 1

TRISD=$FF                                 
 
OUTPUT PORTB
TRISC=%10100000       "RC7-RX (PIN 26 PIC), RC6-TX (PIN 25 PIC
                                    "RC5-CTS (PIN 8-DB9), RC4-RTS (PIN 7-DB9)

SYMBOL BOTON0=PORTD.0   "DAMOS UN ALIAS A RD0
SYMBOL BOTON1=PORTD.1
SYMBOL BOTON2=PORTD.2
SYMBOL BOTON3=PORTD.3
SYMBOL BOTON4=PORTD.4
SYMBOL BOTON5=PORTD.5
SYMBOL BOTON6=PORTD.6
SYMBOL BOTON7=PORTD.7

SPBRG=103                               "VALOR Q SE CARGA A SPBRG PARA CONJUNTAMENTE
                                 "CON K=64 ESCOGEMOS UNA FRECUENCIA
INTCON.7=1                              "DE 600 BAUDIOS
INTCON.6=1
PIE1.5=1

PIE1.4=1                                      "PIE1.4=TXIF=1 INDICA Q TXREG SE ENCUENTRA VACIO
RCSTA=%11011000                                                         

TXSTA=%01100001                           

PORTB=0
PORTC.4=0                               "RTS SE PONE EN BAJO

PREGUNTA_CTS:
                     IF PORTC.5=1 THEN ESPERA                                                              "PREGUNTAMOS SI EL CTS ES 1 LOGICO
               GOTO PREGUNTA_CTS


ESPERA:
      IF BOTON0=0 THEN PLS_RD0                                                                  "ESPERAMOS INICIO DE ENVIO
      IF BOTON1=0 THEN PLS_RD1
      IF BOTON2=0 THEN PLS_RD2
      IF BOTON3=0 THEN PLS_RD3
                   IF BOTON4=0 THEN PLS_RD4
      IF BOTON5=0 THEN PLS_RD5
                   IF BOTON6=0 THEN PLS_RD6
      IF BOTON7=0 THEN PLS_RD7
      GOTO ESPERA
                       
                         
           
PLS_RD0:  
           
PORTC.4=0  "RTS=0
DELAYMS 1   "POR 1MS
PORTC.4=1   "RTS=1
DELAYMS 250   "SE ESPERA 250MS PARA INICIAR LA TRNASMISION
        
TXREG=%00000001
        
ESPERA_0:
IF PIR1.4=0 THEN ESPERA_0    "TERMINÓ DE ENVIAR                                  PORTB=TXREG      "LUEGO PASAMOS A LEDS EN PORTB
PORTC.4=1      "MANTENGO RST AUN POR 250MS
DELAYMS 250
               
DELAYMS TEMPO
               
PORTC.4=0      "Y LUEGO LO MANDAMOS A BAJO
               
PORTB=0
                              
GOTO ESPERA
               
               
PLS_RD1:  
           
PORTC.4=0   "RTS=0
DELAYMS 1   "POR 1MS
PORTC.4=1   "RTS=1
DELAYMS 250   "SE ESPERA 250MS PARA INICIAR LA TRNASMISION
        
TXREG=%00000010
        
ESPERA_1:
IF PIR1.4=0 THEN ESPERA_1       "TERMINÓ DE ENVIAR                                                              PORTB=TXREG
PORTC.4=1      "MANTENGO RST AUN POR 250MS
DELAYMS 250
               
DELAYMS TEMPO
PORTC.4=0      "Y LUEGO LO MANDAMOS A BAJO
      
PORTB=0               
               
GOTO ESPERA
               
               
PLS_RD2:  
PORTC.4=0       
DELAYMS 1                  
PORTC.4=1                  
DELAYMS 250                     
TXREG=%00000100                       ESPERA_2:
IF PIR1.4=0 THEN ESPERA_2                     PORTB=TXREG
PORTC.4=1                  
DELAYMS 250
               
DELAYMS TEMPO
               
PORTC.4=0                           
PORTB=0
GOTO ESPERA   
               
               
               
PLS_RD3:  
           
PORTC.4=0                   
DELAYMS 1                  
PORTC.4=1                  
DELAYMS 250                  
ESPERA_3:
IF PIR1.4=0 THEN ESPERA_3    
PORTB=TXREG          
PORTC.4=1                  
DELAYMS 250
               
DELAYMS TEMPO
               
PORTC.4=0                  
PORTB=0
               
GOTO ESPERA   
               
               
PLS_RD4:  
           
PORTC.4=0                   
DELAYMS 1               
PORTC.4=1                  
DELAYMS 250                     
TXREG= %00010000         
ESPERA_4:
IF PIR1.4=0 THEN ESPERA_4   
PORTB=TXREG       
DELAYMS 250
               
DELAYMS TEMPO
PORTC.4=0                  
PORTB=0
               
GOTO ESPERA   
               
               
PLS_RD5:  
           
PORTC.4=0                   
DELAYMS 1                  
PORTC.4=1                  
DELAYMS 250                     
TXREG= %00100000               
ESPERA_5:
IF PIR1.4=0 THEN ESPERA_5       
PORTB=TXREG                         PORTC.4=1               
DELAYMS 250
               
DELAYMS TEMPO
               
PORTC.4=0                              
PORTB=0
               
GOTO ESPERA   
               
               
               
PLS_RD6:  
           
PORTC.4=0                   
DELAYMS 1                  
PORTC.4=1                  
DELAYMS 250                     
TXREG= %01000000               
ESPERA_6:
IF PIR1.4=0 THEN ESPERA_6    
PORTB=TXREG          
PORTC.4=1                  
DELAYMS 250
               
DELAYMS TEMPO
               
PORTC.4=0                           
PORTB=0
               
GOTO ESPERA   
               
               
PLS_RD7:  
           
PORTC.4=0                   
DELAYMS 1                  
PORTC.4=1                  
DELAYMS 250                  
ESPERA_7:
IF PIR1.4=0 THEN ESPERA_7                     PORTB=TXREG          
PORTC.4=1                  
DELAYMS 250
               
DELAYMS TEMPO
               
PORTC.4=0                              
PORTB=0
               
GOTO ESPERA   

ESTA PLACA TIENE 8 PULSADORES Q CADA VEZ Q SE PULSAN SE ENVIAN 1 DATOS A TRAVES DEL PIN RC6 DEL PIC16F877.
EJEMPLO:
CUANDO SE PRESIONA RD0, SE CARGA EN TXREG=%00000001 Y SE PRENDE EL LED EN RB0 EN EL MASTER COMO EN EL ESCLAVO REMOTO.
CUANDO SE PRESIONA RD1, SE CARGA EN TXREG=%00000010 Y SE PRENDE EL LED EN RB1 EN EL MASTER COMO EN EL ESCLAVO REMOTO Y ASI SUCESIVAMENTE.

COMO PUEDEN VER EN PROGRAMA ANTES DE INICIAR LA LECTURA DE LOS BOTONES PRIMERO SE LEE SI EL PIN RC5=1 (CTS)   Q ES UNA DE LAS CONDICIONES EN LA APLICACION Q ESTOY REALIZANDO Y ENVIANDO UN 1 LOGICO A TRAVES DEL PIN RC4 (RTS DEL DB9) ANTES DE LA TRANSMISION DEL DATO ENVIANDOLO A BAJO DESPUES DE LA TRANSMISION DEL DATO.

PROGRAMA RECEPTOR:   

DEVICE 16F877
XTAL=4
 
ALL_DIGITAL ON

TRISC=%10100000

OUTPUT PORTB

SPBRG=103


PIE1.5=1
TXSTA = %01100000
RCSTA = %11011000                    "RCSTA.0=RX9D 9NO BIT RECEPCIONADO

ESPERA:
      IF PIR1.5=0 THEN ESPERA
           PORTB=RCREG
        DELAYMS 250
        PORTB=0
        GOTO ESPERA

ESTE PROGRAMA PARA EL ESCLAVO FUNCIONA MUY BIEN.

QUISIERA Q ME AYUDARAN PARA Q EL ESCLAVO RESPONDA CON UNA INTERRUPCION CADA VEZ Q RECIBA UN DATO DEL TRANSMISOR.

tANTO EL MASTER COMO LOS ESCLAVOS PUEDEN TRANSMITIR Y RECIBIR EN TIEMPOS DIFERENTES, ES CONVENIENTE UTILIZAR INTERRUPCIONES, COMO PODRIA HACERLO?

AUN TENGO PROBLEMAS CON EL ASM PARA EL ESCLAVO, ALLI COLOCO EL PROGRAMA, POR FAVOR, SI LO PUEDEN REVISAR Y DETECTAR EL PROBLEMA.


LIST   P=16F877,   W=1
INCLUDE   "P16F877.INC"

      CBLOCK   0X20
DELAY
CONTA
VECES
      ENDC

      ORG   0X0000
      GOTO   INICIO
      ORG   0X0004
      GOTO   RSI
      ORG   0X0005

INICIO
      CLRWDT
      BSF   STATUS,RP0
      BCF   STATUS,RP1

      MOVLW   B"0110"
      MOVWF   ADCON1

      MOVLW   B"10000000"
      MOVWF   TRISC

      CLRF   TRISB

      MOVLW   .103
      MOVWF   SPBRG                                 
      MOVLW   B"01100000"                  MOVWF   TXSTA

      BSF   PIE1,RCIE         
      BCF   STATUS,RP0
   

      MOVLW   B"10010000"
      MOVWF   RCSTA         
      MOVLW   B"11000000"                               MOVWF   INTCON   
BUCLE
      CLRWDT
      NOP
      NOP
      GOTO   BUCLE

RSI
      BTFSS   PIR1,RCIF   
                   GOTO   VOLVER                  
      BCF   PIR1,RCIF         
      MOVF   RCREG,0               
      CALL   TX_DATO            

VOLVER      RETFIE

TX_DATO
      BCF   PIR1,TXIF   
      MOVWF   TXREG                                  MOVWF   PORTB

      BSF   STATUS,RP0
      BCF   STATUS,RP1

TX_DAT_W
      BTFSS   TXSTA,TRMT                               GOTO   TX_DAT_W
      BCF   STATUS,RP0
      
      RETURN   

      END

REALIACE LAS SIGTES PRUEBAS:
MASTER CON EL PROGRAMA EN PBPLUS Y ESCLAVO CON PROGRAMA PBPLUS Y FUNCIONA BIEN, PERO CUANDO EL PROGRAMA DEL ESCLAVO POR EL DE ASM MANTENIENDO EN EL MASTER EL PROG EN PBPLUS Y YA NO FUNCIONA BIEN, PUEDEN AYUDARME AL RESPECTO.

GRACIAS POR SUS AYUDAS AMIGOS DEL FORO   
      


                       

Desconectado Lager.

  • Moderadores
  • PIC18
  • *****
  • Mensajes: 477
RE: comunicacion
« Respuesta #13 en: 10 de Enero de 2005, 22:39:00 »
Que onda Neosud, para usar interrupciones en pbplus, es necesario darla de alta como en asm, solo que usando lo mas pronto posible ON_INTERRUPT(esta es una interrupcion por hardware y es la que te recomiendo que uses, ya que la de software tarda una eternidad....) SI usas la de hardware tienes que tener en cuenta que SOLO SALVA LOS registros fsr,status y demas,,, pero hay unas variables que usa el mismo compilador como PP1 o PP1H(byte alto del word pp1) estas son llamadas variables de sistema y hay un post deidaco a estas interrupciones hecho por el pana Khasistos y su funcionamiento y como GUARDAR dichas variables para que la informacion no se pierda , esto solo en caso de que uses comandos complejos en el momento de la interrupcion.
http://miarroba.com/foros/ver.php?foroid=8826&temaid=2661542

Una ves entendido el funcionamiento(es muy sencillo pero hay bastantes ejemplos de como depurar dicha interrupcion asi como su confiabilidad en este post) se podria proceder a realizar el codigo que realmente no tendra mayores inconvenientes, solo activar la interrupcion de recepcion de datos y saltara a la interrupcion, ya en ella, que los guarde solamente y salga de la interrupcion y los imprima(dentro de la interrupcion, pude activar un flag de una variable para que cuando salga y este en el bucle infinito haya una condicionante de que si se activo dicho flag IMPRIMA el valor en el lcd y ahi mismo(dentro de la condicionante borre dicho flag a la espera de mas informacion...)
Claro que esta seria una forma y tu puedes encontrar muchas mas, pero la verdad preferiria que le hecharas una leida al post antes de que la hagas, vas a tardar mas en leer el post que en hacer la interrupcion en proton, ya que es muy facil, ademas puedes accesar directamnte al registro en proton de los micros, por ejemplo:
Intcon.7=1 (movlw 1 , movwf intcon.7), te recomendaria que para no perder tiempo asi, lo hicieras como en asm usando SET(bsf) y CLEAR(clrf) para registros individuales o completos. asi este mismo seteo seria : set intcon.7 (solo ocupa una instruccion en lugar de dos.. Sonrisa  )
Un Saludo pana

Desconectado neosud

  • PIC12
  • **
  • Mensajes: 51
RE: comunicacion
« Respuesta #14 en: 11 de Enero de 2005, 09:29:00 »


"ULTIMA VERSION, SOLO TRANSMITE PERO NO RECEPCIONA
‘PROGRAMA CARGADO A LA PLACA DEL MAESTRO

DEVICE 16F877
XTAL=4

ALL_DIGITAL TRUE


DIM   TEMPO       AS   1

TRISD=$FF                              
OUTPUT PORTB
TRISC=%10100000                           

SYMBOL BOTON0=PORTD.0                     
SYMBOL BOTON1=PORTD.1
SYMBOL BOTON2=PORTD.2
SYMBOL BOTON3=PORTD.3
SYMBOL BOTON4=PORTD.4
SYMBOL BOTON5=PORTD.5
SYMBOL BOTON6=PORTD.6
SYMBOL BOTON7=PORTD.7

SPBRG=103                            
INTCON.7=1      
INTCON.6=1
PIE1.5=1

PIE1.4=1                           
RCSTA=%11011000                           

TXSTA=%01100001                        
PORTB=0
PORTC.4=0                         
PREGUNTA_CTS:
IF PORTC.5=1 THEN ESPERA         
GOTO PREGUNTA_CTS


ESPERA:
IF BOTON0=0 THEN PLS_RD0                           
IF BOTON1=0 THEN PLS_RD1
IF BOTON2=0 THEN PLS_RD2
IF BOTON3=0 THEN PLS_RD3
IF BOTON4=0 THEN PLS_RD4
IF BOTON5=0 THEN PLS_RD5
IF BOTON6=0 THEN PLS_RD6
IF BOTON7=0 THEN PLS_RD7
GOTO ESPERA
                     
                       
                         
           
PLS_RD0:  
DIR_PLS_RD0:
RCSTA=%11011000
TXSTA=%01100001
PORTC.4=0
DELAYUS 1
PORTC.4=1
DELAYMS 250
TXREG=%10100101
DIR_ESPERA_0:
IF PIR1.4=0 THEN DIR_ESPERA_0
PORTB=TXREG
PORTC.4=1
DELAYMS 250
PORTC.4=0      
PORTB=0
DELAYMS 250
                      
           
TXSTA = %00100000
RCSTA = %10010000
PORTC.4=0                                 DELAYMS 1                        
PORTC.4=1                        
DELAYMS 250                             TXREG=%00000001
        
        
ESPERA_0:
IF PIR1.4=0 THEN ESPERA_0       
PORTB=TXREG            
PORTC.4=1            
DELAYMS 250
PORTC.4=0               
PORTB=0
GOTO ESPERA
               
               
PLS_RD1:  
RCSTA=%11011000
TXSTA=%01100001
PORTC.4=0
DELAYUS 1
PORTC.4=1
DELAYMS 250
TXREG=%10100101
DIR_ESPERA_1:
IF PIR1.4=0 THEN DIR_ESPERA_1
PORTB=TXREG
PORTC.4=1
DELAYMS 250
PORTC.4=0      
PORTB=0
DELAYMS 10
            
TXSTA = %00100000
RCSTA = %10010000
PORTC.4=0                         
DELAYMS 1                        
PORTC.4=1                        
DELAYMS 20                             
TXREG=%00000010
        
ESPERA_1:
IF PIR1.4=0 THEN ESPERA_1       
                                                                                
                 

PORTB=TXREG
PORTC.4=1               
DELAYMS 250
                        
PORTC.4=0                               PORTB=0               
               
GOTO ESPERA
               
               
PLS_RD2:  
RCSTA=%11011000
TXSTA=%01100001
PORTC.4=0
DELAYUS 1
PORTC.4=1
DELAYMS 250
TXREG=%10100101
DIR_ESPERA_2:
IF PIR1.4=0 THEN DIR_ESPERA_2
PORTB=TXREG
PORTC.4=1
DELAYMS 250
PORTC.4=0      
PORTB=0
DELAYMS 10
 
TXSTA = %00100000
RCSTA = %10010000
PORTC.4=0                         
DELAYMS 1                                PORTC.4=1                                DELAYMS 250                             TXREG=%00000100                     
ESPERA_2:
IF PIR1.4=0 THEN ESPERA_2                         PORTB=TXREG
PORTC.4=1               
DELAYMS 250
            
PORTC.4=0                               PORTB=0
               
GOTO ESPERA   
               
               
               
PLS_RD3:
RCSTA=%11011000
TXSTA=%01100001
PORTC.4=0
DELAYUS 1
PORTC.4=1
DELAYMS 250
TXREG=%10100101
DIR_ESPERA_3:
IF PIR1.4=0 THEN DIR_ESPERA_3
PORTB=TXREG
PORTC.4=1
DELAYMS 250
PORTC.4=0      
PORTB=0
DELAYMS 10  
           
TXSTA = %00100000
RCSTA = %10010000
PORTC.4=0                         
DELAYMS 1                                PORTC.4=1                                DELAYMS 250                     
TXREG= %00001000               
ESPERA_3:
IF PIR1.4=0 THEN ESPERA_3                         PORTB=TXREG          
PORTC.4=1               
DELAYMS 250
               
PORTC.4=0                               PORTB=0
               
GOTO ESPERA   
               
               
PLS_RD4:  
RCSTA=%11011000
TXSTA=%01100001
PORTC.4=0
DELAYUS 1
PORTC.4=1
DELAYMS 250
TXREG=%11110000
DIR_ESPERA_4:
IF PIR1.4=0 THEN DIR_ESPERA_4
PORTB=TXREG
PORTC.4=1
DELAYMS 250
PORTC.4=0      
PORTB=0
DELAYMS 10
           
TXSTA = %00100000
RCSTA = %10010000
PORTC.4=0                         
DELAYMS 1                                PORTC.4=1                        
DELAYMS 250                     
TXREG= %00000001               
ESPERA_4:
IF PIR1.4=0 THEN ESPERA_4      
PORTB=%00010000         
PORTC.4=1               
DELAYMS 250
               
PORTC.4=0                               PORTB=0
               
GOTO ESPERA   
               
               
PLS_RD5:
RCSTA=%11011000
TXSTA=%01100001
PORTC.4=0
DELAYUS 1
PORTC.4=1
DELAYMS 250
TXREG=%11110000
DIR_ESPERA_5:
IF PIR1.4=0 THEN DIR_ESPERA_5
PORTB=TXREG
PORTC.4=1
DELAYMS 250
PORTC.4=0      
PORTB=0
DELAYMS 10  
           
TXSTA = %00100000
RCSTA = %10010000
PORTC.4=0                         
DELAYMS 1                        
PORTC.4=1                        
DELAYMS 250                     
TXREG= %00000010               
ESPERA_5:
IF PIR1.4=0 THEN ESPERA_5       
PORTB=%00100000       
PORTC.4=1               
DELAYMS 250
            
PORTC.4=0               
               
PORTB=0
               
GOTO ESPERA   
               
               
               
PLS_RD6:
RCSTA=%11011000
TXSTA=%01100001
PORTC.4=0
DELAYUS 1
PORTC.4=1
DELAYMS 250
TXREG=%11110000
DIR_ESPERA_6:
IF PIR1.4=0 THEN DIR_ESPERA_6
PORTB=TXREG
PORTC.4=1
DELAYMS 250
PORTC.4=0      
PORTB=0
DELAYMS 10  
           
TXSTA = %00100000
RCSTA = %10010000
PORTC.4=0                         
DELAYMS 1                        
PORTC.4=1                        
DELAYMS 250                     
TXREG= %00000100                  
ESPERA_6:
IF PIR1.4=0 THEN ESPERA_6                         PORTB=%01000000          
PORTC.4=1                               DELAYMS 250
            
PORTC.4=0               
            
PORTB=0
               
GOTO ESPERA   
               
               
PLS_RD7:
RCSTA=%11011000
TXSTA=%01100001
PORTC.4=0
DELAYUS 1
PORTC.4=1
DELAYMS 250
TXREG=%11110000
DIR_ESPERA_7:
IF PIR1.4=0 THEN DIR_ESPERA_7
PORTB=TXREG
PORTC.4=1
DELAYMS 250
PORTC.4=0      
PORTB=0
DELAYMS 10  
           
TXSTA = %00100000
RCSTA = %10010000
PORTC.4=0                         
DELAYMS 1                        
PORTC.4=1                        
DELAYMS 250                     
TXREG= %00001000               
ESPERA_7:
IF PIR1.4=0 THEN ESPERA_7                         PORTB=%10000000         
PORTC.4=1                               DELAYMS 250
               
PORTC.4=0               
PORTB=0
               
GOTO ESPERA   
 


"PROGRAMA DEL SLAVE 1 CON ID=%10100101
"LA DATA TRANSMITIDA ES VISUALIZADA EN LA PLACA MASTER EN LOS LEDS ‘NARANJA PREVIA VISUALIZACION DE LA DIRECCIION DEL ESCLAVO EN LOS LEDS ‘CONECTADOS A LA PUERTA B

DEVICE 16F877
XTAL=4

DIM     TEMPORAL   AS   BYTE
 
ALL_DIGITAL ON

TRISC=%10100000

OUTPUT PORTB

SPBRG=103

"INTCON=%11000000
PIE1.5=1
TXSTA = %01100000
RCSTA = %11011000                    
ESPERA:
TXSTA = %01100000             
RCSTA = %11011000
IF PIR1.5=0 THEN ESPERA
DELAYUS 1
IF RCSTA.0=1 THEN DIRECCION
GOTO ESPERA
         
DIRECCION:

TEMPORAL=RCREG
TEMPORAL=TEMPORAL-%10100101
IF TEMPORAL=0 THEN MOSTRAR
GOTO ESPERA
         
MOSTRAR:
TXSTA = %00100000
RCSTA = %10010000
IF PIR1.5=0 THEN MOSTRAR
PORTB=RCREG
DELAYMS 250
PORTB=0
GOTO ESPERA  



"PROGRAMA DEL SLAVE 2 CON ID=%11110000
"LA DATA TRANSMITIDA ES VISUALIZADA EN LA PLACA MASTER EN LOS LEDS ‘ROJOS PREVIA VISUALIZACION DE LA DIRECCIION DEL ESCLAVO EN LOS LEDS ‘CONECTADOS A LA PUERTA B

DEVICE 16F877
XTAL=4

DIM     TEMPORAL   AS   BYTE
 
ALL_DIGITAL ON

TRISC=%10100000

OUTPUT PORTB

SPBRG=103

"INTCON=%11000000
PIE1.5=1
TXSTA = %01100000
RCSTA = %11011000                    
ESPERA:
TXSTA = %01100000             
RCSTA = %11011000
IF PIR1.5=0 THEN ESPERA
DELAYUS 1
IF RCSTA.0=1 THEN DIRECCION
GOTO ESPERA
         
DIRECCION:

TEMPORAL=RCREG
TEMPORAL=TEMPORAL-%11110000
IF TEMPORAL=0 THEN MOSTRAR
GOTO ESPERA
         
MOSTRAR:
TXSTA = %00100000
RCSTA = %10010000
IF PIR1.5=0 THEN MOSTRAR
PORTB=RCREG
DELAYMS 250
PORTB=0
GOTO ESPERA
      

HOLA AMIGOS DEL FORO LES ENVIO LA ULTIMA VERSION REALIZADA TANTO PARA EL MASTER COMO PARA LOS ESCLAVOS: ESCLAVO 1 Y ESCLAVO 2.

HASTA ESTA PARTE FUNCIONA TODO BIEN EXCEPTO POR UN PEQUEÑO DETALLE, CADA VEZ Q ENERGIZO LAS PLACAS Y PRESIONO LOS BOTONES CONECTADOS A LA PUERTA D, EL PROGRAMA NO CORRE YA Q NO SE VISUALIZA LA TRANSFERENCIA DE INFORMACION (DIRECCION Y DATA) EN LA PUERTA B DEL MISMO MASTER Y MUCHO MENOS EN LOS ESCLAVOS, PERO CUANDO PRESIONO EL RESET DE LOS ESCLAVOS LA PLACA DEL MASTER EMPIEZA A FUNCIONAR, OTRO DETALLE OBSERVADO ES Q CUANDO EHENGIZO EL MASTER SIN TENER EL CABLE DE CONEXIÓN ENTRE LAS PLACAS (MASTER Y ESCLAVO)TODO FUNCIONA BIEN Y CUANDO SE PRESIONA EL RESET DEL MASTER ESTANDO CONECTADO EL CABLE SERIAL ENTRE LAS PLACAS SUCEDE EL MISMO PROBLEMA MENCIONADO, CUANDO NO ESTA CONECTADO AL ESCLAVO FUNCIONA TODO BIEN, ESTABA PENSANDO COMO SOLUCIONAR ESTO Y PODRIA RESETEAR LOS ESCLAVOS RECIEN INICIADO LA CONEXIÓN DE LA ENERGIA A LAS PLACAS, PERO CONSIDERO Q ESTOS INCONVENIENTES NO DEBERIAN DARSE, COMO PODRIA SOLUCIONAR ESTOS PERCANCES.

ALGO Q SI NECESITO SOLUCIONAR ES A LOS PROGRAMAS ANTERIORES CONSIDERAR LA POSIBILIDAD DE NO SOLO TRANSMITIR O RECEPCIONAR COMO LO HACEN EL MASTER Y LOS ESCLAVOS RESPETIVAMENTE, SINO TAMBIEN CONSIDERAR LA OPCIION DE TRANSMISION Y RECEPCION EN CUALQUIERA DE LAS PLACAS.

SE Q SE PODRIA HACERLO UTILIZANDO INTERRUPCIONES, PERO HAY UN PEQUEÑO DETALLE Q AUN NO HE REALIZADO PROGRAMAS CON INTERRUPCIONES EN PBPLUS EN LA TRANSM Y RECEP DE DATOS A TRAVES DEL USART NI OTRO TIPO DE INTERRUPCION EN PBPLUS.

PLEASE PODRIAN AYUDARME AL RESPECTO.

OBS: LEYENDO EL DS DEL PIC ENTIENDO Q SE PUEDE SELECCIONAR A Q ESCLAVO VA DIRIGIDO LA DATA, EN EL PROGRAMA CITADO PARA EL MASTER LO HACE, PARA EL SLAVE 1 HE CONSIDERADO LA ID=%10100101 Y PARA ELLO HE COSIDERADO LA TRANSMISION DE 9 BITS COLOCANDO A TX9D=1,RX9=1, TX9=1 Y ADDEN=1, Y LO MISMO PARA EL SLAVE 2 PERO CON ID=%11110000 Y PARA LA TRANSMISION DE LA DATA CAMBIO AL MODO DE TRANSMISION DE 8 BITS SOLAMENTE.

GRACIAS POR SUS AYUDAS, ESPERO CONTRIBUIR EN ALGO AL AVANCE DEL FORO