TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: neosud 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
-
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
-
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
-
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! 
-
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
/////////////
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
-
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 yo
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 TXIF
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,
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 ;-
-
Que onda pana RALF2 ,
Tienes razon, no me di cuenta de eso
.
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!
, por cierto pana Ralf2, 

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 
Salu2 panas
-
Al fin llevo 20min intentado llegar aqui no se que pasa con el servidor del foro

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 libro
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.
-
jajajajaja, creo que si viene
, pero bueno, ahi esta la traduccion directa en vivo desde el DS jajajaja
.
Un abrazo pana
-
Eso es lo que se yo llamo lager una traduccion en vivo y directo via satelite o sera via DS (data sheet).

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 foro
-
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!!!
-
Perfecto pana!!!!!!!!!!


, 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
-
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
-
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..
)
Un Saludo pana
-
"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
-
hola amigos, logre realizar el programa q permita realizar transmision o recepcion tanto en el master como en los esclavos, pero ahora deseo mejorar esto en el caso de haber errores en la trnsmision tratanto de reenviar la data si este llegase alterada por alguna razon, he visto q hay un bit de error de trama, es posible supervizar la tx con este bit?, como asi el q transmitio puede saber q lo q llego al esclavo no fue lo q èl enviò?, por favor pueden explicarme esto, algo q aun no entiendo es en cuanto a la paridad, como aprovecho esta caracteristica en la transmision?, q es paridad par o impar?, gracias desde ya.