Está en la página 1de 17

Valeria Agudelo Patiño

Federico Cardona

CONFIGURACION DE PINES
; AssemblerApplication1.asm
;
; Created: 06/09/2019 5:47:39 p. m.
; Author : Valeria
;
ldi r16, 0x20
out DDRB, r16  /*como quiero que se comporte el pin, salida y entrada*/

ldi r19, 0x20   /*registro 19*/


out PortB, r19   /*saca un valor por el puerto b*/

ldi r20, 0x00


out PortB, r20

SUMA O RESTA
; Ejercicio suma y resta de dos números
.ORG 0x000
rjmp inicio   /*salte donde dice inicio*/

.ORG 0x033
inicio:
ldi r19, 0xFF
out DDRD, r19  /*todo el puerto D de salida*/

ldi r16, 0x05


ldi r17, 0x02

SUB r16, r17

out PortD, r16

rjmp inicio

LED DE UN LADO A OTRO CON DELAY


; AssemblerApplication1.asm
;
; Created: 17/10/2019 5:47:39 p. m.
; Author : Valeria
;

;LED DE UN LADO A OTRO CON DELAY


; Replace with your application code
.ORG 0x00
rjmp inicio

.ORG 0x033
inicio:
ldi R27, 0xFF ;Loads an 8-bit constant directly to register
ldi R28, 0x7F
ldi R29, 0x01
out DDRD, R27
out DDRB, R28
out PORTD, R29
ldi r17, PIND

in r16, PIND

check:

cpi r17, $80


breq rigth
lsl R16 ; desplaza todos los bits un lugar a la izquierda
out PORTD, R16
call delay
mov r17, R16 ;hace una copia de un registro a otro
jmp check

lsl r16

rigth:
cpi r17, $01  ;compara un registro con una constante
breq check
lsr R16 ; desplaza todos los bits un lugar a la dercha
out PORTD, R16
call delay
mov r17, R16
jmp rigth
 
delay:
ldi r24, 0xff
ldi r25, 0x00
lazo_2_comp:
adiw r25:r24, 1
breq lazo_2_init
rjmp lazo_2_comp
lazo_2_init:
inc r19 ; incrementa 1 al registro
cpi r19, 75 ;compara un registro con una constante
brne delay
ldi r19, 0x00
ret

intercal:
in r16, PIND
left:
cpi r17, $80
breq rigth
lsl R16
lsl R16
out PORTD, R16
mov r17, R16
jmp check

rigth2:
cpi r17, $01
breq check
lsr R16
lsr R16
out PORTD, R16
mov r17, R16
jmp rigth

CAMBIO DE SECUENCIAS CON INTERRUPTOR (DE UN LADO A OTRO Y UNO DE POR


MEDIO)

; Created: 17/10/2019 5:47:39 p. m.


; Author : Valeria
;
; CAMBIO DE SECUENCIAS CON INTERRUPTOR, DE UN LADO A OTRO Y UNO DE POR
MEDIO
; Replace with your application code

.cseg
.org 0x00
rjmp reset
.org 0x06
rjmp MyFirst_vect

.org 0x34

reset:
; Set Interrupt to trigger when input is at low level
ldi r16, 0x02
sts EICRA, r16

ldi r16, 0x01


sts PCICR, r16

ldi r16, 0x80


sts PCMSK0, r16

ldi r16, 0x00


out PCIFR, r16

ldi R27, 0xFF ;Loads an 8-bit constant directly to register


ldi R28, 0x7F
ldi R29, 0x01
ldi R30, 0x01
ldi R31, 0x00
; Global Enable Interrupt
sei

; Main Loop
main:

secuencia1:
out DDRD, R27
out DDRB, R28
out PORTD, R29
ldi r19, PIND
in r19, PIND

check:

cpi r30,$00
breq secuencia2
cpi r19, $80
breq rigth
lsl R19
out PORTD, R19
call delay
jmp check

rigth:
cpi r30,$00
breq secuencia2
cpi r19, $01
breq check
lsr R19
out PORTD, R19
call delay

