;************************************ RS232_11.asm **************************************
;
;
; SISTEMA DE GOBIERNO DESDE ORDENADOR: Desde el teclado de un ordenador se desea comandar
; el movimiento de una estructura móvil, según la siguiente tabla:
;
; TECLA (Por ejemplo) MOVIMIENTO
; ------------------- ----------
; t Adelante
; b Atrás
; a Izquierda
; l Derecha
; Espacio Parada
;
; La pulsación de cualquiera de estas teclas activa el estado de las salidas correspondiente
; RB3 (Adelante), RB2 (Atrás), RB1 (Izquierda), RB0 (Derecha) y apaga el resto.
;
; El movimiento que se está realizando aparece reflejado en un mensaje en el visualizador LCD
; del sistema y también en la pantalla del ordenador.
;
; El programa debe permitir modificar facilmente en posteriores revisiones en el hardware de
; la salida. Es decir, para activar las salidas conviene utilizar el direccionamiento por bit
; en lugar de por byte (utilizar instrucciones "bsf" y "bcf", en lugar de "mov..").
LIST P=16F877A
INCLUDE <P16F877A.INC>
__CONFIG _CP_OFF & _WDT_OFF & _LVP_OFF & _PWRTE_ON & _XT_OSC
CBLOCK 0x0C
TeclaPulsada ; Va a guardar el contenido de la tecla pulsada.
MensajeApuntado ; Va a guarda la dirección del mensaje apuntado.
ENDC
#DEFINE SalidaAdelante PORTB,3 ; Define dónde se sitúan las salidas.
#DEFINE SalidaAtras PORTB,2
#DEFINE SalidaIzquierda PORTB,1
#DEFINE SalidaDerecha PORTB,0
TECLA_ADELANTE EQU 't' ; Código de las teclas utilizadas.
TECLA_ATRAS EQU 'b'
TECLA_IZQ EQU 'a'
TECLA_DER EQU 'l'
TECLA_PARADA EQU ' ' ; Código de la tecla espaciadora, (hay un espacio,
; tened cuidado al teclear el programa).
CONF_ADCON1 EQU b'00000110' ; Configuracion PORTA E/S digital
; ZONA DE CÓDIGOS ********************************************************************
ORG 0
movlw 7
movwf CMCON ; CMCON=7 inhibir los comparadores
;**** Configuracion de puertos ****
bsf STATUS,RP0 ; Ir banco 1
movlw b'00000000' ; valor portA
movwf PORTA
movlw b'00000000' ; valor portB 0 SALIDA---1 ENTRADA
movwf PORTB
movlw b'00000000' ; valor portC
movwf PORTC
movlw b'00000001' ; valor portD
movwf PORTD
movlw b'00000000' ; valor portE
movwf PORTE
bcf OPTION_REG,7 ; Pull up habilitadas
bcf STATUS,RP1
movlw CONF_ADCON1 ; Configurar el PORTA como digital
movwf ADCON1
bcf STATUS,RP0 ; Ir banco 0
bcf STATUS,RP1
Inicio
call RS232_Inicializa
Principal
bsf PORTB,0
call RS232_LeeDato ; Espera a recibir un carácter.
call TesteaTeclado
goto Principal
; Subrutina "TesteaTeclado" -------------------------------------------------------------
;
; Testea el teclado y actúa en consecuencia.
TesteaTeclado
movwf TeclaPulsada ; Guarda el contenido de la tecla pulsada.
xorlw TECLA_ADELANTE ; ¿Es la tecla del movimiento hacia adelante?
btfsc STATUS,Z
goto Adelante ; Sí, se desea movimiento hacia adelante.
;
movf TeclaPulsada,W ; Recupera el contenido de la tecla pulsada.
xorlw TECLA_ATRAS ; ¿Es la tecla del movimiento hacia atrás?
btfsc STATUS,Z
goto Atras ; Sí, se desea movimiento hacia atrás.
;
movf TeclaPulsada,W ; Recupera el contenido de la tecla pulsada.
xorlw TECLA_IZQ ; ¿Es la tecla del movimiento hacia la izquierda?
btfsc STATUS,Z
goto Izquierda ; Sí, se desea movimiento hacia la izquierda.
;
movf TeclaPulsada,W ; Recupera el contenido de la tecla pulsada.
xorlw TECLA_DER ; ¿Es tecla del movimiento hacia la derecha?
btfsc STATUS,Z
goto Derecha ; Sí, se desea movimiento hacia la derecha.
;
movf TeclaPulsada,W ; Recupera el contenido de la tecla pulsada.
xorlw TECLA_PARADA ; ¿Es la tecla de parada?.
btfss STATUS,Z
goto Fin ; No es ninguna tecla de movimiento. Sale.
Parado
bcf SalidaAdelante ; Como se ha pulsado la tecla de parada se
bcf SalidaAtras ; desactivan todas las salidas.
bcf SalidaIzquierda
bcf SalidaDerecha
goto Visualiza
Adelante
bcf SalidaAtras
bsf SalidaAdelante
bcf SalidaIzquierda
bcf SalidaDerecha
goto Visualiza
Atras
bcf SalidaAdelante
bsf SalidaAtras
bcf SalidaIzquierda
bcf SalidaDerecha
goto Visualiza
Izquierda
bcf SalidaAdelante
bcf SalidaAtras
bsf SalidaIzquierda
bcf SalidaDerecha
goto Visualiza
Derecha
bcf SalidaAdelante
bcf SalidaAtras
bcf SalidaIzquierda
; Según el estado de las salidas visualiza el estado del sistema en el visualizador LCD y en
; el monitor del ordenador.
Visualiza
Fin return
INCLUDE <RS232.INC>
INCLUDE <RETARDOS.INC>
;INCLUDE <RS232MEN.INC>
END3º: no entiendo muy bien a que te referis con que si no me importa perder datos, que significaria perder datos, por ejemplo que si estoy esperando el comando "ACTIVA", me llegaria "ACT" O "VA"?, o directamente no recivir nada, me podrias ampliar la idea?
4º: que micro puedo conseguir que no sea smd, 40 pines....a y que pueda programarlo con el Pickit 2, con dos puertos seriales por HW, en donde vivo no hay mucha variedad, y si tubiera que pasar como decis a un 18f, podria seguir programandolo en asembler?
y...otra...como seria en el caso de que este justo recibiendo por x puerto y se activara la otra interrupcion del otro puerto, cual tendria prioridad?, se puede asignar prioridades a las interrupciones?
Rutina de interrupcion:
Guardo contexto
Flag de Rb4 a 7 activo ?
SI: Voy a la rutina de que atienda esa interrupcion
Flag de UART RX ?
SI: Voy a la rutina que atiende esto.
Devuelvo contexto
RETFIEleyendo por el foro el tema que me planteas, he visto que dicen que las interrupciones no se llevan muy bien con dos o mas puertos seriales, segun tu conocimiento es asi, o no deberia de darme problema.
...que tendria que modificar para correrlo a 20mhz?
saludos
LIST P=16F877A
INCLUDE <P16F877A.INC>
__CONFIG _CP_OFF & _WDT_OFF & _LVP_OFF & _PWRTE_ON & _XT_OSC
CBLOCK 0x20
TeclaPulsada ; Va a guardar el contenido de la tecla pulsada.
MensajeApuntado ; Va a guarda la dirección del mensaje apuntado.
ENDC
#DEFINE SalidaAdelante PORTB,3 ; Define dónde se sitúan las salidas.
#DEFINE SalidaAtras PORTB,2
#DEFINE SalidaIzquierda PORTB,1
#DEFINE SalidaDerecha PORTB,0
TECLA_ADELANTE EQU 'a' ; Código de las teclas utilizadas.
TECLA_ATRAS EQU 's'
TECLA_IZQ EQU 'd'
TECLA_DER EQU 'f'
TECLA_PARADA EQU ' ' ; Código de la tecla espaciadora, (hay un espacio,
; tened cuidado al teclear el programa).
CONF_ADCON1 EQU b'00000110' ; Configuracion PORTA E/S digital
; ZONA DE CÓDIGOS ********************************************************************
ORG 0
movlw 7
movwf CMCON ; CMCON=7 inhibir los comparadores
;**** Configuracion de puertos ****
bsf STATUS,RP0 ; Ir banco 1
movlw b'00000000' ; valor portA
movwf PORTA
movlw b'00000000' ; valor portB 0 SALIDA---1 ENTRADA
movwf PORTB
movlw b'00000001' ; valor portC
movwf PORTC
movlw b'00000001' ; valor portD
movwf PORTD
movlw b'00000000' ; valor portE
movwf PORTE
bcf OPTION_REG,7 ; Pull up habilitadas
bcf STATUS,RP1
movlw CONF_ADCON1 ; Configurar el PORTA como digital
movwf ADCON1
bcf STATUS,RP0 ; Ir banco 0
bcf STATUS,RP1
Inicio
call RS232_Inicializa
call R232_Inicializa
Principal
call RS232_LeeDato ; Espera a recibir un carácter.
call TesteaTeclado
call R232_LeeDato ; Espera a recibir un carácter.
call TesteaTeclad
goto Principal
; "Mensajes" ----------------------------------------------------------------------------
;
Mensajes
addwf PCL,F
MensajeParado
DT "Sistema PARADO", 0x00
MensajeAdelante
DT "Marcha ADELANTE", 0x00
MensajeAtras
DT "Marcha ATRAS", 0x00
MensajeIzquierda
DT "Hacia IZQUIERDA", 0x00
MensajeDerecha
DT "Hacia DERECHA", 0x00
; Subrutina "TesteaTeclado" -------------------------------------------------------------
;
; Testea el teclado y actúa en consecuencia.
TesteaTeclado
movwf TeclaPulsada ; Guarda el contenido de la tecla pulsada.
xorlw TECLA_ADELANTE ; ¿Es la tecla del movimiento hacia adelante?
btfsc STATUS,Z
goto Adelante ; Sí, se desea movimiento hacia adelante.
;
movf TeclaPulsada,W ; Recupera el contenido de la tecla pulsada.
xorlw TECLA_ATRAS ; ¿Es la tecla del movimiento hacia atrás?
btfsc STATUS,Z
goto Atras ; Sí, se desea movimiento hacia atrás.
;
movf TeclaPulsada,W ; Recupera el contenido de la tecla pulsada.
xorlw TECLA_IZQ ; ¿Es la tecla del movimiento hacia la izquierda?
btfsc STATUS,Z
goto Izquierda ; Sí, se desea movimiento hacia la izquierda.
;
movf TeclaPulsada,W ; Recupera el contenido de la tecla pulsada.
xorlw TECLA_DER ; ¿Es tecla del movimiento hacia la derecha?
btfsc STATUS,Z
goto Derecha ; Sí, se desea movimiento hacia la derecha.
;
movf TeclaPulsada,W ; Recupera el contenido de la tecla pulsada.
xorlw TECLA_PARADA ; ¿Es la tecla de parada?.
btfss STATUS,Z
goto Fin ; No es ninguna tecla de movimiento. Sale.
Parado
bcf SalidaAdelante ; Como se ha pulsado la tecla de parada se
bcf SalidaAtras ; desactivan todas las salidas.
bcf SalidaIzquierda
bcf SalidaDerecha
movlw MensajeParado
goto Visualiza
Adelante
bcf SalidaAtras
bsf SalidaAdelante
bcf SalidaIzquierda
bcf SalidaDerecha
movlw MensajeAdelante
goto Visualiza
Atras
bcf SalidaAdelante
bsf SalidaAtras
bcf SalidaIzquierda
bcf SalidaDerecha
movlw MensajeAtras
goto Visualiza
Izquierda
bcf SalidaAdelante
bcf SalidaAtras
bsf SalidaIzquierda
bcf SalidaDerecha
movlw MensajeIzquierda
goto Visualiza
Derecha
bcf SalidaAdelante
bcf SalidaAtras
bcf SalidaIzquierda
bsf SalidaDerecha
movlw MensajeDerecha
goto Visualiza
TesteaTeclad
movwf TeclaPulsada ; Guarda el contenido de la tecla pulsada.
xorlw TECLA_ADELANTE ; ¿Es la tecla del movimiento hacia adelante?
btfsc STATUS,Z
goto Adelant ; Sí, se desea movimiento hacia adelante.
;
movf TeclaPulsada,W ; Recupera el contenido de la tecla pulsada.
xorlw TECLA_ATRAS ; ¿Es la tecla del movimiento hacia atrás?
btfsc STATUS,Z
goto Atra ; Sí, se desea movimiento hacia atrás.
;
movf TeclaPulsada,W ; Recupera el contenido de la tecla pulsada.
xorlw TECLA_IZQ ; ¿Es la tecla del movimiento hacia la izquierda?
btfsc STATUS,Z
goto Izquierd ; Sí, se desea movimiento hacia la izquierda.
;
movf TeclaPulsada,W ; Recupera el contenido de la tecla pulsada.
xorlw TECLA_DER ; ¿Es tecla del movimiento hacia la derecha?
btfsc STATUS,Z
goto Derech ; Sí, se desea movimiento hacia la derecha.
;
movf TeclaPulsada,W ; Recupera el contenido de la tecla pulsada.
xorlw TECLA_PARADA ; ¿Es la tecla de parada?.
btfss STATUS,Z
goto Fin ; No es ninguna tecla de movimiento. Sale.
Adelant
bcf SalidaAtras
bsf SalidaAdelante
bcf SalidaIzquierda
bcf SalidaDerecha
movlw MensajeAdelante
goto Visualiz
Atra
bcf SalidaAdelante
bsf SalidaAtras
bcf SalidaIzquierda
bcf SalidaDerecha
movlw MensajeAtras
goto Visualiz
Izquierd
bcf SalidaAdelante
bcf SalidaAtras
bsf SalidaIzquierda
bcf SalidaDerecha
movlw MensajeIzquierda
goto Visualiz
Derech
bcf SalidaAdelante
bcf SalidaAtras
bcf SalidaIzquierda
bsf SalidaDerecha
movlw MensajeDerecha
goto Visualiz
; Según el estado de las salidas visualiza el estado del sistema en el visualizador LCD y en
; el monitor del ordenador.
Visualiza
movwf MensajeApuntado ; Guarda la posición del mensaje.
movf MensajeApuntado,W
call RS232_Mensaje ; Lo visualiza en el HyperTerminal.
return
Visualiz
movwf MensajeApuntado ; Guarda la posición del mensaje.
movf MensajeApuntado,W
call R232_Mensaje ; Lo visualiza en el HyperTerminal.
Fin return
INCLUDE <RS232.INC>
INCLUDE <RETARDOS.INC>
INCLUDE <RS232MEN.INC>
INCLUDE <RS232a.INC>
INCLUDE <RS232MENa.INC>
ENDsi me funciona de forma independiente pero no los dos a la ves