Autor Tema: Mis primeros programas en ASM. PIC16F84A y PIC16F628A/648A  (Leído 678856 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Mis primeros programas. Tutorial PIC16F84A
« Respuesta #30 en: 05 de Marzo de 2009, 23:47:57 »
El Módulo del Timer 2.
El Timer es un temporizador (sin opción de trabajar como contador) de 8 bits. Su registro principal denominado TMR2 (11h) es un registro de 8 bits que se incrementa continuamente a la frecuencia seleccionada de Fosc/4 dividida por un preescalador. En la siguiente figura se muestra un diagrama de bloques del módulo del Timer2.


El preescalador
La frecuencia que incrementa al registro TMR2 puede ser dividida por un preescalador por un factor de 1/1, 1/4 o 1/16, seleccionable por los bits T2CKPS1:T2CKPS0 (T2CON<1:0>)
El Registro de comparación o de Periodo
En operación, el contenido del registro TMR2 se compara continuamente con un registro de periodo denominado PR2 (92h) cuyo valor podemos establecer por software.
Cada vez que la cuenta de TMR2 es igual a PR2, se reinicia el conteo en TMR2 desde cero, y además se genera una señal de salida, la cual es tratada por un postescalador, para poder generar una señal TMR2IF (PIR1<1>) que puede ser usada para solicitar una interrupción, o para ser leída por poleo.
El Postescalador
El postescalador divide la frecuencia con que ocurre una activación de la bandera TMR2IF, es decir, si el valor del postescalador es 1/1, esta bandera se activará cada vez que TMR2 se reinicie, en cambio, si es 1/16 (por ejemplo), TMR2IF se activará cada 16 reinicios de TMR2. En forma similar a los otros dos Timers, esta bandera debe ser limpiada previamente, si se quiere detectar su activación, esto puede ser hecho en la rutina de atención a la interrupción, o bien en la rutina que la detecta por poleo.
El valor de división del postescalador puede establecerse por software mediante los bits T2OUPS3:T2OUPS0 (T2CON<6:3>).

En este caso la temporización de calcula:
Temporización = Ciclo de instrucción. (PR2-TMR2) .Divisor de Frecuencia Pre. Divisor de frecuencia Post
Vemos que la máxima temporización posible es con TMR2 = 0, y Divisor de Frecuencia Pre en 16, Divisor de frecuencia Post en 16,  lográndose unos 65.5 ms aprox.

A continuación se describe el principal registro relacionado con el Timer 2 y todos sus bits.

Registro T2CON (12h)

bits 6:3
T2OUPS3:T2OUPS0.- Bits de selección del valor del divisor de frecuencia del postescalador, de acuerdo a la siguiente tabla:
0 0 0 0 = divisor 1/1
0 0 0 1 = divisor 1/2
0 0 1 0 = divisor 1/3

1 1 1 1 = divisor 1/16

bit 2
TMR2ON.- Bit de encendido del Timer 2
1 = Enciende (energiza) el Timer 2
0 = Apaga (desconecta) el Timer 2

bits 1:0
T2CKPS1:T2CKPS0.- Bits de configuración del valor del preescalador de acuerdo a la siguiente tabla:
0 0 = divisor 1/1
0 1 = divisor 1/4
1 x = divisor 1/16

Ejemplo de configuración para lograr una temporización de 20 ms:
Código: ASM
  1. bcf             STATUS,RP0      ; Banco 0.-
  2.         movlw   b'01000110'     ; Se selecciona TMR2, preescaler de 1/16, postescaler 1/8.-
  3.         movwf   T2CON
  4. bsf             STATUS,RP0      ; Banco 1.-
  5.         movlw   0x9D            ; Cargamos 157 en PR2 para lograr 20ms.-
  6.         movwf   PR2            
  7.         bsf     PIE1,TMR2IE     ; Activar interrupci&#243;n por TMR2.
  8.         bsf     INTCON,GIE      ; Habilitacion general de interrupciones.-
  9.         bsf     INTCON,PEIE     ; Habilitacion de Interrupcion por perifericos.-
  10.         bcf     STATUS,RP0      ; Banco 0.-

Control de interrupción:
Código: ASM
  1. ISR
  2.         btfss   PIR1,TMR2IF     ; Consultamos si es por TMR2.-
  3.         retfie                  ; No, salimos de interrupcion.-
  4.         .                       ; Si, rutina de interrupcion.
  5.         .
  6.         .
  7. Fin_ISR
  8.         bcf     PIR1,TMR2IF     ; Borro bandera de control de Interrupcion.-
  9.         retfie                  ; Salimos de interrupcion.-
« Última modificación: 31 de Marzo de 2009, 18:40:30 por Suky »
No contesto mensajes privados, las consultas en el foro

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Mis primeros programas. Tutorial PIC16F84A
« Respuesta #31 en: 05 de Marzo de 2009, 23:52:08 »
La USART del PIC16F628/648A
La USART puede configurarse como sistema asíncrono -full dúplex-, que puede comunicarse con dispositivos periféricos como ordenadores personales u otros microcontroladores, o puede configurarse como sistema síncrono -half dúplex-, que puede comunicarse con periféricos tales como circuitos integrados convertidores A/D y D/A, EEPROMs serie, etc.
La USART del PIC puede ser configurada para operar en tres modos:
•   Modo Asíncrono (Full dúplex, transmisión y recepción simultaneas)
•   Modo síncrono Maestro (Hald duplex)
•   Modo síncrono Esclavo (Hald duplex)
Aquí solo trataré el modo asíncrono.
Modo Asíncrono.
En este modo la USART usa un formato estándar NRZ asíncrono, el cual para la sincronización usa: 1 bit de inicio (I), 8 o 9 bits de datos y 1 bit de paro (P). Mientras no se están transmitiendo datos la USART envía continuamente un bit de marca. El modo asíncrono se selecciona limpiando el bit SYNC del registro TXSTA (98H). El modo asíncrono es deshabilitado durante el modo SLEEP.
Cada dato es transmitido y recibido comenzando por el LSB. El hardware no maneja bit de Paridad, pero el noveno bit puede ser usado para este fin y manejado por software.

El módulo Asíncrono de la USART consta de 3 módulos fundamentales:
•   El circuito de muestreo
•   El generador de frecuencia de transmisión (Baud Rate)
•   El transmisor asíncrono
•   El receptor asíncrono.

El circuito de muestreo: El dato en la patita de recepción (RB1/RX/DT) es muestreado tres veces para poder decidir mediante un circuito de mayoría, si se trata de un nivel alto o un nivel bajo.
El Generador de Baud Rate (BRG)
Este generador consiste de un contador/divisor de frecuencia de 8 bits controlado por el registro SPBRG (99H).
De tal manera que la frecuencia de transmisión se calcula de acuerdo a la siguiente tabla:

En esta tabla X=valor de 8 bits en el registro del divisor, SPBRG. El bit BRGH corresponde a TXSTA<2>.
En el datasheet del PIC16F628/648A hay tablas donde se muestran algunos valores baud estándares, el divisor necesario (X=SPBRG) bajo diferentes frecuencias Fosc y el error producido en porcentaje.

El transmisor asíncrono
En la siguiente figura se muestra el diagrama de bloques del transmisor de la USART.

El corazón de este módulo es el registro de corrimiento TSR y la única manera de acceder al registro TSR es a través del registro TXREG (19H).
Para transmitir un dato, el programa deberá ponerlo primero en el registro TXREG. En cuanto el TSR termina de enviar el dato que tenía, enviando el bit de paro, se transfiere el dato contenido en TXREG (si hay alguno). En cuanto el dato de TXREG es transferido al TSR el TXREG queda vacío y esta condición se indicada mediante el bit bandera TXIF (PIR1<4>), el cual se pone en alto. Este bit NO puede ser limpiado por software, solamente se borrará cuando un nuevo dato se cargue en el registro TXREG. Si se escribe un dato seguido de otro a TXREG el primero se transfiere inmediatamente a TSR y el otro tiene que esperar hasta que el TSR termine de enviar el bit de Stop del primero. Durante esta espera TXIF permanece en bajo. Mientras el bit indicador TXIF señala el estado del registro TXREG, otro bit, TRMT (TXSTA<1>), muestra el estado del registro TSR. El bit de estado TRMT es de lectura, y se activa cuando el registro TSR está vacío. Ninguna interrupción está unida a este bit por lo que TRMT está pensado para ser consultado por “poleo” (sin usar interrupciones).
Para habilitar el módulo de transmisión es necesario poner en alto el bit TXEN (TXSTA<5>), mientras no se habilite el módulo, la patita de transmisión (RB2/TX/CK) se mantiene en alta impedancia. Si TXEN es deshabilitada a la mitad de una transmisión, está será abortada y el transmisor será reseteado.
Para seleccionar una transmisión a 9 bits, el bit TX9 (TXSTA<6>) deberá activarse, y el noveno bit deberá escribirse en TX9D (TXSTA<0>). El noveno bit se escribirá antes de cargar los 8 bits de datos en el registro TXREG. Esto es necesario, porque al escribir un dato en el registro TXREG puede tener lugar una transferencia inmediata del dato al registro TSR (si TSR está vacío). En este caso, se habrá cargado un dato incorrecto de nueve bits en el registro TSR.
De acuerdo a lo anterior, la inicialización del módulo de transmisión consiste en los siguientes pasos:
1.   Inicializar baud rate escribiendo al registro SPBRG el divisor adecuado y opcionalmente al bit BRGH.
2.   Habilitar comunicación asíncrona limpiando el bit SYNC y poniendo el bit SPEN.
3.   Si se van a usar interrupciones, poner el bit TXIE (PIE<4>).
4.   Poner el bit TX9 si se desea transmitir datos de 9 bits
5.   Habilitar transmisión poniendo el bit TXEN, lo cual pondrá el bit TXIF.
6.   Colocar el noveno bit del dato en TX9D si se están usando datos de 9 bits.
7.   Cargar el dato al registro TXREG (inicia la transmisión).


El receptor asíncrono
El módulo de recepción es similar al de transmisión, en la siguiente figura se muestran los bloques que lo constituyen.

Una vez que se ha seleccionado el modo asíncrono, la recepción se habilita poniendo en alto el bit CREN (RCSTA<4>)
El dato es recibido mediante la línea RB1/RX/DT y se conduce hasta el bloque Data Recovery (Recuperación de dato), la cual maneja un registro de corrimiento de alta velocidad (16 veces el Baud rate).
El corazón del receptor es el registro de corrimiento RSR. Este registro no es accesible por software, pero al capturar del bit de STOP el dato de RSR es transferido automáticamente al registro RCREG (1Ah) si éste está vacío y al mismo tiempo es puesto en alto la bandera de recepción RCIF (PIR1<5>). La única manera de limpiar la bandera RCIF es leyendo el/los datos del registro RCREG. El RCREG es un registro de doble buffer (una FIFO de dos posiciones).
Si las dos posiciones del registro RCREG están llenas (no han sido leídas) y se detecta el bit de Stop de un tercer dato de recepción, lo cual ocasiona un transferencia automática del dato recibido a RCREG, esto destruirá el primer dato recibido y activará el indicador de desbordamiento OERR (RCSTA<1>).
La única manera de limpiar el bit OERR una vez que ha sido activado es reseteando el módulo de recepción (limpiando CREN y volviéndolo a poner). Si el bit OERR está en 1, se inhibe la transferencia desde el registro RSR hasta el registro RCREG, por lo que es vital borrar el bit OERR, si estuviese activado.
El error de concordancia FERR (RCSTA<2>) se activa si un bit de STOP se lee en nivel bajo. Tanto este indicador como el noveno bit RX9D se memorizan en el mismo canal que el dato recibido, de manera que al leer RCREG se actualizan FERR y RX9D con nuevos valores, por lo cual estos bits deberán ser leídos antes de leer RCREG para no perder su información.
De acuerdo a lo anterior, la inicialización del módulo de recepción es como sigue:
1.   Inicializar el baud rate escribiendo al registro SPBRG el divisor adecuado y opcionalmente al bit BRGH .
2.   Habilitar el puerto serie asíncrono limpiando el bit SYNC y poniendo el bit SPEN.
3.   Si se van a usar interrupciones, poner el bit RCIE (PIE<5>).
4.   Si se desea recepción de datos de 9 bits se deberá poner el bit RX9 (RCSTA<0>).
5.   Habilitar la recepción poniendo el bit CREN (RCSTA<4>)
6.   El bit RCIF se pondrá cuando la recepción de un dato se complete y se generará una interrupción si RCIE está puesto.
7.   Leer el registro RCSTA para obtener el noveno bit (si se están recibiendo datos de 9 bits) o para determinar si ha ocurrido un error de recepción.
8.   Leer los 8 bits del dato recibido leyendo el registro RCREG.
9.   Si ocurrió algún error este se limpia al limpiar el bit CREN, el cual deberá volver a ponerse si se desea continuar la recepción.



ConfigPIC permite seleccionar algunos parámetros para configurar el módulo USART del pic, y generar el código de ayuda  ;)
« Última modificación: 23 de Octubre de 2009, 00:16:07 por Suky »
No contesto mensajes privados, las consultas en el foro

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Mis primeros programas. Tutorial PIC16F84A
« Respuesta #32 en: 05 de Marzo de 2009, 23:54:52 »
Ejemplo:
En este caso usando el módulo Usart del PIC16F628A y la interrupción que genera el mismo al recibir un dato haremos un ejemplo donde esperamos dato desde PC, lo recibimos y lo reenviamos inmediatamente.
Hardware necesario:

