You are on page 1of 11

;EL SEMAFORO

.INCLUDE "m2560def.inc"

; Definición de puertos y pines mediante etiquetas


.EQU DDR_LEDS = DDRF
.EQU PORT_LEDS = PORTF

.ORG 0x00

; Inicializar el Stack Pointer al final de la SRAM


MAIN: LDI R31, HIGH(RAMEND)
OUT SPH, R31
LDI R31, LOW(RAMEND)
OUT SPL, R31
; Configurar como salida los pines correspondientes a los LEDs
LDI R31, 0xFF
OUT DDR_LEDS, R31

; Inicializar el contador R20 = 0x80


INICIAR: LDI R20, 0b10000000 ; Hacer R20 = 0b00000001
CONTINUAR: OUT PORT_LEDS, R20
CALL DELAY_60S
LSR R20 ;Lleva a cabo el
"desplazamiento" del LED
OUT PORT_LEDS, R20
CALL DELAY_5S
LSR R20 ;Lleva a cabo el
"desplazamiento" del LED
OUT PORT_LEDS, R20
CALL DELAY_60S
LSR R20 ;Lleva a cabo el
"desplazamiento" del LED
CPI R20, 0b00010000
BREQ INICIAR
JMP CONTINUAR

; --------------------- Rutina de retardo de 500ms ------------------


