Story Transcript
HOJA DE EJERCICIOS (curso 2014/15) 1. Realizar un programa en ensamblador para que parpadee el bit P1.0, utilizando un bucle para realizar el retardo.
SOLUCIÓN:
;************************************************************* ; Plantilla que se crea automáticamente ; Conviene especificar el microcontrolador usado, describir ; el programa y si fuera posible las patillas utilizadas ; Microcontrolador: MSP430G2553 ; Descripción: ; MSP430G2553 ; ----------------; /|\| XIN|; | | | ; --|RST XOUT|; | | ; | P1.0|-->LED ; ; Autor: ; Empresa: UA ; Fecha: 07/07/14 ; Herramienta: IAR Embedded Workbench Version: 5.51 ;************************************************************* #include "msp430g2553.h" miSP EQU 0x400 ; define el puntero de la Pila ORG 0FC00h ; inicio del programa en memoria ;----------------------------------------------------------RESET MOV.W #miSP,SP ; Inicializa el SP MOV.W #WDTPW+WDTHOLD,&WDTCTL ; para el watchdog BIS.B
#001h,&P1DIR
; el bit P1.0 como salida
XOR.B MOV.W
#001h,&P1OUT #050000,R15
DEC.W JNZ JMP
R15 L1 INICIO
; ; ; ; ; ;
INICIO
L1
Conmuta el bit P1.0 R15=50000 para realizar un retardo se realiza 50000 veces el bucle L1 Decrementando R15 retardo=(1+2)*50000=150000T vuelve a empezar
;-------------------------------------------; VECTORES ;-------------------------------------------ORG 0FFFEh DW RESET END
1
Sistemas Electrónicos Digitales
HOJA DE EJERCICIOS (curso 2014/15) 2. Realizar un programa en C para que parpadee el bit P1.0, utilizando un bucle para realizar el retardo.
SOLUCIÓN: //************************************************************* #include int main(void) { WDTCTL = WDTPW + WDTHOLD; P1DIR |= 0x01;
// Para el watchdog // Configura P1.0 como salida direction
for (;;) { volatile unsigned int i; P1OUT ^= 0x01;
// Conmuta P1.0 usando la XOR
i = 50000; do (i--); while (i != 0); }
// Retardo
}
3. Realizar un programa en C que haga parpadear el bit P1.6, utilizando la función __delay_cicles(nº ciclos)
SOLUCIÓN: /* Enciende el led verde P1.6 Utilizando __delay_cicles() */ #include #include void main(){ WDTCTL= WDTPW+WDTHOLD;
//inclusiones. //funcion principal //Apagamos el watchdog
P1SEL= 0x00; P1DIR|= BIT6;
//Salida el bit 6 del puerto 1
P1OUT|=BIT6;
//LED parte apagado
while(1){ //Loop infinito P1OUT|=BIT6; //prende el LED __delay_cycles(100000); //espera P1OUT&=~BIT6; //apaga el LED __delay_cycles(100000); //espera } }
2
Sistemas Electrónicos Digitales
HOJA DE EJERCICIOS (curso 2014/15) 4. Escribe un programa en lenguaje ensamblador en el cual inicialmente el bit P1.6 esté apagado, cuando se pulse el
botón colocado en P1.3 se ponga a uno el bit P1.6 y si se vuelve a pulsar que se apague. Esto se debe realizar de forma indefinida. SOLUCIÓN: ;******************************************************************** #include "msp430g2553.h" ;-----------------------------------------------------ORG 0FC00h ; Definimos la direccion de inicio ;-----------------------------------------------------RESET MOV.W #0400h,SP ; Establecemos el SP MOV.W #WDTPW+WDTHOLD,&WDTCTL ; Detenemos el watchdog timer MOV.B #040h,&P1DIR ; Colocamos P1.6 salida resto entrada MOV.B #00h,&P1OUT BIS.B #BIT3, &P1REN ; Resistencia en la entrda P1.3 BIS.B #BIT3, &P1OUT ; Resistencia de pull-up SIGUE BIT.B #BIT3, &P1IN ; si pulsado 0000 1000 AND XXXX 0XXX JZ ENCIENDE ; si pulsado salta y enciende P1.6 JMP APAGA JMP SIGUE APAGA BIC.B #BIT6,&P1OUT JMP SIGUE ENCIENDE BIS.B #BIT6,&P1OUT JMP SIGUE ;-----------------------------------------------------; Vectores Interrupción ;-----------------------------------------------------ORG 0FFFEh ; Vector RESET MSP 430 DW RESET ; END
3
Sistemas Electrónicos Digitales
HOJA DE EJERCICIOS (curso 2014/15) 5. Escribe un programa en lenguaje C en el cual inicialmente el bit P1.6 esté apagado, cuando se pulse el botón
colocado en P1.3 se ponga a uno el bit P1.6 y si se vuelve a pulsar que se apague. Esto se debe realizar de forma indefinida. SOLUCIÓN:
#include int i; void main(void) { WDTCTL = WDTPW + WDTHOLD;
// para el watchdog
P1OUT P1DIR P1DIR P1REN P1OUT
// // // // //
&= ~0x40; |= 0x40; &= ~0x08; |= 0x08; |= 0x08;
P1.6 P1.6 P1.3 P1.3 P1.3
a cero (LED) como salida (push button) como entrada (botón) resistencia habilitada (botón) resistencia pull-up
while (1){ if( BIT3 & ~P1IN ) { P1OUT ^= 0x40; } }
// Si se pulsa botón // led encendidO
}
6. Añade un antirrebotes al ejercicio 3
7. Añade un antirrebotes al ejercicio 4
8. Supongamos que la ejecución normal del programa consiste en el desplazamiento de un bit, empezando en el
P2.0, después se encenderá el P2.0 y el P2.1, después el P2.0, P2.1 y P2.2, así sucesivamente hasta llega al P2.7, que vuelve a empezar. Si en el bit P1.3 hay un flanco de bajada se debe atender la interrupción ejecute el correspondiente servicio (ISR) que deberá sacar por P2 la siguiente secuencia: secu DC8 00000001b,00000010b,00000100b,00001000b
DC8 00010000b,00100000b,01000000b,10000000b
DC8 00000000b,11111111b,00000000b,11111111b
DC8 00000000b,11111111b,00000000b,11111111b
Finsecu DC8 01010101b Cuando se encuentre el valor 01010101b se debe salir de la interrupción y continuar por donde iba. Escribir el programa en ensamblador 4 Sistemas Electrónicos Digitales
HOJA DE EJERCICIOS (curso 2014/15) ;----------------------------------------------------#include "msp430g2553.h" #define miSP 0x400 main ;-------------------------------------------------------------------------------ORG 0xFC00 ;Inicio del programa ;-------------------------------------------------------------------------------RESET MOV.W #miSP,SP ; Inicia SP MOV.W #WDTPW+WDTHOLD,&WDTCTL ; Detiene WD ;----------------------esto es opcional para conseguir la frecuencia-----------MOV.B &CALDCO_1MHZ, &DCOCTL ; calibra la f a 1MHz MOV.B &CALBC1_1MHZ, &BCSCTL1 ; calibra la f a 1MHz ;-------------------------------------------------------------------------------BIC.B #BIT3, &P1DIR ; P1.3 IN #11110111b BIS.B #BIT3, &P1OUT ; P1.3 Resist pullup, resto a cero 00001000b BIS.B #BIT3, &P1REN ; P1.3 Resist pullup habilitada BIS.B #BIT3, &P1IES ; flanco de bajada para P1.3 BIC.B #BIT3, &P1IFG ; borrar flags de interrup para P1.3 BIS.B #BIT3, &P1IE ; interrup locales habilita para P1.3 EINT ; GIE