Código: ASM
  1. ; **** Encabezado ****
  2.         list            p=16f628A       ; list directive to define processor
  3.         #include        <p16f628A.inc; processor specific variable definitions
  4.         __CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _INTOSC_OSC_NOCLKOUT & _DATA_CP_OFF & _LVP_OFF & _MCLRE_ON
  5.  
  6. ;**** Definicion de variables ****
  7.         DATA_RS232      equ             0x20    ; Dato recibido desde PC.-
  8.         Flags           equ             0x21    ;
  9. ;**** Definiciones para el ensamblador ****
  10. #DEFINE         Kbhit   Flags,0         ; Indica si se ha recibido algun dato.-
  11. ;**** Definición de macros ****
  12. ; Se envia la data de un registro a PC.-
  13. Putreg  macro   Registro
  14.         movfw   Registro
  15.         call    RS232_EnviaDato
  16. endm
  17. ; Se envia un literal a PC.-
  18. Putc    macro   ACKII
  19.         movlw   ACKII
  20.         call    RS232_EnviaDato
  21. endm
  22.  
  23.  
  24. ;/////////////////////////////////
  25. ;**** Inicio del Micro ****
  26. Reset.         
  27.         org     0x00            ; Aquí comienza el micro.-
  28.         goto    Inicio          ; Salto a inicio de mi programa.-
  29.  
  30. ;**** Vector de Interrupcion ****
  31.         org     0x04            ; Atiendo Interrupcion.-
  32.         goto    ISR
  33.  
  34. ; **** Programa Principal ****
  35.         org     0x05
  36. Inicio
  37.         bsf     STATUS,RP0      ; Banco 1
  38.         movlw   0x02
  39.         movwf   TRISB           ; Configuo pines para Usart.-
  40.         movlw   0x04
  41.         movwf   TXSTA           ; Configura modo asincrono, baud rate de alta velocidad
  42.         movlw   0x19            ; Configura velocidad a 9600 baudios con cristal de 4 Mhz
  43.         movwf   SPBRG
  44.         bsf     PIE1,RCIE       ; Habilita interrupcion de puerto serie para recepcion
  45.         bsf     INTCON,GIE      ; Habilitacion general interrupciones
  46.         bsf     INTCON,PEIE ; Habilitacion de interrupciones por perifericos
  47. ; Activar recepcion, transmision.-
  48.         bsf     TXSTA,TXEN      ; Habilita transmision
  49.         bcf     STATUS,RP0      ; Banco 0
  50.         bsf     RCSTA,SPEN      ; Habilitacion puerto serie
  51.         bsf     RCSTA,CREN      ; Habilita recepcion
  52.         bcf     Kbhit           ; Limpiamos bandera.
  53.  
  54. Bucle
  55.         btfss   Kbhit           ; ¿Se recibio Dato?
  56.         goto    $-1                     ; No, seguimos esperando.-
  57.         bcf     Kbhit           ; Si, borramos bandera.-
  58.         Putreg  DATA_RS232      ; Enviamos lo guardado en DATA_RS232.-
  59.         goto    Bucle           ;
  60. ;.............................................
  61. ;**** Rutina de servicio de Interrupcion ****
  62. ;**** Interrupcion por Usart (Recepcion de Dato)****
  63. ISR
  64.         btfss   PIR1,RCIF               ; Consultamos si es Usart.-
  65.         retfie                  ; No, Salimos de interrupción.-
  66.         movfw   RCREG           ; Llego dato, lo guardamos en un registro.
  67.         movwf   DATA_RS232
  68.         bsf     Kbhit           ; Indicamos que ha llegado Dato.-
  69. Fin_ISR
  70.         bcf     PIR1,RCIF               ; Limpiamos bandera.
  71.         retfie                  ; Salimos de interrupción.-
  72. ;..............................................
  73. ;**** Rutinas ****
  74. ;**** Se envia Dato ****
  75. RS232_EnviaDato
  76.         bsf     STATUS,RP0      ; Banco 1
  77.         btfss   TXSTA,TRMT      ; chequea si esta listo
  78.         goto    $-1             ; Esperamos  a que se desocupe.-
  79.         bcf     STATUS,RP0      ; Banco 0
  80.         movwf   TXREG           ; envia Dato.-
  81.         return
  82. ;...............................................
  83.         end
