LIST p=16f73 list c=132 INDF EQU H'0000' TMR0 EQU H'0001' PCL EQU H'0002' STATUS EQU H'0003' FSR EQU H'0004' PORTA EQU H'0005' PORTB EQU H'0006' PORTC EQU H'0007' PCLATH EQU H'000A' INTCON EQU H'000B' PIR1 EQU H'000C' PIR2 EQU H'000D' TMR1L EQU H'000E' TMR1H EQU H'000F' T1CON EQU H'0010' TMR2 EQU H'0011' T2CON EQU H'0012' SSPBUF EQU H'0013' SSPCON EQU H'0014' CCPR1L EQU H'0015' CCPR1H EQU H'0016' CCP1CON EQU H'0017' RCSTA EQU H'0018' TXREG EQU H'0019' RCREG EQU H'001A' CCPR2L EQU H'001B' CCPR2H EQU H'001C' CCP2CON EQU H'001D' ADRES EQU H'001E' ADCON0 EQU H'001F' OPTION_REG EQU H'0081' TRISA EQU H'0085' TRISB EQU H'0086' TRISC EQU H'0087' PIE1 EQU H'008C' PIE2 EQU H'008D' PCON EQU H'008E' PR2 EQU H'0092' SSPADD EQU H'0093' SSPSTAT EQU H'0094' TXSTA EQU H'0098' SPBRG EQU H'0099' ADCON1 EQU H'009F' PMDATA EQU H'010C' PMADR EQU H'010D' PMDATH EQU H'010E' PMADRH EQU H'010F' PMCON1 EQU H'018C' opcion equ 0x81 step equ 0x20 phrase equ 0x21 play equ 0x22 stop equ 0x23 continue equ 0x24 timing equ 0x25 suma equ 0x28 estado equ 0x29 PDel0 equ 0x30 PDel1 equ 0x31 PDel2 equ 0x32 sensing equ 0x33 org 0 goto empieza org 4 goto interrup org 5 empieza bcf status, 5 ;pagina 0 clrf portb clrf porta clrf portc movlw b'11111110' movwf sensing movlw b'11111000' ;cargo a w movwf timing ;y w a timing movlw b'11111100' movwf stop movlw b'11111011' movwf continue bsf status, 5 ;pagina 1 movlw b'00010110' movwf trisa movlw b'11100001' movf trisb movlw b'11100111' ;flanco ascendente pb0, 1/128 para el timer 0 y cargas pull up activado movwf opcion movlw b'11000000' movwf trisc ;configuro los puertos de c como pone en el datasheet 11000000 movlw b'10110100' ;Se elige el modo asincrono (SYNC=1),dato de 8 bits movwf txsta ;y alta velocidad (BRGH=1) movlw .26 ;Se carga 26 en el registro SPBRG movwf spbrg ;con lo cual se trabaja a 31250baudios con 20 mgh de f.osc bsf intcon, 7 ;activacion de las interrupciones bsf intcon, 5 ;act. interrupcion del timer 0 bsf intcon, 4 ;act. interrupcion del pb0 bsf intcon, 3 ;act. interrupcion del cambio de estado de la pb4-pb7 bcf status, 5 ;pagina 0 bsf rcsta, 7 ;habilito rc6/out y rc7/in goto start ;----------------------------------envia la señal active sensing--------------------------------------------- ;------------------------------------------------------------------------------------------------------------ start bcf status, 5 ;pagina 0 movfw timing movwf TXREG ; Movemos lo que queremos transmitir de w a TXREG goto FIN ;mueve a la subrutina FIN FIN bsf status, 5 ;pagina 1 btfss txsta, 1 ; Compruebo si el bit TMRT del registro esta ; a '1' o a '0'. goto FIN ; Si esta a '0' es que esta lleno TMRT y no ; ha terminado de transmitir, ; para ello TRMT tiene que estar a 1, hasta ; entonces esperamos. ;---------------------------------------rutina de retardo de un tercio de segundo 333us aprox la he sacado ;---------------------------------------del programita tan guai que hay para descargar en este mismo foro, picdel bcf status,5 DEMORA movlw .26 ; 1 set numero de repeticion (B) movwf PDel0 ; 1 | PLoop1 movlw .253 ; 1 set numero de repeticion (A) movwf PDel1 ; 1 | PLoop2 clrwdt ; 1 clear watchdog clrwdt ; 1 ciclo delay decfsz PDel1, 1 ; 1 + (1) es el tiempo 0 ? (A) goto PLoop2 ; 2 no, loop decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ? (B) goto PLoop1 ; 2 no, loop clrwdt ; 1 ciclo delay goto start ; 2+2 Fin. ;--------------------------------------interrpcion, exploracion para saber la causa de la interrupcion--------------- ;-------------------------------------------------------------------------------------------------------------------- interrup btfss intcon, 2 ;explora el bit toif (activacion del timer0) goto int_pb0 ;si fue 0 va a int_pb0 goto timer ;si fue 1 el timer0 reboso y activa la interrupcion int_pb0 btfss intcon, 1 ;explora el bit intf (activacion del pin pb0, se borra por soft.) goto int_567 ;si fue 0 va a int_567 goto pb0 ;si fue cero salta a pb0 int_567 btfss intcon, 0 ;explora el bit rbif (campio de estado en los bits pb5-pb6-pb7 goto salida ;si fue 0 va a salida goto pb_567 ;si fue 1 salta a pb_567 salida bsf status, 5 ;pagina 1 activa las interrupcionees para volver al programa principal asi espera 33uS para enviar ;la señal de active sensing y que el esclavo no de error por desconexion del cable bsf intcon, 7 ;activacion de las interrupciones bsf intcon, 5 ;act. interrupcion del timer 0 bsf intcon, 4 ;act. interrupcion del pb0 bsf intcon, 3 ;act. interrupcion del cambio de estado de la pb4-pb7 goto demora ;le pongo un goto y no return por que no quiero que valla donde se quedo si no a demora ;-----------------------interrupcion de pb0---------------------------------------------------------------------------- ;---------------------------------------------------------------------------------------------------------------------- ;aqui se conoce en que direccion esta girando el encoder incremental--------------------------------------- ;---------------------------------------------------------------------------------------------------------- pb0 btfss porta, 2 ;explora el bit 2 de porta y si esta 1 salta goto menos ;si fue 0 va a menos goto mas ;si fue 1 salta a mas ;direccio de giro adelante envia la sñal de timing clock--------------------------------------------------- ;---------------------------------------------------------------------------------------------------------- mas bcf status, 5 ;pagina 0 btfss portb,1 ;si pb2 esta a 1 hay salto goto mas2 ;si esta a 0 va a mas2 timming movfw timing ;mueve el registro timming a w movwf TXREG ; Movemos lo que queremos transmitir de w a TXREG mas1 bsf status, 5 ;pagina 1 btfss txsta, 1 ; Compruebo si el bit TMRT del registro esta ; a '1' o a '0'. goto mas1 ; Si esta a '0' es que esta lleno TMRT y no ; ha terminado de transmitir, ; para ello TRMT tiene que estar a 1, hasta ; entonces esperamos. incf suma ;incrementa suma movlw .24 ;mueve 24 a w subwf suma ;resta 24 con el registro suma btfss status, 2 ;si el resultado de la operacion es 0 el bit Z de status estara a 1 goto salida ;si no a la salida clrf suma ;si hubo salto, limpia suma incf step ;e incrementa step movlw .128 ;mueve 128 a w subwf step ;resta 128 con step btfss status, 2 ;si fue 0 la operacion ,salta goto salida ;si no va a la salida clrf step ;si dio 0 limpia step incf phrase ;e incrementa frase goto salida ;y va a la salida ;-------------------------------------------------------------------------------------------- mas2 bcf status, 5 ;pagina 0 bsf portb,1 ;pone a uno pb1 movfw estado movwf TXREG ; Movemos lo que queremos transmitir de w a TXREG goto mas?? ;mueve a la subrutina FIN mas?? bsf status, 5 ;pagina 1 btfss txsta, 1 ; Compruebo si el bit TMRT del registro esta ; a '1' o a '0'. goto mas?? ; Si esta a '0' es que esta lleno TMRT y no ; ha terminado de transmitir, ; para ello TRMT tiene que estar a 1, hasta ; entonces esperamos. ;--------------------------------------------------------------------------------------------- bcf status, 5 ;pagina 0 movfw phrase movwf TXREG ; Movemos lo que queremos transmitir de w a TXREG goto mas??? ;mueve a la subrutina FIN mas??? bsf status, 5 ;pagina 1 btfss txsta, 1 ; Compruebo si el bit TMRT del registro esta ; a '1' o a '0'. goto mas??? ; Si esta a '0' es que esta lleno TMRT y no ; ha terminado de transmitir, ; para ello TRMT tiene que estar a 1, hasta ; entonces esperamos. ;--------------------------------------------------------------------------------------------- bcf status, 5 ;pagina 0 movfw step movwf TXREG ; Movemos lo que queremos transmitir de w a TXREG goto mas???? ;mueve a la subrutina FIN mas???? bsf status, 5 ;pagina 1 btfss txsta, 1 ; Compruebo si el bit TMRT del registro esta ; a '1' o a '0'. goto mas???? ; Si esta a '0' es que esta lleno TMRT y no ; ha terminado de transmitir, ; para ello TRMT tiene que estar a 1, hasta ; entonces esperamos. ;--------------------------------------------------------------------------------------------------- bcf status, 5 ;pagina 0 movfw continue movwf TXREG ; Movemos lo que queremos transmitir de w a TXREG goto mas? ;mueve a la subrutina FIN mas? bsf status, 5 ;pagina 1 btfss txsta, 1 ; Compruebo si el bit TMRT del registro esta ; a '1' o a '0'. goto mas? ; Si esta a '0' es que esta lleno TMRT y no ; ha terminado de transmitir, ; para ello TRMT tiene que estar a 1, hasta ; entonces esperamos. goto timming ; va a timing para enviar la señal active sensing ;si marcha hacia detras el encoder hará-------------------------------------------------------------- ;---------------------------------------------------------------------------------------------------- menos bcf status, 5 movfw stop movwf TXREG ; Movemos lo que queremos transmitir de w a TXREG goto menos1 ;mueve a menos menos1 bsf status, 5 btfss txsta, 1 ; Compruebo si el bit TMRT del registro esta ; a '1' o a '0'. goto menos1 ; Si esta a '0' es que esta lleno TMRT y no ; ha terminado de transmitir, ; para ello TRMT tiene que estar a 1, hasta ; entonces esperamos. decf suma ;resta 1 a suma clrw ;pone a 0 w subwf suma ;resta w de suma btfss status,2 ;explora el bit z de intcon si el resultao de la resta fue 0 estara a uno goto salida ; si el resultado fue diferente de 0 en la resta va a salida decf step ; si fue 0 hubo salto y decrementa 1 a step clrw ;pone w a 0 subwf step ;resta w a step btfss status, 2 ;explora el bit z de intcon si el resultao de la resta fue 0 estara a uno goto salida ;si fue diferente de 0 va a la salida decfsz phrase ;si fue 0 salto y decrementa phrase y si da 0 salta goto salida ;si defsz fue diferente de 0 va a salida movlw .128 ;si fue 0 pone 128 movwf step ;el registro step goto salida ;va a la salida ;---------------------------------------------------fin de la interrupcion del pb0----------------------------------------- ;--------------------------------------------------------------------------------------------------------------------------- timer goto salida ;va a la salida pb_567 goto salida ;va a la salida end ;nunca llegara ¡¡¡¡