Buscar este blog

sábado, 28 de noviembre de 2015

PWM bidireccional con ARDUINO

http://diymakers.es/control-velocidad-y-sentido-de-motor-dc/

Reproduce Melodía (se recomienda cambiar la melodia)

#INCLUDE <16F877.H> // LIBRERIA DEL PIC A UTILIZAR
#FUSES XT, NOPROTECT, // CODIGO NO PROTEGIDO
#USE DELAY(CLOCK=4000000) // SELECCION DE LA FRECUENCIA DEL CRISTAL
#USE rs232(BAUD=9600, xmit=PIN_C6, rcv=PIN_C7) // COMUNICAION CON EL PUERTO SERIAL
#ORG 0X1F00, 0X1FFF VOID LOADER16F877(VOID){} // DIRECCION DEL CODIGO DE BUDLOADER

#include <TONES.c> // LIBRERIA DE TONOS MUSICALES

// TIEMPOS DE DURACION DE LAS NOTAS, TIPOS DE NOTAS MUSICALES
int S_CORCHEA=125,CORCHEA=250,FUSA=62;
long NEGRA=500,BLANCA=1000,REDONDA=2000;

VOID MAIN(){
WHILE(1){
// NOTAS DE LA CANCION
DELAY_MS(FUSA);
GENERATE_TONE(G_NOTE[0], CORCHEA);
DELAY_MS(CORCHEA);
GENERATE_TONE(Bb_NOTE[0], S_CORCHEA);
DELAY_MS(NEGRA);
GENERATE_TONE(G_NOTE[0], S_CORCHEA);
DELAY_MS(S_CORCHEA);
GENERATE_TONE(C_NOTE[2], CORCHEA);
GENERATE_TONE(G_NOTE[0], CORCHEA);
GENERATE_TONE(F_NOTE[0], CORCHEA);
GENERATE_TONE(G_NOTE[0], CORCHEA);
DELAY_MS(CORCHEA);
GENERATE_TONE(D_NOTE[2], S_CORCHEA);
DELAY_MS(CORCHEA);
DELAY_MS(CORCHEA);
GENERATE_TONE(G_NOTE[0], S_CORCHEA);
DELAY_MS(S_CORCHEA);
GENERATE_TONE(G_NOTE[0], S_CORCHEA);
GENERATE_TONE(Eb_NOTE[0], CORCHEA);
GENERATE_TONE(D_NOTE[2], CORCHEA);
GENERATE_TONE(Bb_NOTE[0], CORCHEA);
GENERATE_TONE(G_NOTE[0], CORCHEA);
GENERATE_TONE(D_NOTE[2], CORCHEA);
GENERATE_TONE(G_NOTE[2], CORCHEA);
GENERATE_TONE(G_NOTE[0], S_CORCHEA);
GENERATE_TONE(F_NOTE[0], S_CORCHEA);
DELAY_MS(S_CORCHEA);
GENERATE_TONE(F_NOTE[0], S_CORCHEA);
GENERATE_TONE(D_NOTE[0], CORCHEA);
GENERATE_TONE(Bb_NOTE[0], CORCHEA);
GENERATE_TONE(G_NOTE[0], BLANCA);
DELAY_MS(NEGRA);
GENERATE_TONE(F_NOTE[2], S_CORCHEA);
GENERATE_TONE(D_NOTE[2], CORCHEA);
GENERATE_TONE(C_NOTE[2], CORCHEA);
GENERATE_TONE(Bb_NOTE[0], CORCHEA);
GENERATE_TONE(G_NOTE[0], NEGRA);
GENERATE_TONE(Bb_NOTE[0], CORCHEA);
DELAY_MS(NEGRA);
GENERATE_TONE(G_NOTE[0], S_CORCHEA);
DELAY_MS(S_CORCHEA);
GENERATE_TONE(G_NOTE[0], S_CORCHEA);
GENERATE_TONE(D_NOTE[2], CORCHEA);
GENERATE_TONE(G_NOTE[0], CORCHEA);
GENERATE_TONE(F_NOTE[0], CORCHEA);
GENERATE_TONE(G_NOTE[0], NEGRA);
GENERATE_TONE(D_NOTE[2], CORCHEA);
DELAY_MS(NEGRA);
GENERATE_TONE(G_NOTE[0], S_CORCHEA);
DELAY_MS(S_CORCHEA);
GENERATE_TONE(G_NOTE[0], S_CORCHEA);
GENERATE_TONE(Eb_NOTE[0], CORCHEA);

GENERATE_TONE(Bb_NOTE[0], CORCHEA);
GENERATE_TONE(G_NOTE[0], CORCHEA);
GENERATE_TONE(D_NOTE[2], CORCHEA);
GENERATE_TONE(G_NOTE[2], CORCHEA);
GENERATE_TONE(G_NOTE[0], S_CORCHEA);
GENERATE_TONE(F_NOTE[0], S_CORCHEA);
DELAY_MS(S_CORCHEA);
GENERATE_TONE(F_NOTE[0], S_CORCHEA);
GENERATE_TONE(D_NOTE[0], CORCHEA);
GENERATE_TONE(Bb_NOTE[0], CORCHEA);
GENERATE_TONE(G_NOTE[0], BLANCA);

}// WHILE
}// MAIN

Visualización de salidas en HYPERTERMINAL

#INCLUDE <16F877.H> // LIBRERIA DEL PIC A UTILIZAR
#FUSES XT, NOPROTECT, // CODIGO NO PROTEGIDO
#USE DELAY(CLOCK=4000000) // SELECCION DE LA FRECUENCIA DEL CRISTAL
#USE rs232(BAUD=9600, XMIT=PIN_C6, rcv=PIN_C7) // COMUNICAION CON EL PUERTO SERIAL
#ORG 0X1F00, 0X1FFF VOID LOADER16F877(VOID){} // DIRECCION DEL CODIGO DE BUDLOADER

INT VAR;

VOID MAIN(){
WHILE(1){
VAR=INPUT_A();
IF(VAR==0){
   OUTPUT_B(0X00); // SALIDAS EN CEROS
   PRINTF("TODOS LOS BITS APAGADOS \n\r"); // ENVIA MENSAJE AL PUERTO SERIAL
}// IF
ELSE IF(VAR==1){
   OUTPUT_B(0X01); // SALIDAS EN UNOS
   PRINTF("TODOS LOS LEDS ENCENDIDOS \n\r"); // ENVIA MENSAJE AL PUERTO SERIAL
   DELAY_MS(1000); // DELAY DE 1 SEGUNDO
}// ELSE IF
}//WHILE
}//MAIN

Control de LCD (Desplegado, Corrimiento Derecha, Corrimiento Izquierda)

; Desplegar texto

PROCESSOR 16877
INCLUDE <P16F877.INC>

