Você está na página 1de 42

PRTICOS DE ENTRADA Y

SALIDA

Prticos paralelos de entrada/salida


El Atmega164P est formado por 4 puertos: PORTA, PORTB, PORTC, PORTD. Para usar
cualquiera de estos puertos deben ser programados previamente como puertos de
entrada o de salida.
Adems de ser usados como puertos de entrada/salida, cada puerto puede ser utilizado
para implementar funciones adicionales como:
ADC
Timers
Interrupciones
Comunicacin serial
Cada Puerto est formado por tres registros:

PORTX Registro de salida PORTx1, PORTx2, PORTx3,PORTx4

DDRX Registro de sentido del dato DDRx1, DDRx2, DDRx3, DDRx4,.,DDRx8

PINX Registro de entrada PINx1, PINx2, PINx3,PINx4,..,PINx8


2

Prticos paralelos de entrada/salida


El Atmega164P est formado por 4 puertos: PORTA, PORTB, PORTC, PORTD. Para
usar cualquiera de estos puertos deben ser programados previamente como puertos
de entrada o de salida.
Adems de ser usados como puertos de entrada/salida, cada puerto puede ser
utilizado para implementar funciones adicionales como:
ADC
Timers
Interrupciones
Comunicacin serial
Cada Puerto est formado por tres registros:

PORTX Registro de salida

DDRX Registro de sentido del dato

PINX Registro de entrada

DDR 7 6 5 4 3 2 1

7 6 5 4 3 2 1

POR 7 6 5 4 3 2 1

x
Tx

PINx Px7 Px6 Px5 Px4 Px3 Px2


3
Px1 Px0

Prticos paralelos de entrada/salida


DDRx: Registro usado para configurar a un Puerto como entrada o salida.
Salida Cargar/escribir todos los bits del registro con 1 (0b11111111)
Entrada Cargar/escribir todos los bits del registro con 0 (0b00000000)
PINx: Registro empleado para leer los datos presentes en los pines del Puerto.

PORTx: Registro usado para enviar los


datos de salida a los pines del
respectivo
Puerto.
Existe
una
Resistencia de PULL-UP para cada pin
de los puertos. Cuando los bits del
Registro PORTx son configurados a 1,
las resistencias de PULL-UP se activan.

Prticos paralelos de entrada/salida


Observacin: Al aplicar reset todos los puertos se cargan con el valor 0x00

en sus registros DDRx y PORTx, por lo tanto como resultado:

Los puertos quedarn configurados como puertos de entrada.


Se deshabilitan las resistencias de PULL-UP
Los terminals Pxn quedan configurados como entradas en alta
impedancia.
DDRx
PORTx

Entrada y alta
impedancia

Salida 0

Entrada y Pull-Up

Salida 1

Prticos paralelos de entrada/salida


Instrucciones
ACIN
Leer terminales

Escribir en los
prticos

NEMNICO

INSTRUCCIN

FUNCIN

IN

IN Rd, PINx

Leer los 8 bits del registros PINx del puerto

IN Rd, PORTx

Leer los 8 bits del registros PORTx del puerto

IN Rd, DDRx

Leer los 8 bits del registros DDRx del puerto

SBIC

SBIC PINx,b

Monitorear un bit del puerto

SBIS

SBIS PINx,b

SBIC

SBIC PORTx,b

SBIS

SBIS PORTx, b

SBIC

SBIC DDRx,b

SBIS

SBIS DDRx,b

OUT

OUT PORTx, Rr

Escribir en los 8 bits del puerto

SBI

SBI PORTx,b

Escribir un bit del Puerto a 1 L

CBI

CBI PORTx, b

Establecer un bit del Puerto a 0 L

Monitorear un bit del puerto


Monitorear un bit del puerto

Prticos paralelos de entrada/salida


Bit PUD

Bit para desactivar el PULL-UP de todos los pines de todos los puertos, se
encuentra en el registro de control de MCU conocido como, MCUCR.
Resetear este bit, implica configurar el PUD con 0L.
Modo sleep

En el modo sleep el microcontrolador ocupa la menor corriente, es decir


optimiza la energa. Se recomienda activar modo sleep en los siguientes
casos:
Modo stand by
Modo stand by extendido
Para cuidar el consumo de energa.
Para bajar el consumo de energa.

Prticos paralelos de entrada/salida


Instrucciones aritmticas y Lgicas

