Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Meta

#1551
Hola:

Espero que estén bien configuradas las entradas o salidas en digitales en vez de analógico.


Código (asm) [Seleccionar]



; ZONA DE DATOS **********************************************************************

TITLE "LCD Sensor PS2"
SUBTITLE "Revisión 1.00"
LIST P=16F886
INCLUDE <P16F886.INC>
__CONFIG    _CONFIG1, _LVP_OFF & _FCMEN_ON & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
__CONFIG    _CONFIG2, _WRT_OFF & _BOR21V

CBLOCK 0x20
Contador
Apuntador
ENDC

PAGINA EQU 0x00
ULTIMO_MENSAJE EQU .10 ; Señala el número del último mensaje.

#DEFINE RESET_RC0 PORTC,0
#DEFINE EJECT_RC1 PORTC,1
#DEFINE OPEN_RC2 PORTC,2
#DEFINE CLOSE_RC3 PORTC,3
#DEFINE GREEN_RC4 PORTC,4
#DEFINE RED_RC5 PORTC,5
#DEFINE Auxiliar_6 PORTC,6
#DEFINE Auxiliar_7 PORTC,7

; ZONA DE CÓDIGOS ********************************************************************

ORG 0 ; El programa comienza en la dirección 0.

Inicio
call LCD_Inicializa
BANKSEL TRISC ; Banco 1.
bsf RESET_RC0 ; Se configura como entradas.
bsf EJECT_RC1
bsf OPEN_RC2
bsf CLOSE_RC3
bsf GREEN_RC4
bsf RED_RC5
bsf Auxiliar_6
bsf Auxiliar_7
BANKSEL PORTC ; Banco 0.
clrw
clrf Apuntador ; Inicializa el contador
Principal
movf Apuntador,W ; Apunta al inicio de cada mensaje ya que esta
call M24LC256_Mensaje_a_LCD ; subrutina lo carga en (M24LC256_AddressHigh).
call Retardo_2s ; Visualiza el mensaje durante este tiempo.
incf Apuntador,F ; Apunta al siguiente mensaje.
movf Apuntador,W ; Comprueba si ha llegado al último mensaje.
sublw ULTIMO_MENSAJE ; (W)=ULTIMO_MENSAJE-(Apuntador).
btfss STATUS,C ; ¿C=1?, ¿(W) positivo?
clrf Apuntador ; Ha resultado ULTIMO_MENSAJE<(Apuntador).
goto Principal

movf PORTC,W ; Lee los sensores.
andlw b'00111111' ; Máscara para quedarse con el valor de los sensores.
addwf PCL,F ; Salta a la configuración adecuada.
goto Configuracion0 ; 0 0 0 0 0 0
goto Configuracion1 ; 0 0 0 0 0 1
goto Configuracion2 ; 0 0 0 0 1 0
goto Configuracion3 ; 0 0 0 0 1 1
goto Configuracion4 ; 0 0 0 1 0 0
goto Configuracion5 ; 0 0 0 1 0 1
goto Configuracion6 ; 0 0 0 1 1 0
goto Configuracion7 ; 0 0 0 1 1 1
goto Configuracion8 ; 0 0 1 0 0 0
goto Configuracion9 ; 0 0 1 0 0 1
goto Configuracion10 ; 0 0 1 0 1 0
goto Configuracion11 ; 0 0 1 0 1 1
goto Configuracion12 ; 0 0 1 1 0 0
goto Configuracion13 ; 0 0 1 1 0 1
goto Configuracion14 ; 0 0 1 1 1 0
goto Configuracion15 ; 0 0 1 1 1 1
goto Configuracion16 ; 0 1 0 0 0 0
goto Configuracion17 ; 0 1 0 0 0 1
goto Configuracion18 ; 0 1 0 0 1 0
goto Configuracion19 ; 0 1 0 0 1 1
goto Configuracion20 ; 0 1 0 1 0 0
goto Configuracion21 ; 0 1 0 1 0 1
goto Configuracion22 ; 0 1 0 1 1 0
goto Configuracion23 ; 0 1 0 1 1 1
goto Configuracion24 ; 0 1 1 0 0 0
goto Configuracion25 ; 0 1 1 0 0 1
goto Configuracion26 ; 0 1 1 0 1 0
goto Configuracion27 ; 0 1 1 0 1 1
goto Configuracion28 ; 0 1 1 1 0 0
goto Configuracion29 ; 0 1 1 1 0 1
goto Configuracion30 ; 0 1 1 1 1 0
goto Configuracion31 ; 0 1 1 1 1 1
goto Configuracion32
goto Configuracion33
goto Configuracion34
goto Configuracion35
goto Configuracion36
goto Configuracion37
goto Configuracion38
goto Configuracion39
goto Configuracion40
goto Configuracion41
goto Configuracion42
goto Configuracion43
goto Configuracion44
goto Configuracion45
goto Configuracion46
goto Configuracion47
goto Configuracion48
goto Configuracion49
goto Configuracion50
goto Configuracion51
goto Configuracion52
goto Configuracion53
goto Configuracion54
goto Configuracion55
goto Configuracion56
goto Configuracion57
goto Configuracion58
goto Configuracion59
goto Configuracion60
goto Configuracion61
goto Configuracion62
goto Configuracion63
Configuracion0
goto ActivaSalida
Configuracion1
goto ActivaSalida
Configuracion2
goto ActivaSalida
Configuracion3
goto ActivaSalida
Configuracion4
goto ActivaSalida
Configuracion5
goto ActivaSalida
Configuracion6
goto ActivaSalida
Configuracion7
goto ActivaSalida
Configuracion8
goto ActivaSalida
Configuracion9
goto ActivaSalida
Configuracion10
goto ActivaSalida
Configuracion11
goto ActivaSalida
Configuracion12
goto ActivaSalida
Configuracion13
goto ActivaSalida
Configuracion14
goto ActivaSalida
Configuracion15
goto ActivaSalida
Configuracion16
goto ActivaSalida
Configuracion17
goto ActivaSalida
Configuracion18
goto ActivaSalida
Configuracion19
goto ActivaSalida
Configuracion20
goto ActivaSalida
Configuracion21
goto ActivaSalida
Configuracion22
goto ActivaSalida
Configuracion23
goto ActivaSalida
Configuracion24
goto ActivaSalida
Configuracion25
goto ActivaSalida
Configuracion26
goto ActivaSalida
Configuracion27
goto ActivaSalida
Configuracion28
goto ActivaSalida
Configuracion29
goto ActivaSalida
Configuracion30
goto ActivaSalida
Configuracion31
goto ActivaSalida
Configuracion32
goto ActivaSalida
Configuracion33
goto ActivaSalida
Configuracion34
goto ActivaSalida
Configuracion35
goto ActivaSalida
Configuracion36
goto ActivaSalida
Configuracion37
goto ActivaSalida
Configuracion38
goto ActivaSalida
Configuracion39
goto ActivaSalida
Configuracion40
goto ActivaSalida
Configuracion41
goto ActivaSalida
Configuracion42
goto ActivaSalida
Configuracion43
goto ActivaSalida
Configuracion44
goto ActivaSalida
Configuracion45
goto ActivaSalida
Configuracion46
goto ActivaSalida
Configuracion47
goto ActivaSalida
Configuracion48
goto ActivaSalida
Configuracion49
goto ActivaSalida
Configuracion50
goto ActivaSalida
Configuracion51
goto ActivaSalida
Configuracion52
goto ActivaSalida
Configuracion53
goto ActivaSalida
Configuracion54
goto ActivaSalida
Configuracion55
goto ActivaSalida
Configuracion56
goto ActivaSalida
Configuracion57
goto ActivaSalida
Configuracion58
goto ActivaSalida
Configuracion59
goto ActivaSalida
Configuracion60
goto ActivaSalida
Configuracion61
goto ActivaSalida
Configuracion62
goto ActivaSalida
Configuracion63
goto ActivaSalida
ActivaSalida
; movwf PORTB
goto Principal