RDELAY EQU H'20'

ESTADO EQU 0X03
PUERTOB EQU 0X06
PUERTOD EQU 0X08

RS EQU 0
RW EQU 2
E  EQU 1

W EQU 0
F EQU 1

ORG 0
GOTO INICIO
ORG 5

; PROGRAMA PRINCIPAL

INICIO:
CLRF PORTB         ;Limpia PORTB
    CLRF PORTD         ;Limpia PORTD
    BSF STATUS, RP0
    BCF STATUS, RP1    ;Selecciona el banco 1
    CLRF TRISB         ;Configura PORTB como salida
    CLRF TRISA         ;Configura PORTA como salida
    BCF STATUS,RP0     ;Regresa al banco 0


; CODIGO DE DESPLIEGUE DE MENSAJES
DESPLEGAR:  
CALL INICIOLCD
CALL MENSAJE1
CALL R2
CALL MENSAJE2
GOTO DESPLEGAR


; SUBRUTINA DE MENSAJE 1
MENSAJE1:
    MOVLW ' '
    MOVWF PORTB
    CALL ESCRIBE
MOVLW 'M'          ;Mueve 'M' a W
    MOVWF PORTB        ;Mueve lo que hay en W a PORTB
    CALL ESCRIBE        ;Imprime en LCD
    MOVLW 'I'
    MOVWF PORTB
    CALL ESCRIBE
    MOVLW 'C'
    MOVWF PORTB
    CALL ESCRIBE
    MOVLW 'R'
    MOVWF PORTB
    CALL ESCRIBE
    MOVLW 'O'
    MOVWF PORTB
    CALL ESCRIBE
    MOVLW 'S'
    MOVWF PORTB
    CALL ESCRIBE
    MOVLW ' '
    MOVWF PORTB
    CALL ESCRIBE
    MOVLW ' '
    MOVWF PORTB
    CALL ESCRIBE
    MOVLW ' '
    MOVWF PORTB
    CALL ESCRIBE
    MOVLW ' '
    MOVWF PORTB
    CALL ESCRIBE
    MOVLW ' '
    MOVWF PORTB
    CALL ESCRIBE
    MOVLW ' '  
    MOVWF PORTB
    CALL ESCRIBE
MOVLW ' '
    MOVWF PORTB
    CALL ESCRIBE
MOVLW ' '
    MOVWF PORTB
    CALL ESCRIBE
MOVLW ' '
    MOVWF PORTB
    CALL ESCRIBE
MOVLW ' '
    MOVWF PORTB
    CALL ESCRIBE
MOVLW ' '
    MOVWF PORTB
    CALL ESCRIBE
MOVLW ' '
    MOVWF PORTB
    CALL ESCRIBE
CALL RETARDO10
    RETURN    
MENSAJE2:
    MOVLW ' '
    MOVWF PORTB
    CALL ESCRIBE
MOVLW ' '
    MOVWF PORTB
    CALL ESCRIBE
MOVLW ' '
    MOVWF PORTB
    CALL ESCRIBE
MOVLW ' '
    MOVWF PORTB
    CALL ESCRIBE
MOVLW ' '
    MOVWF PORTB
    CALL ESCRIBE
MOVLW ' '
    MOVWF PORTB
    CALL ESCRIBE
MOVLW ' '
    MOVWF PORTB
    CALL ESCRIBE
MOVLW ' '
    MOVWF PORTB
    CALL ESCRIBE
MOVLW 'I'         ;Mueve 'I' a W
    MOVWF PORTB       ;Mueve lo que hay en W a PORTB
    CALL ESCRIBE        ;Imprime en LCD
    MOVLW 'T'
    MOVWF PORTB
    CALL ESCRIBE
    MOVLW 'T'
    MOVWF PORTB
    CALL ESCRIBE
CALL RETARDO10
    RETURN  
; RENGLON 2
R2:
BCF PORTD,0 ; RS=0 MODO INST
MOVLW 0xC0  ;2da linea   USAR 0C
MOVWF PORTB
CALL COMANDO
    RETURN

; INICIALIZACION DE LA LCD
INICIOLCD:
CALL RETARDO100
MOVLW 30H
MOVWF PUERTOB
CALL RETARDO100
MOVLW 30H
MOVWF PUERTOB
CALL RETARDO100
MOVLW 38H
MOVWF PUERTOB
CALL COMANDO
MOVLW H'0C'
MOVWF PUERTOB
CALL COMANDO
MOVLW H'01'
MOVWF PUERTOB
CALL COMANDO
MOVLW H'06'
MOVWF PUERTOB
CALL COMANDO
MOVLW H'02'
MOVWF PUERTOB
CALL COMANDO
MOVLW H'80'
MOVWF PUERTOB
CALL COMANDO
RETURN

COMANDO:
CALL RETARDO10
BSF PUERTOD, E
BCF PUERTOD, RS
CALL RETARDO100
BCF PUERTOD, E
BCF PUERTOD, RS
CALL RETARDO10
CALL RETARDO10
RETURN

ESCRIBE:
CALL RETARDO10
BSF PUERTOD, RS
BSF PUERTOD, E
CALL RETARDO10
BCF PUERTOD, E
BCF PUERTOD, RS
CALL RETARDO10
CALL RETARDO10
RETURN

; RETARDO DE 255 MICROSEC
RETARDO255:
MOVLW 0XFF
MOVWF RDELAY
T1:
DECFSZ RDELAY, F
GOTO T1
RETURN

; RETARDO DE 100ms
RETARDO100:
CALL RETARDO10
CALL RETARDO10
CALL RETARDO10
CALL RETARDO10
CALL RETARDO10
CALL RETARDO10
CALL RETARDO10
CALL RETARDO10
CALL RETARDO10
CALL RETARDO10
RETURN

; RETARDO DE 10 ms
RETARDO10:
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
CALL RETARDO255
RETURN

END



; Desplazar a la derecha
processor 16f877
INCLUDE <P16f877.INC>

N EQU H'21'  ; asignamos direcciones.
M EQU H'22'
Q EQU H'23'

VAL1 EQU H'24'
VAL2 EQU H'25'
CONTA1 EQU 30H
CONTA2 EQU 30H

         org 0
    GOTO INICIO
         org 5  ; vector de reset, vector de interrupcion
       
INICIO

    clrf PORTB         ;Limpia PORTB
    clrf PORTA         ;Limpia PORTA
    bsf STATUS, RP0
    bcf STATUS, RP1    ;Selecciona el banco 1
    clrf TRISB         ;Configura PORTB como salida
    clrf TRISA         ;Configura PORTA como salida
    bcf STATUS,RP0     ;Regresa al banco 0