DELAY_60S:
; delaying 49939965 cycles:
ldi R16, $FF
WGLOOP0: ldi R17, $FF
WGLOOP1: ldi R18, $FF
WGLOOP2: dec R18
brne WGLOOP2
dec R17
brne WGLOOP1
dec R16
brne WGLOOP0
; -----------------------------
; delaying 49939965 cycles:
ldi R16, $FF
WGLOOP3: ldi R17, $FF
WGLOOP4: ldi R18, $FF
WGLOOP5: dec R18
brne WGLOOP5
dec R17
brne WGLOOP4
dec R16
brne WGLOOP3
; -----------------------------
; delaying 49939965 cycles:
ldi R16, $FF
WGLOOP6: ldi R17, $FF
WGLOOP7: ldi R18, $FF
WGLOOP8: dec R18
brne WGLOOP8
dec R17
brne WGLOOP7
dec R16
brne WGLOOP6
; -----------------------------
; delaying 49939965 cycles:
ldi R16, $FF
WGLOOP9: ldi R17, $FF
WGLOOP10: ldi R18, $FF
WGLOOP11: dec R18
brne WGLOOP11
dec R17
brne WGLOOP10
dec R16
brne WGLOOP9
; -----------------------------
; delaying 49939965 cycles:
ldi R16, $FF
WGLOOP12: ldi R17, $FF
WGLOOP13: ldi R18, $FF
WGLOOP14: dec R18
brne WGLOOP14
dec R17
brne WGLOOP13
dec R16
brne WGLOOP12
; -----------------------------
; delaying 49939965 cycles:
ldi R16, $FF
WGLOOP15: ldi R17, $FF
WGLOOP16: ldi R18, $FF
WGLOOP17: dec R18
brne WGLOOP17
dec R17
brne WGLOOP16
dec R16
brne WGLOOP15
; -----------------------------
; delaying 49939965 cycles:
ldi R16, $FF
WGLOOP18: ldi R17, $FF
WGLOOP19: ldi R18, $FF
WGLOOP20: dec R18
brne WGLOOP20
dec R17
brne WGLOOP19
dec R16
brne WGLOOP18
; -----------------------------
; delaying 49939965 cycles:
ldi R16, $FF
WGLOOP21: ldi R17, $FF
WGLOOP22: ldi R18, $FF
WGLOOP23: dec R18
brne WGLOOP23
dec R17
brne WGLOOP22
dec R16
brne WGLOOP21
; -----------------------------
; delaying 49939965 cycles:
ldi R16, $FF
WGLOOP24: ldi R17, $FF
WGLOOP25: ldi R18, $FF
WGLOOP26: dec R18
brne WGLOOP26
dec R17
brne WGLOOP25
dec R16
brne WGLOOP24
; -----------------------------
; delaying 49939965 cycles:
ldi R16, $FF
WGLOOP27: ldi R17, $FF
WGLOOP28: ldi R18, $FF
WGLOOP29: dec R18
brne WGLOOP29
dec R17
brne WGLOOP28
dec R16
brne WGLOOP27
; -----------------------------
; delaying 49939965 cycles:
ldi R16, $FF
WGLOOP30: ldi R17, $FF
WGLOOP31: ldi R18, $FF
WGLOOP32: dec R18
brne WGLOOP32
dec R17
brne WGLOOP31
dec R16
brne WGLOOP30
; -----------------------------
; delaying 49939965 cycles:
ldi R16, $FF
WGLOOP33: ldi R17, $FF
WGLOOP34: ldi R18, $FF
WGLOOP35: dec R18
brne WGLOOP35
dec R17
brne WGLOOP34
dec R16
brne WGLOOP33
; -----------------------------
; delaying 49939965 cycles:
ldi R16, $FF
WGLOOP36: ldi R17, $FF
WGLOOP37: ldi R18, $FF
WGLOOP38: dec R18
brne WGLOOP38
dec R17
brne WGLOOP37
dec R16
brne WGLOOP36
; -----------------------------
; delaying 49939965 cycles:
ldi R16, $FF
WGLOOP39: ldi R17, $FF
WGLOOP40: ldi R18, $FF
WGLOOP41: dec R18
brne WGLOOP41
dec R17
brne WGLOOP40
dec R16
brne WGLOOP39
; -----------------------------
; delaying 49939965 cycles:
ldi R16, $FF
WGLOOP42: ldi R17, $FF
WGLOOP43: ldi R18, $FF
WGLOOP44: dec R18
brne WGLOOP44
dec R17
brne WGLOOP43
dec R16
brne WGLOOP42
; -----------------------------
; delaying 49939965 cycles:
ldi R16, $FF
WGLOOP45: ldi R17, $FF
WGLOOP46: ldi R18, $FF
WGLOOP47: dec R18
brne WGLOOP47
dec R17
brne WGLOOP46
dec R16
brne WGLOOP45
; -----------------------------
; delaying 49939965 cycles:
ldi R16, $FF
WGLOOP48: ldi R17, $FF
WGLOOP49: ldi R18, $FF
WGLOOP50: dec R18
brne WGLOOP50
dec R17
brne WGLOOP49
dec R16
brne WGLOOP48
; -----------------------------
; delaying 49939965 cycles:
ldi R16, $FF
WGLOOP51: ldi R17, $FF
WGLOOP52: ldi R18, $FF
WGLOOP53: dec R18
brne WGLOOP53
dec R17
brne WGLOOP52
dec R16
brne WGLOOP51
; -----------------------------
; delaying 49939965 cycles:
ldi R16, $FF
WGLOOP54: ldi R17, $FF
WGLOOP55: ldi R18, $FF
WGLOOP56: dec R18
brne WGLOOP56
dec R17
brne WGLOOP55
dec R16
brne WGLOOP54
; -----------------------------
; delaying 11140656 cycles:
ldi R16, $F8
WGLOOP57: ldi R17, $45
WGLOOP58: ldi R18, $D8
WGLOOP59: dec R18
brne WGLOOP59
dec R17
brne WGLOOP58
dec R16
brne WGLOOP57
; -----------------------------
; delaying 9 cycles:
ldi R16, $03
WGLOOP60: dec R16
brne WGLOOP60
RET
; =============================
DELAY_5S:
; delaying 49939965 cycles:
ldi R16, $FF
WGLOOP0_1: ldi R17, $FF
WGLOOP1_1: ldi R18, $FF
WGLOOP2_1: dec R18
brne WGLOOP2_1
dec R17
brne WGLOOP1_1
dec R16
brne WGLOOP0_1
; -----------------------------
; delaying 30059760 cycles:
ldi R16, $FB
WGLOOP3_1: ldi R17, $BF
WGLOOP4_1: ldi R18, $D0
WGLOOP5_1: dec R18
brne WGLOOP5_1
dec R17
brne WGLOOP4_1
dec R16
brne WGLOOP3_1
; -----------------------------
; delaying 273 cycles:
ldi R16, $5B
WGLOOP6_1: dec R16
brne WGLOOP6_1
; -----------------------------
; delaying 2 cycles:
nop
nop
RET
; =============================
EJERCICIO 2 – LENGUAJE C

