Anda di halaman 1dari 10

Primer ejercicio

Iniciamos los leds (Puerto Al leer el pulsador no


A) apgados y activamos las genera una confucion
•leerpulsador: aleatorio en el micro , y •leer1:
•//DDRx resitencias de pull up (D3-
• LDI R16,$00 que si hay un 1 en el • IN R17,PIND
•LDI R16, $FF D0)
•OUT DDRA, R16 • OUT PORTA,R16 pulsador salte a "leer1" • SBRC R17, 0
•LDI R16, $F0 •//PORTx • IN R17, PIND
•antirrebote: • JMP uno0
•OUT DDRD, R16 •LD1 16, $00 • SBRC R17, 3
•OUT PORTA, R16 • JMP leerpulsador • IN R17, PIND • JMP cero0
Configuramos todo el •LDI R16, $0F • JMP antirrebote • SBRC R17, 3 Aqui leemos el primer
puerto A como salida de •OUT PORTD, R16 • JMP leer1 switch (D0), si esta en 0
los leds y el puerto D (D3- Se apagan todos los leds y
•CALL espera500ms • JMP antirrebote saltara a "cero0" y si
D0) como entrada. leemos el pulsador (D3) si el
esta en 1 saltara a
pulsador esta en 0 salta a
"uno0"
"antirrebote" si esta en 1 se
queda leyendo el pulsador

Esta es la segunda Leemos el tercer switch


combinacion de los (D2), si esta en 0 salta a
•uno1: "cero2" y si esta en 1
swiths (001) y se realiza •///SEC1 •cero0:
• IN R17, PIND saltara a "uno2"
la segunda secuencia. •cero2: • IN R17, PIND
•SBRC R17, 2 •///SEC2 • LDI R16,$01
•cero1: • SBRC R17, 1
•JMP uno3 •uno2:
• OUT PORTA,R16
• JMP uno1
• CALL espera200ms • IN R17, PIND
•JMP cero3 • LDI R16, $81 •........... • SBRC R17, 2 • JMP cero1
Aqui leemos el tercer •OUT PORTA, R16 • JMP uno2 Leemos el segundo
switch (D2) y si esta en •CALL espera200ms Esta es la primera • JMP cero2 switch (D1), si esta en 0
0 saltara a "cero3" y si •.......... combinacion de los swiths salta a "cero1" y si esta en
esta en 1 saltara a (000) y se realiza la primera 1 saltara a "uno1"
"uno3" secuencia.
Esta es la cuarta
Aqui leemos el tercer
combinacion de los swiths
switch (D2) y si esta en 0
•///SEC3 (011) y se realiza la cuarta •///SEC5
•uno0: saltara a "cero5" y si
•cero3: secuencia. •cero5:
• LDI R16, $18 • IN R17, PIND
esta en 1 saltara a
• OUT PORTA, R16 •///SEC4 "uno5" • LDI R16, $A5
•uno3: • SBRC R17, 1
• CALL espera200ms
• LDI R16, $80 • JMP uno4 •cero4: •OUT PORTA, R16
•.........
• OUT PORTA, • JMP cero4 • IN R17, PIND •CALL espera500ms
R16 • SBRC R17, 2
Esta es la tercera • CALL espera500ms Aqui leemos el segundo Esta es la quinta
combinacion de los swiths •........... switch (D1) y si esta en 0 • JMP uno5 combinacion de los
(010) y se realiza la tercera saltara a "cero4" y si esta • JMP cero5 swiths (100) y se
secuencia. en 1 saltara a "uno4" realiza la quinta
secuencia.

Leemos el tercer switch


Esta es la octava
(D2), si esta en 0 salta a
combinacion de los swiths
(111) y se realiza la octava "cero6" y si esta en 1
•///SEC7 •///SEC6
secuencia. saltara a "uno6"
•cero6: •uno5:
•///SEC8 • LDI R16, $01 • LDI R16, $07
•uno4:
•uno6: • OUT PORTA, R16 • OUT PORTA, R16
• IN R17, PIND
• LDI R16, $AA • CALL espera500ms • CALL espera500ms
• SBRC R17, 2
•........... •...........
• OUT PORTA, R16 • JMP uno6
• CALL espera500ms Esta es la septima • JMP cero6
combinacion de los swiths Esta es la sexta combinacion
•.......... de los swiths (101) y se
(110) y se realiza la septima
realiza la sexta secuencia.
secuencia.
Segundo ejercicio

Iniciamos el display
•comparar:
(Puerto C) prendido y Ubicamos la parte
activamos las resitencias •//TABLA • IN R17, PIND
•//DDRx • LDI R16,$3F alta del puntero en • MOV R19, R17
de pull up del puerto D $00
•LDI R16, $FF •MOV R0, R16 • ANDI R17, $F0
•OUT DDRC, R16 •//PORTx •LDI R16,$06 • SWAP R17
•LDI R16, $00 •LDI R16, $FF •//UBICAR EL
•MOV R1, R16 • ANDI R19, $0F
•OUT DDRD, R16 •OUT PORTC, R16 PUNTERO
Configuramos todo el •..............
•LDI R16, $FF • LDI XH,$00
puerto C como salida del •OUT PORTD, R16 Creamos la tabla Leemos el puerto D y lo
display y todo el puerto •CALL espera500ms utilizando los registro del guardamos en R17 y R19,
D como entrada de los R0 al R15 para guardar la aplicamos una mascara de
switchs. tabla. $F0 y $0F respectivamente y
a R17 lo movemos 4 bits con
swap.