LCD_INICIAR

    CALL LCD_IN
    CALL I
    CALL F1
    CALL NEXT
    CALL I
    CALL F2
    GOTO LCD_INICIAR

I:
CALL DELAYL
    MOVLW 'E'
    CALL MANDAR
    MOVLW 'J'
    CALL MANDAR
    MOVLW 'E'
    CALL MANDAR
    MOVLW 'R'
    CALL MANDAR
    MOVLW 'C'
    CALL MANDAR
    MOVLW 'I'
    CALL MANDAR
    MOVLW 'C'
    CALL MANDAR
    MOVLW 'I'
    CALL MANDAR
    MOVLW 'O'
    CALL MANDAR
    MOVLW ' '
    CALL MANDAR
    MOVLW '2'
    CALL MANDAR
    MOVLW ' '
    CALL MANDAR
RETURN

F1:
    MOVLW 1CH    ;Desplazar 1C DERECHA    18 HIZQUIERDA
    CALL EJECUTA
    DECFSZ VAL1
    GOTO F1
RETURN

F2:
    MOVLW 1CH    ;Desplazar 1C DERECHA    18 HIZQUIERDA
    CALL EJECUTA
    DECFSZ VAL2
    GOTO F2
RETURN

NEXT:
    CALL LCD_IN
    MOVLW 0xD5    ;Ajusta la direccion de DD RAM
    CALL EJECUTA
RETURN

LCD_IN:
    MOVLW 30H    ;Activa funcion
    CALL EJECUTA
    CALL DELAY
    MOVLW 30H    ;Activa funcion
    CALL EJECUTA
    CALL DELAY
    MOVLW 38H    ;Activa funcion
    CALL EJECUTA
    MOVLW 0CH    ;Screen on/off cursor
    CALL EJECUTA
    MOVLW 01H    ;Borrar pantalla
    CALL EJECUTA
    MOVLW 06H    ;Direccion de movimiento
    CALL EJECUTA
    MOVLW 02H    ;Home
    CALL EJECUTA
    MOVLW 95H    ;Ajusta la direccion de DD RAM
    CALL EJECUTA
RETURN

EJECUTA:
MOVWF PORTB
CALL DELAY
MOVLW 02H
    MOVWF PORTA
    CALL DELAY
    MOVLW 00H
    MOVWF PORTA
    CALL DELAY
RETURN

MANDAR:
    MOVWF PORTB
    CALL DELAY
    MOVLW 03H
    MOVWF PORTA
    CALL DELAY
    MOVLW 01H
    MOVWF PORTA
    CALL DELAY
RETURN    


DELAY:
    movlw 10H
    movwf Q ;la CTE1 pasa a la direccion de VALOR1.    
TRES
    movlw 8H
    movwf M ;la CTE2 pasa a la direccion de VALOR2.
DOS
    movlw 255H
    movwf N ;la CTE3 pasa a la direccion de VALOR3.
UNO
    DECFSZ N,1
    GOTO UNO    
    DECFSZ M,1
    GOTO DOS    
    DECFSZ Q,1
    GOTO TRES  
    RETURN

DELAYL:
MOVLW CONTA1
    MOVWF VAL1
    MOVLW CONTA2
    MOVWF VAL2
RETURN

END


; Desplazar a la izquierda
processor 16f877
INCLUDE <P16f877.INC>

N EQU H'21'  ; asignamos direcciones.
M EQU H'22'
Q EQU H'23'

;quitndo el comentario podemos desplegar el mensaje en la parte alta del desplay
;VAL1 EQU H'60'
VAL2 EQU H'60'
;CONTA1 EQU 90H
CONTA2 EQU 90H

         org 0
    GOTO INICIO
         org 5  ; vector de reset, vector de interrupcion
       
INICIO

    clrf PORTB         ;Limpia PORTB
    clrf PORTD         ;Limpia PORTD
    bsf STATUS, RP0
    bcf STATUS, RP1    ;Selecciona el banco 1
    clrf TRISB         ;Configura PORTB como salida
    clrf TRISD         ;Configura PORTD como salida
    bcf STATUS,RP0     ;Regresa al banco 0


LCD_INICIAR
   ;quitndo el comentario podemos desplegar el mensaje en la parte alta del desplay
    CALL LCD_IN
    ;CALL I
    ;CALL F1
    ;CALL NEXT
    CALL I
    CALL F2
    GOTO LCD_INICIAR

I:
CALL DELAYL
    MOVLW 'E'
    CALL MANDAR
    MOVLW 'J'
    CALL MANDAR
    MOVLW 'E'
    CALL MANDAR
    MOVLW 'R'
    CALL MANDAR
    MOVLW 'C'
    CALL MANDAR
    MOVLW 'I'
    CALL MANDAR
    MOVLW 'C'
    CALL MANDAR
    MOVLW 'I'
    CALL MANDAR
    MOVLW 'O'
    CALL MANDAR
    MOVLW ' '
    CALL MANDAR
    MOVLW '3'
    CALL MANDAR
RETURN

;quitndo el comentario podemos desplegar el mensaje en la parte alta del desplay
;F1:
;    MOVLW 18H    ;Desplazar 1C DERECHA    18 HIZQUIERDA
;    CALL EJECUTA
;    DECFSZ VAL1
;    GOTO F1
;RETURN

F2:
    MOVLW 18H    ;Desplazar 1C DERECHA    18 HIZQUIERDA
    CALL EJECUTA
    DECFSZ VAL2
    GOTO F2
RETURN

NEXT:
    CALL LCD_IN
    MOVLW 0xD5    ;Ajusta la direccion de DD RAM
    CALL EJECUTA
RETURN

LCD_IN:
    MOVLW 30H    ;Activa funcion
    CALL EJECUTA
    CALL DELAY
    MOVLW 30H    ;Activa funcion
    CALL EJECUTA
    CALL DELAY
    MOVLW 38H    ;Activa funcion
    CALL EJECUTA
    MOVLW 0CH    ;Screen on/off cursor
    CALL EJECUTA
    MOVLW 01H    ;Borrar pantalla
    CALL EJECUTA
    MOVLW 06H    ;Direccion de movimiento
    CALL EJECUTA
    MOVLW 02H    ;Home
    CALL EJECUTA
    MOVLW 95H    ;Ajusta la direccion de DD RAM
    CALL EJECUTA
RETURN

EJECUTA:
MOVWF PORTB
CALL DELAY
MOVLW 02H
    MOVWF PORTD
    CALL DELAY
    MOVLW 00H
    MOVWF PORTD
    CALL DELAY
RETURN

MANDAR:
    MOVWF PORTB
    CALL DELAY
    MOVLW 03H
    MOVWF PORTD
    CALL DELAY
    MOVLW 01H
    MOVWF PORTD
    CALL DELAY
RETURN    