#define F_CPU 16000000

/* Inclusiones */
#include <avr/io.h>
#include <stdint.h>
#include <util/delay.h>

/* Constantes y macros */
#define DDR_SERIAL_TX DDRE
#define PORT_SERIAL_TX PORTE
#define SERIAL_TX 1

#define BIT_DURATION_US 104

/* Variables globales */

/* Declaración de funciones */
void Serial_Tx_Byte(char byte);
void Serial_Tx_String(char *str);
void Serial_Tx_Entero(int32_t num);

/* Función principal */
int main(void){

char texto_01[] = "Edad:\n";


char texto_02[] = "Peso:\n";
char texto_03[] = "Talla:\n";
uint8_t num_01 = 27;
uint8_t num_02 = 72;
uint8_t num_03 = 169;

/* Deshabilitar el transmisor del UART */


UCSR0B &= ~(1 << TXEN0);
/* Configurar el pin de transmisión como salida digital */
DDR_SERIAL_TX |= (1 << SERIAL_TX);
/* Inicializar el pin en ALTO */
PORT_SERIAL_TX |= (1 << SERIAL_TX);

/* Transmitir un texto indefinidamente */


while(1){

Serial_Tx_String(texto_01);
Serial_Tx_Entero((int32_t)num_01);
Serial_Tx_String("\n\r");
_delay_ms(2000);
Serial_Tx_String(texto_02);
Serial_Tx_Entero((int32_t)num_02);
Serial_Tx_String("\n\r");
_delay_ms(2000);
Serial_Tx_String(texto_03);
Serial_Tx_Entero((int32_t)num_03);
Serial_Tx_String("cm \n\r");
_delay_ms(2000);
}

return 0;
}
/* Definición de funciones */
void Serial_Tx_Byte(char byte){

int8_t bit_pos;

/* Transmitir el bit de inicio (en BAJO) */


PORT_SERIAL_TX &= ~(1 << SERIAL_TX);
_delay_us(BIT_DURATION_US);

/* Transmitir los bits de datos */


for(bit_pos = 0; bit_pos < 8; bit_pos++){
// Si el bit en la posición correspondiente es '1' ...
if(byte & (1 << bit_pos)){
// Colocar el pin de transmisión en ALTO
PORT_SERIAL_TX |= (1 << SERIAL_TX);
// De lo contrario ...
}else{
// Colocar el pin de transmisión en BAJO
PORT_SERIAL_TX &= ~(1 << SERIAL_TX);
}
/* Esperar un tiempo equivalente a la duración del bit */
_delay_us(BIT_DURATION_US);
}

/* Transmitir el bit de parada (en ALTO) */


PORT_SERIAL_TX |= (1 << SERIAL_TX);
_delay_us(BIT_DURATION_US);
}

void Serial_Tx_String(char *str){

/* Mientras no se alcance el final de la cadena */


while(*str != '\0'){
/* Transmitir el caracter correspondiente */
Serial_Tx_Byte(*str);
/* Incrementar el valor del puntero (apuntar al siguiente caracter
en el arreglo) */
str++;
}
}

void Serial_Tx_Entero(int32_t num){

char signo_y_digitos[12];
uint8_t signo = 0;
int32_t digito;
int8_t indice = 11;

/* Determinar el signo del número */


if(num < 0){
signo = 1;
num = -num;
}

/* Indicar el fin de la cadena de caracteres */


signo_y_digitos[indice--] = '\0';

/* Extraer los dígitos uno a uno, empezando por las unidades */


do{
digito = (num % 10) + '0';
signo_y_digitos[indice--] = (char)digito;
num /= 10;
}while(num != 0);

/* Agregar el signo (de ser necesario) */


if(signo){
signo_y_digitos[indice] = '-';
}else{
indice++;
}

/* Transmitir el número */
Serial_Tx_String(&signo_y_digitos[indice]);
}
PROBLEMA 04 – ASSEMBLY

.INCLUDE "m2560def.inc"
.ORG 0

; Inicializar el Stack Pointer al final de la SRAM


