En la entrada anterior (Hola Mundo con el PIC 16F88) vimos como hacer prender y apagar un LED en lenguaje Ensamblador, ahora indicare como hacer lo mismo pero en lenguaje C.
El Lenguaje C es un lenguaje de alto nivel con el que también se pueden programar microcontroladores, para este caso usaremos el compilador XC8 que podemos descargar de la pagina de Microchip y que se integra con el MPLAB X.
El circuito es el mismo, ya que lo único que cambia es el lenguaje.
El código lo pueden descargar aqui del Repositorio en GitHub
Y el vídeo:
Cual es la ventaja de usar el lenguaje C a cambio del Ensamblador:
- Las operaciones lógicas y matemáticas son mas fáciles de hacer.
- El código es mas fácil de entender.
- La utilización del C es mayor.
- El ensamblador es único para cada arquitectura, por ejemplo, el de Microchip es diferente que el de Freescale.
y muchas otras.
Veamos el código:
1 Indicamos la velocidad del oscilador e incluimos la librería xc.h:
2 Escribimos los Bits de configuración del micro, esto lo hice con la herramienta del MPLAB que nos facilita la generación de la configuración:
Esta es una vista de la Herramienta de configuración de Bits que esta en la parte inferior de la ventana del MPLA IDE:
3 Asignamos memoria de usuario a las variables, esto lo hacemos a partir de la posición 0x20 que es donde empiezan los GPR (Registro de Propósito General, lo podes consultar en el manual)
Con este video voy a dar por iniciada una serie de videos que iré publicando semana a semana sobre la Programación de Microcontroladores PIC (Microchip) en lenguaje ensamblador.
Esta serie tiene como objetivos hacer una introducción a la programación de microcontroladores, apoyándome en la información que entrega el fabricante y con base en ejemplos, aunque al principio será necesario un poco de teoría con los conceptos básicos, pondré a su disposición los videos, las diapositivas usadas en los videos y el código fuente de los ejemplos.
Para programar microcontroladores PIC la empresa fabricante de estos (MICROCHIP) nos regala todas las herramientas necesarias para desarrollar, una de ellas llamada MPLAB, que es un entorno de desarrollo completo para la programación de microcontroladores. Pues resulta que nuestros amigos de MICROCHIP liberaron un nuevo entorno para que programemos llamado MPLABX, que es una notable mejora al anterior.
¿Que tiene de nuevo?
Pues que esta optimizado para trabajar en lenguaje C, la configuración de cada proyecto es independiente y algo que me parece muy bueno es que es MULTIPLATAFORMA, lo que significa que nos funciona tanto en Windows como en Linux y en Mac OS.
Aquí les dejo un video de introducción al MPLABX trabajando con el lenguaje ensamblador!!!
http://youtu.be/sWHAiXmJ2Hg
Con este circuito podemos saber la posición de un potenciometro que esta conectado al modulo conversor análogo a digital de un microcontrolador PIC16F886.
El potenciometro puede ser reemplazado con cualquier tipo de sensor para así poder monitorear el estado o nivel de cualquier variable.
otros ejemplos de uso del conversor análogo a digital:
Copyright 2012 edwtron Este DOCUMENTO es un DOCUMENTO LIBRE, usted puede redistribuirlo y/o modificarlo bajo los terminos de la GNU FDL tal y como es publicada por la fundacion de software libre; bajo la version 1.3 de la licencia, o una version superior. Leer la licencia GNU gpl para mas detalles.
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License".
Vamos a implementar el PWM (para que recuerden que es PWM en la Wikipedia) con un microcontrolador 16F886. la idea es usar el modulo de PWM que traen algunos Microcontroladores PIC.
Usaremos el pin RB2/CCP1 com salida donde tendremos el pulso de ancho variable.
Se usa un comparador que activa un bit cuando el valor del registro PR2 coincide con la parte alta del TMR2, en ese momento el TMR2 toma el valor 00, luego el bit se pone en cero cuando otro comparador detecta que la parte del TMR2 y el CCPR1H son iguales.
En PR2 se asigna el periodo T = (PR2 + 1)*4*Tosc * Valor predivisor TMR2
En CCPR1L se carga el ancho del pulso, que luego pasa a CCPR1H
Analicemos:
MOVLW B'00001101' MOVWF CCP1CON; Modo PWM <3,2,1,0>, bit <5,4> en ceros MOVLW B'00000100'; <1x> Un prescaler de 16 da un periodo apox de 4ms y una frec de 244Hz ; <01> Un prescaler de 4 da un periodo apox de 1ms y una frec de 1KHz ; <00> Un prescaler de 1 da un periodo apox de 250us y una frec de 4KHz MOVWF T2CON; Prescaler 16 <1,0> y activa el TMR2 <2>
ORG00 GOTOINICIO
RET_100MS;99998 cycles movlw0x1F movwfd1 movlw0x4F movwfd2
Delay_0 decfszd1, f goto$+2 decfszd2, f gotoDelay_0
;2 cycles goto$+1 RETURN
INICIONOP BANKSEL OSCCON MOVLW B'01101100' MOVWF OSCCON BANKSELTRISA CLRFTRISB MOVLWB'00000000'; Configuro RC2 como sailida MOVWFPORTC MOVLW.255 MOVWFPR2; Asigno el periodo BANKSELPORTB MOVLW0XFF MOVWFPORTB MOVLWB'00001101' MOVWFCCP1CON; Modo PWM <3,2,1,0>, bit <5,4> en ceros MOVLWB'00000100'; <1x> Un prescaler de 16 da un periodo apox de 4ms y una frec de 244Hz ; <01> Un prescaler de 4 da un periodo apox de 1ms y una frec de 1KHz ; <00> Un prescaler de 1 da un periodo apox de 250us y una frec de 4KHz MOVWFT2CON; Prescaler 16 <1,0> y activa el TMR2 <2> CLRFCCPR1L; Duty en cero (0)
Copyright 2012 edwtron Este DOCUMENTO es un DOCUMENTO LIBRE, usted puede redistribuirlo y/o modificarlo bajo los terminos de la GNU FDL tal y como es publicada por la fundacion de software libre; bajo la version 1.3 de la licencia, o una version superior. Leer la licencia GNU gpl para mas detalles.
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License".
Este secuenciador tiene seis modos de secuencia diferentes, que se seleccionan con un pulsador. Para cambiar de secuencia se deja presionado el pulsador hasta que esta cambie.
El programa se hizo de dos formas diferentes, en la primera forma se usa en cada secuencia una rutina para mostrarla, lo que da como resultado un programa mas o menos largo y la segunda forma nos ahorra unas cuantas lineas de código (como 40 lineas) usamos una sola rutina para todas las secuencias.
Video del circuito:
Voy a publicar las dos formas para que se analicen las diferencias y se vea la ventaja de usar subrrutinas.
Copyright 2012 edwtron Este DOCUMENTO es un DOCUMENTO LIBRE, usted puede redistribuirlo y/o modificarlo bajo los terminos de la GNU FDL tal y como es publicada por la fundacion de software libre; bajo la version 1.3 de la licencia, o una version superior. Leer la licencia GNU gpl para mas detalles.
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License".