No contesto mensajes privados, las consultas en el foro

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Mis primeros programas. Tutorial PIC16F84A
« Respuesta #33 en: 05 de Marzo de 2009, 23:58:53 »
Módulos de comparación analógica y tensión de referencia

El Módulo Comparador
Dispone de dos comparadores analógicos C1 y C2 cuyas entradas pueden ser seleccionadas entre los pines RA0 a RA3 y cuyas salidas pueden utilizarse para lectura digital interna o bien conectarse a dos pines de salida: RA4 y RA5. También podría ser posible emplear un nivel de tensión configurable y generado por otro bloque, el denominado Módulo de Referencia de Tensión.
El multiplexado para la selección de las entradas a comparar y las salidas a generar depende del registro de control de comparación CMCON (0x1F).
Existen 8 configuraciones posibles de entradas y salidas de comparación que se seleccionan con los 3 bits menos significativos (CM2-CM1-CM0). En ese mismo registro se pueden leer los estados en la salida de cada uno de los comparadores C1 y C2 y si se desea invertir o no la lógica del resultado de la comparación que aparece a la salida.
 Registro CMCOM

Bit 7.
C2OUT: Bit de salida del Comparador 2.
Cuando C2INV = 0:
Si C2Vin+>C2Vin- = 1
Si C2Vin+<C2Vin- = 0
Cuando C2INV = 1:
Si C2Vin+>C2Vin- = 0
Si C2Vin+<C2Vin- = 1

Bit 6.
C1OUT: bit de salida del Comparador 1.
Cuando C1INV = 0:
Si C1Vin+>C1Vin- = 1
Si C1Vin+<C1Vin- = 0
Cuando CINV = 1:
Si C1Vin+>C1Vin- = 0
Si C1Vin+<C1Vin- = 1

Bit5.
C2INV: Bit de inversión de la salida del Comparador 2.
1 = C2 Salida invertida.
0 = C2 Salida no invertida.

Bit 4.
C1INV: Bit de inversión de la salida del Comparador 1.
1 = C1 Salida invertida.
0 = C1 Salida no invertida.

Bit 3.
CIS: Selector de pin de entrada al Comparador.
Cuando CM<2:0> = 001:
1 = C1Vin- conectado a RA3.
0 = C1Vin- conectado a RA0.
Cuando CM<2:0> = 010:
1 = C1Vin- conectado a RA3.
      C2Vin- conectado a RA2.
0 = C1Vin- conectado a RA0.
      C2Vin- conectado a RA1.

Bit 2-0.
CM<2:0>: bits de selección de configuración de los Comparadores.

Modo de Trabajo de los Comparadores
  • Si la entrada analógica VIN+ es mayor que la entrada analógica VIN-, entonces
    la salida del comparador será un estado digital alto
  • Si la entrada analógica VIN+ es menor que la entrada analógica VIN-, entonces
    la salida del comparador será un estado digital bajo

Las áreas sombreadas de la salida del comparador en la figura representan la incertidumbre debido a tensiones de desviación y tiempo de respuesta.

Referencias de Comparación
La referencia de tensión para la comparación puede ser:
Externa: se conectará a cualquiera de los pines de entrada externos del comparador y esa tensión deberá estar comprendida entre VDD y VSS
Interna: se puede emplear una referencia de tensión generada a nivel interno por parte de un módulo interno específico presente dentro del microcontrolador cuando se configuran los bits CM<2:0> con la combinación 110

Módulo de Referencia de Tensión para Comparación
Se trata de un divisor resistivo a partir de la tensión de alimentación del microcontrolador.
Registro VRCON (9Fh)


VR<3:0> Selección de la tensión de referencia:
Si VRR = 1:
\mathrm{Vref}=\frac{\mathrm{VR<3:0>.Vdd}}{24}
Si VRR = 0:
\mathrm{Vref}=\left(\mathrm{Vdd}.\frac{1}{4}\right)+\frac{\mathrm{VR<3:0>.Vdd}}{32}
Interrupciones del Módulo de Comparación
El módulo de comparación puede generar una interrupción por activación del flag CMIF (Flag de Interrupción del Comparador) presente en el registro PIR1. El flag CMIF se pondrá a 1 si se produce un cambio en la salida de cualquiera de los dos comparadores (C1OUT ó C2OUT) desde la última lectura que se realizó del registro CMCON.
El flag debe ponerse a cero por software pero además debe realizarse previamente una operación de lectura (o escritura) del registro CMCON para que deje de darse la discrepancia entre el valor actual y el valor leído. Para que se produzca la interrupción deben encontrarse activadas la máscara particular (CMIE en PIE2), la de periféricos (PEIE) y la global (GIE).

