Email: Password: Remember Me | Create Account (Free)

Back to Subject List

Old thread has been locked -- no new posts accepted in this thread
Frieder Ferlemann
01/18/10 05:29
Read: 249 times
Old Europe


 
#172543 - PWM IRQ code in C, lookup table, 32 byte
Responding to: Michael Karas'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:^)

List of 41 messages in thread
TopicAuthorDate
Controlling multiple servo motors      Yash Chitalia      01/17/10 14:47      
   executing code takes time      Erik Malund      01/17/10 15:27      
      PWM code      Steve M. Taylor      01/17/10 15:35      
         Thanks...now, about the PCA timer..      Yash Chitalia      01/17/10 16:06      
   If SDCC Then Keil      Michael Karas      01/17/10 16:15      
      PWM IRQ code in C, bitops, 45 byte      Frieder Ferlemann      01/18/10 05:19      
         Optimization having no effect.      Yash Chitalia      01/18/10 11:36      
      PWM IRQ code in C, lookup table, 32 byte      Frieder Ferlemann      01/18/10 05:29      
         I haven't understood the table lookup concept very well...      Yash Chitalia      01/19/10 00:55      
            table lookup      Frieder Ferlemann      01/19/10 02:39      
         PWM IRQ code in C, lookup table, 30 byte      Frieder Ferlemann      01/19/10 03:07      
            Compiler specifics      Andy Neil      01/19/10 04:35      
               absolutely-locating xdata at 256 byte boundary      Frieder Ferlemann      01/19/10 05:00      
                  I see.      Andy Neil      01/19/10 06:34      
            An example code..      Yash Chitalia      01/20/10 02:20      
               Keil: Specifics and non-specifics      Andy Neil      01/20/10 02:50      
                  Not really working...      Yash Chitalia      01/20/10 03:55      
                     Enough power?      Per Westermark      01/20/10 09:45      
                        RE: running 32 servo motors      Andy Neil      01/20/10 10:34      
      The chip sounds perfect...      Yash Chitalia      01/18/10 11:47      
         not worth it      Erik Malund      01/18/10 12:10      
            Servo control will become difficult then...      Yash Chitalia      01/18/10 12:42      
               output      Andy Peters      01/18/10 12:52      
               HCT chips have ...      Erik Malund      01/18/10 14:12      
                  Eval a concept with a single PCA and 3:8 HCT multiplexer?      Frieder Ferlemann      01/18/10 14:36      
               Check their website      Andy Neil      01/18/10 14:44      
                  Here is the code...      Yash Chitalia      01/18/10 15:28      
                     "sbit MTRS=P2^0;" is not OK here      Frieder Ferlemann      01/18/10 16:11      
                        Keil syntax?      Andy Neil      01/18/10 17:36      
                           "#define" not working.."sbit" works      Yash Chitalia      01/18/10 23:32      
                              Yes, you were correct originally!      Andy Neil      01/19/10 01:22      
            Seconded      Andy Neil      01/18/10 12:45      
   Servo_0.1.zip      Murray R. Van Luyn      01/18/10 15:02      
      links      James Hinnant      02/18/10 21:10      
   Eventually feed the guys at http://servomaster.sf.net ?      Frieder Ferlemann      01/18/10 15:12      
      servomaster.sf.net FLOSS      James Hinnant      02/04/10 11:48      
   Maybe of some use...      James Bowmaster      02/10/10 14:40      
      Whoops... found a bug      James Bowmaster      02/10/10 16:35      
         What bug?      Andy Neil      02/10/10 16:41      
            Bug      James Bowmaster      02/10/10 18:47      
   Improved version uploaded      James Bowmaster      02/12/10 21:26      

Back to Subject List