Se restan los registro R19 -


R17 y el resultado se coloca
•bMayor:
en la parte baja del puntero. • CP R19, R17
• SUB R17, R19 • BRPL aMayor
• MOV XL, R17 •aMayor:
• LD R18,X
• JMP bMayor
• SUB R19, R17
• OUT PORTC, R18
• JMP comparar
• MOV XL, R19
• LD R18,X Comparamos los registro R17
• OUT PORTC, R18 y R19 , si R19 es mayor que
Se restan los registro R17 - • JMP comparar R17 salta a "aMayor" si no
R19 y el resultado se coloca salta a "bMayor"
en la parte baja del puntero.
A) ¿?

B) el puntero de pila es un registro especial que se utiliza para saber la posición siguiente en donde estará la
memoria disponible, la pila se encuentra en la memoria RAM y su función es durante las llamadas a las
subrutinas y cuando hay un interrupción.

El puntero de pila (SP) se carga al inicio del programa de la siguiente manera:

LDI R16, HIGH (RAMEND)


OUT SPH, R16
LDI R16, LOW (RAMEND)
OUT SPL, R16
Donde SPH es lo alto de la pila y SPL es la parte baja de la pila.
Si este puntero no se carga adecuadamente al momento de compilarlo no ocurre ningún error pero al momento
de simularlo o de cargarlo a la Atmega el programa no funcionara debido a que no el micro no sabe en donde se
encuentra la memoria para poder ejecutarlo.
Ejemplo:
Como podemos observar en las siguientes imágenes en la primera de ellas cargamos mal el SP y vemos que si
compila y en la segunda imagen vemos que no cargamos el SP y también compila y no marca ningún error.
En la tercera imagen observaremos que al momento de simular no ocurre ninguna acción.
c) Registros DDRx:
Se utilizan para configurar los puertos ya sean de entrada (0) o de salida (1), se tiene que configurar todo el
puerto así sea que se va a usar solo un pin y el dato se ingresa como hexadecimal.
Ejemplo:
DDRx 7654 3210
PUERTO A:LEDS (A7-A0) 1111 1111= $FF
PUERTO D: SWITCH (D3-D0) 1111 0000= $F0
LDI R16, $FF
OUT DDRA, R16
LDI R16, $F0
OUT DDRD, R16
En este ejemplo observamos que se va a configurar el puerto A para la salida de 8 leds entonces el hexadecimal
que se carga a DDRA es $FF, y el puerto D se va a configurar para 4 switch y los pines que no se usan se colocan
como salidas y el hexadecimal que se carga a DDRD es $F0.

Registros PORTx:
Este registro se utiliza para dependiendo del DDRx, en este caso si el pin es de salida se utiliza para poner alto (1)
o bajo (0) y si es de entrada se utiliza para activar (1) o desactivar (0) la resistencia de pull up.
Ejemplo:
PORTx 7654 3210
A7-A0 (OFF) 0000 0000 = $00
D3-D0 (IN) 0000 1111 = $0F
LDI R16, $00
OUT PORTA, R16
LDI R16, $0F
OUT PORTD, R16

En este ejemplo observamos que el puerto A es de salida entonces se iniciara todos los leds apagados y el
hexadecimal que se carga a PORTA es $00, y a los 4 switch se les activara la resistencia de pull up y el
hexadecimal que se carga a PORTD es $0F.

Registros PINx:
Este registro se utiliza solamente para los pines de entrada, y su función es la de leer el puerto que necesitemos.
Ejemplo:
leerpulsador:
IN R17, PIND
SBRC R17, 3
JMP leerpulsador
JMP antirrebote

En este ejemplo vemos que para leer algún puerto necesitaremos de la instrucción IN que siempre va acompaña
del registro PINx, en este caso leeremos el Pin 3 y si en la entrada hay un cero saltara a “antirrebote” y si hay un
uno se quedara en “leerpulsador”.
D)
SWAP: se utiliza para intercambiar nibbles ósea que correr 4 bits a la posición contraria.
MOV: se utiliza para hacer copias de datos pero solo de un registro a otro registro.
CP: se utiliza para comparar dos registros.
LD: se utiliza para cargar un dato en un puntero.
LPM: se utiliza para cargar la memoria de un programa hacienda un puntero.
Ejemplo:
IN R17, PIND
MOV R19, R17
ANDI R17, $F0
SWAP R17
ANDI R19, $0F
CP R19, R17
BRPL aMayor
JMP bMayor
Su pongamos que en este ejemplo la entrada del Puerto D es 10101001 que se movería al registro R19 y R17, al
registro 17 se le aplicara una máscara con $F0 y el resultado seria 10100000, el SWAP hace que se intercambien
los nibbles y R17 quedaría así 00001010, al registro 19 también se le aplica una máscara pero con $0F y el
resultado seria 00001001 y por ultimo con CP se compararían los dos registros para saber cuál es mayor y se
llegaría a la conclucion de que R17 es mayor que R19 y saltaría a “aMayor”.

E) la instrucción JMP significa salto, y salta a una subrutina con la diferencia que se queda en esa subrutina, la
instrucción IJMP significa salto indirecto y lo que hace es saltar a una dirección selecciona por un puntero y la
instrucción RJMP significa salto relativo y lo que realiza es un salto a un registro que está dentro de la memoria.