;
; "Mensajes" ----------------------------------------------------------------------------
;
Mensajes
addwf PCL,F
Mensaje1
DT "aaaaaaaaaaaaaaaaaaaa", 0x00
Mensaje2
DT "bbbbbbbbbbbbbbbbbbbb", 0x00
Mensaje3
DT "cccccccccccccccccccc", 0x00
Mensaje4
DT "dddddddddddddddddddd", 0x00
Mensaje5
DT "e", 0x00
Mensaje6
DT "M", 0x00
Mensaje7
DT "S", 0x00
Mensaje8
DT "M", 0x00
;
FinTabla
;MensajeAnuncio
; DT " fgfd ", 0x00

IF (FinTabla > 0xFF)
ERROR "¡CUIDADO!: La tabla ha superado el tamaño de la página de los"
MESSG "primeros 256 bytes de memoria ROM. NO funcionará correctamente."
ENDIF

INCLUDE <BIN_BCD.INC>
INCLUDE  <BUS_I2C.INC> ; Subrutinas de control del bus I2C.
INCLUDE  <M24LC256.INC> ; Subrutinas de control de la memoria 24LC256.
INCLUDE  <LCD_4BIT.INC>
INCLUDE  <LCD_MENS.INC>
INCLUDE  <RETARDOS.INC>
END




Librería LCD_4BIT.INC por aquí configuro los puertos y espero que no estén en analógicos.

Código (asm) [Seleccionar]

;**************************** Librería "LCD_4BIT.INC"
; Estas subrutinas permiten realizar las tareas básicas de control de un módulo LCD de 2
; líneas por 16 caracteres, compatible con el modelo LM016L.
;
; El visualizador LCD está conectado al Puerto B del PIC mediante un bus de 4 bits. Las
; conexiones son:
; - Las 4 líneas superiores del módulo LCD, pines <DB7:DB4>  se conectan a las 4
; líneas superiores del Puerto B del PIC, pines <RB7:RB4>.
; - Pin RS del LCD a la línea RA0 del PIC.
; - Pin R/W del LCD a la línea RA1 del PIC, o a masa.
; - Pin Enable del LCD a la línea RA2 del PIC.
;
; Se utilizan llamadas a subrutinas de retardo de tiempo localizadas en la librería
; RETARDOS.INC.
;
; ZONA DE DATOS *********************************************************************

CBLOCK
LCD_Dato
LCD_GuardaDato
LCD_GuardaTRISB
LCD_Auxiliar1
LCD_Auxiliar2
ENDC

LCD_CaracteresPorLinea EQU .20 ; Número de caracteres por línea de la pantalla.

#DEFINE  LCD_PinRS PORTB,0
#DEFINE  LCD_PinRW PORTB,1
#DEFINE  LCD_PinEnable PORTB,2
#DEFINE LCD_BusDatos PORTB

; Subrutina "LCD_Inicializa" ------------------------------------------------------------
;
; Inicialización del módulo LCD: Configura funciones del LCD, produce reset por software,
; borra memoria y enciende pantalla. El fabricante especifica que para garantizar la
; configuración inicial hay que hacerla como sigue:
;
LCD_Inicializa
BANKSEL ANSEL                                     
    clrf ANSEL ; E/S Digitales.
clrf ANSELH
BANKSEL TRISB
bcf LCD_PinRS ; R/W y E.
bcf LCD_PinEnable
bcf LCD_PinRW
BANKSEL TRISA
clrf TRISA
clrf TRISB
BANKSEL PORTA
bcf LCD_PinRW ; En caso de que esté conectado le indica
; que se va a escribir en el LCD.
bcf LCD_PinEnable ; Impide funcionamiento del LCD poniendo E=0.
bcf LCD_PinRS ; Activa el Modo Comando poniendo RS=0.
call Retardo_20ms
movlw b'00110000'
call LCD_EscribeLCD ; Escribe el dato en el LCD.
call Retardo_5ms
movlw b'00110000'
call LCD_EscribeLCD
call Retardo_200micros
movlw b'00110000'
call LCD_EscribeLCD
call Retardo_20micros ; Este retardo es necesario para simular en PROTEUS.
movlw b'00100000' ; Interface de 4 bits.
call LCD_EscribeLCD
call Retardo_20micros ; Este retardo es necesario para simular en PROTEUS.

; Ahora configura el resto de los parámetros:

call LCD_2Lineas4Bits5x7 ; LCD de 2 líneas y caracteres de 5x7 puntos.
call LCD_Borra ; Pantalla encendida y limpia. Cursor al principio
call LCD_CursorOFF ; de la línea 1. Cursor apagado.
call LCD_CursorIncr ; Cursor en modo incrementar.
return

; Subrutina "LCD_EscribeLCD" -----------------------------------------------------------
;
; Envía el dato del registro de trabajo W al bus de dato y produce un pequeño pulso en el pin
; Enable del LCD. Para no alterar el contenido de las líneas de la parte baja del Puerto B que
; no son utilizadas para el LCD (pines RB3:RB0), primero se lee estas líneas y después se
; vuelve a enviar este dato sin cambiarlo.

LCD_EscribeLCD
andlw b'11110000' ; Se queda con el nibble alto del dato que es el
movwf LCD_Dato ; que hay que enviar y lo guarda.
movf LCD_BusDatos,W ; Lee la información actual de la parte baja
andlw b'00001111' ; del Puerto B, que no se debe alterar.
iorwf LCD_Dato,F ; Enviará la parte alta del dato de entrada
; y en la parte baja lo que había antes.
BANKSEL TRISB ; Acceso al Banco 1.
movf TRISB,W ; Guarda la configuración que tenía antes TRISB.
movwf LCD_GuardaTRISB
movlw b'00001111' ; Las 4 líneas inferiores del Puerto B se dejan
andwf PORTB,F ; como estaban y las 4 superiores como salida.
BANKSEL PORTB ; Acceso al Banco 0.
;
movf LCD_Dato,W ; Recupera el dato a enviar.
movwf LCD_BusDatos ; Envía el dato al módulo LCD.
bsf LCD_PinEnable ; Permite funcionamiento del LCD mediante un pequeño
bcf LCD_PinEnable ; pulso y termina impidiendo el funcionamiento del LCD.
BANKSEL TRISB ; Acceso al Banco 1. Restaura el antiguo valor en
movf LCD_GuardaTRISB,W ; la configuración del Puerto B.
movwf TRISB
BANKSEL PORTB ; Acceso al Banco 0.
return

