Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include "platform.h"
- #include "xparameters.h"
- #include "xiomodule.h"
- // Variable para inicializar la E/S. Se pone global
- // para que puedan usarla los manejadores de interrupciones
- XIOModule iomodule;
- //Mas variables globales para que puedan usarlas los manejadores
- //------------------------------------------------------------------------
- u16 rpm;
- int temporizador = 0;
- int int_ext = 0;
- //-------------------------------------------------------------------------
- // Manejador de interrupciones para el FIT1, programado a 1 segundo
- void Manejador_Int_Temporizador1 (void* ref)
- {
- if (rpm > 0)
- {
- temporizador = 1;
- }
- }
- void Manejador_INTC (void* ref)
- {
- int_ext = 1;
- }
- int main()
- {
- u32 data;
- u8 temp,hum,dep; temp=hum=dep=0;
- u8 tecla;
- u8 cod_tecla;
- // Inicializa el micro
- init_platform();
- // Inicializa la E/S para GPI y GPO y el módulo de la UART para obtener la dirección base:
- data = XIOModule_Initialize(&iomodule, XPAR_IOMODULE_0_DEVICE_ID);
- data = XIOModule_Start(&iomodule);
- data = XIOModule_CfgInitialize(&iomodule, NULL, 1);
- // Iniciamos el manejador de interrupciones
- microblaze_register_handler(XIOModule_DeviceInterruptHandler, XPAR_IOMODULE_0_DEVICE_ID);
- // Registramos el manejador de interrupciones para el FIT1 "Manejador_Int_Temporizador1"
- XIOModule_Connect(&iomodule, XIN_IOMODULE_FIT_1_INTERRUPT_INTR, Manejador_Int_Temporizador1, NULL);
- // Activamos la interrupción para FIT1
- XIOModule_Enable(&iomodule, XIN_IOMODULE_FIT_1_INTERRUPT_INTR);
- // Registramos el manejador de interrupciones para INTC (Interrupción externa) "Manejador_INTC"
- XIOModule_Connect(&iomodule, XIN_IOMODULE_EXTERNAL_INTERRUPT_INTR, Manejador_INTC, NULL);
- // Activamos la interrupción para INTC
- XIOModule_Enable(&iomodule, XIN_IOMODULE_EXTERNAL_INTERRUPT_INTR);
- // Activamos Interrupciones
- microblaze_enable_interrupts();
- //SIMULACION
- //------------------------------------------------------------------------------------------------------------------------------------
- int i=0; // Declaración de la variable del bucle for
- for (i=0; i<100; i++) // Bucle for que va desde el valor 0 de i hasta el valor 101.
- {
- if(i<45) cod_tecla=4; //Si la i es menor que 45, se "pulsa"la tecla,que 4 sube deposito
- else if (i<51) cod_tecla= 5; //tecla 5 sube humedad
- else if(i<60) cod_tecla=6; // tecla 6 sube temperatura
- if (temporizador == 1)
- {
- cod_tecla=5;
- temporizador = 0;
- XIOModule_DiscreteWrite(&iomodule, 1, cod_tecla); //enviar codigo de tecla subir humedad
- XIOModule_DiscreteWrite(&iomodule,2,1); //tecla pulsada = 1
- XIOModule_DiscreteWrite(&iomodule,2,0);
- }
- if (int_ext == 1)
- {
- int_ext = 0;
- data = XIOModule_DiscreteRead (&iomodule, 1);
- rpm = XIOModule_DiscreteRead (&iomodule, 2);
- temp=data&0xFF;
- hum=(data>>8)&0xFF;
- dep=(data>>16)&0xFF;
- }
- XIOModule_DiscreteWrite(&iomodule, 1, cod_tecla); //enviar codigo tecla
- XIOModule_DiscreteWrite(&iomodule,2,1); // tecla pulsada micro
- XIOModule_DiscreteWrite(&iomodule,2,0);
- }
- //-------------------------------------------------------------------------------------------------------------------------------------
- // Esta línea hace que el cursor se vaya arriba a la izquierda y se borre la pantalla
- xil_printf("\033[H\033[J");
- // Imprime unos mensajes de instrucciones de manejo
- xil_printf("Programa de control de un Sistema de Riego\n\r");
- xil_printf("- Si desea subir o bajar el DEPÓSITO pulse 4 ó 1, respectivamente.\n\r");
- xil_printf("- Si desea subir o bajar la HUMEDAD pulse 5 ó 2, respectivamente.\n\r");
- xil_printf("- Si desea subir o bajar la TEMPERATURA pulse 6 ó 3, respectivamente.\n\r");
- data = XIOModule_DiscreteRead (&iomodule, 1);
- rpm = XIOModule_DiscreteRead (&iomodule, 2);
- temp=data&0xFF;
- hum=(data>>8)&0xFF;
- dep=(data>>16)&0xFF;
- xil_printf ("\n\t* Deposito: %d%% ",dep); //los espacios son necesarios para borrar la "basura" que quedaría si
- xil_printf ("\n\r\t* Humedad: %d%% ", hum); //los números superan las dos o tres cifras y luego volvemos a escribir
- xil_printf ( "\t\t* Revoluciones: %d \n\r", rpm); //un número con menor número de cifras
- xil_printf ("\t* Temperatura: %dºC \r", temp);
- xil_printf("\033[3A");
- while(1)
- {
- if (temporizador == 1)
- {
- cod_tecla=5;
- temporizador = 0;
- XIOModule_DiscreteWrite(&iomodule, 1, cod_tecla); //enviar codigo de tecla subir humedad
- XIOModule_DiscreteWrite(&iomodule,2,1); //tecla pulsada = 1
- XIOModule_DiscreteWrite(&iomodule,2,0);
- }
- if (int_ext == 1)
- {
- int_ext = 0;
- data = XIOModule_DiscreteRead (&iomodule, 1);
- rpm = XIOModule_DiscreteRead (&iomodule, 2);
- temp=data&0xFF;
- hum=(data>>8)&0xFF;
- dep=(data>>16)&0xFF;
- xil_printf ("\n\t* Deposito: %d%% ",dep); //los espacios son necesarios para borrar la "basura" que quedaría si
- xil_printf ("\n\r\t* Humedad: %d%% ", hum);//los números superan las dos o tres cifras y luego volvemos a escribir
- xil_printf ( "\t\t* Revoluciones: %d \n\r", rpm);//un número con menor número de cifras
- xil_printf ("\t* Temperatura: %dºC \r", temp);
- xil_printf("\033[3A");
- }
- if ((XIOModule_Recv(&iomodule, &tecla,1))!=0)
- {
- if (tecla >= 49 && tecla <= 54)
- {
- switch(tecla)
- {
- case 49: //pulsacion tecla 1
- cod_tecla=1;
- break;
- case 50: //pulsacion tecla 2
- cod_tecla=2;
- break;
- case 51: //pulsacion tecla 3
- cod_tecla=3;
- break;
- case 52: //pulsacion tecla 4
- cod_tecla=4;
- break;
- case 53: //pulsacion tecla 5
- cod_tecla=5;
- break;
- case 54: //pulsacion tecla 6
- cod_tecla=6;
- break;
- }
- XIOModule_DiscreteWrite(&iomodule, 1, cod_tecla); //enviar codigo tecla
- XIOModule_DiscreteWrite(&iomodule,2,1); // tecla pulsada micro
- XIOModule_DiscreteWrite(&iomodule,2,0);
- }
- }
- }
- cleanup_platform();
- return 0;
- }
- // source ipcore_dir/microblaze_mcs_setup.tcl
- //microblaze_mcs_data2mem workspace3/practica4/debug/practica4.elf
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement