Está en la página 1de 4

Simon_i6_v1_javier.

c
//AUTORES JAVIER AGUERA SANCHEZ Y CARLOS CANO DOMINGO SISTEMAS ELECTRNICOS
//GRUPO 01
#include "io430g2533.h"

// MSP430G2533

/* ========================================================================== */
/* ============ CONSTANTES ================================================== */
/* ========================================================================== */
#define
#define
#define
#define
#define
#define

ON
OFF
PULS_ON
PULS_OFF
LED_ON
LED_OFF

1
0
0
1
1
0

//
//
//
//
//
//

Activo
Desactivo
Pulsador presionado
Pulsador soltado
LED encendido
LED apagado

/* ========================================================================== */
/* ============ TIPOS DATOS ================================================= */
/* ========================================================================== */
typedef union {

// Flags

unsigned char total;


struct {
unsigned
unsigned
unsigned
unsigned
unsigned
unsigned
unsigned
unsigned
};

char
char
char
char
char
char
char
char

// Todos
f0
f1
f2
f3
f4
f5
f6
f7

:1;
:1;
:1;
:1;
:1;
:1;
:1;
:1;

//
//
//
//
//
//
//
//

Flag
Flag
Flag
Flag
Flag
Flag
Flag
Flag

0
1
2
3
4
5
6
7

} flags;
/* ========================================================================== */
/* ============ VARIABLES GLOBALES ========================================== */
/* ========================================================================== */
flags tareas;

// Flags activacion tareas:


//
BIT0: Tarea_0 -> Pulsador S2 simple
//
BIT1: Tarea_1 -> Pulsador S2 multifuncion
//tareas.f0 ==> INTERRUPCION DEL TIMER 250ms o 500ms
//tareas.f1 ==> FLANCO DE SUBIDA
//tareas.f2 ==> FLANCO DE BAJADA
flags estado;
//estado.f0 ==> LED ON O OFF
//estado.f1 ==>PULSADOR SIMPLE o MULTi
//estado.f2 ==>
//estado.f3 ==> MODO MOSTRAR SEQ o RECIBIR SEQ

// Flags de estado del sistema:

unsigned char num_timer;

// Numero interrupciones Timer1

//
//
//
//
//
//

BIT0:
0:
1:
BIT1:
0:
1:

Pulsador multifuncion
Desactivado
Activado
PWM
Desactivado
Activado

unsigned char num_lights;


unsigned int seq;
unsigned int comp_bit;
unsigned char num_puls;
unsigned int val_bit;
unsigned num_puls2;
/* ========================================================================== */
/* ============ PROTOTIPOS ================================================== */
Pgina 1