MAIN: LDI R31, HIGH(RAMEND)
OUT SPH, R31
LDI R31, LOW(RAMEND)
OUT SPL, R31
; Configurar como salida el pin correspondiente al LED
LDI R20, 0b11100000 ;Configurar pin 7 del
OUT DDRF, R20 ; PUERTO F como salida
;Habilitar las resistencias pull-up del PUERTO K
LDI R31, 0b11100000
STS PORTK, R31

INICIO: CBI PORTF,5


BUCLE: LDS R19, PINK ; R19 = PINK
COM R19
SBRS R19, 7 ; Salta si RK7 es 1
JMP PRIMER
CALL SUBR_1
JMP BUCLE
PRIMER: LDS R19, PINK ; R19 = PINK
COM R19
SBRS R19, 6 ; Salta si RK6 es 1
JMP SEGUNDO
CALL SUBR_2
JMP BUCLE
SEGUNDO: LDS R19, PINK ; R19 = PINK
COM R19
SBRS R19, 5 ; Salta si RK5 es 1
JMP BUCLE
CALL SUBR_3
JMP INICIO

SUBR_1:

;Genera la señal cuadrada (bucle infinito)


SBI PORTF, 7 ; Forzar la señal a '1'
CALL DELAY_100Hz ; Esperar 0.01s
CBI PORTF, 7 ; Forzar la señal a '0'
CALL DELAY_100Hz ; Esperar 0.01s
LDS R19, PINK ; R19 = PINK
COM R19
SBRS R19, 7 ; Salta si RK7 es 1
JMP BUCLE ; Repetir el proceso
JMP SUBR_1 ; Repetir el proceso

; --------------------- Rutina de retardo de 1/100Hz ------------------


DELAY_100Hz:
; delaying 79992 cycles:
ldi R16, $84
WGLOOP0_1: ldi R17, $C9
WGLOOP1_1: dec R17
brne WGLOOP1_1
dec R16
brne WGLOOP0_1
; -----------------------------
; delaying 3 cycles:
ldi R16, $01
WGLOOP2_1: dec R16
brne WGLOOP2_1
RET
;Fin de subrutina 1

SUBR_2:
;Genera la señal cuadrada (bucle infinito)
SBI PORTF, 7 ; Forzar la señal a '1'
CALL DELAY_1KHz ; Esperar 0.01s
CBI PORTF, 7 ; Forzar la señal a '0'
CALL DELAY_1KHz ; Esperar 0.01s
LDS R19, PINK ; R19 = PINK
COM R19
SBRS R19, 6 ; Salta si RK7 es 1
JMP BUCLE ; Repetir el proceso
JMP SUBR_2 ; Repetir el proceso

; --------------------- Rutina de retardo de 1/1KHz ------------------


DELAY_1KHz:
; delaying 7992 cycles:
ldi R16, $0C
WGLOOP0_2: ldi R17, $DD
WGLOOP1_2: dec R17
brne WGLOOP1_2
dec R16
brne WGLOOP0_2
; -----------------------------
; delaying 3 cycles:
ldi R16, $01
WGLOOP2_2: dec R16
brne WGLOOP2_2
RET
;Fin de subrutina 2

SUBR_3:

;Genera la señal cuadrada (bucle infinito)


SBI PORTF, 7 ; Forzar la señal a '1'
CALL DELAY_10KHz ; Esperar 0.01s
CBI PORTF, 7 ; Forzar la señal a '0'
CALL DELAY_10KHz ; Esperar 0.01s
LDS R19, PINK ; R19 = PINK
COM R19
SBRS R19, 5 ; Salta si RK7 es 1
JMP BUCLE ; Repetir el proceso
JMP SUBR_3 ; Repetir el proceso

; --------------------- Rutina de retardo de 1/10KHz ------------------


DELAY_10KHz:
; delaying 792 cycles:
ldi R16, $02
WGLOOP0_3: ldi R17, $83
WGLOOP1_3: dec R17
brne WGLOOP1_3
dec R16
brne WGLOOP0_3
; -----------------------------
; delaying 3 cycles:
ldi R16, $01
WGLOOP2_3: dec R16
brne WGLOOP2_3
RET

You might also like