Вы находитесь на странице: 1из 41

Arquitectura de Computadoras

Semana 08: Programación en


lenguaje C

Semana 08 – Programación en lenguaje C Miguel A. Torres Lázaro


Arquitectura de Computadoras

Temario:

– ¿Por qué programar en lenguaje C?


– Ciclo de construcción de un programa en C
– Librerías proporcionadas por el fabricante
– Manejo de puertos en un microcontrolador
– Concepto de máscara
– Enmascaramiento de bits
– Escritura de bits mediante enmascaramiento
– Lectura de bits mediante enmascaramiento

Semana 08 – Programación en lenguaje C Miguel A. Torres Lázaro


Arquitectura de Computadoras

1.- CONCEPTOS Y DEFINICIONES

1.1.- Lenguaje de programación

¿Por qué aprender a programar


en lenguaje C?

Semana 08 – Programación en lenguaje C Miguel A. Torres Lázaro


Arquitectura de Computadoras

1.- CONCEPTOS Y DEFINICIONES

1.1.- Lenguaje de programación

Suma OK
Transmite ¿Dónde?

Suma 1000110
Transmite 1010011

Semana 08 – Programación en lenguaje C Miguel A. Torres Lázaro


Arquitectura de Computadoras

1.- CONCEPTOS Y DEFINICIONES

1.1.- Lenguaje de programación

Java
Python
(Palabras)

C, Pascal, Fortran
Tiempo de (Palabras) Tiempo de
ejecución desarrollo

Macro Assembler
(Mnemónicos)

Direct Assembler
(Binario o Hexadecimal)

Semana 08 – Programación en lenguaje C Miguel A. Torres Lázaro


Arquitectura de Computadoras

1.- CONCEPTOS Y DEFINICIONES

1.1.- Lenguaje de programación

- Diseñado para ser simple y compacto. - Diseñado para proporcionar ALTA confiabilidad.

- Requiere que el programador sea cuidadoso. - Limita al programador para evitar errores.

- No es fácilmente escalable a sistemas muy complejos. - Eficiente para sistemas de alta complejidad.

- Empleado en diferentes campos de la industria. - Empleado en aplicaciones militares y espaciales.

- Herramientas libres disponibles (GCC). - Herramientas libres disponibles (GNAT).

Semana 08 – Programación en lenguaje C Miguel A. Torres Lázaro


Arquitectura de Computadoras

1.- CONCEPTOS Y DEFINICIONES

1.2.- Ciclo de construcción de un programa en C

Idea

Programa
implementado

Semana 08 – Programación en lenguaje C Miguel A. Torres Lázaro


Arquitectura de Computadoras

1.- CONCEPTOS Y DEFINICIONES

1.2.- Ciclo de construcción de un programa en C

Un programa escrito en lenguaje C debe pasar por un proceso de construcción antes de


poder ser ejecutado.

Este proceso de construcción se encuentra dividido en etapas, y cada etapa del proceso es
llevada a cabo por una herramienta (software) particular.

Las herramientas para construir un programa ejecutable en C son:

- Pre-procesador
- Compilador
- Ensamblador
- Enlazador

Es importante recalcar que el editor de texto, a pesar de ser importante para escribir el código
fuente, no se considera parte de la cadena de herramientas para la construcción de un
programa en C.

Por otro lado, al programar un microcontrolador, además hará falta una herramienta para
transferir el código desde la computadora hacia la memoria de programa del
microcontrolador. Esta herramienta, compuesta por software y hardware, se conoce como el
programador.

Semana 08 – Programación en lenguaje C Miguel A. Torres Lázaro


Arquitectura de Computadoras

1.- CONCEPTOS Y DEFINICIONES

1.2.- Ciclo de construcción de un programa en C

Microprocesador
(Sistema Operativo)

modulo.o

Editor de hola.c Pre hola.i hola.s hola.o hola


Compilador Ensamblador Enlazador Depurador
texto Procesador

Cadena de herramientas (Toolchain) de C para programar una PC.

Semana 08 – Programación en lenguaje C Miguel A. Torres Lázaro


Arquitectura de Computadoras

1.- CONCEPTOS Y DEFINICIONES

1.2.- Ciclo de construcción de un programa en C

Microcontrolador

libreria.o configuración

hola.c hola.i hola.asm hola.o hola.hex ...101100...


Editor de Pre
Compilador Ensamblador Enlazador Programador
texto Procesador

Depurador