Restas
Nemnico
Instruccin
SUB
SUB Rd, Rr
SBC
SBC Rd, Rr
SUBI
SUBI Rd, K
SBCI
SBCI Rd, K
SBIW
SBIW Rd: Rd+1,K

Funcin
Rd=Rd-Rr
Rd=Rd-Rr-c
Rd=Rd-k
Rd=Rd-k-c
Rd+1:Rd=Rd+1:Rd-k

Prticos paralelos de entrada/salida


Instrucciones aritmticas y Lgicas
Restas
Ejemplo 1: Escribir un programa para restar el 0x18 de 0x29
y guardar el resultado en R21

LDI R21, 0x29


SUBI R21,0x18
18 = 11hex

; R21=$29
; R21=R21-18 = 29-

Ejemplo 2: Escribir un programa para restar el 0x18 de


0x2917 y guardar el resultado en R25 y R24.
LDI R25, 0x29
; R25=$29
LDI R24, 0x17
; R24=$17
SBIW R25:R24, 0x18 ; 2917-18= 28FFhex
9

Intrucciones de Uc ATmega164p
Instrucciones aritmticas y Lgicas

SBC: Permite restar dos nmeros incluyendo el carry.

Formato:

SBC Rd, Rr

Ejemplo: Restar 2 nmeros de 16 bits. Los nmeros son 2762hex y


1296hex. Colocar el resultado de la suma en R18 y R19, asumir R18 como el
byte bajo. (Total=14CChex)
LDI R18, 0x62
LDI R19, 0X27
LDI R20, 0x96
LDI R21, 0X12
SUB R18,R20
SBC R19,R21

; R18=$E7
; R19=$27
; R20=$96
; R21=$12
; R18=R18-R20= 62-96 = CChex C=1
; R19=R19-R21-C=27-12-1 =14

hex

10

Intrucciones de Uc ATmega164p
Instrucciones aritmticas y Lgicas

Multiplicacin
Nemnico

Instruccin

Aplicacin

Byte1

Byte2

Byte alto
del
resultado

Byte bajo
del
resultado

MUL

MUL Rd, Rr

Nmeros sin
signo

Rd

Rr

R1

R0

MULS

MULS Rd, Rr

Nmeros
con signo

Rd

Rr

R1

R0

MULSU

MULSU Rd, K

Nmeros sin
signo con
nmeros
con signo

Rd

Rr

R1

R0

11

Intrucciones de Uc ATmega164p
Instrucciones aritmticas y Lgicas

Operaciones lgicas
Nemnico

Instruccin

Resultado

Funcin

AND

AND Rd, Rr

Rd=Rd.Rr

AND

ANDI

ANDI Rd, k

Rd=Rd.k

AND inmediata

OR

OR Rd, Rr

Rd=Rd v k

OR

ORI

ORI Rd, K

Rd=Rd v k

OR inmediata

EOR

EOR Rd, Rr

Rd=Rd+Rr

OR Exclusiva

NEG

NEG Rd

SBR

SBR Rd, K

Rd=Rd v k

Bits del registro configurados a 1

SER

SER Rd

Rd=0xFF

Cargar unos al registro

Complemento a 2

12

Intrucciones de Uc ATmega164p
Instrucciones aritmticas y Lgicas

Operaciones lgicas
AND
X

OR
X.Y

EX-OR
X.Y

X.Y

13

Intrucciones de Uc ATmega164p
Instrucciones aritmticas y Lgicas

Operaciones lgicas
o

Ejemplo 1:

LDI
R21,0x35
ANDI R21,0x0F
R20=0x05 0011
0000
0000

; R21=$35
; R21=R21 AND 0x0F
0101
1111
0101

o Ejemplo 2: La instruccin EOR puede ser usada para verificar el


contenido de un registro, es decir es til si no se conoce el
contenido de un registro

Lazo: IN R16, PINB


LDI R17, 0x45
EOR R16,R17
BRNE Lazo

14

Intrucciones de Uc ATmega164p
Directivas adicionales
Directiva

Funcin

.BYTE
VALOR

Inicializa una posicin de


memoria, de tamao byte a
valor.

.DSEG

Declarar constantes y datos

.CSEG

Segmento de cdigo, indica


que el cdigo a ejecutarse
deber colocarse en la
memoria del programa

.DW

Similar a .DB pero usa una


palabra para cada valor

Segmento
SRAM

CODIGO

15