jmp rigth
 
secuencia2:
out DDRD, R27
out DDRB, R28
out PORTD, R29
ldi r19, PIND
in r19, PIND

left:
cpi r30,$01
breq secuencia1
cpi r19, $40
breq rigth2
lsl R19
lsl R19
out PORTD, R19
call delay
jmp left

rigth2:
cpi r30,$01
breq secuencia1
cpi r19, $01
breq left
lsr R19
lsr R19
out PORTD, R19
call delay
jmp rigth2

delay:
ldi r24, 0xff
ldi r25, 0x00
lazo_2_comp:
adiw r25:r24, 1
breq lazo_2_init
rjmp lazo_2_comp
lazo_2_init:
inc r21
cpi r21, 75
brne delay
ldi r21, 0x00
ret

rjmp main

; Interrupt Vector
MyFirst_vect:
cpi r31, $01
breq seg
ldi r31, 0x01

reti
seg:
eor r30, r29
ldi r31, 0x00
reti

CAMBIAR LA INTENSIDAD DE UN LED CON EL PULSADOR

; AssemblerApplication1.asm
;

;CAMBIAR LA INTENSIDAD DE UN LED CON EL PULSADOR


; Created: 11/10/2019 20:08:27
; Author : Valeria
;

; Replace with your application cod


.org 0x00
rjmp reset
.org 0x06
rjmp MyFirst_vect

.org 0x34

reset:

; Set Interrupt to trigger when input is at low level


ldi r16, 0x02
sts EICRA, r16

ldi r16, 0x01


sts PCICR, r16

ldi r16, 0x80


sts PCMSK0, r16

ldi r16, 0x00


out PCIFR, r16

; Set PB7 as input and PB5 as output


ldi r17, 0x020
out DDRB, r17

ldi r17, 0x00


out PORTB, r17
; Global Enable Interrupt
ldi r31, 0x00
ldi r30, 0x00
ldi r20, 0x01
ldi r19, 0x04
sei

; Main Loop
main:
// Initialize PB1 as output PWM
ldi r16,    0x7F
out DDRB,   r16

//Configure timer1 as PWM


ldi r17, 0x03
ldi r16, 0xE6
sts ICR1H, r17 // Set the top 10bits
sts ICR1L, r16 // Set the top 10bits

sts OCR1AH, R31 // Set the duty cycle 10bits


sts OCR1AL, R30 // Set the duty cycle 10bits
ldi r16, 0x82
sts TCCR1A, r16
ldi r16, 0x1A
sts TCCR1B, r16
mov r21,r31

eor r21,r19
breq CambioAD
mov r22,r31
cpi r22,$0
breq CambioAT
rjmp main

; Interrupt Vector
MyFirst_vect:
cpi r20,$0
breq Atras
rjmp Adelate

reti
Adelate:
adiw r31:r30, 52
reti
Atras:
SBIW r31:r30,52
reti

CambioAT:
ldi r20, 0x01
rjmp main

CambioAD:
ldi r20, 0x00
rjmp main

CAMBIAR EL BRILLO DEL LED CON PWM (A MANO)

; AssemblerApplication1.asm
;

;CAMBIAR EL BRILLO DEL LED CON PWM (A MANO)


; Created: 11/10/2019 20:08:27
; Author : Valeria
;

; Replace with your application cod


.org 0x00
rjmp reset
.org 0x06
rjmp MyFirst_vect

.org 0x34

reset:

; Set Interrupt to trigger when input is at low level


ldi r16, 0x02
sts EICRA, r16

ldi r16, 0x01


sts PCICR, r16

ldi r16, 0x80


sts PCMSK0, r16

ldi r16, 0x00


out PCIFR, r16

; Set PB7 as input and PB5 as output


  ldi r17, 0x020
out DDRB, r17

ldi r17, 0x00


out PORTB, r17
; Global Enable Interrupt
sei