Cadena de herramientas (Toolchain) de C para programar un microcontrolador.

Semana 08 – Programación en lenguaje C Miguel A. Torres Lázaro


Arquitectura de Computadoras

1.- CONCEPTOS Y DEFINICIONES

1.3.- Entorno integrado de desarrollo (IDE)

IDE IDE + Toolchain

Semana 08 – Programación en lenguaje C Miguel A. Torres Lázaro


Arquitectura de Computadoras

1.- CONCEPTOS Y DEFINICIONES

1.3.- Entorno integrado de desarrollo (IDE)

IDE: Atmel Studio

Toolchain: AVR-GCC Toolchain


Incluido en el IDE

Librerías: AVR-LIBC

Incluido en el
Software programador: AVR-DUDE software de
Arduino

Semana 08 – Programación en lenguaje C Miguel A. Torres Lázaro


Arquitectura de Computadoras

1.- CONCEPTOS Y DEFINICIONES

1.4.- Editor de texto

Autocompletar

Resaltar

Archivo(s) fuente

Semana 08 – Programación en lenguaje C Miguel A. Torres Lázaro


Arquitectura de Computadoras

1.- CONCEPTOS Y DEFINICIONES

1.5.- Pre-Procesador

Verificación de la sintaxis

for
else
if
while

+- x / << >= && ||

Semana 08 – Programación en lenguaje C Miguel A. Torres Lázaro


Arquitectura de Computadoras

1.- CONCEPTOS Y DEFINICIONES

1.5.- Pre-Procesador

Evaluación de directivas

#include

stdio.h
stdint.h Pre-Procesador
math.h

archivo.c archivo.i

Contiene Evalúa las directivas No contiene


directivas en el archivo fuente y directivas
en las cabeceras.

Semana 08 – Programación en lenguaje C Miguel A. Torres Lázaro


Arquitectura de Computadoras

1.- CONCEPTOS Y DEFINICIONES

1.6.- Compilador

Alto Nivel Bajo Nivel

Toma dos piezas de pan de la


alacena.
Toma queso y jamón de la nevera.
Pon una pieza de pan como base.
Prepara un sandwich mixto. Pon queso sobre el pan.
Pon jamón sobre el queso.
Pon la otra pieza de pan sobre el
jamón.
Pon todo el grupo en la waflera.

Semana 08 – Programación en lenguaje C Miguel A. Torres Lázaro


Arquitectura de Computadoras

1.- CONCEPTOS Y DEFINICIONES

1.6.- Compilador

C Assembly

LDI R16, 3 
STS x, R16
x = 3; LDS  R17, y
ADD R16, R17
NO depende del z = x + y; STS z, R16 Depende del
hardware hardware
(Estándar) if(z < 5) CPI R16, 5
z = 5 BRSH SIGUE
LDI R16, 5
STS z, R16   

SIGUE:

Semana 08 – Programación en lenguaje C Miguel A. Torres Lázaro


Arquitectura de Computadoras

1.- CONCEPTOS Y DEFINICIONES

1.6.- Compilador

Unidad de
Archivo fuente traducción

Pre-Procesador Compilador

archivo.c archivo.i

Verifica la sintaxis y Traduce el código en


evalúa las directivas. lenguaje C a lenguaje
Assembler.

Semana 08 – Programación en lenguaje C Miguel A. Torres Lázaro


Arquitectura de Computadoras

1.- CONCEPTOS Y DEFINICIONES

1.6.- Compilador

Compilador
(Compiler)

Compilador cruzado
(Cross compiler)

Semana 08 – Programación en lenguaje C Miguel A. Torres Lázaro


Arquitectura de Computadoras

1.- CONCEPTOS Y DEFINICIONES

1.7.- Ensamblador

LDI R16, 3  11000000000011


STS  x, R16 00000010100001

LDS  R17, y 00000010100011


ADD R16, R17 00100000100010
STS z, R16 00011110100011

Archivos Objetos reubicables


ensamblador

Semana 08 – Programación en lenguaje C Miguel A. Torres Lázaro


Arquitectura de Computadoras

1.- CONCEPTOS Y DEFINICIONES

1.8.- Enlazador (Linker)

Objetos reubicables:

file1.o

file2.o

file3.o

file4.o

Semana 08 – Programación en lenguaje C Miguel A. Torres Lázaro


Arquitectura de Computadoras

1.- CONCEPTOS Y DEFINICIONES

1.8.- Enlazador (Linker)

Objetos reubicables Programa ejecutable