Característica especial del Módulo Comparador
Si un comparador se encuentra activo y se sitúa al microcontrolador en modo de bajo consumo (SLEEP), el comparador permanecerá activo y las interrupciones si están activadas mediante sus máscaras serán funcionales y podrán sacar al micro de su modo de bajo consumo si cambia la salida de alguno de los comparadores desde la última lectura.


ConfigPIC permite seleccionar la configuración del módulo comparador analógico y tensión de referencia, generando el código de configuración.
« Última modificación: 30 de Julio de 2009, 15:46:05 por Suky »
No contesto mensajes privados, las consultas en el foro

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Mis primeros programas. Tutorial PIC16F84A
« Respuesta #34 en: 06 de Marzo de 2009, 00:01:51 »
A modo de ejemplo conectaremos un potenciómetro al comparador 1, fijando una tensión de referencia interna a 3.59 Volt e invirtiendo la salida del comparador. Cuando la tensión sobre el pin RA0 (C1Vin-) sea mayor a 3.59 Volt haremos titilar un led 10 veces a modo de alarma.
Hardware necesario:

Diagrama de Flujo:

Código: ASM
  1. ; **** Encabezado ****
  2.         list            p=16f628A       ; list directive to define processor
  3.         #include        <p16f628A.inc; processor specific variable definitions
  4.         __CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _INTOSC_OSC_NOCLKOUT & _DATA_CP_OFF & _LVP_OFF & _MCLRE_ON
  5.  
  6. ;**** Definicion de variables ****
  7. Contador1       equ     0x20    ; Registro utilizado para demora.-
  8. Contador2       equ     0x21    ; Registro utilizado para demora.-
  9. Loop            equ     0x22    ;
  10. ;**** Definiciones para el ensamblador ****
  11. #DEFINE         Led     PORTB,0 ; Led ubicado en Puerto B, bit 0.-
  12. ;/////////////////////////////////
  13. ;**** Inicio del Micro ****
  14. Reset.         
  15.         org             0x00            ; Aquí comienza el micro.-
  16.         goto    Inicio          ; Salto a inicio de mi programa.-
  17.  
  18. ;**** Vector de Interrupcion ****
  19.         org     0x04            ; Atiendo Interrupcion.-
  20.         goto    ISR
  21.  
  22. ; **** Programa Principal ****
  23.         org     0x05
  24. Inicio
  25.         movlw   0x12            ; Seleccionamos 2 comparadores con Vref interna.
  26.                                                 ; C1Vin- -> RA0, C2Vin- -> RA1.
  27.                                                 ; Salida de comparador 1 invertida.
  28.         movwf   CMCON
  29.         bsf     STATUS,RP0      ; Banco 1
  30.         movlw   0x03            ; RA0 y RA1 como entrada.-
  31.         movwf   TRISA
  32.         clrf    TRISB           ; PORTB como salida.-
  33.         movlw   0xAF            ; Vref activado, Low, VR<3:0>=15 (Vref=3.59 Volt).-
  34.         movwf   VRCON
  35.  
  36.         bcf     STATUS,RP0      ; Banco 0.-
  37.         clrf    PORTB
  38.         movf    CMCON,f         ; Operacion de lectura.-
  39.         bcf     PIR1,CMIF               ; Limpiamos bandera.-
  40.  
  41.         bsf     STATUS,RP0      ; Banco 1.-
  42.         bsf     PIE1,CMIE               ; Habilitamos interrupcion por comparador analogico.
  43.         bsf     INTCON,PEIE     ; Habilitacion de Interrupcion por perifericos.-
  44.         bsf     INTCON,GIE      ; Habilitacion general de interrupciones.-
  45.         bcf     STATUS,RP0      ; Banco 0.-
  46. Bucle
  47.         nop
  48.         goto    Bucle
  49. ;.............................................
  50. ;**** Rutina de servicio de Interrupcion ****
  51. ;**** Interrupcion por Comparador Analogico****
  52. ISR
  53.         btfss   PIR1,CMIF               ; Interrupcion por Comparador?
  54.         retfie                  ; No, salimos de interrupcion.-
  55.         btfss   CMCON,C1OUT     ; Consultamos estado del comparador.-
  56.         goto    Fin_ISR         ; Si es 0 salimos de interrupcion.-
  57.         call    Alarma          ; Si es 1, indicamos una alarma.-
  58. Fin_ISR
  59.         movf    CMCON,f         ; Operacion de lectura.-
  60.         bcf     PIR1,CMIF               ; Limpiamos bandera.-
  61.         retfie
  62. ;..............................................
  63. ;**** Rutinas ****
  64. Alarma
  65.         movlw   0x0A            ; Hacemos titilar 10 veces el Led.-
  66.         movwf   Loop
  67.         bsf     Led
  68.         call    Demora_150ms
  69.         bcf     Led
  70.         call    Demora_150ms
  71.         decfsz  Loop
  72.         goto    $-5
  73.         return
  74. ;**** Demora ****
  75. Demora_150ms
  76.         movlw   0xFF            ;
  77.         movwf   Contador1               ; Iniciamos contador1.-
  78. Repeticion1
  79.         movlw   0xC3            ;
  80.         movwf   Contador2               ; Iniciamos contador2
  81. Repeticion2
  82.         decfsz  Contador2,1     ; Decrementa Contador2 y si es 0 sale.-        
  83.         goto    Repeticion2     ; Si no es 0 repetimos ciclo.-
  84.         decfsz  Contador1,1     ; Decrementa Contador1.-
  85.         goto    Repeticion1     ; Si no es cero repetimos ciclo.-
  86.         return                  ; Regresa de la subrutina.-
  87. ;.................................................
  88.         end
« Última modificación: 07 de Marzo de 2009, 01:00:34 por Suky »
No contesto mensajes privados, las consultas en el foro

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Mis primeros programas. PIC16F84A y PIC16F628A/648A
« Respuesta #35 en: 06 de Marzo de 2009, 00:23:28 »
Módulo CCP

Introducción

Los microcontroladores PIC16F628A/648A disponen de un modulo de Captura/Comparación/PWM que en conjunto con los temporizadores, permite realizar en forma sencilla las tareas de medición de tiempo y frecuencia, y generación de señales digitales.
El modulo CCP tiene 3 modos de funcionamiento, que se describen a continuación:
  • Modo captura: Permite capturar el valor que tiene en registro TMR1 cuando ocurre un evento especial en la terminal RB3/CCP1.
  • Modo comparación: Permite comparar el valor de 16 bits del TMR1 con un valor previamente definido en los registros CCPRL1H y CCPR1L
  • Modo PWM: Permite generar señales digitales moduladas en ancho de pulso

A continuación se da un breve resumen de los registros relacionados con cada módulo:
El registro principal de este módulo se compone de dos registros de 8 bits, denominados CCPR1H (16h) (parte más significativa) y CCPR1L (15h) (parte menos significativa). La operación del módulo se controla mediante el registro CCP1CON (17h) y el disparo de evento especial, el cual es generado al alcanzarse la igualdad en un registro de comparación reseteará el Timer 1.

