??? 01/18/10 11:29 Read: times |
#172543 - PWM IRQ code in C, lookup table, 32 byte Responding to: ???'s previous message |
If P1 (or whatever port you connected the servos to) is free to use, you can also use a table lookup.
Thus you have no performance penalty within the IRQ for connecting up to 8 servos:) #include <8052.h> static unsigned char ms_tenth_countdown; // dynamically setup table. // Indexed top down. // setup glitchlessly! unsigned char __pdata table_P1_over_time[180 + 1]; void Timer0_ISR (void) interrupt 1 { // assuming P1 is only used for servos. P1 = table_P1_over_time [ ms_tenth_countdown ]; TF0 = 0; if (!--ms_tenth_countdown) ms_tenth_countdown = 180; } void main(void){} Now you'd be at: 0000 371 _Timer0_ISR: 0000 C0 E0 380 push acc 0002 C0 00 381 push ar0 0004 C0 D0 382 push psw 0006 75 D0 00 383 mov psw,#0x00 384 ; servo_lookup.c:13: P1 = table_P1_over_time [ ms_tenth_countdown ]; 0009 E5*00 385 mov a,_ms_tenth_countdown 000B 24r00 386 add a,#_table_P1_over_time 000D F8 387 mov r0,a 000E E2 388 movx a,@r0 000F F5 90 389 mov _P1,a 390 ; servo_lookup.c:15: TF0 = 0; 0011 C2 8D 391 clr _TF0 392 ; servo_lookup.c:17: if (!--ms_tenth_countdown) 0013 D5*00 03 393 djnz _ms_tenth_countdown,00103$ 394 ; servo_lookup.c:18: ms_tenth_countdown = 180; 0016 75*00 B4 395 mov _ms_tenth_countdown,#0xB4 0019 396 00103$: 0019 D0 D0 397 pop psw 001B D0 00 398 pop ar0 001D D0 E0 399 pop acc 001F 32 400 reti I doubt that switching compilers would help much in this case. What's worse: coding directly in assembly code won't help much either:^) |