Intrucciones de Uc ATmega164p
Manejo del Stack
Nemnico
PUSH

Instruccin
PUSH Rr

POP

POP Rr

Funcin
Guardar un registro
en el STACK.
Rr=Registro de
propsito General
Retorna un valor
almacenado en el
STACK.
Rr=Registro de
propsito General
16

Intrucciones de Uc ATmega164p
Ejercicios:

1.- Escribir un programa que permita escribir las primeras localidades de


la SRAM con la palabra MICROPROCESADOS
Crear un tabla con los datos en la memoria
del programa
TABLA: .DB
.DB
.DB
.DB
.DB
.DB

.DB

0x4D
0x49
0x43
0x52
0x51
0x50
0x53

MICROPROCESADOS=15 posiciones
17

Intrucciones de Uc ATmega164p
Ejercicios:

1.- Escribir un programa que permita escribir las primeras localidades de


la SRAM con la palabra MICROPROCESADOS
.INCLUDE M164PDEF.INC
.EQU VAL = 15
.DEF CONTADOR = R20
.DSEG
DATOS: .BYTE VAL
.CSEG
LDI R20, VAL
LDI XL, LOW(DATOS)
LDI XH, HIGH(DATOS)
LDI ZL, LOW(TABLA<<1)
LDI ZH, HIGH(TABLA<<1)
LAZO: LPM R16,Z+
ST X+,R16
DEC CONTADOR
BRNE LAZO
FIN: RJMP FIN
TABLA: .DB
.EXIT

18

Intrucciones de Uc ATmega164p
Barrido de displays: Consiste en mostrar valores en forma secuencial

mediante un arreglo de displays. En el caso de conectar un arreglo de


displays a un puerto del ATmega164p, se debe tener en cuenta las
siguientes consideraciones:
Cada PIN de un puerto opera con una corriente de 20 mA.
La corriente total que puede manejar un puerto es 100 mA.
Se debe implementar resistencias limitadoras de corriente para cada
segmento de los displays.
Se puede utilizar display de 7 segmentos de tipo nodo comn o
ctodo comn.
Para la conexin de un arreglo de displays se emplea 2 puertos del
ATmega16:
o Puerto1: Puerto para conexin de los segmentos de los displays. Se utiliza 7
pines de este para cada segmento de los displays. Los segmentos de todos los
displays se conectarn en forma paralela.
o Puerto2: Puerto utilizado para controlar la activacin (Orden de activacin) de
los displays. El nmero de pines del puerto que se utilizarn depende del
nmero de displays que forman parte del arreglo.
19

Intrucciones de Uc ATmega164p
Barrido de displays:
Los displays se activarn con la
corriente que proporcionen los
pines del puerto (Puerto 2). Es
recomendable emplear
amplificadores de corriente para
garantizar la activacin del display
considerando que la corriente que
provee cada pin del puerto es
baja. La amplificacin puede ser
realizada mediante transistores.
En el grfico se muestra la
conexin de un arreglo de 4
displays del tipo ctodo comn.
o Las salidas 1,2,3,4 se conectarn al
puerto (Puerto2)que controla la
activacin de los displays.
o Las salidas ABDCEFG se conectarn
al puerto (Puerto1) encargado de
activar los 7 segmentos de los
displays,
20

Intrucciones de Uc ATmega164p
Barrido de displays: (Circuito propuesto para la prctica de Laboratorio)

21

Intrucciones de Uc ATmega164p
Barrido de displays: (Circuito propuesto para la prctica de Laboratorio)
Si se considera que:
o Las salidas para la activacin de los
4 dgitos se conectan al PORTB.
Slo se emplearn 4 bits del
registro de salida del puerto para el
proceso de activacin.
o Las salidas del Control de
Segmentos se conectan al PORTA.
o Se han definido 4 dgitos para
mostrar los resultados de la
multiplicacin. (o de cualquier
operacin)
dmil : miles
dcen: centenas
ddec: decenas
duni: Unidades
o Se realiza la siguiente subrutina
para el barrido de displays.
22

Intrucciones de Uc ATmega164p
Barrido de displays: (Circuito propuesto para la prctica de Laboratorio)

Subrutina_barrido:
OUT PORTA, DMIL
OUT PORTB, 0b00000001
CALL RETARDO
OUT PORTB, OB00000000

; Indico en el primer display el digito de miles de la operacin


