Documentos de Académico
Documentos de Profesional
Documentos de Cultura
LABORATORIO Nº2
TEMA:
INTERFASE DE INTERRUPTORES Y PULSADORES
ASIGNATURA:
MICROCONTROLADORES Y SISTEMAS EMBEBIDOS
PROFESOR:
ASTOCONDOR VILLAR, JACOB
INTEGRANTES:
OBJETIVOS
• Configurar las líneas de los puertos como entradas y salidas.
• Conocer la forma de interfaz ar correctamente interruptores y pulsadores.
• Utilizar las instrucciones:
Para la configuración de puertos como salidas debemos escribir en los bits del registro
DDRx 1 y 0 para entradas. En caso de ser salida un 1 en los bits de PORTx significa
pull -up interna habilitada. La lectura del dato de una entrada se lee en el registro PINx.
Donde V1=Vcc -Vpin ( Vpin=5V ) , entonces R3=7142 O por lo tanto su valor estándar
se de 6.8k Ω.
Con este valor, re calculando el voltaje Vpin será de 4.86V y la corriente (cuando se
accione el pulsador) en el pin será de 0.71mA.
Cuando se trabaja con interruptores y pulsadores aparece el fenómeno de los rebotes
que pueden dar en ocasiones señales falsas de accionamientos y que duran alrededor
de 5ms dependiendo del tamaño del pulsador. Para evitarlos se pueden emplear
métodos de eliminación de los rebotes por software o hardware. Nosotros emplearemos
el primero, introduciendo retardos de hasta 10ms.
PROCEDIMIENTOS:
/*
* main.c
*
*
* Author: DE LA CRUZ SALVADOR KEVIN GERZON
*/
// LEDS APAGADOS
}
}
else { // Se pone en ALTO (1) el pin PC1
PORTD=0b10101010;
_delay_ms(9);
PORTD=0b01010101;
_delay_ms(9);
}
//JUEGO DE LEDS
}
}
}
}
Diagrama de flujo:
Código:
while (1)
{
switch(PINB & 0x0F) //habilitamos 16 casos
{
case 0x00: //caso 1
PORTB=0xF0;//LEDS ENCENDIDOS//
break;
case 0x01: //caso 2
PORTB=0xE0;//encendemos led//
break;
case 0x02: //caso 3
PORTB=0xD0;//encendemos led//
break;
case 0x03: //caso 4
PORTB=0xC0;//encendemos led//
break;
case 0x04: //caso 5
PORTB=0xB0;//encendemos led//
break;
case 0x05: //caso 6
PORTB=0xA0;//encendemos led//
break;
case 0x06: //caso 7
PORTB=0x90;//encendemos led//
break;
case 0x07: //caso 8
PORTB=0x80;//encendemos led//
break;
case 0x08: //caso 9
PORTB=0x70;//encendemos led//
break;
case 0x09: //caso 10
PORTB=0x60;//encendemos led//
break;
case 0x0A: //caso 11
PORTB=0x50;//encendemos led//
break;
case 0x0B: //caso 12
PORTB=0x40;//encendemos led//
break;
case 0x0C: //caso 13
PORTB=0x30;//encendemos led//
break;
case 0x0D: //caso 14
PORTB=0x20;//encendemos led//
break;
case 0x0E: //caso 15
PORTB=0x10;//encendemos led//
break;
case 0x0F: //caso 16
PORTB=0x00;//LEDS APAGADOS//
break;
}
}
}
Esquema:
U1
30 12 8 OFF ON 1
PD0/RXD/PCINT16 PB0/ICP1/CLKO/PCINT0
31 13 7 2
PD1/TXD/PCINT17 PB1/OC1A/PCINT1
32 14 6 3
PD2/INT0/PCINT18 PB2/SS/OC1B/PCINT2
1 15 5 4
PD3/INT1/OC2B/PCINT19 PB3/MOSI/OC2A/PCINT3
2 16
PD4/T0/XCK/PCINT20 PB4/MISO/PCINT4
9 17
PD5/T1/OC0B/PCINT21 PB5/SCK/PCINT5
10 7
PD6/AIN0/OC0A/PCINT22 PB6/TOSC1/XTAL1/PCINT6
11 8
PD7/AIN1/PCINT23 PB7/TOSC2/XTAL2/PCINT7
20 23
AREF PC0/ADC0/PCINT8
18
AVCC PC1/ADC1/PCINT9
24 D1 D2 D4 D3
25 LED-GREEN LED-GREEN LED-GREEN LED-GREEN
PC2/ADC2/PCINT10
19 26
ADC6 PC3/ADC3/PCINT11
22 27
ADC7 PC4/ADC4/SDA/PCINT12
28
PC5/ADC5/SCL/PCINT13
29
R1
PC6/RESET/PCINT14
10k
ATMEGA328P
2. Realizar un programa que encienda y pague un LED desde dos puntos
(interruptores).
Diagrama de flujo:
Código:
int main(void)// funcion principal
{
DDRD =0x00; //Declaramos el puerto D como entrada
PORTD =0xFF; //Activamos las resistencias de PULL UP del puerto D
DDRB =0X01; //Declaramos el PORTB0 como salida
while (1)
{
switch(PIND & 0x03) //iniciamos 4 casos
{
case 0x00: //caso 1
PORTB = 0x00;
break;
case 0x01: //caso 2
PORTB = 0x01;
break;
case 0x02: //caso 3
PORTB = 0x01;
break;
case 0x03: //caso 4
PORTB = 0x00;
break;
}
}
}
Esquema:
U1
4 OFF ON 1 30 12
PD0/RXD/PCINT16 PB0/ICP1/CLKO/PCINT0
3 2 31 13
PD1/TXD/PCINT17 PB1/OC1A/PCINT1
32 14
PD2/INT0/PCINT18 PB2/SS/OC1B/PCINT2
1
PD3/INT1/OC2B/PCINT19 PB3/MOSI/OC2A/PCINT3
15 D1
2 16 LED-RED
PD4/T0/XCK/PCINT20 PB4/MISO/PCINT4
9 17
PD5/T1/OC0B/PCINT21 PB5/SCK/PCINT5
10 7
PD6/AIN0/OC0A/PCINT22 PB6/TOSC1/XTAL1/PCINT6
11 8
PD7/AIN1/PCINT23 PB7/TOSC2/XTAL2/PCINT7
R1
20 23 220
AREF PC0/ADC0/PCINT8
18 24
AVCC PC1/ADC1/PCINT9
25
PC2/ADC2/PCINT10
19 26
ADC6 PC3/ADC3/PCINT11
22 27
ADC7 PC4/ADC4/SDA/PCINT12
28
PC5/ADC5/SCL/PCINT13
29
R2
PC6/RESET/PCINT14
10k
ATMEGA328P
DIAGRAMA DE FLUJO:
CÓDIGO:
#include <avr/io.h> //Incluimos la libreria de entradas y salidas
#define F_CPU 8000000UL //Definimos el clock del microcontrolador
#include <util/delay.h> //incluimos la libreria delay
int main(void)
{
DDRB = 0xFF; //habilitamos puerto B como salida
DDRC = 0X01; //habilitamos PORTC0 como salida
DDRD = 0X00; //habilitamos puerto D como entrada
while(1)
{
switch(PIND & 0x01) //habilitamos 2 casos para el PIND
{
case 0x00: //Caso 1
break;
}
}
}
4. Realizar un contador binario, el mismo que se incrementar á cada vez que se
pulse la tecla conectado a PC0. En el circuito de la figura se cambian los
interruptores por un pulsador
DIAGRAMA DE FLUJO:
CÓDIGO:
#include <avr/io.h> //declaramos libreria del atmega
#define F_CPU 16000000UL //declaramos velocidad del procesador//
#include <util/delay.h> //declaramos libreria del retraso
int main(void)
{
DDRB=0xFF; //Definimos salida
DDRC=0x00; //Definimos entrada
PORTB=0x00;//Apagado
PORTC=0x01;//Encendido
DDRD=0x01; //Definimos salida
PORTD=0x00;//Apagado
while(1)
{
for(int i=1;i<=255;i++) //Iniciamos el conteo
{
while (PINC & 0x01);//El while servira para habilitar el
button del contador
PORTB=i; // se activara los led contando de forma binaria
while (!(PINC & 0x01)); //Hasta que reciba una señal sale
del ciclo while
}
}
5. Hacer los cambios en el programa anterior de tal forma que cuando la cuenta
llegue a 125, suene intermitente una sirena 5 veces.
CODIGO:
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
DDRD=0xFF; //SALIDAS
DDRC &=~ (1<<DDC0); //ENTRADA
PORTC=0x01; //PULL-UP
PORTD=0x00; //INCIALMENTE APAGADOS
while (1)
{
for(int i=1;i<=255;i++) //CONTEO
{
while (PINC & (1<<PINC0)); //HABILITAMOS EL PULSADOR
PORTD=i; //PUERTO D CONTARÁ DE FORMA BINARIA EN LOS
LEDS
if (i==125) //CONTEO 125
{
for (int j=1;j<=5;j++) //NRO DE VECES QUE SONARÁ LA SIRENA
{
PORTB=0x01; //SUENA LA SIRENA
_delay_ms(250); //SUENA POR 250ms
}
}
}
CIRCUITO
DIAGRAMA DE FLUJO
PROBLEM
A5
CONFIGURAMOS
PUERTOS
DDRD=0xFF;
DDRC &=~ (1<<DDC0);
PORTC=0x01;
PORTD=0x00;
for(i=1; i<=255;
i++)
PORTD=i
NO SI
i==125 for(j=1; j<=5; j++)
PORTB=0x01;
_delay_ms(250);
PORTB=0x00;
_delay_ms(250)
6. Un LED se prende con un pulso de una tecla, con el siguiente pulso se apaga.
CODIGO:
#define F_CPU 16000000UL
#include <avr/io.h>
int main(void)
{
DDRD &=~ (1<<DDD0); //ENTRADA
DDRB |= (1<<DDB0); //SALIDA
PORTD |= (1<<DDD0); //PULL-UP
while (1)
{
while (PIND & (1<<PIND0));
PORTB^= (1<<PORTB0);
while (!(PIND & (1<<PIND0)));
}
}
CIRCUITO
DIAGRAMA DE FLUJO
PROBLEM
A6
CONFIGURAMOS
PUERTOS
DDRD &=~ (1<<DDD0);
DDRB |= (1<<DDB0);
PORTD |= (1<<DDD0);
PORTB^= (1<<PORTB0)
7. Realizar un programa que realice el encendido y monitoreo de un motor a través
de contactores. Existen 3 pulsadores: uno de parada ( BP ) , uno de marcha (
BM) y uno para funcionamiento intermitente ( BI ) , y un sensor de supervisión (
S ) . En caso de presionar BM el motor funciona de manera permanente y si se
cierra BP o S el motor se apaga. Con BI el motor funciona solo si este está
presionado.
SIMULACION :
/*
* problem7.c
*/
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
#define pulsador1BP (PIND & (1<<PORTD0))
#define pulsador2BM (PIND & (1<<PORTD1))
#define pulsador3BI (PIND & (1<<PORTD2))
int main(void)
{
DDRD &= ~((1<<DDD0)|(1<<DDD1)|(1<<DDD2)); // puertos de entrada
DDRB |= ((1<<DDB0)|(1<<DDB1)|(1<<DDB2)); // puertos de salida
while (1)
{
if (pulsador2BM==0){ // se a pulsado para ejercutar el codigo
while(pulsador3BI!=0 && pulsador1BP!=0 ){//motor en marcha
_delay_ms(100);
PORTB &= ~(1<<PORTB0); // para sentido antihorario
PORTB |= (1<<PORTB1);
PORTB |= (1<<PORTB2);
}
}
else {
PORTB &= ~(1<<PORTB2);
}
if (pulsador3BI==0){ // se a pulsado para ejercutar el codigo
while(pulsador2BM!=0 && pulsador1BP!=0){ // intermitente
_delay_ms(100);
PORTB &= ~(1<<PORTB0); //sentido antihorario
PORTB |= (1<<PORTB1);
PORTB |= (1<<PORTB2);
_delay_ms(1000);
PORTB &= ~(1<<PORTB2); // apagado del motor
_delay_ms(1000);
}
}
else {
PORTB &= ~(1<<PORTB2);
}
}
}
Link de drive:
https://drive.google.com/drive/folders/1GOSWgW2MWN43HZiuSnOV3Ldx_0MWVn6l?
usp=sharing