;MIRE.ASM ;30-11-97 ;Mire TV vidéo-composite norme L 625 lignes dont 572 vidéos NOIR/BLANC ;PA0=SORTIE SYNCHRO LIGNE ;PA1=VIDEO GRIS bit1 ;PA2=VIDEO BARRE BLANCHE ;PA3=VIDEO GRIS bit0 (LSB) ;pour Qx= 6.000 Mhz ;RAPPEL REGISTRE D'ETAT = STATUS : p:30 ;---------------------------------------------------------------------- ; ; w = 7 ; wreg = 7 ; LIST P=PIC16C84 ;qq include p16c84.inc ;SVP definir ScratchPadRam ici: ;Si vous utilisez un PIC16C5X definissez "departRam equ 0x10" ;sinon definissez "departRam equ 0x20" ;---------------------------------------------------------------------- w equ 0 f equ 1 ;attention: le PIC16C84 possède 36 octets de RAM ;adresses OCh à 2Fh ;attention: le nb qui suit Ram0+... doit être écrit en Hexa ! Ram0 equ 000C AA equ Ram0+00 ;mon registre de travail BB equ Ram0+01 ;mon registre de travail CC equ Ram0+02 ;mon registre de travail DD equ Ram0+03 ;mon registre de travail WW equ Ram0+04 ;pour sauvegarder w pendant INT t1 equ Ram0+05 ;pour les tempos t2 equ Ram0+06 t3 equ Ram0+07 tL equ Ram0+08 ;durée du top ligne dL equ Ram0+09 ;durée ligne NL0 equ Ram0+0A ;compteur Lignes poids faible NL1 equ Ram0+0B ;compteur Lignes poids fort NTopT equ Ram0+0C ;compteur tops trame org 0 ;start address 0 goto start ;---------------------------------------------------------------------- ;traitement interruption ;ici débordement du Timer0 ; 6.00 Mz/4/8/12=15625 Hz org 0004 ;INT movwf WW movf dL,w movwf TMR0 ;ici on passe tous les 64us call topLi call Ligne bcf INTCON,2 ;ré-autorise int Timer0 voir p:136 et p:156 movf WW,w retfie ;---------------------------------------------------------------------- ;INITIALISATION DES PORTS ;---------------------------------------------------------------------- org 0020 start clrwdt movlw B'00000000' ;0=sortie 1=entree (RA4=aussi RTCC) TRIS PORTA ;config du port A (TRISA en page 1) movlw B'00000000' TRIS PORTB ;config du port B bcf PORTB,7 ;sortie vers optocoupleur ;---------------------------------------------------------------------- ;PROGRAMMATION DU REGISTRE OPTION ;VOIR page 144 et 143 ;soit Timer0 = 1/8 -> PS2,1,0 = 010b VOIR PAGE 135 ;PSA (bit3) = 0 -> prédiv affecté au Timer0 voir p:73 ;RTE (bit4) = 0 -> inc sur front montant ;RTS (bit5) = 0 -> branche Timer0 sur horloge interne ;INTEDG=x ;RBPU (bit7)=1 -> pas de R tirage à Vdd du port B (10k ext à GND sur PB7) ; bits: 76543210 movlw B'10000010' OPTION ;---------------------------------------------------------------------- ;PROG DU REGISTRE INTCON ;voir page 155 et surtout p:136 ;bit0 RBIF=x (sortie?) ;bit1 INTF=x (sortie?) ;bit2 RTIF=x (SORTIE?) ;bit3 RBIE=0 -> INT du port RB4 à RB7 interdites. ;bit4 INTE=0 -> INT de RB0/INT interdite. ;bit5 RTIE=1 -> INT par debordement Timer0. ;bit6 EEIE=0 -> INT EEPROM interdites ;bit7 GIE=1 ->INT GLOBALE autorisée. movlw B'10100000' movwf INTCON ;------------------------------------------------------------------------- ;essai ;------------------------------------------------------------------------- clrwdt movlw .245 ;(256-13) movwf dL ;duree ligne movlw .2 ;2 recharge le décompteur movwf NL1 movlw .57 ;57 312=1*256+56 312-24=288 288=1*256+32 movwf NL0 movlw .5 movwf NTopT ;BOUCLE PRINCIPALE loop1 clrwdt goto loop1 ;---------------------------------------------------------------------- ;DEBUT DES PROCEDURES ;---------------------------------------------------------------------- Ligne decfsz NL0,f ;decremente compteur lignes goto suite1 decfsz NL1,f goto suite1 movlw .2 ;2 recharge le décompteur movwf NL1 movlw .40 ;57 312=1*256+56 312-24=288 288=1*256+32 movwf NL0 ;on va appeler top trame lors des 24 dernieres lignes suite1 movlw .2 subwf NL1,w btfss STATUS,0 ;bit c goto suite2 movlw .24 ;pour generer 10 tops trames subwf NL0,w ;pour le tester si < 10 btfsc STATUS,0 ;bit c goto suite2 ; bsf PORTA,1 ; bcf PORTA,1 call topT goto finLi suite2 ; movlw .10 ;10 dernieres lignes noires ; subwf NL0,w ; btfss STATUS,0 ;bit carry ; goto finLi movlw .2 subwf NL1,w btfsc STATUS,0 ;bit c goto finLi ;test pour décider de tracer 1 ligne horizontale ou pas movlw B'00011111' andwf NL0,w ;=0 si NL0[2,1,0]='00000' c.a.d si NL0= n * 64 btfss STATUS,2 ;skip si zéro goto suite5 ;pas de tracé ligne H call videoH ;trace 1 ligne horizontale goto finLi suite5 call videoV ;trace n points de n lignes verticales finLi return ;---------------------------------------------------------------------- ;Top Ligne durée 4.8 us topLi movlw .2 movwf tL bcf PORTA,0 topL1 decfsz tL,f goto topL1 nop bsf PORTA,0 return ;---------------------------------------------------------------------- topT decf NTopT,f movlw .2 movwf tL bsf PORTA,0 ;top Ligne inverse pendant Top trame ;topL2 decfsz tL,f ; goto topL2 ; nop bcf PORTA,0 return ;---------------------------------------------------------------------- videoV ; movlw .3 ; movwf t1 ;t1V1 decfsz t1,f ; goto t1V1 bsf PORTA,2 bcf PORTA,2 nop nop nop nop bsf PORTA,3 ;debut pavé gris 0 nop nop bcf PORTA,3 ;fin pavé gris 0 bsf PORTA,1 ;debut pavé gris 1 nop nop nop bsf PORTA,3 ;debut pavé gris 0 nop nop nop bcf PORTA,1 ;fin pavé gris 1 bcf PORTA,3 ;fin pavé gris 0 bsf PORTA,2 bcf PORTA,2 nop nop nop nop bcf PORTB,0 ;debut salve à 3 MHz nop nop nop nop bsf PORTB,0 nop nop nop nop bsf PORTA,2 bcf PORTA,2 nop nop nop nop bsf PORTA,2 bcf PORTA,2 return ;---------------------------------------------------------------------- ;trace une ligne horizontale videoH nop ;pour tempo ; movlw .3 ; movwf t1 ;t1loop1 decfsz t1,f ; goto t1loop1 bsf PORTA,2 movlw .13 movwf t1 t1loop2 decfsz t1,f goto t1loop2 nop ;pour affiner tempo bcf PORTA,2 return ;---------------------------------------------------------------------- ORG 2007H ; Fuses DATA 3FF5 ;osc=XT , watchdog=yes ;---------------------------------------------------------------------- end