DELAY:
    movlw 20H
    movwf Q ;la CTE1 pasa a la direccion de VALOR1.    
TRES
    movlw 8H
    movwf M ;la CTE2 pasa a la direccion de VALOR2.
DOS
    movlw 255H
    movwf N ;la CTE3 pasa a la direccion de VALOR3.
UNO
    DECFSZ N,1
    GOTO UNO    
    DECFSZ M,1
    GOTO DOS    
    DECFSZ Q,1
    GOTO TRES  
    RETURN

DELAYL:
;quitndo el comentario podemos desplegar el mensaje en la parte alta del desplay
;MOVLW CONTA1
    ;MOVWF VAL1
    MOVLW CONTA2
    MOVWF VAL2
RETURN

END

Control de giro de un motor con visualización en LCD e HYPERTERMINAL

PROCESSOR 16F877; PROCESADOR A UTILIZAR
INCLUDE <P16F877.INC>; LIBRERIA DEL PIC

; VARIABLES DEL DELAY
VAL1 EQU 0x30
VAL2 EQU 0x31

    ORG 0; VECTOR DE RESET
    GOTO INICIO
    ORG 5; INICIO DEL PROGRAMA

; CONFIGURACION DE PUERTOS
INICIO:
CLRF PORTA; LIMPIA LE PUERTO A
CLRF PORTB; LIMPIA LE PUERTO B
CLRF PORTC; LIMPIA LE PUERTO C
    CLRF PORTD; LIMPIA EL PUERTO D
CLRF PORTE; LIMPIA EL PUERTO E
    BSF STATUS, RP0
    BCF STATUS, RP1; SELECCIONA EL BANCO 1
MOVLW 06H; CONFIGURA PUERTOS A Y E COMO DIGITALES
    MOVWF ADCON1
    MOVLW 3FH; CONFIGURA PUERTO A COMO ENTRADA
    MOVWF TRISA
    CLRF TRISB; CONFIGURA PUERTO B COMO SALIDA
CLRF TRISC; CONFIGURA PUERTO C COMO SALIDA
    CLRF TRISD; CONFIGURA PUERTO D COMO SALIDA
CLRF TRISE; CONFIGURA PUERTO E COMO SALIDA

; CONFIGURACION PARA EL REGISTRO DEL TRANSMISOR
    BSF STATUS, RP0; BIT DE SELECCION DE VELOCIDAD
    MOVLW D'25'; VELOCIDAD DEL BAUD, 9600
MOVLW 0CFH; PROGRAMA TERMINALES RC7 RX COMO ENTRADA
MOVWF TRISC; Y RC6 - TX COMO SALIDA
MOVLW 24H; MODO ASINCRONO DE 8 BITS
MOVWF TXSTA; HABILITA LA TRANSMICION
    BCF PIE1, TXIE; INTERRUPCION DE TRANSMICINO INHABILITADA
BCF PIE1, RCIE; INTERRUPCION DE RECEPCINO INHABILITADA
BCF STATUS, RP0; SELECCIONA EL BANCO CERO
MOVLW 90H; RECEPCION HABILITADA PARA 8 BITS DE DATOS
MOVWF RCSTA

    ; COMFIGURACION PARA EL REGISTRO DE RECEPTOR
    BSF RCSTA, SPEN; HABILITA EL PUERTO SERIE
    BSF RCSTA, CREN; CONFIGURA LA RECEPCION CONTINUA EN MODO ASINCRONO

; PROGRAMA PRINCIPAL
PROGRAMA:
    CALL LCD_L1; CONFIGURA LA LCD

; LECTURA DE LA ENTRADA
; REVISA SI EN LA ENTRADA HAY UN CERO
REV0:
MOVF PORTA,0 ; LEE EL PUERTO A Y MANDA EL DATO A W
SUBLW 0x00 ; RESTA W CON CERO
BTFSS STATUS,Z ; REVISA SI LA RESTA ES CERO
GOTO REV1 ; NO, VE A REV1
CALL CERO ; SI VE A CERO

; REVISA SI EN LA ENTRADA HAY UN UNO
REV1:  
MOVF PORTA,0 ; LEE EL PUERTO A Y MANDA EL DATO A W
      SUBLW 0x01 ; RESTA W CON UNO
BTFSS STATUS,Z ; REVISA SI LA RESTA ES CERO
GOTO REV2 ; NO, VE A REV2
CALL UNO ; SI VE A UNO

; REVISA SI EN LA ENTRADA HAY UN DOS
REV2:  
MOVF PORTA,0 ; LEE EL PUERTO A Y MANDA EL DATO A W
      SUBLW 0x02 ; RESTA W CON DOS
BTFSS STATUS,Z ; REVISA SI LA RESTA ES CERO
GOTO REV0 ; NO, VE A PROGRAMA
CALL DOS ; SI VE A UNO


; SUBRRUTINAS DE DESPLEGADO
CERO:
    CALL LCD_L1; CONFIGURA LA LCD
    CALL M3; MUESTRA MENSAJE
MOVLW B'000'; MUEVE CERO A W
MOVWF PORTE; MANDA DATOS AL PUERTO E
CALL ESCRIBECERO
GOTO PROGRAMA

ESCRIBECERO:
MOVLW 'M'        
    MOVWF TXREG; MUEVE W AL REGISTRO DE TRANSMICION
    BSF STATUS, RP0; CAMBIO AL BANCO 1
    CALL TRANSMITE; TRANSMITE EL NUMERO AL CANAL
MOVLW 'O'        
    MOVWF TXREG; MUEVE W AL REGISTRO DE TRANSMICION
    BSF STATUS, RP0; CAMBIO AL BANCO 1
    CALL TRANSMITE; TRANSMITE EL NUMERO AL CANAL
MOVLW 'T'        
    MOVWF TXREG; MUEVE W AL REGISTRO DE TRANSMICION
    BSF STATUS, RP0; CAMBIO AL BANCO 1
    CALL TRANSMITE; TRANSMITE EL NUMERO AL CANAL
MOVLW 'O'        
    MOVWF TXREG; MUEVE W AL REGISTRO DE TRANSMICION
    BSF STATUS, RP0; CAMBIO AL BANCO 1
    CALL TRANSMITE; TRANSMITE EL NUMERO AL CANAL
MOVLW 'R'        
    MOVWF TXREG; MUEVE W AL REGISTRO DE TRANSMICION
    BSF STATUS, RP0; CAMBIO AL BANCO 1
    CALL TRANSMITE; TRANSMITE EL NUMERO AL CANAL
MOVLW ' '        
    MOVWF TXREG; MUEVE W AL REGISTRO DE TRANSMICION
    BSF STATUS, RP0; CAMBIO AL BANCO 1
    CALL TRANSMITE; TRANSMITE EL NUMERO AL CANAL