; Main Loop
main:
// Initialize PB1 as output PWM
ldi r16,    0x7F
out DDRB,   r16

//Configure timer1 as PWM


ldi r17, 0x03
ldi r16, 0xE6
sts ICR1H, r17 // Set the top 10bits
sts ICR1L, r16 // Set the top 10bits
ldi r20, 0x08
ldi r21, 0x03
sts OCR1AH, r20 // Set the duty cycle 10bits
sts OCR1AL, r21 // Set the duty cycle 10bits
ldi r16, 0x82
sts TCCR1A, r16
ldi r16, 0x1A
sts TCCR1B, r16
 
rjmp main

; Interrupt Vector
MyFirst_vect:
ldi r16,    0x7F
out DDRB,   r16

//Configure timer1 as PWM


ldi r17, 0x03
ldi r16, 0xE6
sts ICR1H, r17 // Set the top 10bits
sts ICR1L, r16 // Set the top 10bits
ldi r20, 0x04
ldi r21, 0x00
sts OCR1AH, r20 // Set the duty cycle 10bits
sts OCR1AL, r21 // Set the duty cycle 10bits
ldi r16, 0x82
sts TCCR1A, r16
ldi r16, 0x1A
sts TCCR1B, r16
reti

VUMETRO
/*
* GccApplication4.c
*
* Created: 20/01/2020 11:44:21 a. m.
* Author : Usuario
*/

/* Conversion AD - aumenta la cantidad de leds encendidos a medida que aumenta o


disminuye el voltaje del potenciometro
* ADC_Single_Conversion.c
*/

#include <avr/io.h>
#include <avr/interrupt.h>

volatile unsigned int compare, result;

/*Initializes ADC Peripheral Configuration Registers */


void initADC(void)
{
// Enable ADC with Clock prescaled by 16, then ADC clock = 8MHz/16 = 500kHz
// Enable interrupt ADC

ADCSRA = 0b10001100; // 0x8C


// Disable Digital Input on ADC Channel 0 to reduce power consumption
DIDR0 = 0b00000001; //0x01

//- Select AVCC reference


//- Select Left Adjust Disable
//- Select ADC Channel 0 as input

ADMUX = 0b01000000;

// 511 -> 1.65V if VCC = 3.3V OR 511 -> 2.5 if VCC = 5V


compare = (unsigned int)511;
}

/*ADC Conversion Complete Interrupt Service Routine (ISR)*/


ISR(ADC_vect)
{
// Read the ADC Result
result = ADC;

// Clear ADC Conversion Interrupt Flag


ADCSRA |= (1 << ADIF);

switch(result)
{
case 0 ... 146:
PORTD = 0x02; // Writing HIGH
break;
case 147 ... 292:
PORTD = 0x06; // Writing HIGH
break;
case 293 ... 438:
PORTD = 0x0E; // Writing HIGH
break;
case 439 ... 584:
PORTD = 0x1E; // Writing HIGH
break;
case 585 ... 730:
PORTD = 0x3E; // Writing HIGH
break;
case 731 ... 876:
PORTD = 0x7E;
break;
case 877 ... 1023:
PORTD = 0xFF;
break;
default:

break;

}
ADCSRA |= 1<<ADSC; // Start Conversion
}

