Diferencia entre revisiones de «Programación del PIC16 en C»

De WikiRobotics
Saltar a: navegación, buscar
(Módulo 6: Conversor analógico/digital)
(Módulo 6: Conversor analógico/digital)
Línea 325: Línea 325:
 
::{| {{tablabonita}}
 
::{| {{tablabonita}}
 
|  [http://svn.iearobotics.com/Curso_pic/PIC16/v1.0/Modulo6-conversor-AD/ejemplos/ad0-leds.c ad0-leds.c]
 
|  [http://svn.iearobotics.com/Curso_pic/PIC16/v1.0/Modulo6-conversor-AD/ejemplos/ad0-leds.c ad0-leds.c]
|| [ad0-leds.hex]
+
|| [http://www.iearobotics.com/downloads/Curso-Pic/PIC16-v1.0/Modulo6-hex/ad0-leds.hex ad0-leds.hex]
 
|| Ejemplo de lectura del cana RA0 analógico. La muestra de 8 bits leída se envía por el puerto B para ser visualizada en los leds
 
|| Ejemplo de lectura del cana RA0 analógico. La muestra de 8 bits leída se envía por el puerto B para ser visualizada en los leds
 
|----
 
|----
 
|  [http://svn.iearobotics.com/Curso_pic/PIC16/v1.0/Modulo6-conversor-AD/ejemplos/ad0-leds-int.c ad0-leds-int.c]
 
|  [http://svn.iearobotics.com/Curso_pic/PIC16/v1.0/Modulo6-conversor-AD/ejemplos/ad0-leds-int.c ad0-leds-int.c]
|| [ad0-leds-int.hex]
+
|| [http://svn.iearobotics.com/Curso_pic/PIC16/v1.0/Modulo6-conversor-AD/ejemplos/ad0-leds-int.c ad0-leds-int.hex]
 
|| Ejemplo de lectura del cana RA0 analógico. La lectura del conversor se realiza mediante interrupciones.
 
|| Ejemplo de lectura del cana RA0 analógico. La lectura del conversor se realiza mediante interrupciones.
 
|----
 
|----
 
|  [http://svn.iearobotics.com/Curso_pic/PIC16/v1.0/Modulo6-conversor-AD/ejemplos/ad0-vumetro.c ad0-vumetro.c]
 
|  [http://svn.iearobotics.com/Curso_pic/PIC16/v1.0/Modulo6-conversor-AD/ejemplos/ad0-vumetro.c ad0-vumetro.c]
|| [ad0-vumetro.hex]
+
|| [http://svn.iearobotics.com/Curso_pic/PIC16/v1.0/Modulo6-conversor-AD/ejemplos/ad0-vumetro.c ad0-vumetro.hex]
 
|| Ejemplo de lectura del cana RA0 analógico. La lectura se realiza mediante interrupciones. La información se muestra en los leds
 
|| Ejemplo de lectura del cana RA0 analógico. La lectura se realiza mediante interrupciones. La información se muestra en los leds
 
|}
 
|}

Revisión del 06:33 14 sep 2009

right

Introducción

Curso de introducción a la programación en C de los microcontroladores PIC16F87X de Microchip. Es totalmente práctico, haciéndose ejemplos desde el primer momento. El enfoque didácto es lo que los autores llamamos POE: Programación Orientada a Ejemplos ;-). En cada uno de los módulos se presentan los conocimientos teóricos mínimos necesarios y se aplican en ejemplos.

El lector aprenderá el funcionamiento de los diferentes recursos de estos micros así como la programación en lenguaje C, que se va introduciendo gradualmente con los ejemplos.

Todos los ejemplos se han probado en la Tarjeta Skypic, a la que se le añaden diferentes placas periféricas.


Módulo 1: Introducción al PIC16F876A

plantilla.c plantilla.hex Plantilla de programación para el SDCC
hola_mundo.c hola_mundo.hex Programa "Hola mundo" que enciende el led de la Skypic

Módulo 2: Puertos de E/S digitales. Introducción al lenguaje C (I)

PUERTO B
ledon.c ledon.hex Poner a 1 el bit 1 (RB1) del puerto B. Se enciende el led de la Skypic
ledon2.c ledon2.hex Igual que ledon.c. Mejora de la legibilidad mediante #define
salida8.c salida8.hex Ejemplo de salida de 8 bits
variables1.c variables1.hex Ejemplo de declaracion de variables y su uso
contador1.c contador1.hex Bucle for. Contador desde 0 hasta 128 que se muestra por los leds. Versión rápida no apreciable por ojo humano
contador2.c contador2.hex Funciones en C. Contador desde 0 hasta 128 que se muestra por los leds. Versión con pausa para ver la secuencia
pulsador-led.c pulsador-led.hex Ejemplo de entrada y salida digitales. Por RB1 (el led) se saca el valor negado de lo recibido por RB0 (pulsador)
pulsador-led2.c pulsador-led2.hex Ejemplo de entrada y salida digitales. Por RB1 (el led) se saca el valor negado de lo recibido por RB0 (pulsador) . Mejora de la legibilidad mediante #define.
contador-int1.c contador-int1.hex Detección de flancos por RB0, mediante espera activa.
contador-int2.c contador-int2.hex Detección de flancos por RB0. Ejemplo mediante interrupciones.
pull-ups.c pull-ups.hex Ejemplo de activación de las resistencias de pull-up.
flancos1.c flancos1.hex Detección de cambio en pines RB4-RB7. Mediante espera activa.
flancos2.c flancos2.hex Detección de cambio en pines RB4-RB7. Mediante interrupciones
luces.c luces.hex Arrays en C. Secuencia de luces en los leds
luces2.c luces2.hex Arrays en C. Operador Sizeof. Mismo ejemplo anterior, pero calculándose automáticamente el tamaño del array
PUERTO A
RA0-on.c RA0-on.hex Poner el pin 0 (RA0) del puerto A a 1
salida6.c salida6.hex Ejemplo de salida digital de 6 bits
RA0-led.c RA0-led.hex Ejemplo de entrada y salida digitales. Por RB1 (el led) se saca el valor RA0
PUERTO C
RC0-on.c RC0-on.hex Poner el pin 0 (RC0) del puerto C a 1
C-salida8.c C-salida8.hex Ejemplo de salida digital de 8 bits
RC0-led.c RC0-led.hex Ejemplo de entrada y salida digitales. Por RB1 (el led) se saca el valor RC0

Módulo 3: Puerto serie. Introducción al lenguaje C (II)

sci-conf.c sci-conf.hex Configuracion del puerto serie a 9600 baudios y 8N1. Cada vez que se recibe un dato del PC se cambia el estado del led
sci-conf2.c sci-conf2.hex Mismo ejemplo anterior, pero con la parte de configuración en una función separada
sci-eco.c sci-eco.hex Ejemplo de envio-recepcion de datos. Se hace eco de todo lo recibido por el puerto serie
sci-eco2.c sci-eco2.hex Mismo ejemplo anterior, pero dividido en funciones
sci-cad.c sci-cad.hex Envío de cadenas por el puerto serie
sci-cad2.c sci-cad2.hex Envío de cadenas. Se prueba a enviar una cadena con caracteres especiales
sci-menu.c sci-menu.hex Envío-recepción de datos. Ejemplo de programa interactivo. Instrucción switch.
sci-error.c sci-error.hex Prueba de error en el flag de overflow. Este programa "se cuelga"
sci-read2.c sci-read2.hex Nueva rutina de lectura de por el puerto serie que tiene en cuenta los errores y no se bloquea
sci-int-rx.c sci-int-rx.hex Recepción de datos mediante interrupciones
sci-contador-eco.c sci-contador-eco.hex Ejemplo de dos tareas "concurrentes". Una hace eco por el puerto serie mientras la otra cuenta.
sci-int-tx.c sci-int-tx.hex Transmisión de datos mediante interrupciones
sci-contadores.c sci-contadores.hex Ejemplo de dos tareas "concurrentes". Una envía datos constantemente mientras la otra cuenta.
sci.h [--] Rutinas de manejo del puerto serie para ser usadas desde otros programas usando #include
sci-test.c sci-test.hex Ejemplo de uso de sci.h
libsci.c libsci.lib Módulo de comunicaciones serie. Para ser enlazado con nuestros programas
libsci.h [---] Cabeceras para el módulo libsci
sci-test2.c sci-test2.hex Ejemplo de uso del módulo libsci
sci-test3.c sci-test3.hex Ejemplo de uso de la libreria libsci.lib
sci-hex.c sci-hex.hex Conversión de números a cadenas ASCII para ser enviados a través del puerto serie

Módulo 4: Temporizadores

timer0-pausa1ms.c timer0-pausa1ms.hex Realizar una pausa de 1ms. Se hace parpadear el led de la Skypic
timer0-pausa10ms.c timer0-pausa10ms.hex Realizar una pausa de 10ms. Se hace parpadear el led de la Skypic
timer0-onda1Khz.c timer0-onda1Khz.hex Generación de una señal de 1Khz de frecuencia
timer0-onda10Khz.c timer0-onda10Khz.hex Generación de una señal de 10Khz de frecuencia
timer0-escala.c timer0-escala.hex Reproducción de la escala musical
timer0-delay.c timer0-delay.hex Ejemplo de esperas de "larga duración". Se hace parpadear el led a la frecuencia de 1Hz (1 vez por segundo)
timer0-onda10Khz-int.c timer0-onda10Khz-int.hex Generación de una onda de 10Khz mediante interrupciones
timer0-organo.c timer0-organo.hex Órgano digital por el puerto serie
timer0-pwm1.c timer0-pwm1.hex Generación de una señal PWM con ciclos de trabajo del 20% y 50%
timer0-pwm2.c timer0-pwm2.hex Generación de una señal PWM con ciclos de trabajo del 20% y 50%. Ejemplo mejorado.
timer0-pwm3-fade.c timer0-pwm3-fade.hex Generación de señales PWM de máxima resolución. Se decrementa el ciclo de trabajo gradualmente para hacer que los leds se apaguen progresivamente (efecto fade)
timer0-pwm-int.c timer0-pwm-int.hex Generación de señales PWM mediante interrupciones
timer0-pwm-sci.c timer0-pwm-sci.hex Ejemplo de control de motores con PWM. Mover el Skybot a diferentes velocidades


timer0_ticks.m Calcular el número de ticks del Temporizador 0 que tienen que transcurrir para lograr un tiempo determinado
timer0_Duracion.m Calcular el tiempo real que transcurre cuando se quiere esperar un tiempo determinado
timer0_TMR0.m Obtener los valores de inicialización del temporizador así como el prescaler para lograr una pausa de un valor concreto
timer0_TMR0_frec.m Obtener los valores de inicialización del temporizador así como el prescaler para generar una señal cuadrada de una frecuencia determinada

Ejemplo 1: Configurar el timer0 para realizar pausas de 1ms

octave:1> timer0_TMR0(20,1000);
T0INI= 100, PS2:0= 100, Div=  32, tc= 998.4 us, Error= 1.60 us
T0INI= 178, PS2:0= 101, Div=  64, tc= 998.4 us, Error= 1.60 us
T0INI= 217, PS2:0= 110, Div= 128, tc= 998.4 us, Error= 1.60 us
T0INI= 236, PS2:0= 111, Div= 256, tc= 1024.0 us, Error= -24.00 us
Como argumento se pasa la frecuencia del cristal (en Mhz) y el tiempo en micro-segundos. Existen 4 soluciones, según los valores usados para el prescaler (32,64,128 o 256). T0INI indica el valor con el que hay que inicializar el temporizador para que ocurra un overflow transcurrido 1ms

Ejemplo 2: Configurar el timer0 para generar una onda cuadrada de 800 Hz

octave:1> timer0_TMR0_frec(20,800);
TMR0= 61, PS2:0= 011, Div=  16, Frec= 801.3 Hz, Error= -1.28 Hz
TMR0= 158, PS2:0= 100, Div=  32, Frec= 797.2 Hz, Error= 2.81 Hz
TMR0= 207, PS2:0= 101, Div=  64, Frec= 797.2 Hz, Error= 2.81 Hz
TMR0= 232, PS2:0= 110, Div= 128, Frec= 813.8 Hz, Error= -13.80 Hz
TMR0= 244, PS2:0= 111, Div= 256, Frec= 813.8 Hz, Error= -13.80 Hz
Como argumento se pasa la frecuencia del cristal (en Mhz) y la frecuencia de la señal a generar, en Hz. Existen 5 soluciones, según los valores establecidos para el prescaler (16,32,64,128 o 256). La frecuencia obtenida no es exacta, sino que existe un error, también calculado por el script.

Módulo 5: Displays de cristal líquido (LCD)

lcd-hola.c lcd-hola.hex Ejemplo "hola mundo". Se inicializa el LCD y se imprime la cadena "HOLA!"
lcd-term.c lcd-term.hex Convertir el LCD en una "maquina de escribir". Los caracteres que se envian por el puerto serie desde el PC se imprimen en el LCD
lcd-menu.c lcd-menu.hex Ejemplo de prueba de los diferentes comandos del LCD. Mediante un menu de opciones que sale por el puerto serie, el usuario selecciona los comandos a probar
lcd-usuario.c lcd-usuario.hex Ejemplo de como definir nuestros propios caracteres para ser impresos en el LCD

Módulo 6: Conversor analógico/digital

  • Transparencias: (En línea) (PDF) ([OpenOffice])
  • Ejemplos: []
ad0-leds.c ad0-leds.hex Ejemplo de lectura del cana RA0 analógico. La muestra de 8 bits leída se envía por el puerto B para ser visualizada en los leds
ad0-leds-int.c ad0-leds-int.hex Ejemplo de lectura del cana RA0 analógico. La lectura del conversor se realiza mediante interrupciones.
ad0-vumetro.c ad0-vumetro.hex Ejemplo de lectura del cana RA0 analógico. La lectura se realiza mediante interrupciones. La información se muestra en los leds

Módulo 7: Memoria EEPROM

  • Transparencias: ([ En línea]) ([ PDF]) ([ OpenOffice])
  • Ejemplos: []
[] []

Módulo 8: Control de servos

  • Transparencias: ([ En línea]) ([ PDF]) ([ OpenOffice])
  • Ejemplos: []
[] []

Módulo 9: Introducción a la programación en lenguaje ENSAMBLADOR

  • Transparencias: ([ En línea]) ([ PDF]) ([ OpenOffice])
  • Ejemplos: []
[] []

Módulo 10: Bus I2C

  • Transparencias: ([ En línea]) ([ PDF]) ([ OpenOffice])
  • Ejemplos: []
[] []


Icono aviso.png En construcción.

Repositorio

Para obtener la última versión teclear:

svn co http://svn.iearobotics.com/Curso_pic/

Historia

  • Jun/2009: Creado como una de las partes del Curso de Microcontroladores PIC: Arquitectura, recursos y programación, impartido en esa misma fecha a personal del Centro Nacional de Inteligencia de España (CNI)

Enlaces

Autores

Licencia

Cc logo.png This work is licensed under a Creative Commons Attribution-ShareAlike 2.5 Spain License.

Noticias

  • 14/Sep/2009: Añadidos módulos 4 y 5
  • 13/Sep/2009: Añadido módulo 3
  • 12/Sep/2009: Añadido módulo 2
  • 10/Sep/2009: Comenzada esta página. Añadido módulo 1