MOVLW 'A'        
    MOVWF TXREG; MUEVE W AL REGISTRO DE TRANSMICION
    BSF STATUS, RP0; CAMBIO AL BANCO 1
    CALL TRANSMITE; TRANSMITE EL NUMERO AL CANAL
MOVLW 'P'        
    MOVWF TXREG; MUEVE W AL REGISTRO DE TRANSMICION
    BSF STATUS, RP0; CAMBIO AL BANCO 1
    CALL TRANSMITE; TRANSMITE EL NUMERO AL CANAL
MOVLW 'A'        
    MOVWF TXREG; MUEVE W AL REGISTRO DE TRANSMICION
    BSF STATUS, RP0; CAMBIO AL BANCO 1
    CALL TRANSMITE; TRANSMITE EL NUMERO AL CANAL
MOVLW 'G'        
    MOVWF TXREG; MUEVE W AL REGISTRO DE TRANSMICION
    BSF STATUS, RP0; CAMBIO AL BANCO 1
    CALL TRANSMITE; TRANSMITE EL NUMERO AL CANAL
MOVLW 'A'        
    MOVWF TXREG; MUEVE W AL REGISTRO DE TRANSMICION
    BSF STATUS, RP0; CAMBIO AL BANCO 1
    CALL TRANSMITE; TRANSMITE EL NUMERO AL CANAL
MOVLW 'D'        
    MOVWF TXREG; MUEVE W AL REGISTRO DE TRANSMICION
    BSF STATUS, RP0; CAMBIO AL BANCO 1
    CALL TRANSMITE; TRANSMITE EL NUMERO AL CANAL
MOVLW 'O'        
    MOVWF TXREG; MUEVE W AL REGISTRO DE TRANSMICION
    BSF STATUS, RP0; CAMBIO AL BANCO 1
    CALL TRANSMITE; TRANSMITE EL NUMERO AL CANAL  
MOVLW ' '        
    MOVWF TXREG; MUEVE W AL REGISTRO DE TRANSMICION
    BSF STATUS, RP0; CAMBIO AL BANCO 1
    CALL TRANSMITE; TRANSMITE EL NUMERO AL CANAL  
    RETURN

UNO:
    CALL LCD_L1; CONFIGURA LA LCD
    CALL M1; MUESTRA MENSAJE
MOVLW B'001'
MOVWF PORTE; MANDA DATOS AL PORT E
CALL ESCRIBEUNO
GOTO PROGRAMA

ESCRIBEUNO:
MOVLW 'G'        
    MOVWF TXREG; MUEVE W AL REGISTRO DE TRANSMICION
    BSF STATUS, RP0; CAMBIO AL BANCO 1
    CALL TRANSMITE; TRANSMITE EL NUMERO AL CANAL
MOVLW 'I'        
    MOVWF TXREG; MUEVE W AL REGISTRO DE TRANSMICION
    BSF STATUS, RP0; CAMBIO AL BANCO 1
    CALL TRANSMITE; TRANSMITE EL NUMERO AL CANAL
MOVLW 'R'        
    MOVWF TXREG; MUEVE W AL REGISTRO DE TRANSMICION
    BSF STATUS, RP0; CAMBIO AL BANCO 1
    CALL TRANSMITE; TRANSMITE EL NUMERO AL CANAL
MOVLW 'O'        
    MOVWF TXREG; MUEVE W AL REGISTRO DE TRANSMICION
    BSF STATUS, RP0; CAMBIO AL BANCO 1
    CALL TRANSMITE; TRANSMITE EL NUMERO AL CANAL
MOVLW ' '        
    MOVWF TXREG; MUEVE W AL REGISTRO DE TRANSMICION
    BSF STATUS, RP0; CAMBIO AL BANCO 1
    CALL TRANSMITE; TRANSMITE EL NUMERO AL CANAL
MOVLW 'D'        
    MOVWF TXREG; MUEVE W AL REGISTRO DE TRANSMICION
    BSF STATUS, RP0; CAMBIO AL BANCO 1
    CALL TRANSMITE; TRANSMITE EL NUMERO AL CANAL
MOVLW 'E'        
    MOVWF TXREG; MUEVE W AL REGISTRO DE TRANSMICION
    BSF STATUS, RP0; CAMBIO AL BANCO 1
    CALL TRANSMITE; TRANSMITE EL NUMERO AL CANAL
MOVLW 'R'        
    MOVWF TXREG; MUEVE W AL REGISTRO DE TRANSMICION
    BSF STATUS, RP0; CAMBIO AL BANCO 1
    CALL TRANSMITE; TRANSMITE EL NUMERO AL CANAL
MOVLW 'E'        
    MOVWF TXREG; MUEVE W AL REGISTRO DE TRANSMICION
    BSF STATUS, RP0; CAMBIO AL BANCO 1
    CALL TRANSMITE; TRANSMITE EL NUMERO AL CANAL
MOVLW 'C'        
    MOVWF TXREG; MUEVE W AL REGISTRO DE TRANSMICION
    BSF STATUS, RP0; CAMBIO AL BANCO 1
    CALL TRANSMITE; TRANSMITE EL NUMERO AL CANAL
MOVLW 'H'        
    MOVWF TXREG; MUEVE W AL REGISTRO DE TRANSMICION
    BSF STATUS, RP0; CAMBIO AL BANCO 1
    CALL TRANSMITE; TRANSMITE EL NUMERO AL CANAL
MOVLW 'A'        
    MOVWF TXREG; MUEVE W AL REGISTRO DE TRANSMICION
    BSF STATUS, RP0; CAMBIO AL BANCO 1
    CALL TRANSMITE; TRANSMITE EL NUMERO AL CANAL
MOVLW ' '        
    MOVWF TXREG; MUEVE W AL REGISTRO DE TRANSMICION
    BSF STATUS, RP0; CAMBIO AL BANCO 1
    CALL TRANSMITE; TRANSMITE EL NUMERO AL CANAL    
    RETURN

DOS:
    CALL LCD_L1; CONFIGURA LA LCD
    CALL M2; MUESTRA MENSAJE
MOVLW B'010'
MOVWF PORTE; MANDA DATOS AL PORT E  
CALL ESCRIBEDOS
GOTO PROGRAMA

ESCRIBEDOS:
MOVLW 'G'        
    MOVWF TXREG; MUEVE W AL REGISTRO DE TRANSMICION
    BSF STATUS, RP0; CAMBIO AL BANCO 1
    CALL TRANSMITE; TRANSMITE EL NUMERO AL CANAL
MOVLW 'I'        
    MOVWF TXREG; MUEVE W AL REGISTRO DE TRANSMICION
    BSF STATUS, RP0; CAMBIO AL BANCO 1
    CALL TRANSMITE; TRANSMITE EL NUMERO AL CANAL