Simon_i6_v1_javier.c
/* ========================================================================== */
void Config_uC(void);
void Config_Perifericos();
/* ========================================================================== */
/* ============ PROGRAMA PRINCIPAL ========================================== */
/* ========================================================================== */
int main(void) {
Config_uC();
Config_Perifericos();
tareas.total = 0;
num_puls=0;
num_puls2=0;
num_timer = 0;
num_lights = 0; // VARIABLE QUE CONTROLA NUMERO DE VECES QUE SE ILUMINA EL LED
// VARIABLE PARA ESTABLECER COMPARACION BIT A BIT CON EL TAR (TIMER1)
__enable_interrupt();// Habilita interrupciones
/* ------------ Bucle principal --------------------------------------------- */
for (;;){
//__l+++ow_power_mode_0();
while (tareas.total != OFF) {

// Bajo consumo (LPM0)

if(tareas.f0==1){
num_timer++;
tareas.f0=0;
if(estado.f1==0){ //--> PULSADOR SIMPLE
if(estado.f0==1){ //--> led on
P1OUT_bit.P0=OFF; // APAGO LOS 2 LEDS
P1OUT_bit.P6=OFF;
estado.f0=0; // AVISAMOS AL CODIGO QUE HEMOS APAGADO LOS LEDS
num_lights++;
if(num_puls==num_lights){// IF NUMERO_PULSACIONES == NUMERO_ILUMINCACIONES -->> NO
ILUMINES MAS VECES
TA0CTL = TASSEL_2 + ID_3;// DESHABILITO EL TIMER
P1IE_bit.P3 = ON;// HABILITO INTERRUPCIONES DEL PULSADOR ...
num_lights=0; // INICIALIZO NUEVAMENTE VARIABLE QUE CUENTA NUMERO DE
ILUMINACIONES ...// NOSE PORQUE ?//
val_bit=0x01; //ASOCIADO A INTERMEDIA 7 --NO SIRVE-estado.f3=1; //ASOCIADO A INTERMEDIA 7 --NO SIRVE-}
}else{ //-->led off
if(num_timer==3){
num_timer=0;
if((seq & comp_bit) == 0){
P1OUT_bit.P0=ON;
}else{
P1OUT_bit.P6=ON;
}
estado.f0=1; //AVISAMOS AL CODIGO QUE HEMOS ENCENDIDO LOS LEDS
comp_bit=comp_bit*2; // PREPARAMOS LA SIGUIENTE COMPARACION
}
}
}
else{ // PULSADOR MULTIFUNCION
if(num_timer==1){ // --> ENTRA A LOS 500 ms
P1OUT_bit.P0=1;
P1OUT_bit.P6=1;
P1IE_bit.P3 = OFF;
}else if(num_timer==2){
P1OUT_bit.P0=0;
P1OUT_bit.P6=0;
}else{
P1IE_bit.P3 = ON;
estado.f1=0;
estado.f2=0;
TA0CTL = TASSEL_2 + ID_3;
Pgina 2

Simon_i6_v1_javier.c

}
}
if(tareas.f1==1){ //--> FLANCO DE SUBIDA SIENDO PULSADOR SIMPLE
num_puls++;
if(num_puls==17) num_puls=1;
if(num_puls==1) seq=TA1R;
tareas.f1=0;
TA0CTL|=MC1;
TACCR0= TA0R + 0x7A12;//250 ms
P1IE_bit.P3 = OFF;
num_timer=0;
comp_bit=0x01;
}
if(tareas.f2==1){
TA0CTL|=MC1;
TACCR0= TA0R +0xF424;//500 ms
estado.f1=1; // AVISO QUE ESTOY EN MULTI
tareas.f2=0; // LIMPIAR EL FLAG DE TAREA.F2
};

};

};
};
void Config_uC(void){
/* ------------ Variables --------------------------------------------------- */
/* ------------ Inicio ------------------------------------------------------ */
WDTCTL = WDTPW + WDTHOLD;
DCOCTL = 0;
BCSCTL1 = CALBC1_1MHZ;
DCOCTL = CALDCO_1MHZ;

// Detiene watchdog
// Frecuencia DCO (1MHz)

}//void Config_uC(void)
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
void Config_Perifericos(void){
/* ------------ Inicio ------------------------------------------------------ */
// ------------ [LED1, LED2]
P1DIR_bit.P0 = P1DIR_bit.P6 = ON;
P1OUT_bit.P0 = LED_OFF;
P1OUT_bit.P6 = LED_OFF;

//
//
//
//

P1.0
P1.6
P1.0
P1.6

->
->
->
->

Salida (LED1)
Salida (LED2)
Apaga LED1
Apaga LED2

//
//
//
//
//
//

P1.3 -> Entrada (S2)


P1.3 -> Resistencia activa
P1.3 -> Resistencia pullup
P1.3 -> Flanco bajada
Limpia flag P1.3
Habilita interrupcion P1.3

// ------------ [Pulsador S2]


P1DIR_bit.P3 = OFF;
P1REN_bit.P3 = ON;
P1OUT_bit.P3 = ON;
P1IES_bit.P3 = ON;
P1IFG_bit.P3 = OFF;
P1IE_bit.P3 = ON;
// ------------ [Temporizador T0]
TA0CTL = TASSEL_2 + ID_3 ;// Configura Timer0
TA0CCTL0= CCIE;
estado.f0=OFF;
TA1CTL = TASSEL_2 + ID_3 + MC1;// Configura Timer0
/*// ------------ [Temporizador T1]
TA1CTL = TASSEL_2 + ID_3;
TA1CCR0 = 0xXXXX;*/

// Configura Timer1
Pgina 3

Simon_i6_v1_javier.c
} // void Config_Perifericos(void)
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
#pragma vector =TIMER0_A0_VECTOR
__interrupt void RTI_T0_TACCR0(void) {
tareas.f0=1;
TA0CCR0= TA0R +

0x7A12;
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
#pragma vector = PORT1_VECTOR
__interrupt void RTI_P1(void) {
P1IE_bit.P3 = OFF; // Deshabilita interrupcion P1.3
////////// -------------------Antirrebote-------------------------////////////////////
WDTCTL = WDT_MDLY_32;
// Configura watchdog para que inhabilite durante 30 ms
IFG1_bit.WDTIFG = OFF; // Limpia flag interrupcion watchdog
IE1_bit.WDTIE = ON;
// Habilita interrupcion watchdog
///////// -------------------Antirrebote-------------------------/////////////////////
if (P1IES_bit.P3 == ON) {// Si flanco de bajada (pulsador presionado)
tareas.f2=1; // AVISO QUE ESTOY EN FLANCO DE BAJADO
num_timer=0;
}
else {
//if((estado.f2==0) && (num_timer!=3)){ // SI NO HAN PASADO LOS 500ma
if(num_timer!=3){
estado.f1=0;
//LE AVISO QUE ESTOY EN PULS SIMPLE
tareas.f1=1;//AVISO QUE ES FLANCO SUBIDA
}
}
P1IES_bit.P3 = ~(P1IES_bit.P3);
// P1.3 -> Conmuta flanco
P1IFG_bit.P3 = OFF;
// Limpia flag P1.3
if (tareas.total != OFF) {
// Si alguna tarea activa
__low_power_mode_off_on_exit(); // Sale bajo consumo (LPM0)
} // if (tareas.total != OFF)
} // void RTI_P1(void)
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
#pragma vector =WDT_VECTOR
__interrupt void RTI_WD(void) {
/* ------------ Variables --------------------------------------------------- */
/* ------------ Inicio ------------------------------------------------------ */
//TRAS EL ANTIREBOTE EN LA RTI DEL PULSADOR VIENE AQUI
WDTCTL = WDTPW + WDTHOLD;
// Detiene watchdog
P1IFG_bit.P3 = OFF;
// Limpia flag interrupcion P1.3
P1IE_bit.P3 = ON;
// Habilita interrupcion P1.3
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

Pgina 4

También podría gustarte