; Activo el primer display
; Llamo a la subrutina retardo antes que se active el siguiente display
; PORTB=0 apago el primer display

OUT PORTA, DCEN


OUT PORTB, 0b00000010
CALL RETARDO
OUT PORTB, OB00000000

; Indico en el segundo display el digito de centenas


; Activo el segundo display
; Llamo a la subrutina retardo antes que se active el siguiente display
; PORTB=0 apago el segundo display

OUT PORTA, DDEC


OUT PORTB, 0b00000100
CALL RETARDO
OUT PORTB, OB00000000

; Indico en el tercer display el digito de decenas


; Activo el tercer display
; Llamo a la subrutina retardo antes que se active el siguiente display
; PORTB=0 apago el tercer display

OUT PORTA, DUNI


OUT PORTB, 0b00001000
CALL RETARDO
OUT PORTB, OB00000000

; Indico en el cuarto display el digito de unidades


; Activo el cuarto display
; Llamo a la subrutina retardo antes que se active el siguiente display
; PORTB=0 apago el cuarto display

23

Intrucciones de Uc ATmega164p

Barrido de displays: (Circuito propuesto para la prctica de Laboratorio)


*La subrutina de retardo es similar a las planteadas en los ejercicios en
clase, se puede aumentar instrucciones NOP para variar la frecuencia de
barrido.

24

Conversin de Binario a BCD


Existen algunas formas de realizar la
conversin de binario a BCD, un mtodo
puede ser por restas sucesivas.
Restas Sucesivas:
1. Si se tiene un nmero con cuatro dgitos
decimales, el mximo valor a convertir es el
9999.
Mile Centenas Decena Unidades
s
s
9

9
25

Conversin de Binario a BCD

Restas Sucesivas:

2. Este mtodo consiste en realizar restas sucesivas de cada dgito que forma el
nmero. Las restas se realizan hasta obtener un resultado negativo,

este resultado me indica que debo parar y continuar con el siguiente


dgito.
Miles
Valor a restar = 9999

Valor a considerar en la resta por Dgito miles= 1000

1.

6.

2.

7.

3.

8.

4.

9.

5.

10.

Fin de la resta ya
que el resultado
es negativo 26

Conversin de Binario a BCD

Restas Sucesivas:
Miles
1.

6.

2.

7.

3.

8.

En total se realiz la
resta 9 veces, este valor
9 representa la
conversin del primer
dgito.
Dgito miles = 9

4.

9.

5.

10.

27

Conversin de Binario a BCD

Restas Sucesivas:
Centenas

o Para continuar con el siguiente dgito, considerando que la


ltima resta del dgito miles es un valor negativo, se debe
realizar una suma para transformar el resultado a positivo
Valor incial para dar inicio a las
restas sucesivas del dgito centenas

Valor a restar = 999


Valor a considerar en la resta por Dgito
centenas= 100
28

Conversin de Binario a BCD


Restas Sucesivas:
Centenas
1.

6.

2.

7.

3.

8.

4.

9.

5.

10.
Fin de la resta ya
que el resultado
es negativo 29

Conversin de Binario a BCD

Restas Sucesivas:
Centenas
1.

6.

2.

7.

3.

8.

En total se realiz la
resta 9 veces, este valor
9 representa la
conversin del segundo
dgito.
Dgito centenas = 9

4.

9.

5.

10.

30

Conversin de Binario a BCD

Restas Sucesivas:
Decenas

o Para continuar con el siguiente dgito, considerando que la


ltima resta del dgito centenas es un valor negativo, se
debe realizar una suma para transformar el resultado a
positivo
Valor incial para dar inicio a las
restas sucesivas del dgito decenas

Valor a restar = 99
Valor a considerar en la resta por Dgito
decenas = 10
31

Conversin de Binario a BCD


Restas Sucesivas:
Decenas
1.

6.

2.

7.

3.

8.

4.

9.

5.

10.
Fin de la resta ya
que el resultado
es negativo 32

Conversin de Binario a BCD

Restas Sucesivas:
Decenas
1.

6.

2.

7.

3.

8.

4.

9.

5.

10.

En total se realiz la
resta 9 veces, este valor
9 representa la
conversin del tercer
dgito.
Dgito decenas = 9

33

Conversin de Binario a BCD

Restas Sucesivas:
Decenas

o Para continuar con el siguiente dgito, considerando que la


