3 #include <lpc21xx.h> // LPC21XX Peripheral Registers
5 #include <system_def.h>
10 #define SERVO0 (1<<12)
11 #define SERVO1 (1<<13)
15 #define TIM_EMR_NOTHING 0
16 #define TIM_EMR_CLEAR 1
18 #define TIM_EMR_TOGLE 3
20 #define TIM_EMR_PIN_ON 1
21 #define TIM_EMR_PIN_OFF 0
23 #define TIME20MS ((CPU_APB_HZ) / 50)
24 #define SERVOTICK (((CPU_APB_HZ / 50) / 20) / 256)
27 unsigned char servo[3];
31 // ---------------- SERVO PART -------------------------------
34 void tc1 (void) __attribute__ ((interrupt));
40 T1EMR |= (TIM_EMR_PIN_ON<<0) | (TIM_EMR_PIN_ON<<1) | (TIM_EMR_PIN_ON<<3);
42 T1MR0 = (servo[0] + 256) * SERVOTICK;
43 T1MR1 = (servo[1] + 256) * SERVOTICK;
44 T1MR3 = (servo[2] + 256) * SERVOTICK;
51 T1IR = 4; // Vynulovani priznaku preruseni
52 VICVectAddr = 0; // Potvrzeni o obsluze preruseni
55 void set_servo(char serv, char position)
57 if (serv == 0) servo[0] = position;
58 if (serv == 1) servo[1] = position;
59 if (serv == 2) servo[2] = position;
62 /* Setup the Timer Counter 1 Interrupt */
63 void init_servo (unsigned rx_isr_vect)
66 IO0DIR |= (SERVO0 | SERVO1 | SERVO2); // enables servo output
67 IO0SET |= (SERVO0 | SERVO1 | SERVO2); // sets to High level
69 PINSEL0 &= ~((PINSEL_3 << 24) | (PINSEL_3 << 26));
70 PINSEL0 |= (PINSEL_2 << 24) | (PINSEL_2 << 26);
71 PINSEL1 &= ~(PINSEL_3 << 8);
72 PINSEL1 |= (PINSEL_1 << 8);
81 T1MR0 = (servo[0] + 256) * SERVOTICK;
82 T1MR1 = (servo[1] + 256) * SERVOTICK;
83 T1MR3 = (servo[2] + 256)* SERVOTICK;
84 T1MCR = (3<<6); // interrupt on MR1
86 T1EMR = (TIM_EMR_PIN_ON<<0) | (TIM_EMR_PIN_ON<<1) | (TIM_EMR_PIN_ON<<3) \
87 | (TIM_EMR_CLEAR << 4) | (TIM_EMR_CLEAR << 6) | (TIM_EMR_CLEAR << 10);
90 T1TCR = 1; // Starts Timer 1
93 ((uint32_t*)&VICVectAddr0)[rx_isr_vect] = (unsigned long)tc1; // Nastaveni adresy vektotu preruseni
94 ((uint32_t*)&VICVectCntl0)[rx_isr_vect] = 0x20 | 0x5; // vyber casovece pro preruseni
95 VICIntEnable = (1<<5); // Povoli obsluhu preruseni
99 // ---------------- powSitch PART -------------------------------