Problem e Lab
Problem e Lab
Sa se scrie un program care, la apasarea unei taste, afiseaza codurile SCAN si ASCII ale
tastei
apasate. Cele doua coduri vor fi preluate din zona tampon a tastaturii.
#include <stdio.h>
#include <conio.h>
#include <dos.h>
int loop;
loop++;
(*oldfunc)();
void main()
int off_coada,next;
char coda,cods;
loop = 0; next = 0;
oldfunc=getvect(9);
while (1)
{
1
if (next<loop)
off_coada = peek(0x040,0x1c);
if (off_coada == 0x1e)
cods = peekb(0x40,0x3d);
coda = peekb(0x40,0x3c);
else
cods = peekb(0x40,off_coada-1);
coda = peekb(0x40,off_coada-2);
next = next + 2;
puts("Gata!");
setvect(9,oldfunc);
getch();
L2.P3. Scrieti un program care la fiecare 2. 2 secunde sa afiseze care a fost ultima tasta
apasata de
#include <stdio.h>
#include <dos.h>
2
#include <conio.h>
int c=0;
int flag=0;
c++;
if(c==40)
flag=1;
c=0;
(*oldc)();
(*oldt)();
main()
int i;
int codscan;
clrscr();
oldclk=getvect(8);
setvect(8,funcc);
oldtst=getvect(9);
setvect(9,funct);
3
for(i=1;i<=5;i++)
while(flag==0)
{}
if(nr>0)
codscan=inportb(0x60);
nr=0;
flag=0;
while(flag==0)
{}
setvect(9,oldt);
setvect(8,oldc);
L3.P2. Sa se realizeze un program C care la fiecare apasare a tastelor ALT H sa cânte o melodie
(se vor
trimite în ordine catre bell semnale de frecventa 100Hz, 1500Hz, 2000Hz, fiecare pentru un
interval
de 1.1 sec). Apasarea tastelor pe durata interpretarii meoldiei este neglijata. Programul va
instala
#include <stdio.h>
#include <dos.h>
#include <conio.h>
4
void interrupt (*oldceas)();
int contor=20;
char c;
c=inport(0x60);
if((c&0x7f)==0x38)
flag=1;
else
if(c==0x23&&flag==1)
flag_cald=1;
else
flag=0;
(*oldtast)();
contor--;
if(contor==0)
contor=20;
flagc=1;
(*oldceas)();
5
void suna(int frecventa)
int c_div;
c_div=1190000L/frecventa;
printf("cdiv=%d\n", c_div);
outportb(0x43,0xb6);
outportb(0x42, c_div%256);
outportb(0x42,c_div/256);
outportb(0x61,inportb(0x61)|0x03);
while(flagc==0);
outportb(0x61, inportb(0x61)&0xfc);
flagc=0;
void main(void)
int i;
clrscr();
oldceas=getvect(0x08);
setvect(8,newceas);
oldtast=getvect(9);
setvect(9,newtast);
printf("Apasa ALT+H");
while((c&0x7f)!=0x01)
if(flag_cald==1)
6
{
suna(100);
suna(1500);
suna(2000);
flag_cald=0;
setvect(9,oldtast);
setvect(8,oldceas);
L4.P3. Realizati o aplicatie in care taskul T1 (prioritate 2) creeaza Task T2 dupa 1 sec, Task T3
dupa 2 sec, iar ulterior este distrus de primul task creat (T2 sau T3) care preia procesorul.
preemtiv.
#include <stdio.h>
/* Scheduler includes. */
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "croutine.h"
7
/* Demo application includes. */
#include "partest.h"
_FOSCSEL(FNOSC_FRC);
xTaskHandle *t1;
for (;;)
//PORTBbits.RB15 = ~PORTBbits.RB15;
//vParTestToggleLED(15);
vTaskDelay(1000);
vTaskDelay(1000);
8
}
for (;;)
//PORTBbits.RB14 = ~PORTBbits.RB14;
vParTestToggleLED(15);
vTaskDelay(2000);
for (;;)
//PORTBbits.RB13 = ~PORTBbits.RB13;
vParTestToggleLED(14);
vTaskDelay(1000);
for (;;)
//PORTBbits.RB12 = ~PORTBbits.RB12;
vParTestToggleLED(12);
9
vTaskDelay(1000);
prvSetupHardware();
vTaskStartScheduler();
return 0;
/*-----------------------------------------------------------*/
void initPLL(void)
//PLLFBD = 30; // M = 32 XT
10
CLKDIVbits.PLLPOST=0; // N1 = 2
CLKDIVbits.PLLPRE=0; // N2 = 2
__builtin_write_OSCCONH(0x01); // FRC
//__builtin_write_OSCCONH(0x03); // XT
__builtin_write_OSCCONL(0x01);
while(OSCCONbits.LOCK!=1) {};
vParTestInitialise();
initPLL();
0.5s) si T3 (prioritate 3, perioada 250ms). Task-ul T1 va comuta starea LED-ului 15 iar taskul
T2 va comuta starea LED-ului 14. Task-ul T3 va citi prioritatile celorlalte doua task-uri
#include <stdio.h>
/* Scheduler includes. */
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "croutine.h"
#include "partest.h"
_FOSCSEL(FNOSC_FRC);
int prioT1,prioT2;
xTaskHandle *t1,*t2;
for (;;)
12
{
//PORTBbits.RB15 = ~PORTBbits.RB15;
vParTestToggleLED(15);
vTaskDelay(2000);
for (;;)
//PORTBbits.RB14 = ~PORTBbits.RB14;
vParTestToggleLED(14);
vTaskDelay(500);
portTickType xLastWakeTime;
xLastWakeTime = xTaskGetTickCount();
for (;;)
//PORTBbits.RB13 = ~PORTBbits.RB13;
// vParTestToggleLED(13);
prioT1=uxTaskPriorityGet(t1);
prioT2=uxTaskPriorityGet(t2);
nr=xTaskGetTickCount();
if(nr==12345){
13
vTaskPrioritySet(t1,prioT1+2);
vTaskPrioritySet(t2,prioT2+2);
for (;;)
//PORTBbits.RB12 = ~PORTBbits.RB12;
vParTestToggleLED(12);
vTaskDelay(1000);
prvSetupHardware();
14
/* Finally start the scheduler. */
vTaskStartScheduler();
return 0;
/*-----------------------------------------------------------*/
void initPLL(void)
//PLLFBD = 30; // M = 32 XT
CLKDIVbits.PLLPOST=0; // N1 = 2
CLKDIVbits.PLLPRE=0; // N2 = 2
__builtin_write_OSCCONH(0x01); // FRC
//__builtin_write_OSCCONH(0x03); // XT
__builtin_write_OSCCONL(0x01);
while(OSCCONbits.LOCK!=1) {};
15
{
initPLL();
L5P3. Realizati o aplicatie cu doua taskuri T1 si T2. T1 (prioritate 1) trebuie sa modifice starea
ledului 15 la fiecare 2,5 sec, iar T2 (prioritate 3) trebuie sa modifice starea ledului 12 la
(prioritate 2, perioada 1s) ce comuta starea ledului 13 la fiecare perioada a sa. Task-ul T3 va
#include <stdio.h>
/* Scheduler includes. */
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "croutine.h"
#include "partest.h"
_FOSCSEL(FNOSC_FRC);
int contorT1=0;
int contorT2=0;
xTaskHandle handle_Ts1;
xTaskHandle handle_Ts2;
xTaskHandle handle_Ts3;
int T3_creat=0;
int T3_suspendat=0;
for (;;)
//PORTBbits.RB15 = ~PORTBbits.RB15;
contorT1++;
vParTestToggleLED(15);
vTaskDelay(2500);
17
vTaskSuspend(Handle_T3);
T3_suspendat=1;
vTaskResume(Handle_T3);
T3_suspendat=0;
for (;;)
//PORTBbits.RB14 = ~PORTBbits.RB14;
contorT2++;
vParTestToggleLED(12);
vTaskDelay(500);
if(contorT2==8)
//PORTBbits.RB15 = ~PORTBbits.RB15;
T3_creat=1;
vParTestToggleLED(13);
vTaskDelay(1000);
prvSetupHardware();
vTaskStartScheduler();
return 0;
/*-----------------------------------------------------------*/
void initPLL(void)
19
// Configure PLL prescaler, PLL postscaler, PLL divisor
//PLLFBD = 30; // M = 32 XT
CLKDIVbits.PLLPOST=0; // N1 = 2
CLKDIVbits.PLLPRE=0; // N2 = 2
__builtin_write_OSCCONH(0x01); // FRC
//__builtin_write_OSCCONH(0x03); // XT
__builtin_write_OSCCONL(0x01);
while(OSCCONbits.LOCK!=1) {};
vParTestInitialise();
initPLL();
L7P1. Realizaţi o aplicaţie cu doua task-uri T1 si T2. Task-ul T1 transmite mesaje către T2 la
20
12 ai portului B al microcontroller-ului. Priorităţile task-urilor si modul de comunicatie intre
task-uri (implementat in varianta proprie) vor fi alese astfel încât toate mesajele să fie
prelucrate corect.
P2. Modificati aplicatia dezvoltata la punctul 1 astfel incit comunicatia intre task-uri sa se
priorităţile task-urilor vor fi alese astfel încât toate mesajele să fie prelucrate corect.
#include <stdio.h>
/* Scheduler includes. */
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "croutine.h"
#include "partest.h"
_FOSCSEL(FNOSC_FRC);
21
static void prvSetupHardware( void );
xQueueHandle xQueue1;
xQueueHandle xQueue2;
for (;;)
contor_T1++;
msj_T1++;
vTaskDelay(500);
for (;;)
vTaskDelay(500);
22
msj_T2 = ( ( msj_T2 + 1000 ) % 3000 ) + 1000;//se variaza de la 1 sec la 3 sec
for (;;)
msj_T3++;
vTaskDelay(10000);
for (;;)
vTaskDelay(msj_citit_T4);
PORTBbits.RB0 = ~PORTBbits.RB0;
23
int main( void )
prvSetupHardware();
vTaskStartScheduler();
return 0;
/*-----------------------------------------------------------*/
void initPLL(void)
//PLLFBD = 30; // M = 32 XT
CLKDIVbits.PLLPOST=0; // N1 = 2
CLKDIVbits.PLLPRE=0; // N2 = 2
24
// Initiate Clock Switch to Internal FRC with PLL (NOSC = 0b001)
__builtin_write_OSCCONH(0x01); // FRC
//__builtin_write_OSCCONH(0x03); // XT
__builtin_write_OSCCONL(0x01);
while(OSCCONbits.LOCK!=1) {};
vParTestInitialise();
initPLL();
L7.P3. Modificaţi aplicaţia creată la exerciţiul precedent astfel încât să mai existe două task-
uri (T3
şi T4). Task-ul T3 depune mesaje în coadă cu o perioadă de 10s. Task-ul T4 va primi mesaje
/* Scheduler includes. */
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "croutine.h"
#include "partest.h"
_FOSCSEL(FNOSC_FRC);
struct AMessage {
portCHAR ucMessageID;
portCHAR ucData[ 20 ];
} xMessage;
int inc=0;
portBASE_TYPE msg,msg2;
26
void Task1(void *params) {
int k=1;
for (;;)
//PORTBbits.RB15 = ~PORTBbits.RB15;
//vParTestToggleLED(15);
if(k%15==1){
pxMessage = inc;
vTaskDelay(500);
k++;
int l=1,t=1,change=0;
for (;;)
//PORTBbits.RB14 = ~PORTBbits.RB14;
//vParTestToggleLED(14);
if(l%2==1){
27
if(l%1==1){
PORTB = (msg&&0xF000)<<12;
pxMessage = t;
vTaskDelay(15000);
l++;
int m=1;
for (;;)
//PORTBbits.RB13 = ~PORTBbits.RB13;
//vParTestToggleLED(13);
if(m%15==1){
pxMessage = inc;
28
vTaskDelay(10000);
m++;
for (;;)
//PORTBbits.RB12 = ~PORTBbits.RB12;
vTaskDelay(msg2*1000);
prvSetupHardware();
if(myQueue == 0){
if(myQueue2 == 0){
29
// eroare la creare coada 2
vTaskStartScheduler();
return 0;
/*-----------------------------------------------------------*/
void initPLL(void)
//PLLFBD = 30; // M = 32 XT
CLKDIVbits.PLLPOST=0; // N1 = 2
CLKDIVbits.PLLPRE=0; // N2 = 2
__builtin_write_OSCCONH(0x01); // FRC
//__builtin_write_OSCCONH(0x03); // XT
__builtin_write_OSCCONL(0x01);
30
// Wait for Clock switch to occur
while(OSCCONbits.LOCK!=1) {};
vParTestInitialise();
initPLL();
8.1. Realizaţi o aplicaţie cu patru task-uri: T1, T2, T3 si T4. Task-urile T1, T2 si T3 au
perioadele de 1s, 2s si respectiv 3s si transmit mesaje către task-ul T4 prin intermediul unei
cozi de mesaje. Fiecare mesaj va fi format din trei valori intregi reprezentind identificatorul
task-ului expeditor (1,2,3 sau 4), o valoare intreaga (intre 1 si 15) ce va fi afisata pe LEDurile
timpul minim pentru care trebuie afisata cea de a doua valoare. Timpii de aşteptare folosiţi
în operaţiunile cu coada, lungimea cozii precum şi priorităţile task-urilor vor fi alese astfel
încât toate mesajele să fie prelucrate corect. Sa se evidentieze in MPLAB valorile mesajelor
#include <stdio.h>
/* Scheduler includes. */
31
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "croutine.h"
#include "partest.h"
_FOSCSEL(FNOSC_FRC);
typedef struct {
int val;
int exp;
int delay;
} xMessage;
xQueueHandle myQueue;
for (;;)
32
//PORTBbits.RB15 = ~PORTBbits.RB15;
//vParTestToggleLED(15);
msg.exp = 1;
msg.delay = 1000;
vTaskDelay(1000);
for (;;)
//PORTBbits.RB14 = ~PORTBbits.RB14;
//vParTestToggleLED(14);
msg.exp = 2;
msg.delay = 2000;
vTaskDelay(2000);
for (;;)
//PORTBbits.RB13 = ~PORTBbits.RB13;
//vParTestToggleLED(13);
33
msg.exp = 3;
msg.delay = 3000;
vTaskDelay(3000);
xMessage outmsg;
for (;;)
//PORTBbits.RB12 = ~PORTBbits.RB12;
//vParTestToggleLED(12);
//vTaskDelay(1000);
if(msg.exp == 1) vParTestToggleLED(15);
//PORTB = (outmsg.val&&0xF000)<<12;
//PORTB=~(outmsg.val<<12);
34
prvSetupHardware();
vTaskStartScheduler();
return 0;
/*-----------------------------------------------------------*/
void initPLL(void)
//PLLFBD = 30; // M = 32 XT
CLKDIVbits.PLLPOST=0; // N1 = 2
CLKDIVbits.PLLPRE=0; // N2 = 2
__builtin_write_OSCCONH(0x01); // FRC
//__builtin_write_OSCCONH(0x03); // XT
__builtin_write_OSCCONL(0x01);
35
// Wait for Clock switch to occur
while(OSCCONbits.LOCK!=1) {};
vParTestInitialise();
initPLL();
8.3. Modificati aplicatia de la primul exercitiu astfel incit task-urile T1 si T2 sa depuna mesaje
in
coada, T4 sa afiseze valoarea intreaga (intre 1 si 15) pe LED-urile conectate la pinii 15, 14 ,
disponibil din coada cu o frecventa de 0.5s, continutul acestuia fiind salvat intr-o variabila
globala. In cazul in care coada este vida, elementele variabilei globale vor primi valoarea 0.
Determinati si analizati in ce cazuri coada poate sa fie vida si in ce cazuri coada poate
acumula elemente.
#include <stdio.h>
/* Scheduler includes. */
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
36
#include "croutine.h"
#include "partest.h"
_FOSCSEL(FNOSC_FRC);
typedef struct {
int val;
int exp;
int delay;
} xMessage;
xQueueHandle myQueue;
int firstMsg;
for (;;)
//PORTBbits.RB15 = ~PORTBbits.RB15;
//vParTestToggleLED(15);
37
if(msg.val > 15) msg.val = 0; else msg.val = msg.val+1;
msg.exp = 1;
msg.delay = 1000;
vTaskDelay(1000);
for (;;)
//PORTBbits.RB14 = ~PORTBbits.RB14;
//vParTestToggleLED(14);
msg.exp = 2;
msg.delay = 2000;
vTaskDelay(2000);
for (;;)
//PORTBbits.RB13 = ~PORTBbits.RB13;
//vParTestToggleLED(13);
// msg.exp = 3;
//msg.delay = 3000;
38
//xQueueSend( myQueue, ( void * ) &msg, ( portTickType ) 10 );
} else {
firstMsg = 0;
vTaskDelay(500);
xMessage outmsg;
for (;;)
//PORTBbits.RB12 = ~PORTBbits.RB12;
//vParTestToggleLED(12);
//vTaskDelay(1000);
/*
if(msg.exp == 1) vParTestToggleLED(15);
*/
//PORTB = (outmsg.val&&0xF000)<<12;
39
PORTB=~(outmsg.val<<12);
prvSetupHardware();
vTaskStartScheduler();
return 0;
/*-----------------------------------------------------------*/
void initPLL(void)
//PLLFBD = 30; // M = 32 XT
40
CLKDIVbits.PLLPOST=0; // N1 = 2
CLKDIVbits.PLLPRE=0; // N2 = 2
__builtin_write_OSCCONH(0x01); // FRC
//__builtin_write_OSCCONH(0x03); // XT
__builtin_write_OSCCONL(0x01);
while(OSCCONbits.LOCK!=1) {};
vParTestInitialise();
initPLL();
intre doua task-uri. Task-ul T1, cu perioada de 0,5s, va comuta starea LED-ului conectat la
RB12 atunci cind va aparea un eveniment semnalat (prin intermediul semaforului) de catre
task-ul T1. Evenimentele vor fi simulate prin intermediul unui vector, fiecare element al
dispozitivelor ICD2.
#include <stdio.h>
/* Scheduler includes. */
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "croutine.h"
#include "semphr.h"
#include "partest.h"
_FOSCSEL(FNOSC_FRC);
int i,j;
for (;;)
42
{
vParTestToggleLED(14);
for(i=1;i<v[j])
xSemaphoreGive(mySemaphore);
vTaskDelay(500);
for (;;)
//PORTBbits.RB14 = ~PORTBbits.RB14;
//vTaskDelay(2000);
/*
for (;;)
//PORTBbits.RB13 = ~PORTBbits.RB13;
vParTestToggleLED(13);
vTaskDelay(1000);
43
}
for (;;)
//PORTBbits.RB12 = ~PORTBbits.RB12;
vParTestToggleLED(12);
vTaskDelay(1000);
*/
prvSetupHardware();
vSemaphoreCreateBinary(mySemaphore);
44
vTaskStartScheduler();
return 0;
/*-----------------------------------------------------------*/
void initPLL(void)
//PLLFBD = 30; // M = 32 XT
CLKDIVbits.PLLPOST=0; // N1 = 2
CLKDIVbits.PLLPRE=0; // N2 = 2
__builtin_write_OSCCONH(0x01); // FRC
//__builtin_write_OSCCONH(0x03); // XT
__builtin_write_OSCCONL(0x01);
while(OSCCONbits.LOCK!=1) {};
45
//ADPCFG = 0xFFFF; //make ADC pins all digital - adaugat
vParTestInitialise();
initPLL();
L10.P1. Realizaţi o aplicaţie cu patru task-uri T1, T2, T3 si T4 ce au perioadele de 1s, 1,5s, 2s si
respectiv 3s si afiseaza cite o valoare intreaga (intre 1 si 15) pe LED-urile conectate la pinii
corespunzator fiecarui task. Controlul accesului la LED-uri va fi facut prin intermediul unui
mutex. Timpii minimi de afisare şi priorităţile task-urilor vor fi alese astfel încât sa se poata
#include <stdio.h>
/* Scheduler includes. */
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "croutine.h"
#include "semphr.h"
#include "partest.h"
_FOSCSEL(FNOSC_FRC);
46
_FOSC(FCKSM_CSECMD & OSCIOFNC_OFF); // FRC + PLL
for (;;)
//PORTBbits.RB15 = ~PORTBbits.RB15;
//vParTestToggleLED(15);
PORTB = ((PORTB&0xFFFF)|0<<12)^0xFFFF;
vTaskDelay(500);
xSemaphoreGive(mySemMutex);
vTaskDelay(500);
for (;;)
47
//PORTBbits.RB14 = ~PORTBbits.RB14;
//vParTestToggleLED(14);
PORTB = ((PORTB&0xFFFF)|1<<12)^0xFFFF;
vTaskDelay(500);
xSemaphoreGive(mySemMutex);
vTaskDelay(1000);
for (;;)
//PORTBbits.RB13 = ~PORTBbits.RB13;
//vParTestToggleLED(13);
PORTB = ((PORTB&0xFFFF)|2<<12)^0xFFFF;
vTaskDelay(500);
xSemaphoreGive(mySemMutex);
vTaskDelay(1500);
for (;;)
48
//PORTBbits.RB12 = ~PORTBbits.RB12;
//vParTestToggleLED(12);
PORTB = ((PORTB&0xFFFF)|3<<12)^0xFFFF;
vTaskDelay(500);
xSemaphoreGive(mySemMutex);
vTaskDelay(2500);
prvSetupHardware();
mySemMutex = xSemaphoreCreateMutex();
vTaskStartScheduler();
return 0;
49
}
/*-----------------------------------------------------------*/
void initPLL(void)
//PLLFBD = 30; // M = 32 XT
CLKDIVbits.PLLPOST=0; // N1 = 2
CLKDIVbits.PLLPRE=0; // N2 = 2
__builtin_write_OSCCONH(0x01); // FRC
//__builtin_write_OSCCONH(0x03); // XT
__builtin_write_OSCCONL(0x01);
while(OSCCONbits.LOCK!=1) {};
vParTestInitialise();
initPLL();
50
}
laborator astfel incit starea LED-ului conectat la pinul RB12 al microcontroller-ului sa fie
RB7/INT0. Task-urile Task1, Task2 si Task3 vor pastra caracteristicile din aplicatia initiala.
Task3 la fiecare 10 secunde. Task-ul Task3 va fi scos din starea de suspendat la aparitia
intreruperii INT0.
#include <stdio.h>
/* Scheduler includes. */
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "croutine.h"
#include "partest.h"
_FOSCSEL(FNOSC_FRC);
// P2
vParTestToggleLED(12);
for (;;)
//PORTBbits.RB15 = ~PORTBbits.RB15;
//vParTestToggleLED(15);
//vTaskDelay(3000);
for (;;)
//PORTBbits.RB14 = ~PORTBbits.RB14;
//vParTestToggleLED(14);
52
//vTaskDelay(2000);
for (;;)
//PORTBbits.RB13 = ~PORTBbits.RB13;
//vParTestToggleLED(13);
//vTaskDelay(1000);
// P2
// handler T4
for (;;)
//PORTBbits.RB12 = ~PORTBbits.RB12;
//vParTestToggleLED(12);
//vTaskDelay(1000);
// P2
//vTaskDelay(10000);
//vTaskSuspend();
53
int main( void )
prvSetupHardware();
RCONbits.SWDTEN = 0;
TRISB = 0x00FF;
LATB = 0x0E000;
vTaskStartScheduler();
return 0;
/*-----------------------------------------------------------*/
void initPLL(void)
54
{
//PLLFBD = 30; // M = 32 XT
CLKDIVbits.PLLPOST=0; // N1 = 2
CLKDIVbits.PLLPRE=0; // N2 = 2
__builtin_write_OSCCONH(0x01); // FRC
//__builtin_write_OSCCONH(0x03); // XT
__builtin_write_OSCCONL(0x01);
while(OSCCONbits.LOCK!=1) {};
vParTestInitialise();
initPLL();
55
aparitia intreruperii INT0. Sincronizarea se va face prin intermediul unui semafor binar.
#include <stdio.h>
/* Scheduler includes. */
#include "FreeRTOS.h"
#include "semphr.h"
#include "task.h"
#include "queue.h"
#include "croutine.h"
#include "partest.h"
_FOSCSEL(FNOSC_FRC);
//xQueueHandle pxQueue;
xSemaphoreHandle xSemafor1;
xSemaphoreHandle xSemafor2;
portBASE_TYPE pxHPTW;
56
void __attribute__ ((interrupt, no_auto_psv)) _INT0Interrupt(void)
xSemaphoreGiveFromISR(xSemafor1,&pxHPTW);
if(pxHPTW==pdTRUE) taskYIELD();
for (;;)
if(xSemaphoreTake(xSemafor1,(portTickType)0xFFFF)==pdTRUE)
if(xSemaphoreTake(xSemafor2,(portTickType)0xFFFF)==pdTRUE){
PORTB=((PORTB&0x0FFF)|(0x0A<<12))^0xF000;
vTaskDelay(500);
xSemaphoreGive(xSemafor2);
int val=0;
portTickType xLastWakeTime;
xLastWakeTime=xTaskGetTickCount();
for (;;)
val++;
val=val%15;
if(xSemaphoreTake(xSemafor2,(portTickType)0xFFFF)==pdTRUE){
57
PORTB=((PORTB&0x0FFF)|(val<<12))^0xF000;
vTaskDelay(500);
xSemaphoreGive(xSemafor2);
vTaskDelayUntil(&xLastWakeTime,1500);
prvSetupHardware();
TRISB = 0x00FF;
LATB = 0x0E000;
//pxQueue=xQueueCreate(1,sizeof(int));
vSemaphoreCreateBinary(xSemafor1);
vSemaphoreCreateBinary(xSemafor2);
if(xSemafor1!=NULL) {
if(xSemafor2!=NULL) {
58
xTaskCreate(Task1, (signed portCHAR *) "Ts1", configMINIMAL_STACK_SIZE, NULL,
tskIDLE_PRIORITY + 1, NULL);
vTaskStartScheduler();
return 0;
/*-----------------------------------------------------------*/
void initPLL(void)
//PLLFBD = 30; // M = 32 XT
CLKDIVbits.PLLPOST=0; // N1 = 2
CLKDIVbits.PLLPRE=0; // N2 = 2
__builtin_write_OSCCONH(0x01); // FRC
//__builtin_write_OSCCONH(0x03); // XT
__builtin_write_OSCCONL(0x01);
59
//while (OSCCONbits.COSC != 0b011); // XT
while(OSCCONbits.LOCK!=1) {};
vParTestInitialise();
initPLL();
60