I'll give it a try, but firstly I see this: > servo values range from 1000 to 2000, 1500 is the center position
The min servo range should be 500us and max 2500us, this will reduce movement. Matt. On Feb 27, 10:36 am, savageio <[email protected]> wrote: > Hello Jalians, > > I found thishttp://www.mikroe.com/forum/viewtopic.php?t=13607post > with a great program for a 8 channel servo controller! The program is > in mikroBasic, I have translated it to JAL. It works very well, and > there is plenty of time in the main loop for doing other things. > > I would like to share this code with you, maybe it will be usefull for > the library. > > Best regards, > > Sander > > -- jal 2.4m > include 16f876a > > pragma target OSC HS -- HS crystal or resonator > pragma target clock 4_000_000 -- oscillator frequency > pragma target WDT disabled > pragma target LVP disabled > pragma eedata "xorservo" > > -- don't need analog > enable_digital_io() > > alias blink is pin_A5 > pin_A5_direction = output > > -- servo values range from 1000 to 2000, 1500 is the center position > var word servo_value[8] = {1000,1142,1284,1426,1568,1710,1852,2000} > > PORTC_direction = all_output -- 8 servos on port C > T1CON = 0b_0000_0000 -- prescaler = 1 = 1us ticks > ; timer1 off > TMR1 = 0x0000 -- Timer1 starts at 0 > CCP1CON = 0b_0000_1011 -- Compare mode, trigger > special event > CCP2CON = 0b_0000_1010 -- Compare mode, generate > software interrupt > on match > CCPR1 = 2_500 -- special event > interrupt every 2500us > INTCON = 0b_1100_0000 -- enable GIE and PEIE > PIE1 = 0b_0000_0100 -- CCP1 Interrupt Enable bit > on > PIE2 = 0b_0000_0001 -- CCP2 Interrupt Enable bit > on > PIR1_CCP1IF = 0 -- CCP1 Interrupt > Flag bit off > PIR2_CCP2IF = 0 -- CCP2 Interrupt > Flag bit off > var bit*3 sn = 0b_000 -- servo number rolls over > from 7 to 0 > > -- configure ADC > const bit ADC_HIGH_RESOLUTION = high > const byte ADC_NCHANNEL = 1 > const byte ADC_NVREF = 0 > include adc > adc_init() > var word measure > > procedure servo_control() is > pragma interrupt > if PIR1_CCP1IF == 1 then -- CCP1 resets TMR1; > PORTC = (1 << sn) -- Active Servo High > CCPR2 = servo_value[sn] -- Active Servo Value loaded in CCPR2 > PIR1_CCP1IF = 0 > else -- CCP2 Normal > Compare Event Interrupt > PORTC_low = 0 -- Turn Off Active Servo > sn = sn + 1 -- Get Ready for next Servo > PIR2_CCP2IF = 0 > end if > end procedure > > T1CON_TMR1ON = 1 -- Timer1 On > > forever loop > > -- set the first servo value with adc > measure = adc_read(0) > servo_value[0] = (1000 + measure) > > -- do usefull stuf here > -- update servo_value[n] with adc, serial, ... > > blink = !blink > delay_100ms(1) > > end loop -- You received this message because you are subscribed to the Google Groups "jallib" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/jallib?hl=en.