MOVLW 'R'        
    MOVWF TXREG; MUEVE W AL REGISTRO DE TRANSMICION
    BSF STATUS, RP0; CAMBIO AL BANCO 1
    CALL TRANSMITE; TRANSMITE EL NUMERO AL CANAL
MOVLW 'O'        
    MOVWF TXREG; MUEVE W AL REGISTRO DE TRANSMICION
    BSF STATUS, RP0; CAMBIO AL BANCO 1
    CALL TRANSMITE; TRANSMITE EL NUMERO AL CANAL
MOVLW ' '        
    MOVWF TXREG; MUEVE W AL REGISTRO DE TRANSMICION
    BSF STATUS, RP0; CAMBIO AL BANCO 1
    CALL TRANSMITE; TRANSMITE EL NUMERO AL CANAL
MOVLW 'I'        
    MOVWF TXREG; MUEVE W AL REGISTRO DE TRANSMICION
    BSF STATUS, RP0; CAMBIO AL BANCO 1
    CALL TRANSMITE; TRANSMITE EL NUMERO AL CANAL
MOVLW 'Z'        
    MOVWF TXREG; MUEVE W AL REGISTRO DE TRANSMICION
    BSF STATUS, RP0; CAMBIO AL BANCO 1
    CALL TRANSMITE; TRANSMITE EL NUMERO AL CANAL
MOVLW 'Q'        
    MOVWF TXREG; MUEVE W AL REGISTRO DE TRANSMICION
    BSF STATUS, RP0; CAMBIO AL BANCO 1
    CALL TRANSMITE; TRANSMITE EL NUMERO AL CANAL
MOVLW 'U'        
    MOVWF TXREG; MUEVE W AL REGISTRO DE TRANSMICION
    BSF STATUS, RP0; CAMBIO AL BANCO 1
    CALL TRANSMITE; TRANSMITE EL NUMERO AL CANAL
MOVLW 'I'        
    MOVWF TXREG; MUEVE W AL REGISTRO DE TRANSMICION
    BSF STATUS, RP0; CAMBIO AL BANCO 1
    CALL TRANSMITE; TRANSMITE EL NUMERO AL CANAL
MOVLW 'E'        
    MOVWF TXREG; MUEVE W AL REGISTRO DE TRANSMICION
    BSF STATUS, RP0; CAMBIO AL BANCO 1
    CALL TRANSMITE; TRANSMITE EL NUMERO AL CANAL
MOVLW 'R'        
    MOVWF TXREG; MUEVE W AL REGISTRO DE TRANSMICION
    BSF STATUS, RP0; CAMBIO AL BANCO 1
    CALL TRANSMITE; TRANSMITE EL NUMERO AL CANAL
MOVLW 'D'        
    MOVWF TXREG; MUEVE W AL REGISTRO DE TRANSMICION
    BSF STATUS, RP0; CAMBIO AL BANCO 1
    CALL TRANSMITE; TRANSMITE EL NUMERO AL CANAL
MOVLW 'A'        
    MOVWF TXREG; MUEVE W AL REGISTRO DE TRANSMICION
    BSF STATUS, RP0; CAMBIO AL BANCO 1
    CALL TRANSMITE; TRANSMITE EL NUMERO AL CANAL
MOVLW ' '        
    MOVWF TXREG; MUEVE W AL REGISTRO DE TRANSMICION
    BSF STATUS, RP0; CAMBIO AL BANCO 1
    CALL TRANSMITE; TRANSMITE EL NUMERO AL CANAL  
    RETURN

; MENSAJES PARA ENVIAR
M1:
    MOVLW 'G'
    MOVWF PORTD
    CALL ESCRIBE
MOVLW 'I'        
    MOVWF PORTD      
    CALL ESCRIBE      
    MOVLW 'R'
    MOVWF PORTD
    CALL ESCRIBE
    MOVLW 'O'
    MOVWF PORTD
    CALL ESCRIBE
    MOVLW ' '
    MOVWF PORTD
    CALL ESCRIBE
    MOVLW 'D'
    MOVWF PORTD
    CALL ESCRIBE
    MOVLW 'E'
    MOVWF PORTD
    CALL ESCRIBE
    MOVLW 'R'
    MOVWF PORTD
    CALL ESCRIBE
    MOVLW 'E'
    MOVWF PORTD
    CALL ESCRIBE
    MOVLW 'C'
    MOVWF PORTD
    CALL ESCRIBE
    MOVLW 'H'
    MOVWF PORTD
    CALL ESCRIBE
    MOVLW 'A'
    MOVWF PORTD
    CALL ESCRIBE
    RETURN    

M2:
    MOVLW 'G'
    MOVWF PORTD
    CALL ESCRIBE
MOVLW 'I'          
    MOVWF PORTD        
    CALL ESCRIBE      
    MOVLW 'R'
    MOVWF PORTD
    CALL ESCRIBE
    MOVLW 'O'
    MOVWF PORTD
    CALL ESCRIBE
    MOVLW ' '
    MOVWF PORTD
    CALL ESCRIBE
    MOVLW 'I'
    MOVWF PORTD
    CALL ESCRIBE
    MOVLW 'Z'
    MOVWF PORTD
    CALL ESCRIBE
    MOVLW 'Q'
    MOVWF PORTD
    CALL ESCRIBE
    MOVLW 'U'
    MOVWF PORTD
    CALL ESCRIBE
    MOVLW 'I'
    MOVWF PORTD
    CALL ESCRIBE
    MOVLW 'E'
    MOVWF PORTD
    CALL ESCRIBE
    MOVLW 'R'
    MOVWF PORTD
    CALL ESCRIBE
  MOVLW 'D'
    MOVWF PORTD
    CALL ESCRIBE
  MOVLW 'A'
    MOVWF PORTD
    CALL ESCRIBE
    RETURN

M3:
    MOVLW 'M'
    MOVWF PORTD
    CALL ESCRIBE
MOVLW 'O'          
    MOVWF PORTD        
    CALL ESCRIBE        
    MOVLW 'T'
    MOVWF PORTD
    CALL ESCRIBE
    MOVLW 'O'
    MOVWF PORTD
    CALL ESCRIBE
    MOVLW 'R'
    MOVWF PORTD
    CALL ESCRIBE
    MOVLW ' '
    MOVWF PORTD
    CALL ESCRIBE
    MOVLW 'A'
    MOVWF PORTD
    CALL ESCRIBE
    MOVLW 'P'
    MOVWF PORTD
    CALL ESCRIBE
    MOVLW 'A'
    MOVWF PORTD
    CALL ESCRIBE
    MOVLW 'G'
    MOVWF PORTD
    CALL ESCRIBE
    MOVLW 'A'
    MOVWF PORTD
    CALL ESCRIBE
    MOVLW 'D'
    MOVWF PORTD
    CALL ESCRIBE
