You are on page 1of 17

UNIVERSIDAD TECNOLGICA DE LA MIXTECA

MICROCONTROLADORES

REPORTE DE PRACTICAS 1ER PARCIAL

Ingeniera en Computacin 902

Alumno: Cervantes Martnez Julio Cesar

Fecha de entrega: 31 de octubre de 2016


INTRODUCCIN

Un controlador es un dispositivo de procesamiento que recibe informacin por medio de


sensores, desde una entrada proveniente de un cambio de voltaje o un sensor avanzado, como el
infrarrojo. Durante el pasar de los aos la forma fsica de ellos ha disminuido debido al crecimiento
exponencial de la electrnica, pasando de transistores a pequeos circuitos integrados, llegando
as, a centrar todas los procesos de un controlador en un solo chip, un controlador, y ms
especficamente, un microcontrolador, cuenta con todas las caractersticas para considerarse una
computadora, pero generalmente ser un dispositivo dedicado para un propsito general. En este
curso programaremos con el microcontrolador ATMega328p, usando como interfaz la integracin
de dicho chip en el dispositivo Arduino UNO, programando en c, ensamblador y el propio lenguaje
de arduino. En este reporte presento las 3 primeras prcticas del curso de microcontroladores, las
cuales son: El parpadeo de un led, un decodificador de binario a 7 segmentos y un ALU de 3 bits.

OBJETIVO GENERAL

Con el desarrollo de las siguientes prcticas nos familiarizaremos con el uso de Arduino y
la programacin de microcontroladores, analizaremos con que herramientas contamos para
desarrollar aplicaciones de hardware aprovechando las ventajas que nos presenta. Las diferentes
practicas suponen las bases de la programacin de los microcontroladores, pues vamos desde un
pequeo encendido de un led, hasta operaciones a nivel de bits. Tambin nos familiarizaremos
con el entorno de desarrollo arduino y atmel studio.

PRCTICA #1 Parpadeo de un led

El primer circuito a implementar es un el parpadeo de un led, en la figura 1 podemos apreciar


cmo se desarrollar fsicamente el circuito, a simple vista no puede detectarse que parte
desarrollar el intercambio de encendido a apagado.

Figura 1. Diagrama del circuito (parpadeo de un led).


Gracias al uso del microcontrolador podemos programar un retardo de tiempo para cambiar la
salida del pin. En el diagrama de la figura 2 puede observarse el comportamiento lgico que se
espera de nuestro circuito y que programaremos en el microcontrolador.

Figura 2. Diagrama de flujo del comportamiento lgico de nuestro circuito.

Practica #1 Programacin en Ensamblador


.include <m328pdef.inc>
SER R16
OUT DDRB, R16
LDI R16, 0xFF
LDI R17, 0x08
OUT SPL, R16
OUT SPH, R17
LOOP: LDI R16,0x01
OUT PORTB,R16
RCALL Espera_500ms
CLR R16
OUT PORTB, R16
RCALL Espera_500ms
RJMP LOOP

Espera_500ms:

LDI R18,2

et3:LDI R17,250

et2:LDI R16,250

et1:NOP ;Itera 250 veces emplea 4 us por iteracin

DEC R17 ;es decir, un milisegundo

BRNE et1

DEC R17

BRNE et2;250 milisegundos


DEC R13

BRNE et3;500 milisegundos, 0.5 segundos

Practica #1 Programacin en C
#include <avr/io.h>

#define F_CPU 16000000UL

#include "util/delay.h"