; Subrutinas variadas para el control del módulo LCD -----------------------------------------
;
;Los comandos que pueden ser ejecutados son:
;
LCD_CursorIncr ; Cursor en modo incrementar.
movlw b'00000110'
goto LCD_EnviaComando
LCD_Linea1 ; Cursor al principio de la Línea 1.
movlw b'10000000' ; Dirección 00h de la DDRAM
goto LCD_EnviaComando
LCD_Linea2 ; Cursor al principio de la Línea 2.
movlw b'11000000' ; Dirección 40h de la DDRAM
goto LCD_EnviaComando
LCD_Linea3 ; Cursor al principio de la Línea 3
movlw b'10010100' ; Dirección 14h de la DDRAM
goto LCD_EnviaComando
LCD_Linea4 ; Cursor al principio de la Línea 4
movlw b'11010100' ; Dirección 54h de la DDRAM
goto LCD_EnviaComando
LCD_PosicionLinea1 ; Cursor a posición de la Línea 1, a partir de la
iorlw b'10000000' ; dirección 00h de la DDRAM más el valor del
goto LCD_EnviaComando ; registro W.
LCD_PosicionLinea2 ; Cursor a posición de la Línea 2, a partir de la
iorlw b'11000000' ; dirección 40h de la DDRAM más el valor del
goto LCD_EnviaComando ; registro W.
LCD_OFF ; Pantalla apagada.
movlw b'00001000'
goto LCD_EnviaComando
LCD_CursorON ; Pantalla encendida y cursor encendido.
movlw b'00001110'
goto LCD_EnviaComando
LCD_CursorOFF ; Pantalla encendida y cursor apagado.
movlw b'00001100'
goto LCD_EnviaComando
LCD_Borra ; Borra toda la pantalla, memoria DDRAM y pone el
movlw b'00000001' ; cursor a principio de la línea 1.
goto LCD_EnviaComando
LCD_2Lineas4Bits5x7 ; Define la pantalla de 2 líneas, con caracteres
movlw b'00101000' ; de 5x7 puntos y conexión al PIC mediante bus de
; goto LCD_EnviaComando ; 4 bits.

; Subrutinas "LCD_EnviaComando" y "LCD_Caracter" ------------------------------------
;
; "LCD_EnviaComando". Escribe un comando en el registro del módulo LCD. La palabra de
; comando ha sido entregada a través del registro W.  Trabaja en Modo Comando.
; "LCD_Caracter". Escribe en la memoria DDRAM del LCD el carácter ASCII introducido a
; a través del registro W. Trabaja en Modo Dato.
;
LCD_EnviaComando
bcf LCD_PinRS ; Activa el Modo Comando, poniendo RS=0.
goto LCD_Envia
LCD_Caracter
bsf LCD_PinRS ; Activa el "Modo Dato", poniendo RS=1.
call LCD_CodigoCGROM ; Obtiene el código para correcta visualización.
LCD_Envia
movwf LCD_GuardaDato ; Guarda el dato a enviar.
call LCD_EscribeLCD ; Primero envía el nibble alto.
swapf LCD_GuardaDato,W ; Ahora envía el nibble bajo. Para ello pasa el
; nibble bajo del dato a enviar a parte alta del byte.
call LCD_EscribeLCD ; Se envía al visualizador LCD.
btfss LCD_PinRS ; Debe garantizar una correcta escritura manteniendo
call Retardo_2ms ; 2 ms en modo comando y 50 µs en modo cáracter.
call Retardo_50micros
return

; Subrutina "LCD_CodigoCGROM" -----------------------------------------------------------
;
; A partir del carácter ASCII número 127 los códigos de los caracteres definidos en la
; tabla CGROM del LM016L no coinciden con los códigos ASCII. Así por ejemplo, el código
; ASCII de la "Ñ" en la tabla CGRAM del LM016L es EEh.
;
; Esta subrutina convierte los códigos ASCII de la "Ñ", "º" y otros, a códigos CGROM para que
; que puedan ser visualizado en el módulo LM016L.
;
; Entrada: En (W) el código ASCII del carácter que se desea visualizar.
; Salida: En (W) el código definido en la tabla CGROM.

LCD_CodigoCGROM
movwf LCD_Dato ; Guarda el valor del carácter y comprueba si es
LCD_EnheMinuscula ; un carácter especial.
sublw 'ñ' ; ¿Es la "ñ"?
btfss STATUS,Z
goto LCD_EnheMayuscula ; No es "ñ".
movlw b'11101110' ; Código CGROM de la "ñ".
movwf LCD_Dato
goto LCD_FinCGROM
LCD_EnheMayuscula
movf LCD_Dato,W ; Recupera el código ASCII de entrada.
sublw 'Ñ' ; ¿Es la "Ñ"?
btfss STATUS,Z
goto LCD_Grado ; No es "Ñ".
movlw b'11101110' ; Código CGROM de la "ñ". (No hay símbolo para
movwf LCD_Dato ; la "Ñ" mayúscula en la CGROM).
goto LCD_FinCGROM
LCD_Grado
movf LCD_Dato,W ; Recupera el código ASCII de entrada.
sublw 'º' ; ¿Es el símbolo "º"?
btfss STATUS,Z
goto LCD_FinCGROM ; No es "º".
movlw b'11011111' ; Código CGROM del símbolo "º".
movwf LCD_Dato
LCD_FinCGROM
movf LCD_Dato,W ; En (W) el código buscado.
return

; Subrutina "LCD_DosEspaciosBlancos" y "LCD_LineaBlanco" --------------------------------
;
; Visualiza espacios en blanco.

LCD_LineaEnBlanco
movlw LCD_CaracteresPorLinea
goto LCD_EnviaBlancos
LCD_UnEspacioBlanco
movlw .1
goto LCD_EnviaBlancos
LCD_DosEspaciosBlancos
movlw .2
goto LCD_EnviaBlancos
LCD_TresEspaciosBlancos
movlw .3
LCD_EnviaBlancos
movwf LCD_Auxiliar1 ; (LCD_Auxiliar1) se utiliza como contador.
LCD_EnviaOtroBlanco
movlw ' ' ; Esto es un espacio en blanco.
call LCD_Caracter ; Visualiza tanto espacios en blanco como se
decfsz LCD_Auxiliar1,F ; haya cargado en (LCD_Auxiliar1).
goto LCD_EnviaOtroBlanco
return

; Subrutinas "LCD_ByteCompleto" y "LCD_Byte" --------------------------------------------
;
; Subrutina "LCD_ByteCompleto", visualiza el byte que almacena el registro W en el
; lugar actual de la pantalla. Por ejemplo, si (W)=b'10101110' visualiza "AE".
;
; Subrutina "LCD_Byte" igual que la anterior, pero en caso de que el nibble alto sea cero
; visualiza en su lugar un espacio en blanco. Por ejemplo si (W)=b'10101110' visualiza "AE"
; y si (W)=b'00001110', visualiza " E" (un espacio blanco delante).
;
; Utilizan la subrutina "LCD_Nibble" que se analiza más adelante.
;
LCD_Byte
movwf LCD_Auxiliar2 ; Guarda el valor de entrada.
andlw b'11110000' ; Analiza si el nibble alto es cero.
btfss STATUS,Z ; Si es cero lo apaga.
goto LCD_VisualizaAlto ; No es cero y lo visualiza.
movlw ' ' ; Visualiza un espacio en blanco.
call LCD_Caracter
goto LCD_VisualizaBajo

LCD_ByteCompleto
movwf LCD_Auxiliar2 ; Guarda el valor de entrada.
LCD_VisualizaAlto
swapf LCD_Auxiliar2,W ; Pone el nibble alto en la parte baja.
call LCD_Nibble ; Lo visualiza.
LCD_VisualizaBajo
movf LCD_Auxiliar2,W ; Repite el proceso con el nibble bajo.
; call LCD_Nibble ; Lo visualiza.
; return