MOVLW 'O'
    MOVWF PORTD
    CALL ESCRIBE
    RETURN    

; SUBRRUTINA PARA INICIALIZAR LA LCD
LCD_L1:
BCF PORTB,7; RS=0, MODO INSTRUCCION
CALL DELAY
    MOVLW 0X01; LIMPIA EL LCD
    MOVWF PORTD
    CALL COMANDO; SE DA DE ALTA EL COMANDO
    MOVLW 0x0C; SELECCIONA LA PRIMERA LINEA
    MOVWF PORTD
    CALL COMANDO; SE DA DE ALTA EL COMANDO
    MOVLW 0x3C; SE CONFIGURA EL CURSOR
    MOVWF PORTD
    CALL COMANDO; SE DA DE ALTA EL COMANDO
    BSF PORTB, 7; RS=1, MODO ALTO
    RETURN

; SUBRRUTINA PARA EJECUTAR COMANDOS
COMANDO:
    BSF PORTB,6; PON ENALE EN 1
    CALL DELAY; TIEMPO DE ESPERA
    CALL DELAY
BCF PORTB, 6; ENABLE =0
CALL DELAY
    RETURN    

; SUBRRUTINA PARA ESCRIBIR EN LA LCD
ESCRIBE:
    BSF PORTB,7; RS=1, MODO ALTO
    CALL COMANDO
    RETURN

; SUBRRUTINA PARA ESCRIBIR EN HYPERTERMINAL
TRANSMITE    
VERIFICA:; LOOP DE VERIFICACION
       btfss TXSTA,TRMT; PREGUNTA SI TERMINO LA TRANSMICION
       goto VERIFICA; NO, SIGUE VERIFICANDO
       bcf STATUS,RP0; SI, CAMBIA AL BANCO CERO
       return

; SUBRRUTINA DE DELAY
DELAY:        
    MOVLW 0x0F
    MOVWF VAL2
CICLO:
    MOVLW 0XFF
    MOVWF VAL1
CICLO2:
    DECFSZ VAL1, 1
    GOTO CICLO2
    DECFSZ VAL2,1
    GOTO CICLO
    RETURN

 END

Chat entre dos computadoras con PIC y Bluetooth

#INCLUDE <16F877.H> // LIBRERIA DEL PIC A UTILIZAR
#FUSES XT, NOPROTECT, // CODIGO NO PROTEGIDO
#USE DELAY(CLOCK=4000000) // SELECCION DE LA FRECUENCIA DEL CRISTAL
#USE RS232(BAUD=9600, BITS=8, PARITY=N, XMIT=PIN_C6, RCV=PIN_C7) // COMUNICAION CON EL PUERTO SERIAL
#ORG 0X1F00, 0X1FFF VOID LOADER16F877(VOID){} // DIRECCION DEL CODIGO DE BUDLOADER
CHAR COMANDO; // COMANDO DE INICO
CHAR MENSAJE[20]; // ARREGLO DE LOS MENSAJES
VOID MAIN(){
WHILE(TRUE){
COMANDO=GETC(); // LEE UN COMANDO PARA INICIALIZAR LA COMUNICACINO
IF(COMANDO==' '){
// MENSAJE INICIAL
   PRINTF("\conexión ESTABLECIDA");
   PRINTF("\n");
   PRINTF("\rCHAT BLUETOOTH");
   PRINTF("\n");
   DELAY_MS(3000);
DO{
   PRINTF("\rPC1: "); // ESCRIBE LA PC1
   GETS(MENSAJE);
   OUTPUT_B(0X01); // ACTIVA EL RELAY, CAMBIA EL MANDO A LA PC2
   PRINTF("\rPC2: "); // ESCRIBE LA PC2
   GETS(MENSAJE);
   OUTPUT_B(0X00); // ACTIVA EL RELAY, CAMBIA EL MANDO A LA PC1
}WHILE(COMANDO==' '); // REALIZA LO ANTERIOR MIENTRAS QUE COMANDO NO CAMBIE DE VALOR
}//IF
}//WHILE

}//MAIN


                      Conexiones con pic, bluetooth y relay


viernes, 27 de noviembre de 2015

Señal de Video en formato VGA

Señales de vídeo de pantalla blanca, 8 barras de colores verticales, tres barras horizontales y tablero de ajedrez

----------------------------------------------------------------------------------
-- PRÁCTICA 3
-- DISEÑAR EN IMPLEMENTAR UN GENERADOR DE SEÑALES DE PRUEBA DE VÍDEO UTILIZANDO EL
-- PUERTO VGA PARA EL DESPLIEGUE DE LAS MISMAS
----------------------------------------------------------------------------------
library IEEE;
USE IEEE.STD_LOGIC_1164.ALL;

ENTITY VGA IS
PORT ( R : OUT  STD_LOGIC_VECTOR ( 3 DOWNTO 0);-- SEÑAL DEL COLOR ROJO
       G : OUT  STD_LOGIC_VECTOR (3 DOWNTO 0);-- SEÑAL DEL COLOR VERDE
       B : OUT  STD_LOGIC_VECTOR ( 3 DOWNTO 0);-- SEÑAL DEL COLOR AZUL
       VS : OUT  STD_LOGIC; -- SINCRONISMO VERTICAL
       HS : out  STD_LOGIC; --SINCRONISMO HORIZONTAL
       RESET : IN  STD_LOGIC; -- SALIDA DEL RESET
CLK : IN  STD_LOGIC; -- RELOJ INTERNO
       S : IN  STD_LOGIC_VECTOR (1 DOWNTO 0)); -- SELECTOR DE SEÑAL
END VGA;
ARCHITECTURE VIDEO OF VGA IS
BEGIN

-- SEÑALES DE SINCRONISMO
PROCESS (CLK, RESET)
VARIABLE PIX : INTEGER := 0;-- CONTADOR DE PIXELES
VARIABLE LIN : INTEGER := 0;-- CONTADOR DE LINEAS
VARIABLE DESP_P : INTEGER :=1;-- CONTADOR PARA DESPLEGAR UN PIXEL(divisor de frecuencia a 25MHz)
VARIABLE PT_R : STD_LOGIC_VECTOR (3 DOWNTO 0):="0000"; -- VARIABLE INTERNA DE ROJO
VARIABLE PT_V : STD_LOGIC_VECTOR (3 DOWNTO 0):="0000"; -- VARIABLE INTERNA DE VERDE
VARIABLE PT_A : STD_LOGIC_VECTOR (3 DOWNTO 0):="0000"; -- VARIABLE INTERNA DE AZUL
BEGIN