Selección del modo de operación:
La selección del modo en que trabajara el módulo CCP se realiza mediante los cuatro bits menos significativos del registro CCP1CON, es decir, mediante los bits CCP1M3:CCP1M0 (CCP1CON<3:0>) de acuerdo a lo siguiente:

  • 0000   Captura/Comparación/PWM deshabilitados
  • 0100   Captura cada transición de bajada
  • 0101   Captura cada transición de subida
  • 0110   Captura cada cuarta transición de subida
  • 0111   Captura cada 16 transiciones de subida
  • 1000   Comparación, pone salida cada coincidencia
  • 1001   Comparación, limpia salida cada coincidencia
  • 1010   Comparación, genera interrupción cada coincidencia (Se setea bit CCP1IF, salida inalterada)
  • 1011   Comparación, dispara evento especial (Se setea bit CCP1IF , resetea TMR1(TMR1IF inalterado) )
  • 11xx   Modo PWM

 El Modo de Captura
En el modo de captura el registro CCPR1 (CCPR1H:CCPR1L) captura el valor de 16 bits registro TMR1 cuando ocurre un evento en la patita RB3/CCP1. El evento en cuestión puede especificarse previamente como alguno de los siguientes:
  • Cada transición de bajada
  • Cada transición de subida
  • Cada cuarta transición de subida
  • Cada dieciseisava transición de subida
Además de que el valor de TMR1 es capturado, la bandera de solicitud de interrupción CCP1IF es activada, la cual deberá ser limpiada por software para poder detectarla si se está consultando por poleo.
El tipo de acción que se desea detectar en esta patita se configura mediante los bits de control CCP1M3:CCP1M0 (CCP1CON<3:0>). Si ocurre otro evento de captura antes de que haya sido leído el registro CCPR1, el valor capturado anterior se perderá, ya que con la nueva captura este registro es reescrito.
En la figura siguiente se muestra un diagrama de bloques en donde se ilustra la manera en que trabaja el módulo CCP en modo de captura:


El preescalador del CCP
El valor del preescalador se configura mediante los bits CCP1M3:CCP1M0. Sin embargo, al realizar un cambio en la configuración del preescalador se puede generar una interrupción falsa, para evitar lo anterior se deberá apagar el modulo CCP (limpiando el registro CCP1CON) previamente al cambio de valor del preescalador.
Este preescalador es independiente al preescalador del Timer 1 (el cual puede usarse como ya se explicó con sus posibles divisores de 1/1, 1/2, 1/4, 18).

Configuraciones:
  • Se debe configurar el CCP1 como entrada a través del registro TRISB
  • El Timer1 debe estar en modo temporizador o modo contador sincronizado
  • Al cambiar el modo de captura hay que tener inhabilitadas las interrupciones y borrar el flag para evitar interrupciones espúreas.
  • Si el pin RB3/CCP1 es configurado como salida, se deberá tener en cuenta que una escritura al puerto B puede causar una condición de captura.
« Última modificación: 01 de Abril de 2009, 19:12:04 por Suky »
No contesto mensajes privados, las consultas en el foro

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Mis primeros programas. PIC16F84A y PIC16F628A
« Respuesta #36 en: 31 de Marzo de 2009, 18:22:51 »
Ejemplo:
Para ejemplificar el uso del modulo CCP en modo captura vamos a realizar la medida del periodo de una onda cuadrada para así determinar su frecuencia. La forma de trabajar va a ser la siguiente:
Configuramos CCP modo captura con cada transición de subida del pin RB3/CCP1 con Timer1 modo temporizador 1/1.
Al llegar un flanco ascendente, reseteamos Timer1 y esperamos al siguiente flanco ascendente, en el cual se guarda el valor capturado y lo enviamos a la PC para poder determinar la frecuencia de la señal. Lo que hemos capturado es la cantidad de ciclos de reloj transcurridos en un ciclo de la señal a medir. Con este valor y el Tosc al cual trabaja el microcontrolador podemos determinar el periodo de la señal.
\mathrm{Periodo[s]}=\left(\frac{4}{\mathrm{20MHz}}\right)\cdot\mathrm{CCPR1}
\mathrm{Frecuencia[Hz]}=\frac{1}{\mathrm{Periodo}}

Con un cristal de 20 MHz podemos medir desde aprox. 77Hz hasta los 500kHz, claro que a más frecuencia más error en las mediciones. Por ejemplo, con algunos ensayos que he realizado a 1kHz se tiene un error de +-1Hz, 10kHz +-5Hz, 100kHz +- 0.5kHz, 200kHz +- 2kHz, etc.

Para determinar la frecuencia adjunto un programita hecho en Visual Basic que toma 10 valores enviados desde el microcontrolador, calcula un promedio del periodo y determina la frecuencia. Se hace de este modo para reducir el error cometido a altas frecuencias.


Hardware necesario:


Código: ASM
  1. ; **** Encabezado ****
  2.         list            p=16f628A       ; list directive to define processor
  3.         #include        <p16f628A.inc; processor specific variable definitions
  4.         __CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _HS_OSC & _DATA_CP_OFF & _LVP_OFF & _MCLRE_ON
  5.  
  6. ;**** Definicion de variables ****
  7.         Msb                     equ             0x20    ; Guarda Byte alto de Captura para enviar por RS232
  8.         Lsb                     equ             0x21    ; Guarda byte bajo de Captura para enviar por RS232
  9.         Contador1       equ             0x22    ; Para demora
  10.         Contador2       equ             0x23    ; Para demora
  11. ;**** Definiciones para el ensamblador ****
  12.  
  13. ;**** Definición de macros ****
  14. ; Se envia la data de un registro a PC.-
  15. Putreg  macro   Registro
  16.         movfw   Registro
  17.         call    RS232_EnviaDato
  18. endm
  19.  
  20. ;/////////////////////////////////
  21. ;**** Inicio del Micro ****
  22. Reset.         
  23.         org             0x00            ; Aquí comienza el micro.-
  24.         goto    Inicio          ; Salto a inicio de mi programa.-
  25.  
  26. ; **** Programa Principal ****
  27.         org             0x05
  28. Inicio
  29.         bsf             STATUS,RP0      ; Banco 1
  30.         movlw   b'00001010'     ; RB1 entrada, RB2 salida, RB3 entrada.
  31.         movwf   TRISB          
  32.         movlw   0x04
  33.         movwf   TXSTA           ; Configura modo asincrono, baud rate de alta velocidad
  34.         movlw   0x81            ; Configura velocidad a 9600 baudios con cristal de 20 Mhz
  35.         movwf   SPBRG
  36.         bsf     TXSTA,TXEN      ; Habilita transmision
  37.         bcf             STATUS,RP0      ; Banco 0.-
  38.         bsf             RCSTA,SPEN      ; Habilitacion puerto serie
  39.  
  40.         movlw   b'00000001'     ; Se selecciona TMR1, preescaler de 1/1, modo temporizador.-
  41.         movwf   T1CON
  42.         movlw   b'00000101'     ; Se configura CCP modo captura cada flanco de subida.-
  43.         movwf   CCP1CON
  44. Bucle
  45.         bcf             PIR1,CCP1IF     ; Borramos bandera
  46.         btfss   PIR1,CCP1IF     ; Testeamos bandera.-
  47.         goto    $-1                     ; Si no se activo seguimos esperando
  48.         bcf             PIR1,CCP1IF     ; Se activo, la borramos.-
  49.         clrf    TMR1H           ; Borramos Timer1.-    
  50.         clrf    TMR1L           ;      
  51.         btfss   PIR1,CCP1IF     ; Volvemos a testear bandera.-
  52.         goto    $-1                     ; No se activo, seguimos esperando.-
  53.         movfw   CCPR1L          ; Copiamos el valor capturado.-
  54.         movwf   Lsb
  55.         movfw   CCPR1H         
  56.         movwf   Msb
  57.         Putreg  Msb                     ; Enviamos lo guardado en el registro Msb.-
  58.         Putreg  Lsb                     ; Enviamos lo guardado en el registro Lsb.-
  59.         call    Demora_30ms
  60.         goto    Bucle           ;
  61. ;..............................................
  62. ;**** Rutinas ****
  63. ;**** Se envia Dato ****
  64. RS232_EnviaDato
  65.         bsf             STATUS,RP0      ; Banco 1
  66.         btfss   TXSTA,TRMT  ; chequea si esta listo
  67.         goto    $-1                     ; Esperamos  a que se desocupe.-
  68.         bcf             STATUS,RP0      ; Banco 0
  69.         movwf   TXREG           ; envia Dato.-
  70.         return
  71. ;...............................................
  72. ; *** Demora****
  73. Demora_30ms
  74.         movlw   0xFF                    ;
  75.         movwf   Contador1               ; Iniciamos contador1.-
  76. Repeticion1
  77.         movlw   0xC3                    ;
  78.         movwf   Contador2               ; Iniciamos contador2
  79. Repeticion2
  80.         decfsz  Contador2,1             ; Decrementa Contador2 y si es 0 sale.-        
  81.         goto    Repeticion2             ; Si no es 0 repetimos ciclo.-
  82.         decfsz  Contador1,1             ; Decrementa Contador1.-
  83.         goto    Repeticion1             ; Si no es cero repetimos ciclo.-
  84.         return                                  ; Regresa de la subrutina.-
  85. ;...............................................
  86.         end

