;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;      Generador_de_video                                      ;
;       12/07/2008                                             ;
;   12F675   20 Mhz                                            ;
; Descripcion: Programa de generación de                       ;
; sincronismo de video para el sistema NTSC                    ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

 LIST    P=PIC12F675
 INCLUDE <P12F675.inc>

 __config _HS_OSC & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _BODEN_OFF & _CPD_OFF & _CP_OFF


flags                 equ     0x20
contador_ver          equ     0x21
contador_lineas       equ     0x22
contador_delay        equ     0x24
impar                 equ     0                       ;muestra el campo par=0  impar=1



                      org     0x00
                      bsf     STATUS,RP0              ;elige banco 1
                      bcf     STATUS,RP1
                      clrf    ANSEL                   ;todos los pines I/O digitales
                      movlw   b'00001000'             ;todos los pines como salidas
                      movwf   TRISIO                  ;salvo MCLR que puede ser solo entrada
                      bcf     STATUS,RP0              ;banco 0
                      clrf    GPIO                    ;pone el puerto a cero
                      movlw   b'00000111'             ;desactiva el comparador
                      movwf   CMCON



campo_impar           bsf     flags,impar             ;comienza el campo impar
bucle_vertical        movlw   d'252'                  ;cuenta las lineas de cada campo
                      movwf   contador_lineas         ;
                      call    ecualizacion            ;
                      call    sincro_vertical         ;
                      call    ecualizacion            ;
                      btfsc   flags,impar             ;si el bit impar = 1
                      goto    aviso_vertical

                      movlw   .21                     ;delay de 22,2uS
                      call    delay_x1uS              ;
                      nop                             ;
                      nop                             ;
                      nop                             ;

aviso_vertical        bsf     GPIO,GP0                ;señal de sincro vertical para el video
bucle_horizontal      call    sincro_horizontal
                      bcf     GPIO,GP0                ;señal de sincro vertical para el
                      bsf     GPIO,GP1                ;pulso de referencia horizontal para el uC MASTER

                      nop                             ;delay de 1uS
                      nop                             ;
                      nop                             ;
                      nop                             ;
                      nop                             ;
                      
                      bcf     GPIO,GP1                ;pulso de referencia horizontal para el video
                      
                      movlw   .52                     ;delay de 52,6uS
                      call    delay_x1uS              ;
                      nop                             ;
                      nop                             ;
                      nop                             ;
                      
                      decfsz  contador_lineas,f       ;si se llegó a la línea 262 ne termina el bucle
                      goto    bucle_horizontal
                      btfss   flags,impar             ;si el bit impar = 0
                      goto    campo_impar
                      call    sincro_horizontal
                      
                      movlw   .22                     ;delay de 22,2uS
                      call    delay_x1uS
                      nop
                      
                      bcf     flags,impar             ;cambia el campo, ahora es par
                      goto    bucle_vertical          ;cierra el ciclo

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;                                                              ;
;                        subrutinas                            ;
;                                                              ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

ecualizacion          movlw   d'6'                    ;número de veces que se repite cada pulso
                      movwf   contador_ver
bucle_ecualizacion    bcf     GPIO,GP2                ;sincro horizontal

                      movlw   .2                      ;delay de 2,4uS
                      movwf   contador_delay          ;
                      nop                             ;
                      decfsz  contador_delay,f          ;
                      goto    $-2                     ;
                      nop                             ;
                      nop                             ;

                      bsf     GPIO,GP2

                      movlw   .29                    ;delay de 29,4uS
                      call    delay_x1uS             ;
                      nop                            ;
                      nop                            ;

                      decfsz  contador_ver,f
                      goto    bucle_ecualizacion      ;cierra el ciclo
                      return
                      
                      


sincro_vertical       movlw   d'6'                    ;cantidad de pulsos
                      movwf   contador_ver
bucle_sincro_vertical bcf     GPIO,GP2                ;pulso de sincronismo vertical
                      movlw   .27                     ;delay de 27uS
                      call    delay_x1uS
                      bsf     GPIO,GP2                ;pulso de ecualizacion horizontal

                      movlw   .4
                      call    delay_x1uS              ;delay de 4,8uS
                      nop                             ;
                      nop                             ;
                      nop                             ;
                      nop                             ;

                      decfsz  contador_ver,f
                      goto    bucle_sincro_vertical   ;continua el bucle
                      return
                      
                      
                      


sincro_horizontal     bsf     GPIO,GP2                ;umbral de entrada

                      nop                             ;delay de 1,4uS
                      nop                             ;
                      nop                             ;
                      nop                             ;
                      nop                             ;
                      nop                             ;
                      nop                             ;

                      bcf     GPIO,GP2                ;pulso de sincronismo horizontal

                      movlw   .4
                      call    delay_x1uS              ;delay de 4,8uS
                      nop                             ;
                      nop                             ;
                      nop                             ;
                      nop                             ;

                      bsf     GPIO,GP2                ;umbral de salida

                      movlw   .4
                      call    delay_x1uS              ;delay de 4,8uS
                      nop                             ;
                      nop                             ;
                      nop                             ;
                      nop                             ;

                      return
                      
                      


delay_x1uS            movwf   contador_delay
                      nop
                      nop
                      decfsz  contador_delay,f
                      goto    $-2
                      nop
                      return


                      End