ó
Archivo binario

Semana 08 – Programación en lenguaje C Miguel A. Torres Lázaro


Arquitectura de Computadoras

1.- CONCEPTOS Y DEFINICIONES

1.9.- Depurador (Debugger)

Encontrar JTAG
errores (Hardware)

Monitoreo

Semana 08 – Programación en lenguaje C Miguel A. Torres Lázaro


Arquitectura de Computadoras

1.- CONCEPTOS Y DEFINICIONES

1.10.- Librerías proporcionadas por el fabricante

http://www.nongnu.org/avr-libc/

avr/io.h:
Define los nombres de todos los registros de función específica (puertos de entrada salida y
registros de configuración). Asimismo, define nombres para cada bit de cada registro de
función específica (SFR).

util/delay.h:
Proporciona funciones para la generación de retardos por “software”. Las funciones más
empleadas son _delay_us() y _delay_ms().

avr/interrupt.h:
Proporciona macros para facilitar la implementación de rutinas de interrupción. Asimismo,
proporciona macros para la habilitación y deshabilitación de interrupciones.

Semana 08 – Programación en lenguaje C Miguel A. Torres Lázaro


Arquitectura de Computadoras

2.- MANEJO DE PUERTOS EN UN MICROCONTROLADOR

2.1.- Registros de los puertos de E/S

B0 RB0
Puerto de salida tratado como
un espacio en memoria.

B1 RB1

B2 RB2
.
uint8_t Puerto_B .
.
B7 RB7

Clock

Puerto de salida de un microcontrolador mapeado en memoria.

Semana 08 – Programación en lenguaje C Miguel A. Torres Lázaro


Arquitectura de Computadoras

2.- MANEJO DE PUERTOS EN UN MICROCONTROLADOR

2.1.- Registros de los puertos de E/S

Relación entre los registros y los pines de un PUERTO x en el microcontrolador ATmega2560.

Semana 08 – Programación en lenguaje C Miguel A. Torres Lázaro


Arquitectura de Computadoras

2.- MANEJO DE PUERTOS EN UN MICROCONTROLADOR

2.1.- Registros de los puertos de E/S

Registros asociados al Puerto F del ATmega2560.

Semana 08 – Programación en lenguaje C Miguel A. Torres Lázaro


Arquitectura de Computadoras

2.- MANEJO DE PUERTOS EN UN MICROCONTROLADOR

2.2.- Ejercicios básicos

Ejercicio 01:
Conectar cuatro LEDs (con sus respectivas resistencias) a los pines del puerto F. Luego,
implementar un pograma que cuente segundos desde 0 hasta 15. El valor del contador debe
mostrarse en los LEDs en formato binario. Una vez que el programa funcione correctamente,
implementar una función que convierta un número de formato binario a formato Gray (de 4
bits). Finamente, el valor del contador en formato Gray debe ser mostrado en los LEDs.
Utilizar la función _delay_ms() para la generación de los retardos.

Ejercicio 02:
Empleando la función _delay_us(), escribir una función que permita generar una señal PWM
de, aproximadamente, 10KHz. La función debe recibir el duty cycle como parámetro. Verificar
el correcto funcionamiento de la función, midiendo el pin de salida con un osciloscopio. De
no contar con un osciloscopio, conectar el pin a un LED (con su respectiva resistencia) y
verificar que la intensidad de la luz emitida por el LED cambia al modificar el duty cycle.

Ejercicio 03:
Conectar un display de 7 segmentos (cátodo común) al puerto F. Luego, escribir un programa
que cuente segundos desde 0 hasta 9, y que muestre el valor del contador en el display de 7
segmentos. Se recomienda implementar una función “decodificador” y llamarla desde la
función principal. Utilizar la función _delay_ms() para la generación de los retardos.

Semana 08 – Programación en lenguaje C Miguel A. Torres Lázaro


Arquitectura de Computadoras

2.- MANEJO DE PUERTOS EN UN MICROCONTROLADOR

2.2.- Ejercicios básicos

Entrada Salida (CC) Salida (AC)


a (gfedcba) (gfedcba)
0 0000 0111111 1000000
1 0001 0000110 1111001
f b 2 0010 1011011 0100100
g 3 0011 1001111 0110000
4 0100 1100110 0011001
5 0101 1101101 0010010
e c 6 0110 1111101 0000010
7 0111 0000111 1111000
8 1000 1111111 0000000
d 9 1001 1101111 0010000

