USO TIMER1 como un contador La operación de Timer1 como contador es similar a la operación de TIMER0. Sin embargo, el Timer1 es un temporizador de 16 bits, puede ser manipulado y cuenta a mayor velocidad. También se puede control con rutinas TimerLoop y Blinker Loop si el programa está diseñado para hacerlo. Sin embargo, la puesta en marcha de Timer1 es más complicada debido a las opciones más numerosas disponibles. Las diferencias entre el uso de los dos temporizadores tienen que ver con la configuración del control de registros. Timer1 es controlado por seis registros, en comparación con tres del TIMER0. Los registros del Timer1son los siguientes: INTCON interrupción registro de control PIR1 registro periférica de interrupción 1 PIE1 Habilita el registro de interrupción 1 TMR1L byte bajo del contador de registro TMR1H byte alto del registro del temporizador T1CON Timer1 control de la interrupción
EL Modo de contador se selecciona mediante el establecimiento del bit TMR1CS. En este modo, los incrementos del contador de tiempo en cada flanco ascendente se establecen en la entrada de reloj del pin RC1/T1OSI/CCP2 , cuando el bit T1OSCEN se establece, o en el pin RC0/T1OSO/T1CKI, cuando el T1OSCEN se borra. Tres de los pines en el 16F877A se puede utilizar como insumos para el modulo TIMER1 como contador: 1. Pin PORTA.4, la entrada de reloj externo (pin 6 en el PIC) 2. Pin PORTC.0, seleccionados mediante el establecimiento de TIOSCEN = 1 3. Pin PORTC.1, seleccionados mediante el establecimiento de TIOSCEN = 0 EL Timer1 se habilita estableciendo T1CON.0 = 1. Se detiene cuando este Bit está apagado o con discapacidad. El reloj que usará Timer1 es seleccionado por T1CON.1. El reloj externo seleccionados mediante el establecimiento de este a 1. La entrada para este reloj externo debe estar en PORTA.4. En resumen, ocho bits del registro de control del Timer 1 (T1CON), proporciona las siguientes funciones : Bit 7: No se utiliza y que se lea como un 0 Bit 6: No se utiliza y que se lea como un 0
Bit 5: Entrada pre-escalador Bit 4: Entrada de pre-escalador Bit 3: oscilador permite Timer1 Bit 2: sincronización de reloj externo Timer1 Bit 1: Timer1 selección de reloj Bit 0: Timer1 permite
Si las interrupciones no se van a utilizar todos los demás registros se puede ignorar y podemos establecer: T1CON a % 00110001 En primer lugar vamos a definir todos los define que vamos a necesitar. Aquí todos los define se incluyen como ejemplo, pero no todos son necesarios. Timer1 como contador. Timer1 cuenta las señales de un codificador del servomotor. ‘DEFINICIONES PARA EL FUNCIONAMIENTO DEL LCD
Las siguientes dos líneas definen el pin que se va a utilizar para la señal de HPWM que controlara la velocidad del motor. DEFINE CCP1 REG PORTC ‘definir la configuración de HPWM DEFINE CCP1_BIT 2 ‘pin C1 Las siguientes tres líneas definen la lectura de los tres potenciómetros en el tablero. Sólo el potenciómetro primero se utiliza en el programa, pero los otros son definidos de forma que los puede utilizar cuando se modifica el programa. Los potenciómetros son para cambiar el tiempo real. Definir los valores de A2D DEFINE ADC_BITS 8; número determinado de bits en el resultado DEFINE ADC_CLOCK 3; ajustar fuente de reloj interno (3 = rc) DEFINE ADC_SAMPLEUS 50, el tiempo de muestreo establecidos en Us A continuación, ponemos ADCON1 para que el MCU lo establezca como modo digital. , Establecer el registro de control analógico a digital ADCON1 =% 00000111; necesarios para el funcionamiento del LCD , creamos las variables que van a necesitar
TMR1 VAR WORD; establecer la variable para el temporizador ADVAL0 VAR BYTE, crear ADVAL para almacenar resultado ADVAL1 VAR BYTE, crear ADVAL para almacenar resultado ADVAL2 VAR BYTE, crear ADVAL para almacenar resultado X VAR WORD; variable de repuesto para la experimentación Y VAR WORD; variable de repuesto para la experimentación PAUSA 500 ; pausa para la pantalla LCD para la puesta en marcha LCDOUT $ FE, 1; pantalla clara y ubicación del cursor , configurar el registro de E / S TRISC =% 11110001; PORTC.0 va a ser la entrada CCP1CON =% 00000101; capturar cada flanco de subida T1CON =% 00000011; no pre-scale/osc / señal externa ; TMR1 en marcha el motor, utilizando un ; codificador para la entrada PORTC.3 = 0; habilita el motor PORTC.2 = 1, establecer el sentido de rotación A continuación, vamos a entrar en el cuerpo del programa. El ciclo del programa comienza con la lectura de tres potenciómetros a pesar de que está utilizando sólo el primero para establecer el poder y por tanto la velocidad del motor. LOOP: ADCIN 0, ADVAL0; lea el canal 0 a ADVAL0 ADCIN 1, ADVAL1; leer el canal 1 a ADVAL1 ADCIN 3, ADVAL2; leer el canal 3 de ADVAL2 Si el ciclo de trabajo del motor es inferior a 20 sobre un total de 255, el motor se moverá, así que hacemos u alinea de código para eso y ver el estado en la pantalla LCD. IF ADVAL0>20 THEN ; HPWM 2, ADVAL0, 32000 ; LCDOUT $FE, $C0, "PWM = ",DEC ADVAL0," " ; ELSE ; LCDOUT $FE, $C0, "PWM TOO LOW ",DEC ADVAL0," "; ENDIF Luego leemos los dos registros de contador de tiempo para ver cuántas cuentas pasaron. Sin embargo, si usted tiene una entrada de conteo rápido, es posible que desee agregar esta información a la lectura
TMR1H = 0; claro Timer1 alta de 8 bits TMR1L = 0; claro Timer1 baja de 8 bits T1CON.0 = 1; iniciar el temporizador de 16 bits PAUSA 100; captura de 100 m de la entrada ; Frecuencia de reloj T1CON.0 = 0; parada de 16 bits del temporizador TMR1.BYTE0 = TMR1L; lectura baja de 8 bits TMR1.BYTE1 = TMR1H; lectura de alta de 8 bits TMR1 = TMR1 - 11; Corrección de captura SI = TMR1 = 65.525 THEN NOSIGNAL; ver el libro de PBP ; explicación. LCDOUT $ FE, $ 80, DEC5 TMR1, "COUNTS", la frecuencia ; pantalla PAUSA 10; lento GOTO BUCLE; hacerlo de nuevo ; NOSIGNAL: LCDOUT $ FE, $ 80, "NO SIGNAL"; GOTO BUCLE; END;
‘codigo para utilizar el timer 1 del pic 16f877A como contador o modulo de captura DEFINE CCP1 REG PORTC DEFINE CCP1_BIT 2 DEFINE ADC_BITS 8 DEFINE ADC_CLOCK 3 DEFINE ADC_SAMPLEUS 50 ADCON1 = %00000111 TMR1 VAR WORD ADVAL0 VAR BYTE ADVAL1 VAR BYTE ADVAL2 VAR BYTE X VAR WORD Y VAR WORD PAUSE 500
LCDOUT $FE, 1 TRISC = %11110001 CCP1CON = %00000101 T1CON = %00000011 PORTC.3 = 0 PORTC.2 = 1 LOOP: ADCIN 0, ADVAL0 ADCIN 1, ADVAL1 ADCIN 3, ADVAL2 IF ADVAL0>20 THEN HPWM 2, ADVAL0, 32000 LCDOUT $FE, $C0, "PWM = ",DEC ADVAL0," " ELSE LCDOUT $FE, $C0, "PWM TOO LOW ",DEC ADVAL0," " ENDIF TMR1H = 0 TMR1L = 0 T1CON.0 = 1 PAUSE 100 T1CON.0 = 0 TMR1.BYTE0 = TMR1L TMR1.BYTE1 = TMR1H TMR1 = TMR1 - 11 IF TMR1 = 65525 THEN NOSIGNAL LCDOUT $FE, $80, DEC5 TMR1," COUNTS" PAUSE 10 GOTO LOOP NOSIGNAL: LCDOUT $FE, $80, "NO SIGNAL " GOTO LOOP END