; Subrutina "LCD_Nibble" ----------------------------------------------------------------
;
; Visualiza en el lugar actual de la pantalla, el valor hexadecimal que almacena en el nibble
; bajo del registro W. El nibble alto de W no es tenido en cuenta. Ejemplos:
; - Si (W)=b'01010110', se visualizará "6".
; - Si (W)=b'10101110', se visualizará "E".
;
LCD_Nibble
andlw b'00001111' ; Se queda con la parte baja.
movwf LCD_Auxiliar1 ; Lo guarda.
sublw 0x09 ; Comprueba si hay que representarlo con letra.
btfss STATUS,C
goto LCD_EnviaByteLetra
movf LCD_Auxiliar1,W
addlw '0' ; El número se pasa a carácter ASCII sumándole
goto LCD_FinVisualizaDigito ; el ASCII del cero y lo visualiza.
LCD_EnviaByteLetra
movf LCD_Auxiliar1,W
addlw 'A'-0x0A ; Sí, por tanto, se le suma el ASCII de la 'A'.
LCD_FinVisualizaDigito
goto LCD_Caracter ; Y visualiza el carácter. Se hace con un "goto"
; para no sobrecargar la pila.



El bus I2C también lo he modificado para el 16F886, espero que esté bien.

Código (asm) [Seleccionar]

;**************************** Librería "BUS_I2C.INC"
;
; 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
bcf STATUS,RP1
bsf STATUS,RP0 ; Configura la línea SDA como salida.
bcf SDA
bcf STATUS,RP1
bcf STATUS,RP0
bcf SDA ; SDA en bajo.
return
;
; Subrutina "SDA_AltaImpedancia" --------------------------------------------------------
;
SDA_AltaImpedancia
bcf STATUS,RP1
bsf STATUS,RP0 ; Configura la línea SDA entrada.
bsf SDA ; Lo pone en alta impedancia y, gracias a la
bcf STATUS,RP1
bcf STATUS,RP0 ; Rp de esta línea, se mantiene a nivel alto.
return
;
; Subrutina "SCL_Bajo" ------------------------------------------------------------------
;
SCL_Bajo
bcf STATUS,RP1
bsf STATUS,RP0
bcf SCL ; Configura la línea SCL como salida.
bcf STATUS,RP1
bcf STATUS,RP0
bcf SCL ; La línea de reloj SCL en bajo.
return
;
; Subrutina "SCL_AltaImpedancia" --------------------------------------------------------
;
SCL_AltaImpedancia
bcf STATUS,RP1
bsf STATUS,RP0 ; Configura la línea SCL entrada.
bsf SCL ; Lo pone en alta impedancia y, gracias a la Rp
bcf STATUS,RP1
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.



La EEPROM 24LC256.

Código (asm) [Seleccionar]

;**************************** Librería "M24LC256.INC"
;
; Estas subrutinas permiten realizar las tareas de manejo de la memoria EEPROM serie
; 24LC256 que transmite y recibe la información vía serie a través de un bus I2C.
;
; Subrutina "M24LC256_InicializaEscritura" ----------------------------------------------
;
; Prepara la memoria para iniciar su escritura a partir de la posición de memoria fijada
; por los registros:
; - (M24LC256_AddressHigh), indica el número del bloque o página de memoria a escribir.
; - (M24LC256_AddressLow), indica posición a escribir dentro del bloque.

CBLOCK
M24LC256_AddressHigh ; Guarda el valor de la dirección de memoria a
M24LC256_AddressLow ; escribir o leer.
M24LC256_Dato
ENDC
;
M24LC256_DIR_ESCRITURA EQU b'10100000'; Dirección de la memoria 24LC256 para
M24LC256_DIR_LECTURA EQU b'10100001'; escritura y lectura respectivamente.

M24LC256_InicializaEscritura
call I2C_EnviaStart ; Envía condición de Start.
movlw M24LC256_DIR_ESCRITURA ; Envía dirección de escritura del
call I2C_EnviaByte ; esclavo.
movf M24LC256_AddressHigh,W ; A partir de la dirección apuntada por los
call I2C_EnviaByte ; registros M24LC256_AddressHigh y
movf M24LC256_AddressLow,W ; M24LC256_AddressLow.
call I2C_EnviaByte
return

; Subrutina "M24LC256_InicializaLectura" ------------------------------------------------
;
; Prepara la memoria para iniciar su lectura a partir de la posición de memoria fijada
; por los registros:
; - (M24LC256_AddressHigh), indica el número del bloque o página de memoria a leer.
; - (M24LC256_AddressLow), indica posición a escribir dentro del bloque.

M24LC256_InicializaLectura
bcf I2C_UltimoByteLeer ; Todavía no ha comenzado a leer ningún dato.
call I2C_EnviaStart ; Envía condición de Start.
movlw M24LC256_DIR_ESCRITURA ; Envía dirección de escritura del
call I2C_EnviaByte ; esclavo.
movf M24LC256_AddressHigh,W ; A partir de la dirección apuntada por los
call I2C_EnviaByte ; registros M24LC256_AddressHigh y
movf M24LC256_AddressLow,W ; M24LC256_AddressLow.
call I2C_EnviaByte
call I2C_EnviaStop
;
call I2C_EnviaStart ; Envía condición de Start.
movlw M24LC256_DIR_LECTURA ; Indica a la memoria 24LC256 que va a
call I2C_EnviaByte ; proceder a la lectura.
return

; Subrutina "M24LC256_Mensaje_a_LCD" ----------------------------------------------------
;
; Lee el mensaje grabado en la memoria 24LC256 y lo visualiza en la pantalla del módulo LCD.
; En el registro de trabajo W se introduce la página de la memoria a partir de cuya primera
; posición se va a leer. La lectura termina cuando encuentre el código 0x00. Así por ejemplo,
; si (W)=2Fh lee el mensaje que comienza en la posición 0 de la página 2Fh de la memoria,
; que es la posición 2F00h absoluta.
;
CBLOCK
; M24LC256_ValorCaracter ; Valor ASCII del carácter leído.
ENDC

;M24LC256_Mensaje_a_LCD
movwf M24LC256_AddressHigh ; Apunta al inicio de la página correspondiente.
clrf M24LC256_AddressLow
call M24LC256_InicializaLectura
M24LC256_LeeOtroByte
call I2C_LeeByte ; Lee la memoria 24LC256.
movwf M24LC256_ValorCaracter ; Guarda el valor de carácter.
movf M24LC256_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 M24LC256_FinMensaje ; del mensaje, sale de la subrutina.
movf M24LC256_ValorCaracter,W ; Recupera el valor leído.
call LCD_Caracter ; Lo visualiza en la pantalla del LCD.
incf M24LC256_AddressLow,F ; Apunta a la siguiente posición.
goto M24LC256_LeeOtroByte
;M24LC256_FinMensaje
; call M24LC_256_FinalizaLectura
; return

; Subrutina "M24LC256_FinalizaLectura" ------------------------------------------------
;
; Activa el bit I2C_UltimoByteLeer para que la subrutina I2C_LeeByte ponga en alta
; impedancia la línea SDA y pueda ejecutarse posteriormente la condición de Start o Stop
; que fija el protocolo del bus I2C.