int main(void){

DDRB = 0xFF;//Puerto B como salida

while (1)

PINB = 0x01; //PINB0 como envia un alto para encender el LED

_delay_ms(500);

PINB = 0x00;//Despues de 0.5 segundo apagamos el LED

_delay_ms(500);

Practica #1 Programacin en arduino


void setup() {

// initializa pin 8 como salida

pinMode(8, OUTPUT);

void loop() {

digitalWrite(8, HIGH); // Enciende el LED

delay(500); // Espera medio segundo

digitalWrite(8, LOW); // Apaga el LED

delay(500); // Espera un segundo

}
Practica #1 Resultado

Figura 3. Circuito fsico, podemos observar la configuracin fsica del circuito para el parpadeo de
un LED.

Figura 4.Resultado de la simulacin


PRCTICA #2 Decodificador de binario a 7 segmentos

El segundo circuito a implementar es un decodificador de binario a 7 segmentos, en la figura 2


podemos apreciar cmo se desarrollar fsicamente el circuito, donde las entradas sern
procesadas por el microcontrolador, encargndose de la lgica de salida.

Figura 5. Diagrama del circuito (Decodificador de binario a 7 segmentos).

La entrada en los puertos PD0 a PD3 representara un nmero binario, siendo 15 (b1111) el
nmero ms grande a representar, la siguiente lista representa los pines encendidos y apagados
de g hasta a, y su valor hexadecimal representar la salida de los puertos en serie.

Figura 6. Tabla de valores de las salidas del display


Figura 7. Diagrama de flujo del comportamiento lgico de nuestro circuito.

Practica #2 Programacin en Ensamblador


.include <m328pdef.inc>

LDI R16, 0x00


OUT DDRD, R16
LDI R16, 0xFF
OUT PORTD, R16
OUT DDRB, R16
LOOP: IN R20, PIND
ANDI R20, 0x0F
LDI R30, LOW(tabla << 1); Z apunta al inicio de la tabla
LDI R31, HIGH(tabla << 1)
ADD R30, R20
BRCC s1
INC R31
s1: LPM R0, Z
OUT PORTD, R0
RJMP LOOP

tabla: .DB 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07
.DB 0x7F, 0x67, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71
Practica #2 Programacin en C (anodo comn)
#include <avr/io.h>

#define F_CPU 16000000UL

const int tabla[] PROGMEM = {-0x40,-0x07,-0x5C,-0x50,-0x67,-0x6E,-0x7E,-0x08,-0x80,-0x68,-0x78,-0x7D,-0x3A,-0x5F,-0x7A,-


0x72};

int main(void){

char bcd;

DDRB = 0x00;

DDRD = 0xFF;

char hab;

while(1){

bcd = PINB & 0x0F;

hab = PINB & 0x10;

if(hab == 0x10){

PORTD = pgm_read_byte(&(tabla[bcd]));

Practica #2 Programacin en arduino (anodo comn)


const int numeros[16][7] = {

//ABCDEFG

1,1,1,1,1,1,0, // 0

0,1,1,0,0,0,0, // 1

1,1,0,1,1,0,1, // 2

1,1,1,1,0,0,1, // 3

0,1,1,0,0,1,1, // 4

1,0,1,1,0,1,1, // 5

0,0,1,1,1,1,1, // 6

1,1,1,0,0,0,0, // 7

1,1,1,1,1,1,1, // 8

1,1,1,0,0,1,1, // 9

1,1,1,0,1,1,1, // A

0,0,1,1,1,1,1, // b
1,0,0,1,1,1,0, // c

0,1,1,1,1,0,1, // d

1,0,0,1,1,1,1, // E

1,0,0,0,1,1,1 // F

};

// b,..,..,B, ha

const int PinesEntrada[5]= {9,10,11,12,13};

// A,B,C,D,E,F,G

const int PinesSalida[7] = {2,3,4,5,6,7,8};

int numero = 0;

boolean input;

void setup() {

// put your setup code here, to run once:

for(int i=0;i<5;i++){

pinMode(PinesEntrada[i],INPUT);

for(int i=0; i < 7; i++){

pinMode(PinesSalida[i], OUTPUT);

void loop() {

numero=8*digitalRead(PinesEntrada[0]) + 4*digitalRead(PinesEntrada[1]) + 2*digitalRead(PinesEntrada[2]) +


1*digitalRead(PinesEntrada[3]);

if(digitalRead(PinesEntrada[4])){

for(int i=0;i<7;i++){

input = numeros[numero][i];

digitalWrite(PinesSalida[i],!input);

}
Practica #2 Resultado

Figura 8. Circuito fsico, podemos observar la configuracin fsica del circuito para el parpadeo de
un LED.

Figura 9.- PuertoB con salidas


en alto,
Prctica 3
Diseo de una ALU de 3 bits.

Para el diseo de la ALU de 3 bits fueron necesarios.Se usaron 3 lneas de seleccin


correspondientes a las operaciones: suma, resta y multiplicacin el resultado se visualizaba en las
salidas que estaban conectadas a cada uno de los leds.

Figura 10. Diagrama del circuito.

Prctica #3 Programacin en Ensamblador


.include <m328def.inc>
LDI R16, 0x00
OUT DDRB, R16
OUT DDRC, R16
LDI R16 , 0xFF
OUT PORTB, R16
OUT PORTC, R16
OUT DDRD, R16
LOOP: IN R20, PINB
ANDI R20, 0x0F
IN R21, PINB
ANDI R21, 0xF0
SWAP R21
IN R22, PINC
ANDI R22, 0x07
CPI R22, 5
BRGE caso_valido

caso_valido: LDI R30, LOW(tabla)


LDI R31, HIGH(tabla)
ADD R30, R22
BRNE no_carry
INC R31
no_carry: IJMP

no_valido: LDI R22, 5


RJMP caso_valido
tabla:
RJMP caso_0
RJMP caso_1
RJMP caso_2
RJMP caso_3
RJMP caso_4
RJMP default

caso_0: MOV R23, R20


ADD R23,R21
RJMP fin_case
caso_1: MOV R23,R20
SUB R23,R21
RJMP fin_case
caso_2: MUL R21, R20
MOV R23,R0
RJMP fin_case
caso_3: MOV R23, R20
AND R23, R21
RJMP fin_case
caso_4: MOV R23, R20
OR R23, R21
RJMP fin_case
default: CLR R23

fin_case: OUT PORTD, R23


RJMP LOOP

Prctica #3 Programacin en C

#include <avr/io.h>

#define F_CPU 16000000UL

char A,B,op;

int main(void){

DDRD = 0x00; // Taking portD as input port

DDRB = 0x00;

DDRC = 0xFF; //taking porta as output port

//char hab;

PIND = 0x00;
//DDRD = 0b11111111; //taking portd as output

while(1){

A = (PIND & 0x0F);

B = (PIND & 0xF0)>>4;

op = PINB & 0x07;

if(op == 0){

PORTC = A + B;

if(op == 1){

//PORTC = 0x00;

PORTC = A - B;

if(op == 2){

//PORTC = 0x00;

PORTC = A * B;

if(op == 3){

//PORTC = 0x00;

PORTC = A & B;

if(op == 4){

//PORTC = 0x00;

PORTC = A | B;

}else{

PORTC = 0x00;

//if(hab == 0x10){

//PORTD = pgm_read_byte(&(tabla[bcd]));
//}

Prctica #3 Programacin en Arduino

int a0,a1,a2,b0,b1,b2,s0,s1,s2,operacion,c2,c1,c0,r3,r2,r1,r0,numa,numb;

int num2;

int LEDP[] = {A5, A4, A3, A2, A1, A0};

void setup() {

pinMode(2, INPUT);

pinMode(3, INPUT);

pinMode(4, INPUT);

pinMode(5, INPUT);

pinMode(6, INPUT);

pinMode(7, INPUT);

pinMode(8, INPUT);

pinMode(9, INPUT);

pinMode(10, INPUT);

pinMode(A0, OUTPUT);

pinMode(A1, OUTPUT);

pinMode(A2, OUTPUT);

pinMode(A3, OUTPUT);

pinMode(A4, OUTPUT);

pinMode(A5, OUTPUT);

void numeros (int num){


num2 = int(num);

for (int i = 0; i < 6; i++) {

if (num2 % 2 == 1) {

digitalWrite(LEDP[i], HIGH);

else {

digitalWrite(LEDP[i], LOW);

num2 = num2 / 2;

void loop() {

a2 = digitalRead(10);

a1 = digitalRead(9);

a0 = digitalRead(8);

b2 = digitalRead(7);

b1 = digitalRead(6);

b0 = digitalRead(5);

s0 = digitalRead(2);

s1 = digitalRead(3);

s2 = digitalRead(4);

operacion = 4*s2 + 2*s1 +1*s0;

switch(operacion){

case 0: //suma
numa = 4*a2 + 2*a1 +1*a0;

numb = 4*b2 + 2*b1 +1*b0;

numeros(numa + numb);

break;

case 1: //resta

numa = 4*a2 + 2*a1 +1*a0;

numb = 4*b2 + 2*b1 +1*b0;

numeros(numa - numb);

break;

case 2: //mult

numa = 4*a2 + 2*a1 +1*a0;

numb = 4*b2 + 2*b1 +1*b0;

numeros(numa * numb);

break;

case 3: //and

display(0,0,0,a2 and b2, a1 and b1, a0 and b0);

break;

case 4: //or

display(0,0,0,a2 or b2, a1 or b1, a0 or b0);

break;

default:

display(0,0,0,0,0,0);

break;

void display (int r5, int r4, int r3, int r2, int r1, int r0)

{
digitalWrite (A5,r0);

digitalWrite (A4,r1);

digitalWrite (A3,r2);

digitalWrite (A2,r3);

digitalWrite (A1,r4);

digitalWrite (A0,r5);

Figura 11.Resultado de la simulacin.

PRACTICA#3 RESULTADO

Figura 12. Circuito fsico del alu de 3


bits