--DIVISOR A 25 HHz
IF(RISING_EDGE (CLK))THEN
 DESP_P := DESP_P-1;
 IF (RESET = '1')THEN
 DESP_P :=1;
 R <= "0000";
 G <= "0000";
 B <= "0000";
 VS <= '0';
 HS <= '0';
 END IF;
 IF(DESP_P =0)THEN
  DESP_P :=2;
  CASE S IS

 -- PANTALLA BLANCA
  WHEN "00" =>
  PT_R := "1111" ; PT_V := "1111" ; PT_A := "1111" ;

-- TRES BARRAS HORIZONTALES
  WHEN "10" =>
  IF LIN >= 0 AND LIN < 159 THEN
  PT_R := "1111" ; PT_V := "0000" ; PT_A := "0000" ;
  ELSIF LIN >= 159 AND LIN < 319 THEN
  PT_R := "0000" ; PT_V := "1111" ; PT_A := "0000" ;
  ELSIF LIN >= 319 AND LIN < 479 THEN
  PT_R := "0000" ; PT_V := "0000" ; PT_A := "1111" ;
  END IF;

-- BARRAS DE COLORES VERTICALES
  WHEN "01" =>
  IF PIX >= 0 AND PIX < 79 THEN -- BLANCO
  PT_R := "1111" ; PT_V := "1111" ; PT_A := "1111" ;
  ELSIF PIX >= 79 AND PIX < 159 THEN -- AMARILLO
  PT_R := "1111" ; PT_V := "1111" ; PT_A := "0000" ;
  ELSIF PIX >= 159 AND PIX < 239 THEN -- CYAN
  PT_R := "0000" ; PT_V := "1111" ; PT_A := "1111" ;
  ELSIF PIX >= 239 AND PIX < 319 THEN -- VERDE
  PT_R := "0000" ; PT_V := "1111" ; PT_A := "0000" ;
  ELSIF PIX >= 319 AND PIX < 399 THEN -- MAGENTA
  PT_R := "1111" ; PT_V := "0000" ; PT_A := "1111" ;
  ELSIF PIX >= 399 AND PIX < 479 THEN -- ROJO
  PT_R := "1111" ; PT_V := "0000" ; PT_A := "0000" ;
  ELSIF PIX >= 479 AND PIX < 559 THEN -- AZUL
  PT_R := "0000" ; PT_V := "0000" ; PT_A := "1111" ;
  ELSIF PIX >= 559 AND PIX < 639 THEN -- NEGRO
  PT_R := "0000" ; PT_V := "0000" ; PT_A := "0000" ;
  END IF;

-- TABLERO DE AJEDREZ
  WHEN "11" =>
  -- HORIZONTAL
  IF PIX >= 0 AND PIX < 79 THEN -- BLANCO
  PT_R := "1111" ; PT_V := "1111" ; PT_A := "1111" ;
  ELSIF PIX >= 79 AND PIX < 159 THEN -- NEGRO
  PT_R := "0000" ; PT_V := "0000" ; PT_A := "0000" ;
  ELSIF PIX >= 159 AND PIX < 239 THEN -- BLANCO
  PT_R := "1111" ; PT_V := "1111" ; PT_A := "1111" ;
  ELSIF PIX >= 239 AND PIX < 319 THEN -- NEGRO
  PT_R := "0000" ; PT_V := "0000" ; PT_A := "0000" ;
  ELSIF PIX >= 319 AND PIX < 399 THEN -- BLANCO
  PT_R := "1111" ; PT_V := "1111" ; PT_A := "1111" ;
  ELSIF PIX >= 399 AND PIX < 479 THEN -- NEGRO
  PT_R := "0000" ; PT_V := "0000" ; PT_A := "0000" ;
  ELSIF PIX >= 479 AND PIX < 559 THEN -- BLANCO
  PT_R := "1111" ; PT_V := "1111" ; PT_A := "1111" ;
  ELSIF PIX >= 559 AND PIX < 639 THEN -- NEGRO
  PT_R := "0000" ; PT_V := "0000" ; PT_A := "0000" ;
  END IF;
  -- VERTICAL
  IF LIN >= 0 AND LIN < 59 THEN -- BLANCO
  PT_R := PT_R ; PT_V := PT_V ; PT_A := PT_A;
  ELSIF LIN >= 59 AND LIN < 119 THEN -- NEGRO
  PT_R := NOT PT_R ; PT_V := NOT PT_V ;PT_A := NOT PT_A ;
  ELSIF LIN >= 119 AND LIN < 179 THEN -- BLANCO
  PT_R := PT_R ; PT_V := PT_V ; PT_A := PT_A;
  ELSIF LIN >= 179 AND LIN < 239 THEN -- NEGRO
  PT_R := NOT PT_R ; PT_V := NOT PT_V ;PT_A := NOT PT_A ;
  ELSIF LIN >= 239 AND LIN < 299 THEN -- BLANCO
  PT_R := PT_R ; PT_V := PT_V ; PT_A := PT_A;
  ELSIF LIN >= 299 AND LIN < 359 THEN -- NEGRO
  PT_R := NOT PT_R ; PT_V := NOT PT_V ;PT_A := NOT PT_A ;
  ELSIF LIN >= 359 AND LIN < 419 THEN -- BLANCO
  PT_R := PT_R ; PT_V := PT_V ; PT_A := PT_A;
  ELSIF LIN >= 419 AND LIN < 479 THEN -- NEGRO
  PT_R := NOT PT_R ; PT_V := NOT PT_V ;PT_A := NOT PT_A ;
  END IF;

  WHEN OTHERS =>
  PT_R := "0000" ; PT_V := "0000" ; PT_A := "0000" ;
  END CASE;

  -- CUENTA HASTA 800
  PIX := PIX+1;
  IF PIX = 800 then
  LIN := LIN+1;
  PIX :=0;
  END IF;

  -- CUENTA HASTA 521
  IF LIN = 521 then
  LIN := 0;
  END IF;

  -- PERIODO DE BORRADO HORIZONTAL
  IF PIX >= (640+16) AND PIX < (640+16+96) THEN
  HS <= '0';
  ELSE
  HS <= '1';
  END IF;

  -- PERIODO DE BORRADO VERTICAL
  IF LIN >= (480+10) AND LIN < (480+10+2) THEN
  VS <= '0' ;
  else
  VS <= '1';
  END IF ;

  -- IGUALACIÓN DE LAS VARIABLES INTERNAS A LAS SALIDAS R, G, B.
  IF PIX < 640 AND LIN <480 THEN
  R <= PT_R;
  G <= PT_V;
  B <= PT_A;
  ELSE
  R <= "0000" ;
  G <= "0000" ;
  B <= "0000" ;
  END IF;
  END IF;
END IF;

END PROCESS;

END VIDEO;