M24LC256_FinalizaLectura
bsf I2C_UltimoByteLeer ; Con estas dos instrucciones se pone en
call I2C_LeeByte ; alta impedancia la línea SDA. No importa el
call I2C_EnviaStop ; resultado de la lectura realizada.
return

; Subrutina "M24LC256_Mensaje_a_LCD" ----------------------------------------------------
;
; Lee un mensaje grabado en la memoria 24LC256 y lo visualiza por el módulo LCD. En caso que
; sea más largo que la longitud de la pantalla se desplaza hacia la izquierda con sensación
; de movimiento. En el registro de trabajo W se introduce la página de la memoria a partir
; de cuya primera posición va a leer. La visualización termina cuando encuentre el código
; 0x00. Así por ejemplo si (W)= 2Fh lee el mensaje que comienza en la posición 0 de la
; página 2Fh de la memoria, que es la posición 2F00h absoluta.
;
CBLOCK
M24LC256_ValorCaracter ; Valor ASCII del carácter leído.
M24LC256_CursorPosicion
ENDC

M24LC256_Mensaje_a_LCD
bcf I2C_UltimoByteLeer
movwf M24LC256_AddressHigh ; Apunta al inicio de la página correspondiente.
clrf M24LC256_AddressLow
call M24LC256_InicializaLectura
M24LC256_PrimeraPosicion
clrf M24LC256_CursorPosicion ; El cursor en la posición 0 de la línea.
call LCD_Borra ; Se sitúa en la primera posición de la línea 1 y
M24LC256_VisualizaCaracter ; borra la pantalla.
movlw LCD_CaracteresPorLinea ; ¿Ha llegado a final de línea?
subwf M24LC256_CursorPosicion,W
btfss STATUS,C
goto M24LC256_NoEsFinalLinea
M24LC256_EsFinalLinea
call Retardo_200ms ; Lo mantiene visualizado durante este tiempo.
call Retardo_200ms
call M24LC256_FinalizaLectura
incf M24LC256_AddressLow,F
call M24LC256_InicializaLectura
goto M24LC256_PrimeraPosicion
M24LC256_NoEsFinalLinea
call I2C_LeeByte ; Obtiene el ASCII del carácter apuntado.
movwf M24LC256_ValorCaracter ; Guarda el valor de carácter.
movf M24LC256_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 M24LC256_FinMensaje ; de mensaje, sale fuera.
M24LC256_NoUltimoCaracter
call LCD_Caracter ; Visualiza el carácter ASCII leído.
incf M24LC256_CursorPosicion,F ; Contabiliza el incremento de posición del
; cursor en la pantalla.
goto M24LC256_VisualizaCaracter ; Vuelve a visualizar el siguiente carácter
M24LC256_FinMensaje ; de la línea.
call M24LC256_FinalizaLectura
return


Si lo deseas, te paso los archivos completos con esquema Proteus por e-mail. No encuentro la manera de que me funcione, a lo mejor es eso del puerto que lo tengo enanalógico y no lo se.

Saludo.
#1552


- Multiplataforma (Windows, Linux, Mac)
- Tecnología Netbeans
- Y como lo acabo de instalar... solo decir que es muuuuucho más bonito
- Ah sí y lo más importante, todo cambiado de sitio XD

http://devupdates.microchip.com/mplab/
#1553
Gracias, veo que dominas el tema.

Por lo que parece hay que cambiar todo hasta en las librerías.

Hasta en el 2º nivel si hace falta.

Estaba pensando en meter una EERPOM 24LC256 ya que soporta 128 mensajes a 256 bytes cada uno. ¿Qué es más preferible y por qué?

Se que requiere más gastos en hardware, pero el programa te lo deja como un campeón sin usar cosas raras.




Edito:[/b]

Hola:

Estoy probando la EEPROM externa 24LC256. Sospecho que no tengo configuradio bien el PORTA del PIC16F886. Me aparecen carácteres sólo en negro.

En cada 100 de dirección de la EEPROM hay mensajes guardado. Supuestamente debe aparecer el 1 que indica en la diracción 0.

Dejo el esquema en Proteus y código fuente.



Ver mejor imagen.

Descargar código fuente y esquema proteus.

Si no pudes descargarlo, desde estar registrado.

Saludo.
#1554
Hola:

Eso suenaalgo parecido como suena por aquí. No sabía que en todas las librerías tenía que hacer lo mismo.
http://www.pic16f84a.org/index.php?option=com_docman&task=doc_download&gid=3&Itemid=59

Como voy a usar quizás muchos mensajitos para el LCD. ¿Hay algún problema para hacer con una EEPROM 24LC256 externa?

Empezaré la programación con ellas.

Saludo.
#1555
Electrónica / Resolver problemas con tablas 6 bits.
3 Septiembre 2010, 07:32 AM
Hola:

Quiero hacer la tabla de 6 bits y me parece el error de los 256 bits usados. ¿Hay alguna manera de resolverlo?



; ZONA DE DATOS **********************************************************************

    TITLE        "LCD Sensor PS2"
    SUBTITLE    "Revisión 1.00"
    LIST        P=16F886
    INCLUDE        <P16F886.INC>
    __CONFIG    _CONFIG1, _LVP_OFF & _FCMEN_ON & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
    __CONFIG    _CONFIG2, _WRT_OFF & _BOR21V

    CBLOCK    0x20
    CONTADOR
    ENDC

#DEFINE        RESET_RC0    PORTC,0
#DEFINE        EJECT_RC1    PORTC,1
#DEFINE        OPEN_RC2    PORTC,2
#DEFINE        CLOSE_RC3    PORTC,3
#DEFINE        GREEN_RC4    PORTC,4
#DEFINE        RED_RC5        PORTC,5
#DEFINE        Auxiliar_6    PORTC,6
#DEFINE        Auxiliar_7    PORTC,7

; ZONA DE CÓDIGOS ********************************************************************

    ORG     0                        ; El programa comienza en la dirección 0.

Inicio
    call    LCD_Inicializa
    BANKSEL    TRISC                    ; Banco 1.
    bsf        RESET_RC0                    ; Se configura como entradas.
    bsf        EJECT_RC1
    bsf        OPEN_RC2
    bsf        CLOSE_RC3                   
    bsf        GREEN_RC4
    bsf        RED_RC5
    bsf        Auxiliar_6
    bsf        Auxiliar_7
    BANKSEL    PORTC                    ; Banco 0.
    clrw