//Main routine
int main(void)
{
DDRD |= 0xFF; /* Configure PB5 as digital output */

initADC(); // Initialize the ADC Module

sei(); // Enable Global Interrupts


ADCSRA |= 1<<ADSC; // Start Conversion

while (1);

COMUNICACIÓN SERIAL
RECEPCION
#define F_CPU 16000000UL  // 16 MHz

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
void iniciar_usart();  //función para iniciar el USART AVR asíncrono, 8 bits, 9600 baudios,
//sin bit de paridad, 1 bit de parada

unsigned char recibe_caracter_usart();     //función para la recepción de caracteres


/////////////////////////////////////////////
//inicialización del módulo USART AVR modo asíncrono
//en una función, a 8bits,a 9600 baudios, sin bit de paridad
//1 bit de parada
/////////////////////////////////////////////////////
void iniciar_usart(){

#define USART_BAUDRATE 9600


#define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)
UBRR0L = BAUD_PRESCALE;
UBRR0H = (BAUD_PRESCALE >> 8);

// Enable receiver and transmitter


UCSR0B = (1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0);
// Set frame format: 8data, 1stop bit */
UCSR0C = (3<<UCSZ00);

///////////////////////////////////////////////////////////
///////////////////////////////////////////////
//recepción de datos del módulo USART AVR modo asíncrono
////////////////////////////////////////////////////////////
}
unsigned char recibe_caracter_usart(){
if(UCSR0A&(1<<7)){  //si el bit7 del registro UCSR0A se ha puesto a 1
return UDR0;    //devuelve el dato almacenado en el registro UDR0
}
else//sino
return 0 ;//retorna 0
}

int main(void) {

unsigned char dato;//variable tipo char para guardar el caracter recibido

DDRC|=((1<<0)|(1<<1)|(1<<2)|(1<<3));//PC0, PC1, PC2, PC3 como salidas digitales


PORTC&=~((1<<0)|(1<<1)|(1<<2)|(1<<3));//leds inician apagados
iniciar_usart();
while(1)
{
dato=recibe_caracter_usart();
switch(dato){
case '1':                        //En caso el caracter recibido sea 1
PORTC|=(1<<0);                   //enciende el led en el pin PC0
PORTC&=~((1<<1)|(1<<2)|(1<<3));  //leds en PC1, PC2 y PC3 apagados
break;
case '2':                        //En caso el caracter recibido sea 2
PORTC|=(1<<1);                   //enciende el led en el pin PC1
PORTC&=~((1<<0)|(1<<2)|(1<<3));  //leds en PC0, PC2 y PC3 apagados
break;
case '3':                        //En caso el caracter recibido sea 3
PORTC|=(1<<2);                   //enciende el led en el pin PC2
PORTC&=~((1<<0)|(1<<1)|(1<<3));  //leds en PC0, PC1 y PC3 apagados
break;
case '4':                        //En caso el caracter recibido sea 4
PORTC|=(1<<3);                   //enciende el led en el pin PC3
PORTC&=~((1<<0)|(1<<1)|(1<<2));  //leds en PC0, PC1 y PC2 apagados
break;
}

}
}
ENVIO
/*
 * UART_Demo.c
 *
 * Created: 11/7/2019 7:40:00 PM
 * Author : Bernardo Andres C
 */

#define F_CPU 16000000UL  // 8 MHz

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

// Define baud rate


#define USART_BAUDRATE 9600  
#define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)

volatile unsigned char value;  


ISR(USART_RX_vect)
{
   value = UDR0;             //read UART register into value
}

void USART_Init(void)
{
// Set baud rate
    UBRR0L = BAUD_PRESCALE;
    UBRR0H = (BAUD_PRESCALE >> 8);

// Enable receiver and transmitter


UCSR0B = (1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0);
// Set frame format: 8data, 1stop bit */
UCSR0C = (3<<UCSZ00);  
}

void USART_SendByte(uint8_t data)


{
/* Wait for empty transmit buffer */
while (!(UCSR0A & (1<<UDRE0)));
/* Put data into buffer, sends the data */
UDR0 = data;
}

uint8_t USART_ReceiveByte()
{
/* Wait for data to be received */
while (!(UCSR0A & (1<<RXC0)));
/* Get and return received data from buffer */
return UDR0;
}

int main(void) {
USART_Init(); // Initialize USART

DDRB |= (1<<DDB5); // Set PB5 output


DDRB &= ~(1<<DDB7); // Set PB7 input

sei();         // enable all interrupts

value = '1'; //0x41;


  
while(1) {    // Repeat indefinitely
while(!(PINB & (1<<PINB7)))
{
USART_SendByte(value);  // send value
_delay_ms(250); // delay just to stop terminal screen cluttering up
}  
  }

También podría gustarte