ltima resta del dgito decenas es un valor negativo, se
debe realizar una suma para transformar el resultado a
positivo
Valor incial para dar inicio a las
restas sucesivas del dgito unidades

Valor a restar = 9
Valor a considerar en la resta por Dgito
unidades= 1
34

Conversin de Binario a BCD


Restas Sucesivas:
Unidades
1.

6.

2.

7.

3.

8.

4.

9.

5.

10.
Fin de la resta ya
que el resultado
es negativo 35

Conversin de Binario a BCD

Restas Sucesivas:
Unidades
1.

6.

2.

7.

3.

8.

4.

9.

5.

10.

En total se realiz la
resta 9 veces, este valor
9 representa la
conversin del cuarto
dgito.
Dgito unidades = 9

36

Conversin de Binario a BCD

Restas Sucesivas:

Resultado Final
El resultado final ser igual al nmero de veces que se
realiz la resta con resultados positivos en cada dgito.
Nmero de
restas con
resultados
positivos

Miles

Centenas

Decenas Unidades
9

Para programar una subrutina que realice este mtodo, ser deber
realizar las operaciones en nmeros binarios. Las restas sucesivas pueden
estar integradas en un lazo y se definir un contador que almacenar el
Nmero de restas con resultados positivos.
Cuando llegue a un resultado negativo de la resta debe realizar un salto
al siguiente dgito y proceder a realizar la respectiva suma para
transformar el resultado negativo a positivo y as obtener el valor inicial
para las restas sucesivas del respectivo dgito.

37

Conversin BCD a 7 segmentos

Esta conversin les permite mostrar el valor de


cada dgito de la operacin en el respectivo display
Se puede crear una subrutina para realizar la
conversin.
La correspondencia de los segmentos que se
deben prender de acuerdo a los valores de los
dgitos puede ser almacenada en una tabla.
Para el programa se ha representado a los 4
dgitos del siguiente modo:
DIGBCD0
DIGBCD1
DIGBCD2
DIGBCD3

38

Conversin BCD a 7 segmentos

SUBRUTINA_BCD_SEGMENTOS
; Guardo en el Stack los siguientes valores
PUSH R20
PUSH ZH
PUSH ZL
; Proceso a la lectura de los valores que tengo
almacenada en la tabla para el DIGBCD0
LDS R20, DIGBCD0
; DIGBCD0=R20
LDI ZH,HIGH(TABLA_7SEG<<1)
LDI ZL,LOW(TABLA_7SEG<<1)
ADD ZL,R20
CLR R20
ADC ZH,R20
LPM R20,Z
STS DIGBCD0 ,R20
39

Conversin BCD a 7 segmentos

; Proceso a la lectura de los valores que tengo almacenada


en la tabla para el DIGBCD1
LDS R20, DIGBCD1
; DIGBCD1=R20
LDI ZH,HIGH(TABLA_7SEG<<1)
LDI ZL,LOW(TABLA_7SEG<<1)
ADD ZL,R20
CLR R20
ADC ZH,R20
LPM R20,Z
STS DIGBCD1 ,R20
; Proceso a la lectura de los valores que tengo almacenada
en la tabla para el DIGBCD2
LDS R20, DIGBCD2
; DIGBCD2=R20
LDI ZH,HIGH(TABLA_7SEG<<1)
LDI ZL,LOW(TABLA_7SEG<<1)
ADD ZL,R20
CLR R20
ADC ZH,R20
LPM R20,Z
40
STS DIGBCD2 ,R20

Conversin BCD a 7 segmentos


; Proceso a la lectura de los valores que tengo almacenada
en la tabla para el DIGBCD3
LDS R20, DIGBCD3
; DIGBCD3=R20
LDI ZH,HIGH(TABLA_7SEG<<1)
LDI ZL,LOW(TABLA_7SEG<<1)
ADD ZL,R20
CLR R20
ADC ZH,R20
LPM R20,Z
STS DIGBCD3 ,R20
;recupero los valores almacenados en el STACK y as
utilizarlos para mostrar en el display
POP ZL
POP ZH
POP R20
RET
41

Conversin BCD a 7 segmentos


RET
; Creacion de la TABLA_7SEG
.db
.db
.db
.db
.db

0b00111111,
0b01011011,
0b01100110,
0b01111101,
0b01111111,

0b00000110
0b01001111
0b01101101
0b00000111
0b01101111

;
;
;
;
;

0,1
2,3
4,5
6,7
8,9

42

Você também pode gostar