Principal
    movf    PORTC,W                ; Lee los sensores.
    andlw    b'00111111'            ; Máscara para quedarse con el valor de los sensores.
    addwf    PCL,F                ; Salta a la configuración adecuada.
    goto    Configuracion0        ; 0 0 0 0 0 0
    goto    Configuracion1        ; 0 0 0 0 0 1
    goto    Configuracion2        ; 0 0 0 0 1 0
    goto    Configuracion3        ; 0 0 0 0 1 1
    goto    Configuracion4        ; 0 0 0 1 0 0
    goto    Configuracion5        ; 0 0 0 1 0 1
    goto    Configuracion6        ; 0 0 0 1 1 0
    goto    Configuracion7        ; 0 0 0 1 1 1
    goto    Configuracion8        ; 0 0 1 0 0 0
    goto    Configuracion9        ; 0 0 1 0 0 1
    goto    Configuracion10        ; 0 0 1 0 1 0
    goto    Configuracion11        ; 0 0 1 0 1 1
    goto    Configuracion12        ; 0 0 1 1 0 0
    goto    Configuracion13        ; 0 0 1 1 0 1
    goto    Configuracion14        ; 0 0 1 1 1 0
    goto    Configuracion15        ; 0 0 1 1 1 1
    goto    Configuracion16        ; 0 1 0 0 0 0
    goto    Configuracion17        ; 0 1 0 0 0 1
    goto    Configuracion18        ; 0 1 0 0 1 0
    goto    Configuracion19        ; 0 1 0 0 1 1
    goto    Configuracion20        ; 0 1 0 1 0 0
    goto    Configuracion21        ; 0 1 0 1 0 1
    goto    Configuracion22        ; 0 1 0 1 1 0
    goto    Configuracion23        ; 0 1 0 1 1 1
    goto    Configuracion24        ; 0 1 1 0 0 0
    goto    Configuracion25        ; 0 1 1 0 0 1
    goto    Configuracion26        ; 0 1 1 0 1 0
    goto    Configuracion27        ; 0 1 1 0 1 1
    goto    Configuracion28        ; 0 1 1 1 0 0
    goto    Configuracion29        ; 0 1 1 1 0 1
    goto    Configuracion30        ; 0 1 1 1 1 0
    goto    Configuracion31        ; 0 1 1 1 1 1
    goto    Configuracion32
    goto    Configuracion33
    goto    Configuracion34
    goto    Configuracion35
    goto    Configuracion36
    goto    Configuracion37
    goto    Configuracion38
    goto    Configuracion39
    goto    Configuracion40
    goto    Configuracion41
    goto    Configuracion42
    goto    Configuracion43
    goto    Configuracion44
    goto    Configuracion45
    goto    Configuracion46
    goto    Configuracion47
    goto    Configuracion48
    goto    Configuracion49
    goto    Configuracion50
    goto    Configuracion51
    goto    Configuracion52
    goto    Configuracion53
    goto    Configuracion54
    goto    Configuracion55
    goto    Configuracion56
    goto    Configuracion57
    goto    Configuracion58
    goto    Configuracion59
    goto    Configuracion60
    goto    Configuracion61
    goto    Configuracion62
    goto    Configuracion63
Configuracion0                       
    goto    ActivaSalida
Configuracion1                       
    goto    ActivaSalida
Configuracion2                   
    goto    ActivaSalida
Configuracion3                   
    goto    ActivaSalida
Configuracion4
    goto    ActivaSalida
Configuracion5
    goto    ActivaSalida
Configuracion6
    goto    ActivaSalida
Configuracion7
    goto    ActivaSalida
Configuracion8
    goto    ActivaSalida
Configuracion9
    goto    ActivaSalida
Configuracion10
    goto    ActivaSalida
Configuracion11
    goto    ActivaSalida
Configuracion12
    goto    ActivaSalida
Configuracion13
    goto    ActivaSalida
Configuracion14
    goto    ActivaSalida
Configuracion15
    goto    ActivaSalida
Configuracion16
    goto    ActivaSalida
Configuracion17
    goto    ActivaSalida
Configuracion18
    goto    ActivaSalida
Configuracion19
    goto    ActivaSalida
Configuracion20
    goto    ActivaSalida
Configuracion21
    goto    ActivaSalida
Configuracion22
    goto    ActivaSalida
Configuracion23
    goto    ActivaSalida
Configuracion24
    goto    ActivaSalida
Configuracion25
    goto    ActivaSalida
Configuracion26
    goto    ActivaSalida
Configuracion27
    goto    ActivaSalida
Configuracion28
    goto    ActivaSalida
Configuracion29
    goto    ActivaSalida
Configuracion30
    goto    ActivaSalida
Configuracion31
    goto    ActivaSalida
Configuracion32
    goto    ActivaSalida
Configuracion33
    goto    ActivaSalida
Configuracion34
    goto    ActivaSalida
Configuracion35
    goto    ActivaSalida
Configuracion36
    goto    ActivaSalida
Configuracion37
    goto    ActivaSalida
Configuracion38
    goto    ActivaSalida
Configuracion39
    goto    ActivaSalida
Configuracion40
    goto    ActivaSalida
Configuracion41
    goto    ActivaSalida
Configuracion42
    goto    ActivaSalida
Configuracion43
    goto    ActivaSalida
Configuracion44
    goto    ActivaSalida
Configuracion45
    goto    ActivaSalida
Configuracion46
    goto    ActivaSalida
Configuracion47
    goto    ActivaSalida
Configuracion48
    goto    ActivaSalida
Configuracion49
    goto    ActivaSalida
Configuracion50
    goto    ActivaSalida
Configuracion51
    goto    ActivaSalida
Configuracion52
    goto    ActivaSalida
Configuracion53
    goto    ActivaSalida
Configuracion54
    goto    ActivaSalida
Configuracion55
    goto    ActivaSalida
Configuracion56
    goto    ActivaSalida
Configuracion57
    goto    ActivaSalida
Configuracion58
    goto    ActivaSalida
Configuracion59
    goto    ActivaSalida
Configuracion60
    goto    ActivaSalida
Configuracion61
    goto    ActivaSalida
Configuracion62
    goto    ActivaSalida
Configuracion63
    goto    ActivaSalida
ActivaSalida
;    movwf    PORTB               
    goto     Principal

;
; "Mensajes" ----------------------------------------------------------------------------
;
Mensajes
    addwf    PCL,F
Mensaje1
    DT    "      STAND BY      ", 0x00
Mensaje2
    DT    "MEnsaje             1.", 0x00
Mensaje3
    DT     "Mensaje 2            ", 0x00
Mensaje4
    DT    "Mensaje 3             ", 0x00
Mensaje5
    DT     "     Msm             ", 0x00
Mensaje6
    DT    "Motor girando...", 0x00
Mensaje7
    DT     "marca", 0x00
Mensaje8
    DT    "Mensaje 4-2     ", 0x00
FinTabla
;MensajeAnuncio
;    DT " anuncio---       ", 0x00   

    IF (FinTabla > 0xFF)
        ERROR    "¡CUIDADO!: La tabla ha superado el tamaño de la página de los"
        MESSG    "primeros 256 bytes de memoria ROM. NO funcionará correctamente."
    ENDIF

    INCLUDE  <LCD_4BIT.INC>
    INCLUDE  <LCD_MENS.INC>
    INCLUDE  <RETARDOS.INC>
    END


Saludo.
#1556
Electrónica / Re: Tablas indexado de 8 bits.
29 Agosto 2010, 02:39 AM
Hola:

Muchas gracias por la explicación. No se me había ocurrido crear usar macros.

Te me has delantado ya que te iba a poner esta explicación de lo que quiero decite.

Hola:

Ese es el problema, no liar la parda cmabiando los contadores. En el primer ejemplo que puse, me pareció mucho poner los 256 configuraciones, sólo llegué a 53 y me cansé. A parte que no voy a utilizar las 256 combinaciones que hay usando los 8 pines de un puerto del PIC.

Con los ejemplos que he puesto. ¿Entiendes a lo que quiero llegar?


      Configuración0       Configuración1       Configuración2       Configuración3       Configuración4       Configuración5       Configuración6       Configuración7       Configuración8       Configuración9       Configuración10       Configuración11       Configuración12       Configuración13       Configuración14       Configuración15       Configuración16       Configuración17       Configuración18       Configuración19       Configuración20       Configuración21       Configuración22       Configuración23       Configuración24       Configuración25       Configuración26       Configuración27       Configuración28       Configuración29       Configuración30       Configuración31       Configuración32       Configuración33       Configuración34       Configuración35       Configuración36       Configuración37       Configuración38       Configuración39       Configuración40       Configuración41       Configuración42       Configuración43       Configuración44       Configuración45       Configuración46       Configuración47       Configuración48       Configuración49       Configuración50       Configuración51       Configuración52       Configuración53 