Tabla para decodificador de display de 07 segmentos.

Semana 08 – Programación en lenguaje C Miguel A. Torres Lázaro


Arquitectura de Computadoras

3.- MANIPULACIÓN DE BITS

3.1.- Máscara (Mask)

Usualmente, los microcontroladores cuentan con instrucciones que nos permiten evaluar o
modificar un bit en particular en un registro.

Por un lado, el ATmega2560 cuenta con las instrucciones SBIS, SBIC, SBRS y SBRC para
evaluar un bit en un registro, ya sea un SFR o un GPR. Por otro lado, cuando deseamos
modificar un bit en particular en un SFR, podemos usar las instrucciones SBI o CBI.

A diferencia del lenguaje Assembly, el lenguaje C no cuenta con operadores o sentencias


que nos permitan evaluar o modificar bits directamente. Por este motivo, algunos fabricantes
han optado por incluir sus propias “herramientas” (macros).

Ejemplo:

Microchip → LATBbits.LATB3 = 0  // Fuerza a ‘0’ el bit 3 de LATB
Atmel → PORTB = _BV(5)   // Fuerza ‘1’ el bit 5 de PORTB

La desventaja de estas herramientas es que no son estándar (no generan código portable) y
solo funcionan con su respectivo fabricante. Por esta razón, a nivel profesional, la
manipulación de bits se lleva a cabo mediante un método estándar, conocido como
enmascaramiento de bits (bit masking).

Semana 08 – Programación en lenguaje C Miguel A. Torres Lázaro


Arquitectura de Computadoras

3.- MANIPULACIÓN DE BITS

3.1.- Máscara (Mask)

Ejemplos de máscara. Descripción gráfica de máscara.

Semana 08 – Programación en lenguaje C Miguel A. Torres Lázaro


Arquitectura de Computadoras

3.- MANIPULACIÓN DE BITS

3.1.- Máscara (Mask)

Visibilidad del área de interés. Modificación del área de interés.

Semana 08 – Programación en lenguaje C Miguel A. Torres Lázaro


Arquitectura de Computadoras

3.- MANIPULACIÓN DE BITS

3.2.- Escritura de bits mediante máscaras

Número de 8 bits: Máscara:

b7b6b5b4b3b2b1b0

b1 b1

b7b6b5b4b3b20b0

¡Solo el bit de interés es afectado!

Semana 08 – Programación en lenguaje C Miguel A. Torres Lázaro


Arquitectura de Computadoras

3.- MANIPULACIÓN DE BITS

3.2.- Escritura de bits mediante máscaras

Propiedades de los operadores a nivel de bits.

Semana 08 – Programación en lenguaje C Miguel A. Torres Lázaro


Arquitectura de Computadoras

3.- MANIPULACIÓN DE BITS

3.2.- Escritura de bits mediante máscaras

Forzar bits a 1: variable |= mascara_set;

Forzar bits a 0: variable &= mascara_clear;

Conmutar bits: variable ^= mascara_toggle;

Modificar bit en la posicion “p”: Modificar bits en las posiciones “p1”, “p2” y “p3”:

mascara_set = (1 << p) mascara_set = (1 << p1) | (1 << p2) | (1 << p3)

mascara_clear = ~(1 << p) mascara_clear = ~((1 << p1) | (1 << p2) | (1 << p3))
mascara_toggle = (1 << p) mascara_toggle = (1 << p1) | (1 << p2) | (1 << p3)

Semana 08 – Programación en lenguaje C Miguel A. Torres Lázaro


Arquitectura de Computadoras

3.- MANIPULACIÓN DE BITS

3.2.- Escritura de bits mediante máscaras

Ejercicio 04:
Conectar un LED a cada uno de los pines del puerto F. Luego, seguir las indicaciones del
profesor para la implementación de 03 secuencias de encendido de los LEDs. Después,
escribir 03 funciones para implementar las secuencias (una función por cada secuencia).

Ejercicio 05:
Conectar 02 pulsadores a los pines PK0 y PK1. Luego, escribir un programa para generar 03
señales de control de un driver para dos motores: IN1, IN2, ENABLE, correspondientes a los
pines PF1, PF3 y PF5. Si solo PK0 se encuentra pulsado, entonces el motor 1 debe rotar; si
solo PK1 se encuentra pulsado, entonces el motor 2 debe rotar; si ambos botones se
encuentran pulsados, entonces ambos motores deben frenar; si ningún boton se encuentra
pulsado, entonces el driver es deshabilitado (los motores quedan “flotantes”).

