Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:
Buenas, voy a conectar 7 pic´s 16f628a, uno envia la informacion y los otros van a recibirla, se van a enviar 12 bytes cada vez, entre cada byte espero 2ms, bueno el caso, esque tengo el codigo para que copien el byte que les he enviado, el primero copiara los dos primeros.. el sgundo pic el tercero y cuarto y asi...es decir q si al tercero le llegan los 4 primeros byte no los copiara, pero se puede crear algun conflicto? conectando 6 pics de recepcion a uno q envia? esa es mi duda... ❓
El unico que va a poner un uno o un cero es el pic que envia, los otros solo reciben, el que envia va conectado a un mosfet, y este a los 6 pic´s receptores, con sus resistencias correspondientes...no creo que pase nada, si los que reciben no ponen nada en la linea claro, otra cosa...esque los pics que reciben pongan algo en la linea de envio, ay se puede liar parda!
El protocolo i2c ya lo probe...pero resulta q el pic q utilizo no lo tiene, asi que...me queda el protocolo rs232 jeje, y tenia hecho ya el programa con i2c...un rollo
¿Qué más da que el PIC no incluya el I2C?
Uso el PIC16F84A que no tiene ni RS232 ni I2C y se puede programar con el código completo.
Doy algo de información:
http://www.pic16f84a.org/index.php?option=com_content&view=article&id=66&Itemid=87 " onclick="window.open(this.href);return false;
Librería I2C para PIC16F84A:
;************************* Librería "BUS_I2C.INC" ******************************
;
; ===================================================================
; Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
; E. Palacios, F. Remiro y L. López. www.pic16f84a.com
; Editorial Ra-Ma. www.ra-ma.es
; ===================================================================
;
; Estas subrutinas permiten realizar las tareas básicas de control del bus serie I2C,
; por parte de un solo microcontrolador maestro.
;
; ZONA DE DATOS ****************************************************************
;
CBLOCK
I2C_ContadorBits ; Cuenta los bits a transmitir o a recibir.
I2C_Dato ; Dato a transmitir o recibido.
I2C_Flags ; Guarda la información del estado del bus I2C.
ENDC
#DEFINE I2C_UltimoByteLeer I2C_Flags,0
; - (I2C_UltimoByteLeer)=0, NO es el último byte a leer por el maestro.
; - (I2C_UltimoByteLeer)=1, SÍ es el último byte a leer por el maestro.
; La definición de las líneas SCL y SDA del bus I2C se puede cambiar según las
; necesidades del hardware.
#DEFINE SCL PORTA,3 ; Línea SCL del bus I2C.
#DEFINE SDA PORTA,4 ; Línea SDA del bus I2C.
;
; Subrutina "SDA_Bajo" ------------------------------------------------------------------
;
SDA_Bajo
bsf STATUS,RP0 ; Configura la línea SDA como salida.
bcf SDA
bcf STATUS,RP0
bcf SDA ; SDA en bajo.
return
;
; Subrutina "SDA_AltaImpedancia" --------------------------------------------------------
;
SDA_AltaImpedancia
bsf STATUS,RP0 ; Configura la línea SDA entrada.
bsf SDA ; Lo pone en alta impedancia y, gracias a la
bcf STATUS,RP0 ; Rp de esta línea, se mantiene a nivel alto.
return
;
; Subrutina "SCL_Bajo" ------------------------------------------------------------------
;
SCL_Bajo
bsf STATUS,RP0
bcf SCL ; Configura la línea SCL como salida.
bcf STATUS,RP0
bcf SCL ; La línea de reloj SCL en bajo.
return
;
; Subrutina "SCL_AltaImpedancia" --------------------------------------------------------
;
SCL_AltaImpedancia
bsf STATUS,RP0 ; Configura la línea SCL entrada.
bsf SCL ; Lo pone en alta impedancia y, gracias a la Rp
bcf STATUS,RP0 ; de esta línea, se mantiene a nivel alto.
SCL_EsperaNivelAlto
btfss SCL ; Si algún esclavo mantiene esta línea en bajo
goto SCL_EsperaNivelAlto ; hay que esperar.
return
;
; Subrutina "I2C_EnviaStart" ------------------------------------------------------------
;
; Esta subrutina envía una condición de Start o inicio.
;
I2C_EnviaStart
call SDA_AltaImpedancia ; Línea SDA en alto.
call SCL_AltaImpedancia ; Línea SCL en alto.
call Retardo_4micros ; Tiempo tBUF del protocolo.
call SDA_Bajo ; Flanco de bajada de SDA mientras SCL está alto.
call Retardo_4micros ; Tiempo tHD;STA del protocolo.
call SCL_Bajo ; Flanco de bajada del reloj SCL.
call Retardo_4micros
return
;
; Subrutina "I2C_EnviaStop" -------------------------------------------------------------
;
; Esta subrutina envía un condición de Stop o parada.
;
I2C_EnviaStop
call SDA_Bajo
call SCL_AltaImpedancia ; Flanco de subida de SCL.
call Retardo_4micros ; Tiempo tSU;STO del protocolo.
call SDA_AltaImpedancia ; Flanco de subida de SDA.
call Retardo_4micros ; Tiempo tBUF del protocolo.
return
;
; Subrutina "I2C_EnviaByte" -------------------------------------------------------------
;
; El microcontrolador maestro transmite un byte por el bus I2C, comenzando por el bit
; MSB. El byte a transmitir debe estar cargado previamente en el registro de trabajo W.
; De la subrutina ejecutada anteriormente I2C_EnviaStart o esta misma I2C_EnviaByte,
; la línea SCL se debe encontrar a nivel bajo al menos durante 5 µs.
;
I2C_EnviaByte
movwf I2C_Dato ; Almacena el byte a transmitir.
movlw 0x08 ; A transmitir 8 bits.
movwf I2C_ContadorBits
I2C_EnviaBit
rlf I2C_Dato,F ; Chequea el bit, llevándolo previamente al Carry.
btfsc STATUS,C
goto I2C_EnviaUno
I2C_EnviaCero
call SDA_Bajo ; Si es "0" envía un nivel bajo.
goto I2C_FlancoSCL
I2C_EnviaUno
call SDA_AltaImpedancia ; Si es "1" lo activará a alto.
I2C_FlancoSCL
call SCL_AltaImpedancia ; Flanco de subida del SCL.
call Retardo_4micros ; Tiempo tHIGH del protocolo.
call SCL_Bajo ; Termina el semiperiodo positivo del reloj.
call Retardo_4micros ; Tiempo tHD;DAT del protocolo.
decfsz I2C_ContadorBits,F ; Lazo para los ocho bits.
goto I2C_EnviaBit
;
call SDA_AltaImpedancia ; Libera la línea de datos.
call SCL_AltaImpedancia ; Pulso en alto de reloj para que el esclavo
call Retardo_4micros ; pueda enviar el bit ACK.
call SCL_Bajo
call Retardo_4micros
return
;
; Subrutina "I2C_LeeByte" ---------------------------------------------------------------
;
; El microcontrolador maestro lee un byte desde el esclavo conectado al bus I2C. El dato
; recibido se carga en el registro I2C_Dato y lo envía a la subrutina superior a través
; del registro W. Se empieza a leer por el bit de mayor peso MSB.
; De alguna de las subrutinas ejecutadas anteriormente I2C_EnviaStart, I2C_EnviaByte
; o esta misma I2C_LeeByte, la línea SCL lleva en bajo al menos 5 µs.
I2C_LeeByte
movlw 0x08 ; A recibir 8 bits.
movwf I2C_ContadorBits
call SDA_AltaImpedancia ; Deja libre la línea de datos.
I2C_LeeBit
call SCL_AltaImpedancia ; Flanco de subida del reloj.
bcf STATUS,C ; En principio supone que es "0".
btfsc SDA ; Lee el bit
bsf STATUS,C ; Si es "1" carga 1 en el Carry.
rlf I2C_Dato,F ; Lo introduce en el registro.
call SCL_Bajo ; Termina el semiperiodo positivo del reloj.
call Retardo_4micros ; Tiempo tHD;DAT del protocolo.
decfsz I2C_ContadorBits,F ; Lazo para los 8 bits.
goto I2C_LeeBit
;
; Chequea si este es el último byte a leer para enviar o no el bit de reconocimiento
; ACK en consecuencia.
;
btfss I2C_UltimoByteLeer ; Si es el último, no debe enviar
; el bit de reconocimiento ACK.
call SDA_Bajo ; Envía el bit de reconocimiento ACK
; porque todavía no es el último byte a leer.
call SCL_AltaImpedancia ; Pulso en alto del SCL para transmitir el
call Retardo_4micros ; bit ACK de reconocimiento. Este es tHIGH.
call SCL_Bajo ; Pulso de bajada del SCL.
call Retardo_4micros
movf I2C_Dato,W ; El resultado se manda en el registro de
return ; de trabajo W.
; ===================================================================
; Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
; E. Palacios, F. Remiro y L. López. www.pic16f84a.com
; Editorial Ra-Ma. www.ra-ma.es
; ===================================================================
Librería RS232 para 16F84A:
;*********************** Librería "RS232.INC" *******************************
;
; ===================================================================
; Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
; E. Palacios, F. Remiro y L. López. www.pic16f84a.com
; Editorial Ra-Ma. www.ra-ma.es
; ===================================================================
;
; Estas subrutinas permiten realizar las tareas básicas de control de la transmisión
; seríe asincrona según normas RS-232.
;
; Los parámetros adoptados para la comunicación son los siguientes:
; - Velocidad de transmisión de 9600 baudios. La duración de cada bit será 104 µs.
; - Un bit de inicio o Start a nivel bajo.
; - Dato de 8 bits.
; - Sin paridad.
; - Dos bits de final o Stop a nivel alto.
;
; El tiempo entre bit y bit debe coincidir con el periodo de la señal leída o enviada.
; Como la velocidad de transmisión o recepción es de 9600 baudios, el periodo será:
; 1/9600 Baudios = 104 µs. Se utilizará pues la subrutina Retardos_100micros.
CBLOCK
RS232_ContadorBits
RS232_Dato
ENDC
#DEFINE RS232_Entrada PORTA,4 ; Línea por la que se reciben los datos.
#DEFINE RS232_Salida PORTA,3 ; Línea por la que se envían los datos.
;
; Subrutina "RS232_Inicializa" -------------------------------------------------------------
;
; Configura las líneas de salida y entrada del microcontrolador.
RS232_Inicializa
bsf RS232_Salida ; Al principio salida en alto para resposo.
bsf STATUS,RP0
bsf RS232_Entrada ; Esta línea se configura como entrada.
bcf RS232_Salida ; Esta línea se configura como salida.
bcf STATUS,RP0
return
; Subrutina "RS232_LeeDato" -------------------------------------------------------------
;
; El microcontrolador lee el dato por la línea de entrada comenzando por el bit de menor
; peso. El dato leído se envía finalmente en el registro de trabajo W.
;
; El ordenador parte siempre de un nivel alto, que es el estado que tiene cuando no
; envía información. La secuencia utilizada es:
; 1º Espera que se ejecute el pulso negativo del bit Start o flanco de bajada.
; 2º Deja pasar un tiempo una y media veces mayor que el periodo de transmisión para
; saltarse el bit de Start y lee el primer bit en su mitad.
; 3º Lee el resto de los bits de datos, esperando un tiempo igual a la duración del
; período entre lectura y lectura para testearlos en mitad del bit.
;
; Salida: En el registro de trabajo W el byte leído.
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 Retardo_100micros ; El primer bit debe leerlo un tiempo igual a una
call Retardo_50micros ; vez y media el periodo de transmisión.
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 Retardo_100micros ; 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 Retardo_200micros ; Espera un tiempo igual al los 2 bits de Stop.
movf RS232_Dato,W ; El resultado en el registro W.
return
; Subrutinas "RS232_EnviaDato" y "RS232_EnviaNúmero" -------------------------------------
;
; El microcontrolador envía un dato por la línea de salida comenzando por el bit de menor
; peso. En dato enviado será el que le llegue a través del registro de trabajo W.
; 1º. Envía un "0" durante un tiempo igual al periodo de la velocidad de transmisión.
; Este es el bit de "Start".
; 2º. Envía el bit correspondiente:
; - Si va a enviar un "0" permanece en bajo durante el periodo correspondiente.
; - Si va a escribir un "1" permanece en alto durante el periodo correspondiente.
; 3º. Envía dos bits "1" durante un tiempo igual al período de la velocidad de
; transmisión cada uno. Estos son los dos bits de Stop.
;
; Entrada: En (W) el dato a enviar.
RS232_EnviaNumero ; Envía el código ASCII de un número.
addlw '0' ; Lo pasa a código ASCII sumándole el ASCII del 0.
RS232_EnviaDato
movwf RS232_Dato ; Guarda el contenido del byte a transmitir.
movlw d'8' ; Este es el número de bits a transmitir.
movwf RS232_ContadorBits
bcf RS232_Salida ; Bit de Start.
call Retardo_100micros
RS232_EnviaBit ; Comienza a enviar datos.
rrf RS232_Dato,F ; Lleva el bit que se quiere enviar al Carry para
btfss STATUS,C ; deducir su valor. ¿Es un "1" el bit a transmitir?
goto RS232_EnviaCero ; No, pues envía un "0".
RS232_EnviaUno
bsf RS232_Salida ; Transmite un "1".
goto RS232_FinEnviaBit
RS232_EnviaCero
bcf RS232_Salida ; Transmite un "0".
RS232_FinEnviaBit
call Retardo_100micros ; Este es el tiempo que estará en alto o bajo.
decfsz RS232_ContadorBits,F ; Comprueba que es el último bit.
goto RS232_EnviaBit ; Como no es el último bit repite la operación.
bsf RS232_Salida ; Envía dos bits de Stop.
call Retardo_200micros
return
; ===================================================================
; Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
; E. Palacios, F. Remiro y L. López. www.pic16f84a.com
; Editorial Ra-Ma. www.ra-ma.es
; ===================================================================
Librería RS232 para mensajes con16F84A.
;*********************** Librería "RS232MEN.INC" *******************************
;
; ===================================================================
; Del libro "MICROCONTROLADOR PIC16F84A. DESARROLLO DE PROYECTOS"
; E. Palacios, F. Remiro y L. López. www.pic16f84a.com
; Editorial Ra-Ma. www.ra-ma.es
; ===================================================================
;
; Estas subrutinas permiten transmitir mensajes desde el microcontrolador hacia el
; ordenador a través del puerto serie RS232.
;
; Subrutina "RS232_Mensaje" -------------------------------------------------------------
;
; Envía por el puerto serie el mensaje apuntado por el registro W y grabado en memoria
; de programa del PIC. El mensaje se visualizará en el monitor del ordenador. Esta
; subrutina sigue la estructura de funcionamiento similar a la ya conocida "LCD_Mensaje"
; para visualización de mensajes en pantallas de modulos LCD.
;
CBLOCK
RS232_ApuntaCaracter ; Apunta al carácter a visualizar.
RS232_ValorCaracter ; Valor ASCII del carácter a visualizar.
ENDC
RS232_Mensaje
movwf RS232_ApuntaCaracter ; Posición del primer carácter del mensaje.
movlw Mensajes ; Halla la posición relativa del primer carácter
subwf RS232_ApuntaCaracter,F ; del mensaje respecto del comienzo de todos los
; mensajes (identificados mediante la etiqueta
; "Mensajes").
decf RS232_ApuntaCaracter,F ; Para compensar la posición que ocupa la
RS232_VisualizaOtroCaracter ; instrucción "addwf PCL,F".
movf RS232_ApuntaCaracter,W ; Apunta al carácter a visualizar.
call Mensajes ; Obtiene el código ASCII del carácter apuntado.
movwf RS232_ValorCaracter ; Guarda el valor de carácter.
movf RS232_ValorCaracter,F ; Lo único que hace es posicionar flag Z. En caso
btfsc STATUS,Z ; que sea "0x00", que es código indicador final
goto RS232_FinMensaje ; de mensaje, sale fuera.
RS232_NoUltimoCaracter
call RS232_EnviaDato ; Visualiza el carácter ASCII leído.
incf RS232_ApuntaCaracter,F ; Apunta a la posición del siguiente carácter
goto RS232_VisualizaOtroCaracter ; dentro del mensaje.
RS232_FinMensaje
return
; Subrutina "RS232_LineasBlanco" ------------------------------------------------
;
; Visualiza unas cuantas líneas en blanco en el monitor del ordenador.
CBLOCK
RS232_ContadorLineas
ENDC
RS232_LineasBlanco
movlw d'10' ; Por ejemplo este número de líneas en
movwf RS232_ContadorLineas ; blanco.
R232_LineasBlancoLazo
movlw .10 ; Código del salto de línea
call RS232_EnviaDato
decfsz RS232_ContadorLineas,F
goto R232_LineasBlancoLazo
movlw .13 ; Código del retorno de carro.
call RS232_EnviaDato ; Finaliza con un retorno de carro.
return
; ===================================================================
; Del libro "MICROCONTROLADOR PIC16F84A. DESARROLLO DE PROYECTOS"
; E. Palacios, F. Remiro y L. López. www.pic16f84a.com
; Editorial Ra-Ma. www.ra-ma.es
; ===================================================================
Gracias a ello he hecho algún proyecto:
http://www.youtube.com/watch?v=niWAbQ-HVnY&
Manuales Visual c# y PIC16F84 con Puerto serie.
http://www.abcdatos.com/tutoriales/tutorial/z9521.html " onclick="window.open(this.href);return false;
Lo mismo pero en C++ y VB .net:
http://www.abcdatos.com/tutoriales/tutorial/v12.html " onclick="window.open(this.href);return false;
Saludos.
Muchas gracias, lo apuntare, pero de ensamblador...no se mucho para pic, en ccs, implemente el i2c por software y m dijo el compilador que me fuera a mi casa, asi que nose...
Con el MPLAB existe. Para que te funciona con CSS debes crear desde cero tus propias librerías.
alguno conoce o ha utilizado alguna librería para PIC para hacer el tema del bus RS485 (preferentemente para PIC con puerto RS-232 y en ASM 😀
Gracias y un saludo.