Como muestra el primer ejemplo.

   movf    PORTA,W                ; Lee los sensores.
    andlw    b'00000111'            ; Máscara para quedarse con el valor de los sensores.
    addwf    PCL,F                ; Salta a la configuración adecuada.
    goto    Configuracion0
    goto    Configuracion1
    goto    Configuracion2
    goto    Configuracion3
    goto    Configuracion4
    goto    Configuracion5
    goto    Configuracion6
    goto    Configuracion7
Configuracion0
    movlw     b'01100001'            ; Estado "Vacio" (configuración 0).
    goto    ActivaSalida
Configuracion1
    movlw     b'01100010'            ; Estado "Llenándose" (configuración 1).
    goto    ActivaSalida
Configuracion2
    movlw     b'00010000'            ; Estado "Alarma" (configuración 2).
    goto    ActivaSalida
Configuracion3
    movlw     b'00100100'            ; Estado "Lleno" (configuración 3).
    goto    ActivaSalida
Configuracion4
    movlw     b'00010000'            ; Estado "Alarma" (configuración 4).
    goto    ActivaSalida
Configuracion5
    movlw     b'00010000'            ; Estado "Alarma" (configuración 5).
    goto    ActivaSalida
Configuracion6
    movlw     b'00010000'            ; Estado "Alarma" (configuración 6).
    goto    ActivaSalida
Configuracion7
    movlw     b'00001000'            ; Estado "Rebose" (configuración 7).
ActivaSalida
    movwf    PORTB                ; Visualiza por el puerto de salida.
    goto     Principal

    END
No sólo desea activar salidas 1 y 0. También quiero añadirle más códigos.

Configuracion0
    movlw     b'01100001'            ; Estado "Vacio" (configuración 0).
    goto    ActivaSalida
Configuracion1
    movlw     b'01100010'            ; Estado "Llenándose" (configuración 1).
    goto    ActivaSalida
Configuracion2
    movlw     b'00010000'            ; Estado "Alarma" (configuración 2).
    goto    ActivaSalida
Configuracion3
    movlw     b'00100100'            ; Estado "Lleno" (configuración 3).
    goto    ActivaSalida
Configuracion4
    movlw     b'00010000'            ; Estado "Alarma" (configuración 4).
    goto    ActivaSalida
Configuracion5
    movlw     b'00010000'            ; Estado "Alarma" (configuración 5).
    goto    ActivaSalida
Configuracion6
    movlw     b'00010000'            ; Estado "Alarma" (configuración 6).
    goto    ActivaSalida
Configuracion7
    movlw     b'00001000'            ; Estado "Rebose" (configuración 7).
ActivaSalida
    movwf    PORTB                ; Visualiza por el puerto de salida.
    goto     Principal

Quiero insertarle más códigos como el ejemplo de abajo.
Citar
Configuracion0
call LCD_LineaEnBlanco
call LCD_Linea1
movlw Mensaje3_1
call LCD_Mensaje
call LCD_Linea2
movlw Mensaje3_2
call LCD_Mensaje

movlw b'01100001' ; Estado "Vacio" (configuración 0).
goto ActivaSalida
Configuracion1
call LCD_LineaEnBlanco
call LCD_Linea1
movlw Mensaje78_1
call LCD_Mensaje
call LCD_Linea2
movlw Mensaje5_msn
call LCD_Mensaje

movlw b'01100010' ; Estado "Llenándose" (configuración 1).
goto ActivaSalida
Configuracion2
call LCD_LineaEnBlanco
call LCD_Linea1
movlw Mensaje4_1
call LCD_Mensaje
call LCD_LineaEnBlanco
call LCD_Linea2
movlw Mensaje4_2
call LCD_Mensaje
call LCD_LineaEnBlanco
call LCD_Linea3
movlw Mensaje3_1
call LCD_Mensaje
call LCD_LineaEnBlanco
call LCD_Linea4
movlw Mensaje3_2
call LCD_Mensaje
movlw b'00010000' ; Estado "Alarma" (configuración 2).
goto ActivaSalida
Configuracion3

movlw b'00100100' ; Estado "Lleno" (configuración 3).
goto ActivaSalida
Configuracion4
movlw b'00010000' ; Estado "Alarma" (configuración 4).
goto ActivaSalida
Configuracion5
movlw b'00010000' ; Estado "Alarma" (configuración 5).
goto ActivaSalida
Configuracion6
movlw b'00010000' ; Estado "Alarma" (configuración 6).
goto ActivaSalida
Configuracion7
movlw b'00001000' ; Estado "Rebose" (configuración 7).
ActivaSalida
movwf PORTB ; Visualiza por el puerto de salida.
goto Principal
Lo azul es donde inyecté más códigos para ejecutar. Esta es la idea si usas sólo 8 Configuraciones, no es cuestión usar esa técnica si son 256 configuraciones, me da algo si lo hago, aunque estaba a punto de hacerlo, pero me entró depresión.

Por eso quiero buscar la mejor forma de usar un buen decoder solo usando las entradas que reconozca e ignora las que no conozcas y que se pueda poner más códigos en las configuraciones, no sólo una línea de código.

Saludo.
#1557
Electrónica / Tablas indexado de 8 bits.
28 Agosto 2010, 06:52 AM
Hola:

Como pueden ver el código de abajo. Se utiliza 3 bits de entrada para una tabla de la verdad. 8 Configuraciones en total. Está muy bien para hacer un decoder. Viendo que quiero hacer uno de 8 bits, 8 entradas para la tabla de la verdad, obtiene 256 Configuraciones. Tardaría años en configurarlas todas. No quiero usar TTL decoder a parte, sólo con PIC.

¿Existe una manera de hacer esta tabla sin tardar demasiado tiempo en hacer 256 configuraciones?

El ejemplo de abajo son de 8 configuraciones y no me parece mucho, pero 256 es la eternidad.