Ejercicio 06:
Conectar 04 pulsadores a los pines PK0, PK1, PK2 y PK3. Luego, escribir un programa para
controlar las señales de control de un driver para un motor: IN1, IN2, ENABLE,
correspondientes a los pines PF2, PF4 y PF6. Basta con presionar un botón una vez (no
mantener pulsado) para llevar a cabo cada acción: PK0 rota el motor en sentido horario; PK1
rota el motor en sentido anti-horario; PK2 frena el motor; PK3 deshabilita el driver (el motor
queda “flotante”). Se recomienda el uso de una variable “estado” para resolver este ejercicio.

Semana 08 – Programación en lenguaje C Miguel A. Torres Lázaro


Arquitectura de Computadoras

3.- MANIPULACIÓN DE BITS

3.3.- Lectura de bits mediante máscaras

mascara = (1 << p);

Evaluar si el bit en la posición “p” es 1: test = variable & mascara;

Evaluar si el bit en la posición “p” es 0: test = !(variable & mascara);

test ≠ 0 ↔ la condición se cumple test = 0 ↔ la condición no se cumple

RECOMENDACIÓN:
Utilizar la directiva #define para colocar identificadores al emplear máscaras constantes.
Esto ayudará a hacer el código más fácil de leer y escribir.

Semana 08 – Programación en lenguaje C Miguel A. Torres Lázaro


Arquitectura de Computadoras

3.- MANIPULACIÓN DE BITS

3.3.- Lectura de bits mediante máscaras

Ejercicio 07:
Conectar una resistencia pull-down y un pulsador a uno de los pines del microcontrolador, y
un LED a otro. Luego, escribir un programa que encienda el LED mientas el pulsador se
encuentre presionado. Una vez que el programa funcione correctamente, cambiar la
resistencia pull-down por una resistencia pull-up y modificar el código para que el
comportamiento del sistema se mantenga (el LED debe encender mientras el pulsador se
encuentre presionado).

Ejercicio 08:
Conectar dos pulsadores y un LED al microcontrolador. Luego, escribir un programa que
habilite las resistencias pull-up internas de los pines conectados a los pulsadores, y que
encienda el LED solo si los dos pulsadores se encuentran presionados.

Ejercicio 09:
Conectar un pulsador a uno de los pines del microcontrolador, y conectar un LED a otro pin.
Luego, escribir un programa que haga que el pulsador se comporte como un botón ON/OFF:
Si el LED se encuentra apagado, al presionar el pulsador el LED debe encenderse; si el LED
se encuentra encendido, al presionar el pulsador el LED debe apagarse (ver el diagrama de
flujo proporcionado por el profesor como referencia).

Semana 08 – Programación en lenguaje C Miguel A. Torres Lázaro


Arquitectura de Computadoras

3.- MANIPULACIÓN DE BITS

3.3.- Lectura de bits mediante máscaras

Semana 08 – Programación en lenguaje C Miguel A. Torres Lázaro


Arquitectura de Computadoras

4.- TAREA PARA EL ESTUDIANTE

4.1.- Contador con displays

Conectar dos displays de 07 segmentos al microcontrolador: uno en el PUERTO F y otro en


el PUERTO K. También, conectar un pulsador a un pin libre de otro puerto. Luego, escribir un
programa que cuente segundos desde 0 hasta 60, y que muestre el valor de la cuenta en los
displays (en valor decimal). El programa debe iniciar mostrando en los displays el valor “00”,
y no debe empezar a contar hasta que el usuario presione el pulsador. Una vez que la
cuenta se haya completado, el programa debe encender el LED conectado a PB7 y dejarlo
encendido permanentemente.

Para este ejercicio se espera del alumno:

- Uso de máscaras para leer bits


- Uso de etiquetas (mediante la directiva #define)
- Uso de sentencias condicionales (if, else, etc.)
- Uso de bucles (for, while, etc.)
- Uso de arrays *
- Definición de una función Display_Decodificar_Numero( )
- Uso de funciones de retardo (incluidas en el archivo util/delay.h)
- Buenas prácticas en la escritura del código

* No es obligatorio, pero es pereferible.

Semana 08 – Programación en lenguaje C Miguel A. Torres Lázaro


Arquitectura de Computadoras

5.- PREGUNTAS

Semana 08 – Programación en lenguaje C Miguel A. Torres Lázaro

Вам также может понравиться