actividad1 expractico
-
Upload
miguel-larumbe-bolado -
Category
Documents
-
view
212 -
download
0
Transcript of actividad1 expractico
#include <asf.h>#include "conf_gpio_peripheral_bus_example.h"#include "delay.h"#include "pm.h"#include "delay.h"#include "intc.h"
void display(volatile int32_t numero);void inicializa_PM(void);volatile uint32_t vel=1;int32_t numero1 = 0;volatile int tecla_up=0;volatile int tecla_down=0;volatile int tecla_right=0;volatile int tecla_left=0;
/** \brief Main function to alter the state of the pin \c GPIO_PIN_EXAMPLE. */
void inicializa_PM(void){
// Activa el oscilador Osc0pm_switch_to_osc0(&AVR32_PM,12000000,6);
//_______________________________________________________________________________
//Establece la frecuencia del VCO//Si DIV>1 Fvco=((MUL+1)/DIV)*Fosc//Si DIV=0 Fvco=2*(MUL+1)*Fosc
pm_pll_setup(&AVR32_PM,0,vel,0,0,16); // lockcount in main clock for the PLL wait lock
//_______________________________________________________________________________
// Establece la frecuencia de salida del PLLpm_pll_set_option(&AVR32_PM,0,1,1,0);//1 Start-up faster, Start-up
normal
//_______________________________________________________________________________
//Habilita el PLL 0pm_pll_enable(&AVR32_PM,0);
//_______________________________________________________________________________
//Espera a que se establesca el PLLpm_wait_for_pll0_locked(&AVR32_PM) ;
//_______________________________________________________________________________
// Set one wait-state (WS) for flash controllerflashc_set_wait_state(1);
//habilita la salida del PLL0 con 2 y el OSC0 con 1
pm_switch_to_clock(&AVR32_PM, 2);}
//La rutina de display lo que hace es un and con el número que tiene con un 1,2,4 y 8 así si por ejemplo tenemos un 7 de número que en binario es= 0111 primero hace and con 0111 & 0001 luego 0111 & 0010 , 0111 & 0100 y 0111 & 1000 para asi saber cuáles leds prender
void display(volatile int32_t numero){//muestra numero en los ledsint8_t numerox = (int8_t)numero;if (numerox & (1 << 0)) //checa el bit0//if (numerox & 1){
gpio_clr_gpio_pin(LED3_GPIO);}else{gpio_set_gpio_pin(LED3_GPIO);
}if (numerox & (1 << 1)) //checa el bit1//if (numerox & 2){
gpio_clr_gpio_pin(LED2_GPIO);}else{gpio_set_gpio_pin(LED2_GPIO);
}if (numerox & (1<<2)) //checa el bit2//if (numerox & 4){
gpio_clr_gpio_pin(LED1_GPIO);}else{gpio_set_gpio_pin(LED1_GPIO);
}if (numerox & (1<<3)) //checa el bit3//if (numerox & 8){
gpio_clr_gpio_pin(LED0_GPIO);}else{gpio_set_gpio_pin(LED0_GPIO);
}
}
//Aquí vienen las interrupciones, aquí entran las interrupciones de todas las teclas por lo que para saber que botón fue el q pidió interrupción se hace con la función gpio_get_pin_interrupt_flag y prendo una bandera que en mi caso se llaman tecla_up, tecla_down, tecla_left, tecla_right para después con esa bandera ocuparlas en el main
__attribute__ ((__interrupt__)) void teclas_touch(void){//teclas touch up down right left center
if (gpio_get_pin_interrupt_flag(QT1081_TOUCH_SENSOR_UP)){
gpio_clear_pin_interrupt_flag(QT1081_TOUCH_SENSOR_UP);
tecla_left=0;tecla_right=0;tecla_up=1;
}
if (gpio_get_pin_interrupt_flag(QT1081_TOUCH_SENSOR_DOWN)){
gpio_clear_pin_interrupt_flag(QT1081_TOUCH_SENSOR_DOWN);tecla_left=0;tecla_right=0;tecla_down=1;
}
if (gpio_get_pin_interrupt_flag(QT1081_TOUCH_SENSOR_ENTER)){
gpio_clear_pin_interrupt_flag(QT1081_TOUCH_SENSOR_ENTER);tecla_left=0;tecla_right=0;numero1=0;display(numero1);
}
if (gpio_get_pin_interrupt_flag(QT1081_TOUCH_SENSOR_RIGHT)){
gpio_clear_pin_interrupt_flag(QT1081_TOUCH_SENSOR_RIGHT);tecla_left=0;tecla_right=1;
}if (gpio_get_pin_interrupt_flag(QT1081_TOUCH_SENSOR_LEFT)){
gpio_clear_pin_interrupt_flag(QT1081_TOUCH_SENSOR_LEFT);tecla_right=0;tecla_left=1;
}
}
int main(void){
inicializa_PM();//Interrupciones
Disable_global_interrupt();
INTC_init_interrupts();
INTC_register_interrupt(&teclas_touch, 71, 0); //right left centerINTC_register_interrupt(&teclas_touch, 70,0);//up and downgpio_enable_pin_interrupt(QT1081_TOUCH_SENSOR_LEFT,GPIO_RISING_EDGE);gpio_enable_pin_interrupt(QT1081_TOUCH_SENSOR_RIGHT,GPIO_RISING_EDGE);
gpio_enable_pin_interrupt(QT1081_TOUCH_SENSOR_ENTER,GPIO_RISING_EDGE);gpio_enable_pin_interrupt(QT1081_TOUCH_SENSOR_UP,GPIO_RISING_EDGE);gpio_enable_pin_interrupt(QT1081_TOUCH_SENSOR_DOWN,GPIO_RISING_EDGE);
Enable_global_interrupt();
while (1) {
if (tecla_up){
tecla_up=0;numero1++;
if (numero1>=15){numero1=15;}display(numero1);
}
if (tecla_down){
tecla_down=0;numero1--;if (numero1<=0){numero1=0;}display(numero1);
}
if (tecla_right){pm_switch_to_clock(&AVR32_PM,0); //cambia al RC
for(vel=1;vel<=7;vel++){inicializa_PM();gpio_clr_gpio_pin(LED0_GPIO);delay_ms(40000);inicializa_PM();gpio_set_gpio_pin(LED0_GPIO);gpio_clr_gpio_pin(LED1_GPIO);delay_ms(40000);inicializa_PM();gpio_set_gpio_pin(LED1_GPIO);gpio_clr_gpio_pin(LED2_GPIO);delay_ms(40000);inicializa_PM();gpio_set_gpio_pin(LED2_GPIO);gpio_clr_gpio_pin(LED3_GPIO);delay_ms(40000);
inicializa_PM();gpio_set_gpio_pin(LED2_GPIO);gpio_set_gpio_pin(LED3_GPIO);delay_ms(40000);}
}
if (tecla_left){
pm_switch_to_clock(&AVR32_PM,0); //cambia al RC
for(vel=1;vel<=7;vel++){inicializa_PM();gpio_clr_gpio_pin(LED3_GPIO);delay_ms(40000);inicializa_PM();gpio_set_gpio_pin(LED3_GPIO);gpio_clr_gpio_pin(LED2_GPIO);delay_ms(40000);inicializa_PM();gpio_set_gpio_pin(LED2_GPIO);gpio_clr_gpio_pin(LED1_GPIO);delay_ms(40000);inicializa_PM();gpio_set_gpio_pin(LED1_GPIO);gpio_clr_gpio_pin(LED0_GPIO);delay_ms(40000);inicializa_PM();gpio_set_gpio_pin(LED0_GPIO);gpio_set_gpio_pin(LED1_GPIO);delay_ms(40000);
}}
}}