No contesto mensajes privados, las consultas en el foro

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Mis primeros programas. PIC16F84A y PIC16F628A
« Respuesta #37 en: 31 de Marzo de 2009, 18:27:05 »
    El Modo Comparador
    En el modo de comparación el registro de 16 bits CCPR1 (CCPR1H:CCPR1L) se compara constantemente con el valor del registro de 16 bits TMR1. De manera que cuando sus valores coinciden además de activarse la bandera para solicitar interrupción CCP1IF (PIR1<2>), puede ocurrir en la patita RB3/CCP1 (previa configuración) alguna de las siguientes acciones:
    • RB3/CCP1 Se pone en alto
    • RB3/CCP1 Se pone en Bajo
    • RB3/CCP1 no cambia
    La acción que ocurra en esta patita se configura mediante los bits de control CCP1M3:CCP1M0 (CCP1CON<3:0>). En la figura siguiente se muestra un diagrama de bloques en donde se ilustra la manera en que trabaja el módulo CCP en modo comparador

    Configuraciones:
    • El pin RB3/CCP1 debe configurarse como salida limpiando el bit TRISB<3>
    • El Timer 1 debe estar corriendo en modo temporizador (o en modo contador sincronizado)
    • Al limpiar el registro CCP1CON el latch de salida de la patita RB3/CCP1 se forza a su valor “default” de cero.
    • En el modo “interrupción software” no se realiza ninguna acción en el pin RB3/CCP1.
    • El modo “Special Event Trigger” ocurre inmediatamente al igualarse el par de registros TMR1H, TMR1L al par de registros CCPR1H, CCPR1L. El par de registros TMR1H, TMR1L no se resetean hasta el próximo flanco ascendente del clock de Timer1. Esto permite que el registro CCPR1 sea un registro de periodo programable para el Timer1

    Ejemplo:
    En este programa se hace uso del modo de comparación para realizar la conmutación de una señal cada vez que transcurre un tiempo, el cual se ajusta al oprimir un pulsador de incremento o uno de decremento.

    Hardware necesario:

    [/list]
    Código: ASM
    1. ; **** Encabezado ****
    2.         list            p=16f628A       ; list directive to define processor
    3.         #include        <p16f628A.inc; processor specific variable definitions
    4.         __CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _HS_OSC & _DATA_CP_OFF & _LVP_OFF & _MCLRE_ON
    5.  
    6. ;**** Definicion de variables ****
    7.         decre   equ             0       ; Pulsador para decrementar periodo
    8.         incre   equ             1       ; Pulsador para incrementar periodo
    9.  
    10. ;/////////////////////////////////
    11. ;**** Inicio del Micro ****
    12. Reset.         
    13.         org             0x00            ; Aquí comienza el micro.-
    14.         goto    Inicio          ; Salto a inicio de mi programa.-
    15.  
    16. ; **** Programa Principal ****
    17.         org             0x05
    18. Inicio
    19.         movlw   0x07            ; Para deshabilitar comparadores analogicos.-
    20.         movwf   CMCON
    21.         bsf             STATUS,RP0      ; Banco 1
    22.         bsf             TRISA,decre     ; Como entrada.-
    23.         bsf             TRISA,incre     ; Como entrada.-
    24.         bcf             TRISB,3         ; RB3 como Salida.
    25.         bcf             STATUS,RP0      ; Banco 0.-
    26.         movlw   b'00000001'     ; Se selecciona TMR1, preescaler de 1/1, modo temporizador.-
    27.         movwf   T1CON
    28.         movlw   0x80            ; Inicia periodo de comparacion a mitad de rango.-
    29.         movwf   CCPR1H
    30.         movlw   0x00
    31.         movwf   CCPR1L
    32.         movlw   b'00001000'     ; Se configura CCP modo comparación, setea salida con coincidencia.-
    33.         movwf   CCP1CON
    34.         clrf    TMR1H           ; Comenzamos generacion de señal.-
    35.         clrf    TMR1L
    36. Bucle
    37.         bcf             PIR1,CCP1IF     ; Borramos bandera
    38.         btfss   PIR1,CCP1IF     ; Testeamos bandera.
    39.         goto    $-1                     ; Si no se activo seguimos esperando
    40.         bcf             PIR1,CCP1IF     ; Se activo, la borramos.
    41.         movlw   b'00000001'     ; Invertimos ultimo bit, para pasar de setear a resetear...
    42.         xorwf   CCP1CON,1       ; o viceversa.-
    43.         clrf    TMR1H           ; Reseteamos cuenta Timer1.
    44.         clrf    TMR1L           ;
    45.         btfsc   PORTA,decre     ; Testea pulsador para decrementar periodo.-
    46.         call    Decrementa
    47.         btfsc   PORTA,incre     ; Testea pulsador para incrementar periodo.-
    48.         call    Incrementa
    49.         goto    Bucle           ;
    50. ;..............................................
    51. ;**** Rutinas ****
    52. Decrementa
    53.         decf    CCPR1L,1        ; Decrementa parte baja.-
    54.         comf    CCPR1L,w        ; Carga el negado a W, si CCPR1L=0xFF -> W=0x00.-
    55.         btfss   STATUS,Z        ; Si W=0x00 decrementamos parte alta.-
    56.         return                          ; No.-
    57.         decf    CCPR1H,1        ; Decrementa parte alta.-
    58.         return
    59. ;..............................................
    60. Incrementa
    61.         incf    CCPR1L,1        ; Incrementa parte baja.-
    62.         btfss   STATUS,Z        ; CCPR1L=0x00?
    63.         return                          ; No.-
    64.         incf    CCPR1H,1        ; Si, incrementa parte alta
    65.         return
    66.        
    67. ;...............................................
    68.         end
    « Última modificación: 31 de Marzo de 2009, 18:56:10 por Suky »
    No contesto mensajes privados, las consultas en el foro

    Desconectado Suky

    • Moderadores
    • DsPIC33
    • *****
    • Mensajes: 6758
    Re: Mis primeros programas. PIC16F84A y PIC16F628A
    « Respuesta #38 en: 31 de Marzo de 2009, 18:32:44 »
    Modo PWM (Modulación de Ancho de Pulso).

    Con este modo de trabajo se consiguen impulsos lógicos cuya anchura del nivel alto es de duración variable, que son de enorme aplicación en el control de dispositivos tan populares como los motores y triacs.
    El pin RB3/CCP1 esta configurado como salida y cambia entre los niveles 0 y 1 a intervalos de tiempos variables,  logrando un pulso cuyo nivel alto tiene un ancho variable dentro del intervalo del periodo de trabajo:


    La base de tiempos es el Timer2 más dos bits adicionales para tener los 10.
    El periodo se determina con el registro PR2, ya que cuando TMR2=PR2:
    • Se borra el TMR2
    • Se pone a “1” el pin CCP1
    • Se pasa el valor del CCPR1L al CCPR1H (para evitar glitch)

    De esta manera, de acuerdo a la figura anterior, el siguiente valor de comparación para TMR2 en el comparador de 10 bits es el Ciclo de Trabajo, el cual al alcanzarse limpiará la patita CCP1.
    El ciclo de trabajo se determina con el contenido del CCPR1L y los dos bits de CCP1CON (CCP1X y CCP1Y).

    Periodo del PWM

    \mathrm{PeriodoPWM}=\left(\mathrm{PR2} + 1 \right)\cdot 4\cdot\mathrm{Tosc}\cdot\mathrm{TMR2 Preescaler}

    \mathrm{FrecuenciaPWM}=\frac {1}{\mathrm{PeriodoPWM}}

    Ciclo de Trabajo del PWM
    El ciclo de Trabajo se especifica escribiendo un valor de 10 bits al registro CCPR1L (los 8 bits más significativos (msb)) y los dos bits menos significativos (lsb) a CCP1CON<5:4>.

    \mathrm{CTPWM}=\left(\mathrm{CCPR1L:CCP1CON<5:4>}\right)\cdot\mathrm{Tosc}\cdot\mathrm{TMR2 Preescaler}

    Como se puede ver en la figura anterior, el valor que determina la duración de C.T. del PWM no es el cargado en CCPR1L, sino en CCPR1H, el cual sólo se actualiza en el momento en que TMR2 alcanza el valor de PR2 (es decir, cada vez que se completa un periodo). Por ello, aunque CCPR1L puede ser escrito en cualquier momento, el Ciclo de Trabajo solo se actualiza hasta que termina el periodo que está en transcurso.
    No hay otra manera de escribir al registro CCPR1H, ya que este es un registro de sólo lectura.

    El número de divisiones que se pueden tener en un Ciclo de Trabajo será
    2^{n}
    , donde n es el número de bits usados, por lo tanto su duración máxima será:
    \mathrm{CTPWM}=2^{n}\cdot\mathrm{Tosc}\cdot\mathrm{TMR2 Preescaler}

    Sin embargo, dependiendo del valor de Ciclo de trabajo máximo (CT_PWM) deseado, no será posible realizar las
    2^{n}
    divisiones y por lo tanto no se podrán usar los n bits de resolución. O al revés, si se elige una resolución deseada n no será posible tener cualquier Ciclo de Trabajo máximo (CT_PWM) Deseado.

    De la ecuación anterior se puede despejar cual es la resolución máxima:
    \mathrm{ResolucionPWM}=\frac{\log\left(\frac{\mathrm{CTPWM}}{\mathrm{Tosc}\cdot\mathrm{TMR2 Preescaler}}\right)}{\log 2}

    Veamos con un ejemplo, si fijamos PR2 en 100 y usamos preescaler 1/4 con un oscilador de 20 MHz, tendremos un PWM de periodo 80.8us. El ciclo de trabajo no puede superar este valor por lo que despejando de las ecuaciones anteriores, CCPR1L:CCP1CON<5:4> no puede ser mayor a 404. Aquí se ve claramente que no se pueden usar los 10 bits de resolución, sino “8.66” bits. Caso contario el pin RB3/CCP1 nunca será reseteado.

    En la siguiente tabla se resumen diversas elecciones de resolución n y la correspondiente frecuencia F_PWM máxima, así como el valor de PR2 con el que se logra (para un frecuencia del cristal de 20 Mhz).


    Secuencia de configuración del PWM
    A continuación se resumen los pasos para realizar la configuración inicial del PWM:
    • Establecer el periodo del PWM escribiendo al registro PR2.
    • Establecer el Ciclo de Trabajo del PWM escribiendo al registro CCPR1L y a los bits CCP1CON<5:4>.
    • Configurar como salida el pin CCP1, limpiando el bit TRISB<3>.
    • Configurar el preescalador del Timer 2 y habilitar el Timer 2, escribiendo al registro T2CON.
    • Configurar el módulo CCP1 para operación PWM. Poniendo en alto los bits CCP1CON <2:3>.
    No contesto mensajes privados, las consultas en el foro

    Desconectado Suky

    • Moderadores
    • DsPIC33
    • *****
    • Mensajes: 6758
    Re: Mis primeros programas. PIC16F84A y PIC16F628A
    « Respuesta #39 en: 31 de Marzo de 2009, 18:34:33 »
    Ejemplo:

    Como ejemplo generaremos dos frecuencias distintas seleccionables mediante la acción de un pulsador conectador a RB0. Una de las señales será de 500Hz y la otra de 2kHz, con ciclo de trabajo de 50%.

    Con oscilador de 4MHz y preescaler 1/16 tendremos:

    Señal de 500HzPR2=124 (0x7C)CCPR1L&2bits=250(0xFA)CCPR1L=0x3E & 2bits=10
    Señal de 2kHzPR2=30 (0x1E)CCPR1L&2bits=62 (0x3E)CCPR1L=0x0F & 2bits=10

    Hardware necesario:

    Código: ASM
    1. ; **** Encabezado ****
    2.         list            p=16f628A       ; list directive to define processor
    3.         #include        <p16f628A.inc; processor specific variable definitions
    4.         __CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _INTOSC_OSC_NOCLKOUT & _DATA_CP_OFF & _LVP_OFF & _MCLRE_ON
    5.  
    6. ;**** Definicion de variables ****
    7.         Flags   equ             0x20    ; Registro para guardar banderas.-
    8.  
    9.         Selec   equ             0               ; Bit para indicar seleccion(Selec=1->500Hz; Selec=0->2kHz).-
    10. ;**** Definiciones para el ensamblador ****
    11.         #define Signal Flags,Selec
    12.        
    13.        
    14. ;/////////////////////////////////
    15. ;**** Inicio del Micro ****
    16. Reset.         
    17.         org             0x00            ; Aquí comienza el micro.-
    18.         goto    Inicio          ; Salto a inicio de mi programa.-
    19.  
    20. ; **** Programa Principal ****
    21.         org             0x05
    22. Inicio
    23.         bsf             STATUS,RP0      ; Banco 1
    24.         bsf             TRISB,0         ; Como Entrada.-
    25.         bcf             TRISB,3         ; RB3 como Salida.
    26.         bcf             STATUS,RP0      ; Banco 0.-
    27.         movlw   b'00000110'     ; Se selecciona TMR2, preescaler de 1/16.-
    28.         movwf   T2CON
    29.         bsf             STATUS,RP0      ; Banco 1
    30.         movlw   0x7C            ; Inicia periodo de 500Hz.-
    31.         movwf   PR2
    32.         bcf             STATUS,RP0      ; Banco 0.-
    33.         bsf             Signal
    34.         movlw   0x3E            ; Ciclo de trabajo 50%
    35.         movwf   CCPR1L
    36.         bsf             CCP1CON,CCP1X
    37.         bcf             CCP1CON,CCP1Y
    38.         bsf             CCP1CON,CCP1M3  ; Configura modulo CCP modo PWM.-
    39.         bsf             CCP1CON,CCP1M2
    40. Bucle
    41.         btfss   PORTB,0         ; Testea si se quiere cambiar de Frecuencia.-
    42.         goto    $-1                     ; No se quiere cambiar.-
    43.         btfss   Signal          ; A cual cambiar?
    44.         goto    Cambiar500Hz
    45. Cambiar2kHz
    46.         bsf             STATUS,RP0      ; Banco 1
    47.         movlw   0x1E
    48.         movwf   PR2    
    49.         bcf             STATUS,RP0      ; Banco 0
    50.         bcf             Signal          ; Señal de 2kHz
    51.         movlw   0x0F            ; Ciclo de trabajo 50%
    52.         movwf   CCPR1L
    53.         goto    Bucle           ;
    54.  
    55. Cambiar500Hz
    56.         bsf             STATUS,RP0      ; Banco 1
    57.         movlw   0x7C            ; Inicia periodo de 500Hz.-
    58.         movwf   PR2                     ; Señal de 500 Hz.-
    59.         bcf             STATUS,RP0      ; Banco 0.-
    60.         bsf             Signal
    61.         movlw   0x3E            ; Ciclo de trabajo 50%
    62.         movwf   CCPR1L 
    63.         goto    Bucle
    64. ;...............................................
    65.         end
    No contesto mensajes privados, las consultas en el foro

    Desconectado Suky

    • Moderadores
    • DsPIC33
    • *****
    • Mensajes: 6758
    Re: Mis primeros programas. PIC16F84A y PIC16F628A
    « Respuesta #40 en: 31 de Marzo de 2009, 18:37:34 »
    Otro ejemplo:
    En este se fija la frecuencia de PWM en 2 kHz y se varía el ciclo de trabajo con 2 pulsadores de control conectados a RB0 y RB1. Solo se modifica en byte alto del CT, ósea el registro CCPR1L con lo que CT se varía de 4 en 4.

    Hardware necesario:


    Código: ASM
    1. ; **** Encabezado ****
    2.         list            p=16f628A       ; list directive to define processor
    3.         #include        <p16f628A.inc; processor specific variable definitions
    4.         __CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _INTOSC_OSC_NOCLKOUT & _DATA_CP_OFF & _LVP_OFF & _MCLRE_ON
    5.  
    6. ;**** Definicion de variables ****
    7.         Contador1       equ             0x20    ;
    8.         Contador2       equ             0x21    ;
    9.        
    10.         decre   equ             0       ; Pulsador para decrementar Ciclo de Trabajo
    11.         incre   equ             1       ; Pulsador para incrementar Ciclo de Trabajo
    12.        
    13.        
    14. ;/////////////////////////////////
    15. ;**** Inicio del Micro ****
    16. Reset.         
    17.         org             0x00            ; Aquí comienza el micro.-
    18.         goto    Inicio          ; Salto a inicio de mi programa.-
    19.  
    20. ; **** Programa Principal ****
    21.         org             0x05
    22. Inicio
    23.         bsf             STATUS,RP0      ; Banco 1
    24.         bsf             TRISB,incre     ; Como Entrada.-
    25.         bsf             TRISB,decre     ; Como Entrada.-
    26.         bcf             TRISB,3         ; RB3 como Salida.
    27.         bcf             STATUS,RP0      ; Banco 0.-
    28.         movlw   b'00000110'     ; Se selecciona TMR2, preescaler de 1/16.-
    29.         movwf   T2CON
    30.         bsf             STATUS,RP0      ; Banco 1
    31.         movlw   0x1E            ; Señal de 2kHz
    32.         movwf   PR2    
    33.         bcf             STATUS,RP0      ; Banco 0
    34.         clrf    CCPR1L          ; Ciclo de trabajo 0%
    35.         bcf             CCP1CON,CCP1X
    36.         bcf             CCP1CON,CCP1Y
    37.         bsf             CCP1CON,CCP1M3  ; Configura modulo CCP modo PWM.-
    38.         bsf             CCP1CON,CCP1M2
    39. Bucle
    40.         btfsc   PORTB,decre     ; Testea si se quiere reducir CT.-
    41.         goto    Decrementa
    42.         btfsc   PORTB,incre     ; Testea si se quiere aumentar CT.-
    43.         goto    Incrementa
    44.         goto    Bucle
    45. Incrementa
    46.         incf    CCPR1L,1
    47.         call    Demora_50ms
    48.         goto    Bucle
    49. Decrementa
    50.         decf    CCPR1L,1
    51.         call    Demora_50ms
    52.         goto    Bucle
    53.  
    54.  
    55. ;**** Demora ****
    56. Demora_50ms
    57.         movlw   0xFF                    ;
    58.         movwf   Contador1               ; Iniciamos contador1.-
    59. Repeticion1
    60.         movlw   0x40                    ;
    61.         movwf   Contador2               ; Iniciamos contador2
    62. Repeticion2
    63.         decfsz  Contador2,1             ; Decrementa Contador2 y si es 0 sale.-        
    64.         goto    Repeticion2             ; Si no es 0 repetimos ciclo.-
    65.         decfsz  Contador1,1             ; Decrementa Contador1.-
    66.         goto    Repeticion1             ; Si no es cero repetimos ciclo.-
    67.         return                                  ; Regresa de la subrutina.-
    68. ;..............................................
    69.         end
    No contesto mensajes privados, las consultas en el foro

    Desconectado WillyP

    • Colaborador
    • PIC18
    • *****
    • Mensajes: 280
      • Sitiónica
    Re: Mis primeros programas. PIC16F84A y PIC16F628A
    « Respuesta #41 en: 31 de Marzo de 2009, 19:02:30 »
    Excelente Suky, vaya que te has tomado trabajo y dedicación con este aporte. :)  Te felicito.

    Desconectado Suky

    • Moderadores
    • DsPIC33
    • *****
    • Mensajes: 6758
    « Última modificación: 12 de Octubre de 2009, 18:22:31 por Suky »
    No contesto mensajes privados, las consultas en el foro

    Desconectado marvicdigital

    • Colaborador
    • PIC18
    • *****
    • Mensajes: 311
    Re: Mis primeros programas en ASM. PIC16F84A y PIC16F628A/648A
    « Respuesta #43 en: 11 de Abril de 2009, 02:27:09 »
    Suky..muchas gracias por tu valioso aporte a la comunidad, estoy mur agradecido contigo...de verdad que si pudiera te envitaba a un buen par de cervezas..como se nota que trabajas para enseñar..trabajas más que le registro W  :mrgreen:..

    Saludos y de nuevo mil gracias.


    Desconectado Suky

    • Moderadores
    • DsPIC33
    • *****
    • Mensajes: 6758
    Re: Mis primeros programas en ASM. PIC16F84A y PIC16F628A/648A
    « Respuesta #44 en: 11 de Abril de 2009, 21:00:19 »
    Citar
    de verdad que si pudiera te envitaba a un buen par de cervezas..

    Venga, venga!  :D  :D  :D

    Saludos!!!
    No contesto mensajes privados, las consultas en el foro


     

    anything