Sunteți pe pagina 1din 5

MULTITAREAS MULTIPROCESO 1.

Encendido de 3 leds

#include<18f4550.h> #fuses xt,nowdt,nomclr #use delay(clock=4000000) #use rs232(UART1,BAUD=2400) #use RTOS(timer=0,minor_cycle=50ms) #task(rate=1s,max=10ms) void tarea1() { OUTPUT_toggle(PIN_b0); } #task(rate=1500ms,max=50ms) void tarea2() { OUTPUT_toggle(PIN_c0); } #task(rate=2s,max=10ms) void tarea3() { OUTPUT_toggle(PIN_d0); } void main() { setup_timer_0(RTCC_internal|RTCC_DIV_1); output_low(pin_b0); output_low(pin_c0); output_low(pin_d0); rtos_run(); }

2. Programa que enva un mensaje

#include<18f4550.h> #fuses xt,nowdt,nomclr #use delay(clock=4000000) #use rs232(UART1,BAUD=2400) #use RTOS(timer=0,minor_cycle=50ms) #task(rate=1s,max=10ms) void tarea1() { printf("tarea1\r"); } #task(rate=2s,max=10ms) void tarea2() { printf("tarea2\r"); } #task(rate=3s,max=10ms) void tarea3() { printf("tarea3\r"); } void main() { setup_timer_0(RTCC_internal|RTCC_DIV_1); rtos_run(); }

3. RTOS Paso de mensajes entre tareas

#include<18f4550.h> #fuses xt,nowdt,nomclr #use delay(clock=4000000) #use RTOS(timer=0,minor_cycle=10ms) #include<lcd.c> int cuenta; #task(rate=500ms,max=1ms) void activo() { OUTPUT_TOGGLE(PIN_c0); } // parpadeo de un led

#task(rate=1s,max=10ms,queue=1)

//leemos si ha llegado algn mensaje , queue= es un buzn q puede recibir 1 msm de 8 bites, este puede recibir hasta 255 msm

void mostrar() { if(rtos_msg_poll()>0) //poll=registrar, si no hay mensajes esta en 0 { printf(lcd_putc,"\nNumero = %3u",rtos_msg_read()); //imprimo el mensaje en el LCD } } #task(rate=200ms,max=2ms) //contador binario que se ejecuta cada 200ms void generator() { cuenta++; if(input(pin_c7)==0) // { rtos_msg_send(mostrar,cuenta); //enva un mensaje al programa MOSTRAR, enva la variable cuenta } output_b(cuenta); } void main() { lcd_init(); output_b(0);

lcd_putc("Presionar boton"); // por defecto el rtos utiliza el timer 0 y se habilita internamente y realiza divisiones setup_timer_0(RTCC_internal|RTCC_DIV_1); //este me ayuda a gestionar las tareas rtos_run(); //correr las tareas }

4. Del ejercicio 3 solo contar hasta el 15

5. Control de teclado usando semforo

#include <18f4550.h> #fuses xt,nowdt,nomclr #use delay(clock=4000000) #use RTOS(timer=0,minor_cycle=1ms) //las tareas no deben pasar de 1 ms #include <lcd.c> #define use_portb_kbd true //indico q se use el puerto b para el teclado #include <kbd.c> int digito,I=0; int semaforo=0; // en este micro me programo 3 tareas

//1. parpadeo de 1 led //2. revision de teclado //3. muestra lo que se presiono en el teclado, //avisa si hay una tecla presionada mediante un semforo(es una variable que avisa si se pres teclas) #task(rate=250ms,max=1ms) //parpadeo de 1 led void activo() { output_toggle(pin_c0); rtos_yield(); // como estas tareas se ejecutan en menos de 2 micro segundos, entonces podemos ceder // Estamos cediendo (yield=seder)el tiempo a otros programas } #task(rate=1ms,max=1ms) void barrido() { digito=kbd_getc(); //almaceno cualquier tecla presionada en la variable digito if(digito!=0)rtos_signal(semaforo); //si alguien presiona el teclado, entonces al semforo lo pongo en 1 } #task(rate=1ms,max=1ms) void generator() { rtos_wait(semaforo); //espera al semforo, el semforo debe estar en 1 para ejecutar las siguientes instrucciones lcd_putc(digito); // si no est en uno, no hace nada y se va IF(digito=='#') { LCD_PUTC("\f"); lcd_init(); lcd_putc("Presionar teclas\n"); I=0; } IF(I==15)LCD_SEND_BYTE(0,7); I++; } void main() { lcd_init(); kbd_init(); lcd_putc("Presionar teclas\n"); output_low(pin_c0); setup_timer_0(RTCC_internal|RTCC_DIV_1); rtos_run(); ini: sleep(); goto ini; }

S-ar putea să vă placă și