;**************************************************************************** ; ; DIGMC-10.ASM Desarrollado por Decos (decos@uol.com.ar) 15-02-2001 ; con los fragmentos de codigo del proyecto de DIGITALMAN ; y su programa 3CHI.ASM para un xtal de 20MHz. ; VERSION PARA EL HARDWARE DE DIGITALMAN ; ; Programa creado para un PIC16F84 trabajando sobre un cristal de 10MHz. ; Cada instruccion (excepto saltos), lleva 0.4us (5 instr./2us) ; Desarrollado para trabajar bajo sistemas PAL-N. ; Comentarios como t=1.0 significan tiempos respecto del comienzo de la ; linea de video (flanco negativo del HSYNC). ; ; NOTA: este programa esta modificado para la codificacion de MC. No maneja ; la deteccion automatica de canal codificado (a lo mejor alguien aporta ; data sobre esto). ; Por ultimo, recomiendo fuertemente la lectura de PROYECTO.DOC, la data de ; DIGITALMAN sobre el deco (www.pablin.com.ar). ;**************************************************************************** PROCESSOR 16F84A #include "p16f84a.inc" __CONFIG _CP_OFF & _WDT_OFF & _HS_OSC RADIX DEC ; Definicion de registros generales VideoMode equ 20h Loops equ 21h LineaCnt equ 22h SearchCnt equ 23h CntSyncOk equ 24h CntSyncErr equ 25h DataSample equ 26h ; PORTB valores de salida para los diferentes modos PASSVIDEO equ 00010011b PASSINVER equ 00110010b MAKEBLACK equ 10010000b MAKESYNC equ 10000000b PASSBURST equ 11010000b ; PORTB bits de entrada NEG equ 2 POS equ 3 ; VideoMode bits DEC equ 0 INV equ 1 BLK equ 2 ERR equ 3 FIND equ 4 ; PORTA osc control OSCTRLON equ 00001000b OSCTRLOFF equ 00001001b ORG 0 goto MAIN ;***************************************************************************** ; HORLINEA ; ; Crea una linea de video. ; Adjusta la frequencia VCXO. ; Valores de entrada en LineCnt desde MAIN ; Valores de salida en DataSample hacia MAIN ;***************************************************************************** HORLINEA ; t=-4.4 nop movlw MAKEBLACK btfss VideoMode,DEC movlw PASSVIDEO movwf PORTB ; Portico delantero=2.4us ; t=-2.4 nop nop movlw MAKESYNC btfss VideoMode,DEC movlw PASSVIDEO movwf PORTB ; Ventana sync=4.4us ; t=0 nop nop nop nop nop bcf PORTA,0 nop movlw PASSBURST btfss VideoMode,DEC movlw PASSVIDEO movwf PORTB ; t=4.4 ; Ventana burst=5.6us movf PORTB,W ; movwf DataSample ; tomo muestra para re-sincronizacion movlw OSCTRLON btfsc DataSample,POS ; Si hay un flanco POS movlw OSCTRLOFF ; subir frec. tris PORTA ; habilitar osc. control movlw PASSVIDEO btfsc VideoMode,INV ; control de inversion ;movlw PASSVIDEO ; PARA MC SIEMPRE ES DIRECTO movlw PASSINVER btfsc VideoMode,BLK movlw MAKEBLACK btfss VideoMode,DEC movlw PASSVIDEO movwf PORTB ; comienzo de la linea de video movf PORTB,W ; tomo muestras al inicio de la iorwf PORTB,W ; linea 23 y 622 para determinar nop nop nop movwf DataSample ; guarda en DataSample info de inversion btfss DataSample,POS ; Si no hay un flanco POS (seccion de BURST) bsf PORTA,4 ; test port on movlw 33 ; delay movwf Loops L1 ; t=14.0 decfsz Loops,f ; 32*1.2+0.8=39.2 goto L1 nop nop movlw OSCTRLOFF tris PORTA ; deshabilitar osc. control bcf PORTA,4 ; test port off decf LineaCnt,f btfsc STATUS,Z ; Si LineaCnt=0 ; t=56 retlw 1 ; retornar a MAIN nop ; delay antes de recomenzar otra linea nop nop nop nop nop goto HORLINEA ; crear otra linea ;***************************************************************************** ; SEARCH ; ; Busca linea 3, para sincronizarse. ; Retorna hacia el final de la linea 6. ;***************************************************************************** SEARCH movlw 3 movwf SearchCnt S1 btfsc PORTB,POS goto SEARCH btfsc PORTB,POS ; Detecta ausencia de flancos goto SEARCH ; en VBI (nivel bajo) btfsc PORTB,POS goto SEARCH btfsc PORTB,POS goto SEARCH btfsc PORTB,POS goto SEARCH btfsc PORTB,POS goto SEARCH decfsz SearchCnt,1 ; 2*6.0+5.6=17.6 goto S1 S2 btfss PORTB,POS ; Espera flanco POS (t=0) goto S2 nop movf PORTB,W ; Detecta ausencia de flancos iorwf PORTB,W iorwf PORTB,W ; en VBI (nivel alto) movwf DataSample btfsc DataSample,NEG ; si hay un flanco POS goto SEARCH ; recomenzar btfsc DataSample,POS ; si hay un flanco NEG goto SEARCH ; recomenzar movf PORTB,W ; Detecta si hay un flanco NEG (+4.4) movwf DataSample btfss DataSample,NEG ; si no es NEG goto SEARCH ; recomenzar nop nop movf PORTB,W ; Detecta si hay un flanco POS (+2.4) movwf DataSample ; (inicio de pos-eq) btfss DataSample,POS ; si no es POS goto SEARCH ; recomenzar movlw 49 ; delay movwf Loops S3 decfsz Loops,1 ; 48*1.2+0.8=58.4 goto S3 nop nop movf PORTB,W ; Detecta si hay un flanco NEG (+61.6) movwf DataSample ; (Linea 4,5) btfss DataSample,NEG ; si no es NEG goto SEARCH ; recomenzar movlw 78 ; delay movwf Loops S4 decfsz Loops,1 ; 77*1.2+0.8=93.2 goto S4 nop movf PORTB,W ; Detecta si hay un flanco NEG (+96) movwf DataSample ; (fin linea 5) btfss DataSample,NEG ; si no es NEG goto SEARCH ; recomenzar movlw 46 ; delay movwf Loops S5 decfsz Loops,1 ; 45*1.2+0.8=54.8 goto S5 bcf VideoMode,FIND ; Linea 3 encontrada retlw 1 ;***************************************************************************** ; MODE ; ; Determina el modo de funcionamiento. ; Valores de entrada en VideoMode,ERR desde VBI ; Valores de salida en VideoMode,FIND hacia MAIN ;***************************************************************************** MODE ; t=-4.4 btfss PORTA,3 ; habilitacion manual bsf VideoMode,ERR ; si RA3=1 btfss VideoMode,ERR ; si no hay error de Vsync clrf CntSyncErr ; borrar contador de cuadros malos incf CntSyncErr,f ; incrementar contador de cuadros malos btfsc CntSyncErr,2 ; si hay 4 cuadros malos consecutivos bcf VideoMode,DEC ; dejar de decodificar btfsc CntSyncErr,2 ; si hay 4 cuadros malos consecutivos bsf VideoMode,FIND ; buscar Linea 3 btfsc CntSyncErr,2 ; si hay 4 cuadros malos consecutivos clrf CntSyncErr ; recomenzar la cuenta de cuadros malos incf CntSyncOk,f ; incrementar cuadros buenos btfsc VideoMode,ERR ; si hay error de Vsync clrf CntSyncOk ; recomenzar la cuenta de cuadros buenos btfsc CntSyncOk,2 ; si hay 4 cuadros buenos consecutivos bsf VideoMode,DEC ; comenzar la decodificasion bcf VideoMode,ERR bsf PORTA,1 ; prender LED btfsc VideoMode,DEC ; si se habilita la decodificacion bcf PORTA,1 ; apagar LED bsf PORTA,2 ; deshabilitar deco de audio btfsc VideoMode,DEC ; si se habilita la decodificacion bcf PORTA,2 ; habilitar deco de audio nop nop movlw 15 ; delay movwf Loops LOOPM ; decfsz Loops,f ; 14*1.2+0.8=17.6 goto LOOPM retlw 1 ;***************************************************************************** ; MEDLINEA ; ; Crea media linea de video (1ra. mitad de 623). ;***************************************************************************** MEDLINEA ; t=-4.4 movlw 2 ; delay movwf Loops ML1 ; t=-3.6 decfsz Loops,f ; 1*1.2+0.8=2 goto ML1 movlw MAKESYNC btfss VideoMode,DEC movlw PASSVIDEO movwf PORTB ; Ventana sync=4.4us ; t=0.0 movlw 2 ; delay movwf Loops ML2 ; t=0.8 decfsz Loops,f ; 1*1.2+0.8=2 goto ML2 movlw PASSBURST btfss VideoMode,DEC movlw PASSVIDEO movwf PORTB ; Ventana burst=5.6us ; t=4.4 movlw 3 ; delay movwf Loops ML3 ; t=5.2 decfsz Loops,f ; 2*1.2+0.8=3.2 goto ML3 movlw MAKEBLACK btfss VideoMode,DEC movlw PASSVIDEO movwf PORTB ; Black video nop movlw 11 ; delay movwf Loops ML4 ; t=11.2 decfsz Loops,f ; 10*1.2+0.8=12.8 goto ML4 retlw 1 ;***************************************************************************** ; VBI ; ; Crea retroceso vertical y pulsos de pre/pos-ecualizacion. ; Verifica si se esta correctamente sincronizado. ; Valores de entrada en LineaCnt desde MAIN ; Valores de salida en VideoMode,ERR hacia MODE ;***************************************************************************** ; Comienzo con 5 pulsos de pre-equaliz.(PAL Lineas 623.5 a 1) VBI ; t=-4.4 movlw 2 ; delay movwf Loops V1 decfsz Loops,f ; 1*1.2+0.8=2 goto V1 PREEQ movlw MAKESYNC btfss VideoMode,DEC movlw PASSVIDEO movwf PORTB ; Ventana SYNC=2.4us ; t=0 nop nop movlw MAKEBLACK btfss VideoMode,DEC movlw PASSVIDEO movwf PORTB ; Black video=29.6us nop nop movlw 21 movwf Loops V2 ; t=4 decfsz Loops,f ; 20*1.2+0.8=24.8 goto V2 movlw 5 ; cantidad de pulsos proximos decfsz LineaCnt,f goto PREEQ movwf LineaCnt ; Proximos 5 pulsos de sync vertical (PAL Lineas 1 a 3.5) ; Durante estos 5 pulsos se muestrea para determinar si se esta en Vsync. VSYNC movlw MAKESYNC btfss VideoMode,DEC movlw PASSVIDEO movwf PORTB ; Ventana SYNC=27.2us movf PORTB,W iorwf PORTB,W nop movwf DataSample btfss DataSample,NEG ; si no es NEG bsf VideoMode,ERR ; error de sincronismo movlw 19 ; delay movwf Loops V3 decfsz Loops,f ; 18*1.2+0.8=22.4 goto V3 movlw MAKEBLACK btfss VideoMode,DEC movlw PASSVIDEO movwf PORTB ; Black video=4.8us nop nop nop nop movlw 5 ; cantidad de pulsos proximos decfsz LineaCnt,f goto VSYNC movwf LineaCnt ; Ultimos 5 pulsos de post-equaliz. (PAL Lineas 3,5 a 6) POSEQ movlw MAKESYNC btfss VideoMode, DEC movlw PASSVIDEO movwf PORTB ; Ventana SYNC=2.4us ; t=0 nop nop movlw MAKEBLACK btfss VideoMode,DEC movlw PASSVIDEO movwf PORTB ; Black video=29.6us movlw 17 ; delay movwf Loops V4 ; decfsz Loops,f ; 16*1.2+0.8=20 goto V4 decf LineaCnt,f btfsc STATUS,Z retlw 1 ; sale de VBI movlw 4 ; delay movwf Loops V5 decfsz Loops,f ; 3*1.2+0.8=4.4 goto V5 goto POSEQ ;***************************************************************************** ; MAIN ; ; Inicializacion de los puertos ; o Port B como : oooo iioo ; o Port A como : oooo iooi ;***************************************************************************** MAIN movlw 00001001b tris PORTA ; Def. port A movlw 00001100b tris PORTB ; Def. port B movlw PASSVIDEO ; movwf PORTB ; Video normal bsf PORTA,1 clrf VideoMode bsf VideoMode,DEC bsf VideoMode,FIND movlw 1 goto START ;***************************************************************************** ; LOOP principal ; ; Valores de entrada en DataSample desde HORLINEA ; Valores de salida en VideoMode y LineaCnt ;***************************************************************************** LOOP1 nop movlw 5 ; 5 pulsos de pre,sync y pos-equaliz. movwf LineaCnt call VBI ; comienzo de CAMPO 2, Lineas 311 a 318,5 nop nop nop nop nop call MODE ; seleccion de MODO, Linea 318,5 a 319 nop nop nop movlw 17 movwf LineaCnt call HORLINEA ; Lineas 319 a 335 nop nop bcf VideoMode,BLK ; deshabilito black video movlw 200 movwf LineaCnt call HORLINEA ; Lineas 336 a 535 nop nop nop movlw 82 movwf LineaCnt call HORLINEA ; Lineas 536 a 617 nop nop bsf VideoMode,BLK ; habilito black video movlw 5 movwf LineaCnt call HORLINEA ; Lineas 618 a 622 nop nop nop btfsc DataSample,NEG ; si se detecto flanco NEG (inico linea 622) nop ;bcf VideoMode,INV ; no invertir video call MEDLINEA ; Linea 623 a 623,5 nop nop nop movlw 5 movwf LineaCnt call VBI ; comienzo CAMPO 1, Lineas 623,5 a 5 nop nop nop nop movwf LineaCnt call HORLINEA ; Linea 6 START nop btfsc VideoMode,FIND ; si hay error de sync call SEARCH ; re-sync movlw 16 ;estaba en 16 movwf LineaCnt call HORLINEA ; Lineas 7 a 22 ;------------------------------------------------------------------ nop nop nop bcf VideoMode,BLK ; deshabilito black video movwf LineaCnt call HORLINEA ; Linea 23 bcf VideoMode,INV ; no invertir video btfsc DataSample,POS ; Auto-inversion (inico linea 23) bsf VideoMode,INV ; si hay flanco POS=>invertir video ;------------------------------------------------------------------ movlw 200 ;estaba en 200 movwf LineaCnt call HORLINEA ; Lineas 23 a 223 nop nop nop movlw 82 movwf LineaCnt call HORLINEA ; Lineas 224 a 305 nop nop bsf VideoMode,BLK ; habilito black video movlw 5 movwf LineaCnt call HORLINEA ; Lineas 306 a 310 goto LOOP1 ; al CAMPO 2 END