Creando un retraso usando el módulo TIMER0 en PIC16F1939

0

Supongamos que estamos usando un oscilador externo a 8 MHz y necesitamos un voltaje alto durante aproximadamente 1 segundo en el pin RA0. Un ciclo de instrucción toma 0.5 \ $ \ mu s \ $. Hice una subrutina que toma 25 ms, con el prescaler establecido en \ $ \ frac {1} {256} \ $.

delay
clrf TMR0
L0
movf TMR0,w
xorlw d'195'
btfss STATUS, Z
goto L0
return 

Esta subrutina (que da cuenta de las instrucciones de llamada y devolución que usan dos ciclos cada una) ocupa 49924 ciclos.

Entonces, para crear un retraso de un segundo, todo lo que necesito hacer es llamar a esta rutina 40 veces.

   counter equ 0x21
   movlw d'40'
   movwf counter

   bsf LATA, 0
   bcf BSR, BSR1
   L1

   call delay
   decfsz counter
   goto L1

   bsf BSR, BSR1
   bcf LATA, 0

Sin embargo, en el analizador lógico de MPLAB obtengo algunos resultados extraños, ¡el pin RA0 ni siquiera va a ALTO! Soy autodidacta sobre este tema, y si conoce algún buen artículo en línea sobre este tema, me encantaría leerlo. También, ¿cómo podemos hacer esto usando el registro INTCON?

AQUÍ es la hoja de datos de la foto que estoy usando. El OPTION_ REG está en la página 187, y el registro de INTCON está en la página 90.

    
pregunta Emir Šemšić

1 respuesta

1

En primer lugar, debe leer la guía del usuario de MPASM para conocer las características que pueden hacer que su código sea más fácil de escribir y seguir. Use cblock o res para asignar variables, y skpz en lugar de btfss STATUS, Z . Siempre que sea posible, use #define para dar nombres simbólicos a números "mágicos", y use los símbolos predefinidos para los registros y bits de hardware (por ejemplo, bsf LATA, RA0 en lugar de bsf LATA, 0 ). Ponga radix dec al inicio para que no tenga que especificar explícitamente los números decimales. También recomiendo agregar dos puntos al final de las etiquetas de dirección para que puedan identificarse fácilmente. ¡Dé a cada etiqueta un nombre descriptivo, guarde los códigos de operación y comente todo!

  

Obtengo algunos resultados extraños, el pin RA0 ni siquiera va a ALTO!

Esto puede deberse a que no ha configurado correctamente el puerto. En Restablecer, todos los pines de E / S están configurados para ingresar el modo analógico y (si es posible). Antes de usar un pin para la salida, debe borrar el bit asociado en el registro TRIS .

El PIC16F1939 tiene muchos registros, demasiados para ser abordados de manera lineal, por lo que se dividen en bancos. TRISA está en el Banco 1, por lo que debe seleccionar el Banco 1 antes de acceder a él. La directiva BANKSEL se proporciona para hacer esto sin dolor. Entonces para hacer de RA0 una salida que escribirías: -

  BANKSEL TRISA
  BCF     TRISA,RA0   ; RA0 is output
  .
  .
  BANKSEL xxx         ; for next register not in same bank     

Tienes bsf BSR, BSR1 en un par de lugares. Normalmente, debe usar BANKSEL o MOVLB para manipular el registro de selección de banco. Su código cambiaría a Banco 2 si se configuró previamente a Banco 0, pero no si fuera a otro banco.

    
respondido por el Bruce Abbott

Lea otras preguntas en las etiquetas