; Controla el nivel de un depósito de líquido. Utiliza (entre paréntesis las líneas del
; microcontrolador a la que se han conectado):
; -    Tres sondas detectoras: SV, Sonda de Vacío (RA0); SLL, Sonda de LLenado (RA1);
;    SR, Sonda de Rebose (RA2).
; -    Dos bombas de agua: B1 (RB5), B2 (RB6).
; - Cinco indicadores: Vacio (RB0), Llenandose (RB1), Lleno (RB2), Rebose (RB3),
;    Alarma (RB4).
;
; Su funcionamiento:
; -    Cuando ninguna de las sondas está mojada se entiende que el depósito está vacío y
;    se accionarán las dos bombas. El indicador "Vacio" se iluminará .
; -    Cuando el nivel del líquido toque la sonda de vacío "SV" seguirá llenándose el
;     depósito con las dos bombas. El indicador "Llenandose" se ilumina.
; -    Cuando el nivel del líquido toca la sonda de llenado "SLL", para la bomba B2, quedando
;    B1 activada en modo mantenimiento. El indicador "Lleno" se ilumina.
; -    Si el nivel del líquido moja la sonda de rebose "SR" se apaga también la bomba B1,
;    quedando las dos bombas fuera de servicio. El indicador "Rebose" se enciende.
; -    Cuando se produce un fallo o mal funcionamiento en las sondas de entrada (por
;    ejemplo que se active la sonda de rebose y no active la de vacío) se paran
;    las dos bombas. El indicador "Alarma" se ilumina.
;
; Según el enunciado del problema, teniendo en cuenta las conexiones citadas y poniendo la
; salida no utilizada (RB7) siempre a cero, la tabla de verdad resultante es:
;
; RA2.. RA0 | RB7 ...          ... RB0
; ------------|--------------------------------
;  0   0   0  |  0   1   1   0   0   0   0   1    (Configuración 0. Estado "Vacio").
;  0   0   1  |  0   1   1   0   0   0   1   0    (Configuración 1. Estado "Llenandose").
;  0   1   0  |  0   0   0   1   0   0   0   0    (Configuración 2. Estado "Alarma").
;  0   1   1  |  0   0   1   0   0   1   0   0    (Configuración 3. Estado "Lleno").
;  1   0   0  |  0   0   0   1   0   0   0   0    (Configuración 4. Estado "Alarma").
;  1   0   1  |  0   0   0   1   0   0   0   0    (Configuración 5. Estado "Alarma").
;  1   1   0  |  0   0   0   1   0   0   0   0    (Configuración 6. Estado "Alarma").
;  1   1   1  |  0   0   0   0   1   0   0   0    (Configuración 7. Estado "Rebose").
;
; ZONA DE DATOS **********************************************************************

    LIST        P=16F84A
    INCLUDE        <P16F84A.INC>
    __CONFIG    _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC

; ZONA DE CÓDIGOS ********************************************************************

    ORG     0                    ; El programa comienza en la dirección 0.
Inicio
    clrf    PORTB                ; Debe estar a cero cuando el puerto se configure como salida.
    bsf        STATUS,RP0            ; Acceso al Banco 1.
    clrf    TRISB                ; Las líneas del Puerto B se configuran como salida.
    movlw    b'00011111'            ; Las 5 líneas del Puerto A se configuran como entrada.
    movwf    TRISA
    bcf        STATUS,RP0            ; Acceso al Banco 0.
Principal
    movf    PORTA,W                ; Lee los sensores.
    andlw    b'00000111'            ; Máscara para quedarse con el valor de los sensores.
    addwf    PCL,F                ; Salta a la configuración adecuada.
    goto    Configuracion0
    goto    Configuracion1
    goto    Configuracion2
    goto    Configuracion3
    goto    Configuracion4
    goto    Configuracion5
    goto    Configuracion6
    goto    Configuracion7
Configuracion0
    movlw     b'01100001'            ; Estado "Vacio" (configuración 0).
    goto    ActivaSalida
Configuracion1
    movlw     b'01100010'            ; Estado "Llenándose" (configuración 1).
    goto    ActivaSalida
Configuracion2
    movlw     b'00010000'            ; Estado "Alarma" (configuración 2).
    goto    ActivaSalida
Configuracion3
    movlw     b'00100100'            ; Estado "Lleno" (configuración 3).
    goto    ActivaSalida
Configuracion4
    movlw     b'00010000'            ; Estado "Alarma" (configuración 4).
    goto    ActivaSalida
Configuracion5
    movlw     b'00010000'            ; Estado "Alarma" (configuración 5).
    goto    ActivaSalida
Configuracion6
    movlw     b'00010000'            ; Estado "Alarma" (configuración 6).
    goto    ActivaSalida
Configuracion7
    movlw     b'00001000'            ; Estado "Rebose" (configuración 7).
ActivaSalida
    movwf    PORTB                ; Visualiza por el puerto de salida.
    goto     Principal

    END


Un cordial saludo.
#1558
Los programadores de USB son caros, y eso que cada vez sacan algunos nuevos. Este es el más nuevo que han sacado.



Citar
Ingeniería de Microsistemas Programados presenta el nuevo grabador Universal USB-Pic'Burner. Consiste en un grabador de última generación y bajo coste que admite los dispositivos PIC mas representativos de 8, 18, 28 y 40 patillas, de las familias 12F, 16F, 18F, que se insertan sobre un zócalo ZIF de fuerza de inserción nula.

Su interface con el PC (de sobremesa o portátil) se realiza a través de un puerto USB desde donde también se toma la alimentación. Se trata por tanto de un grabador de reducidas dimensiones, potente, económico y totalmente portátil que se controla directamente desde el conocido entorno de desarrollo MPLAB-IDE y/o desde el software
de grabación PICKit-2. Ambas herramientas software son originales de Microchip y se pueden descargar sin costo alguno desde www.microchip.com

Sus características más relevantes son:

    * Reducidas dimensiones de 77x 62mm
    * Interface USB con el PC mediante cable USB tipo A a tipo B (incluido)
    * Alimentación desde el propio puerto USB del PC; consumo de 35mA en standby y 55mA en actividad
    * Compatible a nievel de hardware con el PICkit-2 de Microchip
    * Compatible a nivel de software con MPLAB-IDE y PICkit-2 de Microchip.
    * Se puede configurar para proceder automáticamente a la grabación cada vez que se realiza el ensamblado/compilado de un programa
    * Zócalo ZIF de inserción nula que admite dispositivos PICde 0.3" y 0.6" de 8, 18, 28 y 40 patillas de las familias PIC12, PIC16 y PIC18
    * Selección mediante jumper del dispositivo de 8, 18, 28/40 patillas a grabar
    * Dispone de conexión ICSP compatible con PICKit-2 que transporta las señales de grabación
    * Esas señales ICSP es posible conectarlas a múltiples dispositivos PIC de otras familias y encapsulados soportados por MPLAB-IDE y PICkit-2


Ver el programdor y sus características en PDF.

Fuente:
http://www.msebilbao.com/tienda/product_info.php?products_id=582
#1559
Electrónica / Hacer algo con la PS2 vieja.
27 Agosto 2010, 08:47 AM
Hola:



Tengo una PS2 FAT y quiero hacerle un poco de experimento con ella aunque sea inútil. Mi idea principal es usar un LCD 16x2 HD44780 de Hitachi que al introducir el juego sea capaz de detectar que juego he instertado. El DVD del juego tiene un ID que la PS2 sabe el título introducido, solo que no se como obtenerlo. En la EEPROM externa 24LC256 de un PIC16F88 por poner un ejemplo, tiene los ID obtenidos por cada juego que tengo original y sus títulos, es decir, que en la EEPROM están guardados los datos, el PIC16F88 o otro está conectado entre el lector y la placa de la PS2 de una manera que detecte los id del juego al introducir un DVD.

También detecta cuando le falta un juego, cuando has introducido un juego, cuando expulsa un juego, cuando enciende o reinicia la consola, etc.

Si pueden o los que sepan, pueden ponerme cualquier información sobre las PS2 y sus placas bases más lectores. Mi modelo de PS2 es el SCPH-39004. Pueden poner el que quieran. Sólo encuentro poner chip pero eso no me interesa.

Para que se hagan una idea, la 360 se puede extraer datos del lector como la Key, pero no he probado si con ella se puede leer los id de los discos para hacer esta funcióny obtener los títulos del juego.

Un cordial saludo.
#1560
Programación General / Visual C#.
25 Agosto 2010, 00:53 AM
Me encanta Visual C#.