DIY_EFI Digest Saturday, 7 December 1996 Volume 01 : Number 373 In this issue: Re: Flywheel/Encoder patterns RE: Plugs for Autronic/Motec Re: injector duty cycles Re: Flywheel/Encoder patterns Re: injector duty cycles Re: Flywheel/Encoder patterns Re: injector duty cycles Re: injector duty cycles Re: Flywheel/Encoder patterns Re: Flywheel/Encoder patterns Re: Flywheel/Encoder patterns Re: Flywheel/Encoder patterns Re: injector duty cycles RE: Flywheel/Encoder patterns Re: Flywheel/Encoder patterns Re: Flywheel/Encoder patterns Re: Flywheel/Encoder patterns Re: Flywheel/Encoder patterns Re: Flywheel/Encoder patterns Re: Flywheel/Encoder patterns Re: Flywheel/Encoder patterns Re: Flywheel/Encoder patterns Re: Flywheel/Encoder patterns Re: injector duty cycles Re: Flywheel/Encoder patterns Re: Flywheel/Encoder patterns Re: Flywheel/Encoder patterns C Prog ALDL See the end of the digest for information on subscribing to the DIY_EFI or DIY_EFI-Digest mailing lists. ---------------------------------------------------------------------- From: Mazda Ebrahimi Date: Fri, 06 Dec 1996 06:21:39 -0500 Subject: Re: Flywheel/Encoder patterns RABBITT_Andrew@xxx.au wrote: > > >can you explain your thinking on the 60 tooth wheel. I know > >Electromotive uses both the 60 tooth design and the 120 tooth design. > > We're looking at a 60 tooth wheel (over a 36 tooth) to improve our > timing accuracy when we use missing tooth reference markers. > > We use the industry standard practice of measuring time interval > between edges and using this time to extrapolate the position over the > next interval. Usually clocks with a 250ns to 1us time resolution are > used to drive the counters. > > There are a couple of other issues driving this too, which are > specific to our design and not applicable to MPI systems. > > Andrew Rabbitt Hi Andrew, This is exactly what I was thinking about when I decided to use 180 teeth. I figured if I use a lower resolution, I would have to calculate RPM (which I have to do anyway), then calculate time elapsed per degree of rotation (which is estimated), and load my counter. By going to 180 teeth, I've eliminated the last two steps, and all events happen once per degree based on an actual signal, not an estimated value. I realize that this approach also generates more interrupts per revolution, but it seems easier to work with. Best Regards, Mazda ------------------------------ From: Robert McElroy Date: Fri, 6 Dec 1996 07:21:15 -0600 Subject: RE: Plugs for Autronic/Motec Newark Electronics (www.newark.com) has a huge selection of AMP = connectors and an online catalog (not sure what the online version is = like though.) I don't know how they would feel about sending one of = their print catalogs out of the US, because I don't know if they do any = sales outside the US. Hope this helps you out a little. Bob M. - ---------- A mate of mine has the same problem, I thought we could get them = from=20 AMP in OZ, but apparently they are only available from AMP in the = US. =20 Dan dzorde@xxx.au ______________________________ Reply Separator = _________________________________ Subject: Plugs for Autronic/Motec Author: diy_efi@xxx.edu at INTERNET does anyone know where to buy the 36 pin AMP plugs that the aautronicSMC = and motec m4/8 use?? regards ------------------------------ From: Mark Eidson Date: Fri, 6 Dec 1996 09:06:43 -0700 Subject: Re: injector duty cycles I noticed that my fuel injected 75 280Z has a fuel pressure regulator that is controlled by manifold pressure. I assume that this compensates for presssure differential across the injectors. Has anyone made a system that uses an ECU controlled fuel pressure regulator to compensate for the wide range from idle to WOT? me *************************************************************************** * Mark Eidson Voice: (602)752-6513 * * Staff Design Engineer Fax: (602)752-6000 * * Manager System Integration and * * Verification E-Mail: mark.eidson@xxx.com * * VLSI Technology, Inc. * * 8375 South River Parkway * * M/S 265 * * Tempe, Arizona 85284 * *************************************************************************** ------------------------------ From: Walters Chris Date: Fri, 06 Dec 96 09:13:00 MST Subject: Re: Flywheel/Encoder patterns >This is exactly what I was thinking about when I decided to use 180 >teeth. I figured if I use a lower resolution, I would have to calculate >RPM (which I have to do anyway), then calculate time elapsed per degree >of rotation (which is estimated), and load my counter. By going to 180 >teeth, I've eliminated the last two steps, and all events happen once >per degree based on an actual signal, not an estimated value. I realize >that this approach also generates more interrupts per revolution, but it >seems easier to work with. I thought 60 was the practical limit on number of teeth on a timing gear - above that and you'd start to lose resolution. Rather than counting pulses, has anybody thought about encoding the timing gear such that you can read crank position directly off the gear? Sortof like a shaft encoder. Snake no cool Fords yet, one cool Dodge ------------------------------ From: cloud@xxx.edu (tom cloud) Date: Fri, 6 Dec 1996 11:09:28 -0600 Subject: Re: injector duty cycles >I noticed that my fuel injected 75 280Z has a fuel pressure regulator that >is controlled by manifold pressure. I assume that this compensates for >presssure differential across the injectors. Has anyone made a system that >uses an ECU controlled fuel pressure regulator to compensate for the wide >range from idle to WOT? me The Ford EFI also varies the injector pressure -- don't remember how. Tom Cloud ------------------------------ From: Todd Knighton Date: Fri, 06 Dec 1996 09:30:34 -0800 Subject: Re: Flywheel/Encoder patterns Mazda Ebrahimi wrote: > > This is exactly what I was thinking about when I decided to use 180 > teeth. I figured if I use a lower resolution, I would have to calculate > RPM (which I have to do anyway), then calculate time elapsed per degree > of rotation (which is estimated), and load my counter. By going to 180 > teeth, I've eliminated the last two steps, and all events happen once > per degree based on an actual signal, not an estimated value. I realize > that this approach also generates more interrupts per revolution, but it > seems easier to work with. Mazda, Bosch used a similar thing on the C1 brains for 84-89 carrera's, however they used 129 tooth flywheel for the 6 cylinder cars and then idle air compensator pulse width to come up with a rpm number. Basically the thing couted the number of teeth per IAC cycle and that x 40 gave the rpms. This gives a resolution of 40 rpms with a max of 10200 rpms. They use the teeth to get a 1.4 degree resolution on the ignition, rising or falling. But they do not use it for fuel. Your resolution would be horrible at low speeds. Typically an 8 bit number generating 0 - - 255 multiplied by 32 gives you up to 16ms injector pulse width with a resolution of .06ms. In your case at 1000 rpm's you've got 60ms from tdc to tdc with 180 teeth that's only .333ms resolution, or using rising and falling edge triggers maybe .16666ms, you're still double that of a 16bit timer running at 6mhz. The only reason I say this, is that this .06ms resolution sometimes isn't enough at idle for larger injectors, if your planning on running a low horsepower application with very small injectors, you might be able to get away with it. Todd Knighton Protomotive Engineering ------------------------------ From: Todd Knighton Date: Fri, 06 Dec 1996 09:50:40 -0800 Subject: Re: injector duty cycles Mark Eidson wrote: > > I noticed that my fuel injected 75 280Z has a fuel pressure regulator that > is controlled by manifold pressure. I assume that this compensates for > presssure differential across the injectors. Has anyone made a system that > uses an ECU controlled fuel pressure regulator to compensate for the wide > range from idle to WOT? me, Bosch used an electromechanical fuel injection system on a lot of the super high horsepower F1 cars in the mid 80's. They were running so much boost pressure (5 bar absolute) that standard electronic injectors wouldn't really work in that application. As well as the boost being so high they were running 100 bar fuel pressure or so to get the stuff to atomize. These engines were pretty phenomenal, producing 1500 hp out of a 1.5l 4 or 6 cylinder. Pretty neat stuff. They used the computer to basically control a mechanical type fuel pump (a la kugelfischer or something of the sorts). Now days, with all the hp limiters and no more boost they're basically back to boring old fuel injectors. Todd Knighton Protomotive Engineering ------------------------------ From: kleenair@xxx.com Date: Fri, 06 Dec 1996 12:31:27 -0800 Subject: Re: injector duty cycles tom cloud wrote: > > >I noticed that my fuel injected 75 280Z has a fuel pressure regulator that > >is controlled by manifold pressure. I assume that this compensates for > >presssure differential across the injectors. Has anyone made a system that > >uses an ECU controlled fuel pressure regulator to compensate for the wide > >range from idle to WOT? me > > The Ford EFI also varies the injector pressure -- don't remember how. > > Tom Cloud Every port injection system I remember from the big three have a vacuum operated fuel pressure regulator. The exception may be some of the new Chrysler products with no fuel return line. Best Regards, Mazda ------------------------------ From: kleenair@xxx.com Date: Fri, 06 Dec 1996 12:39:21 -0800 Subject: Re: Flywheel/Encoder patterns Walters Chris wrote: > > >This is exactly what I was thinking about when I decided to use 180 > >teeth. I figured if I use a lower resolution, I would have to calculate > >RPM (which I have to do anyway), then calculate time elapsed per degree > >of rotation (which is estimated), and load my counter. By going to 180 > >teeth, I've eliminated the last two steps, and all events happen once > >per degree based on an actual signal, not an estimated value. I realize > >that this approach also generates more interrupts per revolution, but it > >seems easier to work with. > > I thought 60 was the practical limit on number of teeth on a timing gear - > above that and you'd start to lose resolution. > > Rather than counting pulses, has anybody thought about encoding the timing > gear such that you can read crank position directly off the gear? Sortof > like a shaft encoder. > > Snake > no cool Fords yet, one cool Dodge The tooth wheel operates by generating an interrupt which in effect tells the processor the engine has advanced an X amount of degrees. Using the interrupt method is preferred because regardless of what is going on, the processor will stop what it's doing and attend to engine needs (i.e. load a counter, advance degree count, etc...). If we do away with the interrupt, depending on what kind of calculations are being performed, system performance will suffer. If we keep the interrupt (i.e. generate an interrupt based on encoder state change) what have we gained? We still need the cam sensor to tell us if we are in power or intake strokes. ------------------------------ From: kleenair@xxx.com Date: Fri, 06 Dec 1996 12:55:55 -0800 Subject: Re: Flywheel/Encoder patterns Todd Knighton wrote: > > Mazda Ebrahimi wrote: > > > > This is exactly what I was thinking about when I decided to use 180 > > teeth. I figured if I use a lower resolution, I would have to calculate > > RPM (which I have to do anyway), then calculate time elapsed per degree > > of rotation (which is estimated), and load my counter. By going to 180 > > teeth, I've eliminated the last two steps, and all events happen once > > per degree based on an actual signal, not an estimated value. I realize > > that this approach also generates more interrupts per revolution, but it > > seems easier to work with. > > Mazda, > Bosch used a similar thing on the C1 brains for 84-89 carrera's, > however they used 129 tooth flywheel for the 6 cylinder cars and then > idle air compensator pulse width to come up with a rpm number. > Basically the thing couted the number of teeth per IAC cycle and that x > 40 gave the rpms. This gives a resolution of 40 rpms with a max of > 10200 rpms. > They use the teeth to get a 1.4 degree resolution on the ignition, > rising or falling. But they do not use it for fuel. Your resolution > would be horrible at low speeds. Typically an 8 bit number generating 0 > - 255 multiplied by 32 gives you up to 16ms injector pulse width with a > resolution of .06ms. In your case at 1000 rpm's you've got 60ms from > tdc to tdc with 180 teeth that's only .333ms resolution, or using rising > and falling edge triggers maybe .16666ms, you're still double that of a > 16bit timer running at 6mhz. The only reason I say this, is that this > .06ms resolution sometimes isn't enough at idle for larger injectors, if > your planning on running a low horsepower application with very small > injectors, you might be able to get away with it. > > Todd Knighton > Protomotive Engineering Thanks Todd, that is a very good point. The way I was looking at the problem was that I have a maximum window of 720 degrees to fire the injector. By using the 180 teeth with rising and falling edges, I can control my duty cycle in 0.13 % increments (1/720), and I thought this would be satisfactory. But I can see your point about low load AND low RPM conditions posing a problem. I think I'll be OK on my current project, but I'll keep that in mind for the next application. Best Regards, Mazda ------------------------------ From: Walters Chris Date: Fri, 06 Dec 96 11:36:00 MST Subject: Re: Flywheel/Encoder patterns >> I thought 60 was the practical limit on number of teeth on a timing gear - >> above that and you'd start to lose resolution. >> >> Rather than counting pulses, has anybody thought about encoding the timing >> gear such that you can read crank position directly off the gear? Sortof >> like a shaft encoder. > >The tooth wheel operates by generating an interrupt which in effect tells >the processor the engine has advanced an X amount of degrees. >Using the interrupt method is preferred because regardless of what is >going on, the processor will stop what it's doing and attend to engine >needs (i.e. load a counter, advance degree count, etc...). If we do away >with the interrupt, depending on what kind of calculations are being >performed, system performance will suffer. If we keep the interrupt >(i.e. generate an interrupt based on encoder state change) what have we >gained? We still need the cam sensor to tell us if we are in power or >intake strokes. An encoder giving absolute crank position would implicitly supply an interrupt when the position changes value. Reading crank position directly means you wouldn't have to fool with timers or counters to derive it. You'd also know exactly what the position is upon start-up without having to store the last known position info upon shutdown. No way around the cam sensor tho that I can see. Snake no cool Fords yet, one cool Dodge ------------------------------ From: Walters Chris Date: Fri, 06 Dec 96 11:55:00 MST Subject: Re: Flywheel/Encoder patterns >The way I was looking at the problem was that I have a maximum window of >720 degrees to fire the injector. By using the 180 teeth with rising and >falling edges, I can control my duty cycle in 0.13 % increments (1/720), >and I thought this would be satisfactory. But I can see your point about >low load AND low RPM conditions posing a problem. I think I'll be OK on >my current project, but I'll keep that in mind for the next application. It does seem to be a sticky wicket -- you need big injectors to work at WOT because there's very little time to deliver the fuel but big injectors deliver too much fuel at idle due to minimum pulse width. Could you keep the pulse width up at idle but compensate by dropping the fuel pressure? Snake no cool Fords yet, one cool Dodge ------------------------------ From: Mark Eidson Date: Fri, 6 Dec 1996 13:18:27 -0700 Subject: Re: injector duty cycles Do you think the the Chrysler products are mesuring the fuel line pressure and compensating the injector pulse width accordingly? me At 12:31 PM 12/6/96 -0800, you wrote: >tom cloud wrote: >> >> >I noticed that my fuel injected 75 280Z has a fuel pressure regulator that >> >is controlled by manifold pressure. I assume that this compensates for >> >presssure differential across the injectors. Has anyone made a system that >> >uses an ECU controlled fuel pressure regulator to compensate for the wide >> >range from idle to WOT? me >> >> The Ford EFI also varies the injector pressure -- don't remember how. >> >> Tom Cloud > >Every port injection system I remember from the big three have a vacuum >operated fuel pressure regulator. The exception may be some of the new >Chrysler products with no fuel return line. > >Best Regards, Mazda > > *************************************************************************** * Mark Eidson Voice: (602)752-6513 * * Staff Design Engineer Fax: (602)752-6000 * * Manager System Integration and * * Verification E-Mail: mark.eidson@xxx.com * * VLSI Technology, Inc. * * 8375 South River Parkway * * M/S 265 * * Tempe, Arizona 85284 * *************************************************************************** ------------------------------ From: Anthony Tsakiris Date: Fri, 6 Dec 1996 15:11:40 -0500 Subject: RE: Flywheel/Encoder patterns >> It does seem to be a sticky wicket -- you need big injectors to work at WOT because there's very little time to deliver the fuel but big injectors deliver too much fuel at idle due to minimum pulse width. Could you keep the pulse width up at idle but compensate by dropping the fuel pressure? << Or, stated another way, you need big flow at WOT and little flow at idle. If cost is not an issue, how about multiple small injectors per cylinder. At idle, use only one injector. Unfortunately, adding injectors means all kinds of hardware modifications. Anthony Tsakiris ------------------------------ From: Kalle Pihlajasaari Date: Fri, 6 Dec 1996 22:20:25 +0200 (sat) Subject: Re: Flywheel/Encoder patterns Hi There, > An encoder giving absolute crank position would implicitly supply an > interrupt when the position changes value. Reading crank position directly > means you wouldn't have to fool with timers or counters to derive it. You'd > also know exactly what the position is upon start-up without having to store > the last known position info upon shutdown. No way around the cam sensor tho > that I can see. I still have not figured out why one could not replace the distributor with a 512 line Grey/binary encoder with 9 bits of absolute crank position. Make a backlash free coupling to the shaft and perhaps preload the shaft in the engine as well. Absolute position to 1.4deg on the crank (0.7 on the cam shaft) Cheers *<<<-| - -- Kalle Pihlajasaari kalle@xxx.za/ip Interface Products P O Box 15775, DOORNFONTEIN, 2028, South Africa + 27 (11) 402-7750 Fax: 402-7751 http://www.ip.co.za/people/kalle ------------------------------ From: Mark Eidson Date: Fri, 6 Dec 1996 13:37:46 -0700 Subject: Re: Flywheel/Encoder patterns Why not just have an encoder or sensor on the cam if you can get enough resolution? me At 11:36 AM 12/6/96 MST, you wrote: > >>> I thought 60 was the practical limit on number of teeth on a timing gear > - >>> above that and you'd start to lose resolution. >>> >>> Rather than counting pulses, has anybody thought about encoding the >timing >>> gear such that you can read crank position directly off the gear? Sortof >>> like a shaft encoder. >> >>The tooth wheel operates by generating an interrupt which in effect tells >>the processor the engine has advanced an X amount of degrees. >>Using the interrupt method is preferred because regardless of what is >>going on, the processor will stop what it's doing and attend to engine >>needs (i.e. load a counter, advance degree count, etc...). If we do away >>with the interrupt, depending on what kind of calculations are being >>performed, system performance will suffer. If we keep the interrupt >>(i.e. generate an interrupt based on encoder state change) what have we >>gained? We still need the cam sensor to tell us if we are in power or >>intake strokes. > >An encoder giving absolute crank position would implicitly supply an >interrupt when the position changes value. Reading crank position directly >means you wouldn't have to fool with timers or counters to derive it. You'd >also know exactly what the position is upon start-up without having to store >the last known position info upon shutdown. No way around the cam sensor tho >that I can see. > >Snake >no cool Fords yet, one cool Dodge > > *************************************************************************** * Mark Eidson Voice: (602)752-6513 * * Staff Design Engineer Fax: (602)752-6000 * * Manager System Integration and * * Verification E-Mail: mark.eidson@xxx.com * * VLSI Technology, Inc. * * 8375 South River Parkway * * M/S 265 * * Tempe, Arizona 85284 * *************************************************************************** ------------------------------ From: Todd Knighton Date: Fri, 06 Dec 1996 13:10:52 -0800 Subject: Re: Flywheel/Encoder patterns kleenair@xxx.com wrote: > > Thanks Todd, that is a very good point. > > The way I was looking at the problem was that I have a maximum window of > 720 degrees to fire the injector. By using the 180 teeth with rising and > falling edges, I can control my duty cycle in 0.13 % increments (1/720), > and I thought this would be satisfactory. But I can see your point about > low load AND low RPM conditions posing a problem. I think I'll be OK on > my current project, but I'll keep that in mind for the next application. > Yes, going sequential will definately help out that problem, the stuff I was referring to was group fire and fired every TDC. The only other problem I can see is unless your running a very fast clock, you'll run out of interrupt time at high rpm. The Porsche's with 129 teeth have a practical limit between 8000 and 8500 rpm's where with more teeth that will drop to 5733-6091 rpm's. But again we were using an 8051 with a 6mhz clock, but doubling the clock rate you could effectively have a 10,000 rpm setup. Something to look for further down the road. Porsche's setup also had a map that corrected for timing vs rpm, I'd assume this would be because of interrupt latency. You'll have a similar problem to deal with, should be easy enough to correct though. Be careful that your interrupts are extremely short, otherwise your program will just stay there and never do any code work. Your registers will have to be saved, or just make sure you deal with a different set all together. You'll also have to watch out for variable loading. After your calc's are done, you'll want to load your variables into the ones you'll use in your interrupts, if you don't cancel all the interrupts, you can be half done and load in some very strange values. Either cancel your interrupts, or set a check bit to make sure your not doing that. Todd Knighton Protomotive Engineering ------------------------------ From: Walters Chris Date: Fri, 06 Dec 96 14:20:00 MST Subject: Re: Flywheel/Encoder patterns >>An encoder giving absolute crank position would implicitly supply an >>interrupt when the position changes value. Reading crank position directly >>means you wouldn't have to fool with timers or counters to derive it. You'd >>also know exactly what the position is upon start-up without having to store >>the last known position info upon shutdown. No way around the cam sensor tho >>that I can see. > >Why not just have an encoder or sensor on the cam if you can get enough >resolution? Kalle has a good idea -- some sort of retrofit device in a distributor housing that encodes off the cam. This would work great *IF* you could get rid of all the mechanical slop between the crank and the encoder, like timing-chain stretch and cam/distributor gear backlash. Snake no cool Fords yet, one cool Dodge ------------------------------ From: Todd Knighton Date: Fri, 06 Dec 1996 13:21:18 -0800 Subject: Re: Flywheel/Encoder patterns Walters Chris wrote: > > An encoder giving absolute crank position would implicitly supply an > interrupt when the position changes value. Reading crank position directly > means you wouldn't have to fool with timers or counters to derive it. You'd > also know exactly what the position is upon start-up without having to store > the last known position info upon shutdown. No way around the cam sensor tho > that I can see. Just fire the injectors batch every TDC, and lost spark ignition or have the computer fire a coil into a mechanical distributor, then you'll never care where TDC is. Todd Knighton Protomotive Engineering ------------------------------ From: Walters Chris Date: Fri, 06 Dec 96 15:05:00 MST Subject: Re: Flywheel/Encoder patterns >> An encoder giving absolute crank position would implicitly supply an >> interrupt when the position changes value. Reading crank position directly >> means you wouldn't have to fool with timers or counters to derive it. You'd >> also know exactly what the position is upon start-up without having to store >> the last known position info upon shutdown. No way around the cam sensor tho >> that I can see. > >Just fire the injectors batch every TDC, and lost spark ignition or >have the computer fire a coil into a mechanical distributor, then you'll >never care where TDC is. Wouldn't this be wasting 7X as much fuel as needed since only one piston will be starting its power stroke at any given TDC? Snake no cool Fords yet, one cool Dodge ------------------------------ From: Mark Eidson Date: Fri, 6 Dec 1996 16:21:49 -0700 Subject: Re: Flywheel/Encoder patterns Many systems use only the distributor timing signal and work just fine for spark and fuel. Why would this be any different? Are there suitable encoders available to adapt for this application? me At 02:20 PM 12/6/96 MST, you wrote: > >>>An encoder giving absolute crank position would implicitly supply an >>>interrupt when the position changes value. Reading crank position directly >Kalle has a good idea -- some sort of retrofit device in a distributor >housing that encodes off the cam. This would work great *IF* you could get >rid of all the mechanical slop between the crank and the encoder, like >timing-chain stretch and cam/distributor gear backlash. > >Snake >no cool Fords yet, one cool Dodge > > *************************************************************************** * Mark Eidson Voice: (602)752-6513 * * Staff Design Engineer Fax: (602)752-6000 * * Manager System Integration and * * Verification E-Mail: mark.eidson@xxx.com * * VLSI Technology, Inc. * * 8375 South River Parkway * * M/S 265 * * Tempe, Arizona 85284 * *************************************************************************** ------------------------------ From: Todd Knighton Date: Fri, 06 Dec 1996 16:34:56 -0800 Subject: Re: Flywheel/Encoder patterns Walters Chris wrote: > > > >Just fire the injectors batch every TDC, and lost spark ignition or > >have the computer fire a coil into a mechanical distributor, then you'll > >never care where TDC is. > > Wouldn't this be wasting 7X as much fuel as needed since only one piston > will be starting its power stroke at any given TDC? No. Firing at every TDC versus Sequential firing at each cylinders TDC just means that you're firing the injector twice as often and half as long. Only two of the cylinders would get the happiness of being fired on at TDC while the others would get the fuel fired at some point other than their own TDC. We're only firing the injectors at the engines TDC, not each cylinders. It works fine because the fuel just atomizes in the port. Sequential tends to get a bit better emmissions at low speed conditions, but anything over 3000 rpm's and batch or sequential don't really make any difference. Todd Knighton Protomotive Engineering 1 6 2 4 3 5 TDC TDC Batch or Group Fire Fire Fire all injectors at once Sequential 1st rev Fire Fire Fire 2nd rev Fire Fire Fire Fire only individual injectors at each cylinders TDC ------------------------------ From: "Jeffrey Engel" Date: Fri, 6 Dec 1996 20:14:51 +600 Subject: Re: Flywheel/Encoder patterns > Subject: Re: Flywheel/Encoder patterns > From: Kalle Pihlajasaari > Hi There, > > > An encoder giving absolute crank position would implicitly supply an > > interrupt when the position changes value. Reading crank position directly > > means you wouldn't have to fool with timers or counters to derive it. You'd > > also know exactly what the position is upon start-up without having to store > > the last known position info upon shutdown. No way around the cam sensor tho > > that I can see. > > I still have not figured out why one could not replace the distributor > with a 512 line Grey/binary encoder with 9 bits of absolute crank position. > > Make a backlash free coupling to the shaft and perhaps preload the > shaft in the engine as well. > > Absolute position to 1.4deg on the crank (0.7 on the cam shaft) > Sarcasim? Seriously, Bill "Grumpy" Jenkins makes the point in his book on Chevy race motors that the crank flexs enough that isolating the timing is important. 'Course he was talking about 650+ HP. It seems to me that it would be easy to get so precise that the real world variations would confuse things badly. je jengel@xxx.net ------------------------------ From: Mazda Ebrahimi Date: Fri, 06 Dec 1996 20:59:50 -0500 Subject: Re: injector duty cycles Mark Eidson wrote: > > Do you think the the Chrysler products are mesuring the fuel line pressure > and compensating the injector pulse width accordingly? me Not that I know of (at least on domestic products) I haven't seen any sensors on the fuel rail anywhere. ------------------------------ From: Mazda Ebrahimi Date: Fri, 06 Dec 1996 21:03:20 -0500 Subject: Re: Flywheel/Encoder patterns Kalle Pihlajasaari wrote: > > Hi There, > > > An encoder giving absolute crank position would implicitly supply an > > interrupt when the position changes value. Reading crank position directly > > means you wouldn't have to fool with timers or counters to derive it. You'd > > also know exactly what the position is upon start-up without having to store > > the last known position info upon shutdown. No way around the cam sensor tho > > that I can see. > > I still have not figured out why one could not replace the distributor > with a 512 line Grey/binary encoder with 9 bits of absolute crank position. > > Make a backlash free coupling to the shaft and perhaps preload the > shaft in the engine as well. > > Absolute position to 1.4deg on the crank (0.7 on the cam shaft) > > Cheers *<<<-| > -- > Kalle Pihlajasaari kalle@xxx.za/ip > Interface Products P O Box 15775, DOORNFONTEIN, 2028, South Africa > + 27 (11) 402-7750 Fax: 402-7751 http://www.ip.co.za/people/kalle I might be wrong, but 1.4 degrees is alot of variation, especially for ignition timing. That's one of the reasons alot of newer designs have gone away from traditional distributors. Even the ones that have distributors, still use a crank signal for timing purposes and just use the distributor to distribute the spark. ------------------------------ From: Mazda Ebrahimi Date: Fri, 06 Dec 1996 21:19:23 -0500 Subject: Re: Flywheel/Encoder patterns Walters Chris wrote: > > >> An encoder giving absolute crank position would implicitly supply an > >> interrupt when the position changes value. Reading crank position > directly > >> means you wouldn't have to fool with timers or counters to derive it. > You'd > >> also know exactly what the position is upon start-up without having to > store > >> the last known position info upon shutdown. No way around the cam sensor > tho > >> that I can see. > > > >Just fire the injectors batch every TDC, and lost spark ignition or > >have the computer fire a coil into a mechanical distributor, then you'll > >never care where TDC is. > > Wouldn't this be wasting 7X as much fuel as needed since only one piston > will be starting its power stroke at any given TDC? > > Snake > no cool Fords yet, one cool Dodge Only for one rotation, until you find your reference. ------------------------------ From: Mazda Ebrahimi Date: Fri, 06 Dec 1996 21:17:32 -0500 Subject: Re: Flywheel/Encoder patterns > Yes, going sequential will definately help out that problem, the stuff > I was referring to was group fire and fired every TDC. > The only other problem I can see is unless your running a very fast > clock, you'll run out of interrupt time at high rpm. The Porsche's with > 129 teeth have a practical limit between 8000 and 8500 rpm's where with > more teeth that will drop to 5733-6091 rpm's. But again we were using > an 8051 with a 6mhz clock, but doubling the clock rate you could > effectively have a 10,000 rpm setup. > Something to look for further down the road. Porsche's setup also had > a map that corrected for timing vs rpm, I'd assume this would be because > of interrupt latency. You'll have a similar problem to deal with, > should be easy enough to correct though. > Be careful that your interrupts are extremely short, otherwise your > program will just stay there and never do any code work. Your registers > will have to be saved, or just make sure you deal with a different set > all together. You'll also have to watch out for variable loading. > After your calc's are done, you'll want to load your variables into the > ones you'll use in your interrupts, if you don't cancel all the > interrupts, you can be half done and load in some very strange values. > Either cancel your interrupts, or set a check bit to make sure your not > doing that. > > Todd Knighton > Protomotive Engineering As soon as I get a little more involved in actual programming, I'll come up with a lot of questions for you. Regarding the length of the interrupts, this is the way I'm planning things right now: I'll be running a foreground loop with no time driven tasks, which constantly calculates fuel and spark values based on latest readings. The result of the most recent completed calculations are four numbers: inj_delay, inj_ontime, ign_delay, ign_ontime (dwell). When an interrupt is generated, the following happens: -advance degree count, -check for reference count (i.e. at this degree count, do I have to load any counters? This only happens 8 times a rotation (v8)). -if reference is reached, load decoder with external counter value; -return this is in addition to calculating RPM. I'm running a 16 bit 32 MHz processor. ------------------------------ From: peter paul fenske Date: Fri, 06 Dec 1996 06:26:30 -0800 Subject: C Prog ALDL - --=====================_849911190==_ Content-Type: text/plain; charset="us-ascii" Hi All I was cleaning house when I ran across some C language routines to communicate with a HC11 EVB. This program would probably work for ALDL at 8192. CYall: peter - --=====================_849911190==_ Content-Type: application/zip; name="CCOM.ZIP"; x-mac-type="705A4950"; x-mac-creator="705A4950" Content-Transfer-Encoding: x-uuencode Content-Disposition: attachment; filename="CCOM.ZIP" begin 600 CCOM.ZIP M4$L#!!0````(`*JK41Q)<9I/>P$``*@$```'````05-#24DN2(6344_",!1& MWTWX#S?Q17V`=4.!Q]$-(2(('49?2,K6*1$W4J;QY[O;1MMD!?9XN.?K>O?1 MN8&0T#[`3:=UT;JH`UC%BXS+##*1;XMMM2V+ M`Y2Y#H:T+"I9[B!]YY*GE9"'OU`=<*DL`;/5%+P?SS.$S<=(B$62%R2^(;$F M@xxx.> MI^*H/DZ4/G#J%=_`Z=.G(Z6'3GU73^1"9,?U9WWZT)"1#J3.P+R4GRKP:CV] M=@xxx.`]=+^#, M#B/JHVY5*Z(!DL`=R,X'=E&W>C@+L77$ZB%[G2&Q>A@G0R0]:YFAFNE;,X^X M#3*P?:$Q/><:VG6O+$6]4?K MC9QZ)G:B:OBH_P)02P,$%`````@`Y$UU&FE+A75,`0``<00```D```!!3%1? M2T59+DB5TT]/PD`0!?`["=]A$V\P;#?J_?ZRY(U&;7J@]1Q$)]'51; MJUJ\J&_QO*\[_>N"DUH?%U?+?!UGTU)X1UMLJ\>GWU>=X(C=O#?ZO#,&O",, M`5/""+`DG`!6&MT1X(K0`5P2NH`S0C9\A]>$/F!!B!M--7J8OB#$](00TR4A MII\38CI]90_3+PBQSSDA]ID38I\/>,NB?$H)@xxx.N"/'#76H, M6'72$?0$[$WI&ASS-SV+K&3I6V0ER\`B*UF.+;+=96B1[2XCBVQW.;'(=I?. MR"#;/=N_*8TAFW/Y;HZ';,ZB,1RR.7.U.1"RDPYP\O;XZ/B(`()TR\$Z* M+(W4-O'!BZ+AS"8HLI),M8\@LFRL`0@"?RB$ZG[WQX#9>W5]$L^'W< ML^[K@B_4!>3XJ$&M"RZ)=1<+\!CBFSY0*1C#;]]^MUDL4/;8--[&(HOO,NQ8 M=Y,9@xxx.JXS8#ZB,@WFY!`!+)G-FMR0J=IH MD[5U?^8OBIT8O`F&43`,.S"^#G:I)(R+\P\?`0FH6#3J56+$:@xxx.:: M5E45.J*"@L<_=WEAQ$K7:*1+/$O=,XA?X&L?&U`E%A==DHD# MVJBP4J%*,`>D'+\U.Q-F9C097.ZIC!E.$E2*<+9"%1*R6"=+%TSI/II,R/UR M<#N"-]!]O+JJ8;C`J.%V$,[A3FB07*BZP,Y_ZOP_?8(+O]>.[&HZ/Q09(S\4 M,H4,\WN][`#JY*Q.K>Q+Z,,]ZBTF&CP[N?Q>4WMD5Q:);8I*/*KEU'$-;",A M=^OPW:>ZMWWG7@xxx.;`^5G8A26?>J]8UPIV&3$_N(`B*Z_PG" M7Z+I["<354,ZE6R*O,5V,&9*#PT4LH%O;Z=GQ\JZ#VKX^+\0Q>(SEU5MS]7G2M14,-I50L M%B\JU*VB7KT>RFQW]-UBA%#+45:RL#?DM8QSM1*L)"R95[YU-$YF86^#V]X18]]Z/>!$R;\AUB8O3W>H8H>$,N^F[M,YSTV`SW9 MCS198O*G^;^0XT.EPBI27FBCP7P0A:/?6B.[:LD%J&*%>BGR>P,BZN[YVN0F M=W=EV=,=JMP6ZUUF)\'IZ4$-NVV,I^@xxx.'77,:,]V[/ MZ[:(IP>VF.<-RYJ5IOZ),L=TPU**60U-@xxx.Y' METY]Q?-_6RV"S_CWZ:*^@xxx.N[-W_ M)/O3KNP[W3^=?1JSS8LC%%JIH)Z!U2K*DB+';[-#^B?[3#9

9!D7,C=0^!],I@:MRLQIEY-&"I:3(<:'RHDI MQFJP@6Z<,[OIM-JV;:0ELFVGFM9_.+B?)ZYAP\IR(,X,,YK$D10\QV+%<45Y65Z&#B?U;HTVYT3B6$ M7T%RR#,241L=?EYB1=WH+1%WH,(:K!W;72HMG/M!-YKN:-J%7KI?$.V<=:-3 MLDYH#AD13#XTZ@XG&GW:B1[TWF+H(>229[F-_GT>8!#L&1[F! M=RCG(1K[1:VWQ4;T+V,8(/JLAG[LF%P26>3/:)A&QX2![W9JKJ3.;]E&HGN@ MVPR)L[(//VETN^8*?T^WSQX2M^?SJ:OGT7DMX1!+U)\_6)+IKU'X=#CMYQP$A>;G;@*78 ML$WTH)/W(E>U\$)FA81A&W-^&'3S[M._"YKK^`%-8^#]K,%[Z'?S/D/20RJV M+%6E^X;]!N_/WFPV[_X\F#T]G2,B!%..3=LW:C>[Y8GI++#C61JSB$CL/*OV M0-?^Q'36!`1*OUKM^],J_-YTGB:4B#WUS7XWA1^VS+[N6Y+>8+\8CNP9XZK* MGYS.:MTXB&'PYMRQ8V/A71W3B*TYLM%8>.=TMM&:H\>.\5*)8R"3U6;XL:ZQ M.\:=!8'7Q1Q+)?`4JU=B:][.!_:9.E?@5NKV\U4A];0I9Y6%#B>NUTK=8VP] M_]^X1/?,?L:W,L9BFDFVPGQ53WV'09LZ;#3H&/$90B][, MP4@xxx.G-)_=ZG0BOOUI#_<;1C8BOB]P?R M,]'JZWM]L\^:JGG51:I#M5*7#*_"Z8VEVMGP[7M8"L;UT?FHX=2<58F2K=(O M!Y+&UFUF?RI[TY4W]5L&E14_DD(??LTS'=$+C6[D;Z&W)+^KH6O5X\M2ZY7$ MO.,.^J.:FP/N\%VH]4IBT,/^Z1-H]\K3MM;*73S--C52*_1/FOH9C1(BB-D+ M2&TF^(T@xxx.\ M_DIAW]+.O@S*PIQ1LRY,8H`ZXO)@' MJHC:^>%?NP`OM;V&OP@O5O[L#SAFZ2J3`EY^P)L'_O,5NI,/&<7WU2+-V0V^ MDD:W1,#Z0=)QRR(.-/C&13PN=\/'A*])`CLBF'GO^+&/J9W>*YU3V'$6USKF M^(0G\2K?1:_@xxx.Y7ZV*S^:L2]__CQBT35ZFH M12_1NB##S-@xxx.\H2C=;MFHLW.OH.14[5KY0EV@F5PH(Q_A?_7QCG#')2,+^H<;)/KI&"YI+ MKC)M`R.Z6J\:1V]'Z`G\9U-'_!5!+`P04````"`"!:U8=SC&_SZL````)`@``"0```%-% M5%!/4E0N0ZV1.PO",!2%]T#^@xxx.RAK1&+UD@:41#_NXG: MX-!LW>[Y./!QN)0T%X6.*U:+%IX)5R'5E)(G)8#)7$HAD<)/*#&LNS>J/L+[ M]8!/$ZC+CB.8?8..HF6502FR51$D/<\W:U9L%QKK*RXLUR66+W?65Y) M7IZ2/T7H4(3#BLBEF+L5D4,1C;&L`DTCTN9?WG,M#2L/7,+U;WL_F-\'@xxx. MV'7A]?#EB^'KER_T:+AC$EBV28J(0LP2"AN>*<(R"2F7"G@,:D?RE:F=`9;?4#2EF?KUY0MS$XY1X-6_(T7)(]E2!Y M2D$]Y2S;F@$,4,$U7P9>OQ=QV;JS9N;6,W5TDI0\F>DAI[I0K0?/*-A9ZN$9 MSWY2\)4+\01DS0O]_Z[D+.9)PK_BM").Y1M8ZT'-K2P$A5)DY([#`Z4Y,`4L MAB=>0,JV.P6%I%J\B,4Q%9I5V%,AM6RH`=3@^C(LQ)J#UGK"14*R"*;#Z<\_ MH]HY2Z@8#`;/ZK+39[$6`^[O-WE22/QTU6]ZJVPF##L>/)8!M,!V4(>8KE:_ M^W\/]$@]'6I4Y#D72EHL_`B3Z4$CFDC:%Z6M=#W*R,S@&"73'&$UAI#/&38Y M\M52H%HA!YJ_$OP6!U%D=3XSH^_T;@F845\D3UT,=O&)B_90C`XPLHT<'RG4 M]]QZP;@xxx.;Z[J(Y[_C_ME\`G_7BSK`V@IWFVH$<[44-@,/^H)/^H- M/^X+/^D(/^Z;_?S_,ON+OMGWAC\]>]L9J,V?C+K3LC5PE9YKCY\$A8CC&*DW M!WUKNJ)QI$I"+'@*=?O`0<,RB2)!I<04CV:M&Z,O]Y>KT:6C`VZ95+KP006? M?PGG_BTD&!O7%)J6V0Q(:A6T;@xxx.#U;*S#%(N$$+LLK,;BZ85@TG% MD@xxx.:CDH(^ZE$Q_34'X MT7_?(9M.\0%;R8&_S!:_3_#BKT<]:W!_\C_!9XO%M\'='OCR%-P]`_?F)R=_ M%NZ=A(^ZED(-OIB>A(_/P)>GX1?GL@xxx.$"OTW MVR;T;7FD*L]D;V#3\BJH]7W",BK+TP;N]\7Y3>_7KCTJ_.B#4UWZD\;E;+%H M7B[!K2Z]N=^X]'P859=:6!A7EUHHN*B-!CY%A6/`$UDRU32U#![*V02-T`[QY:[R1).#=!B9`1)168D>I&ASE6=C=QT8^ MF)Y)49_)&9P)D4$$=LSR<7Q,%.B@XG_2:,O^M%H<>$7 MM'>9DPUMHL-/*]PE^M$I$0]X8+389N[Y*@"-=OO1=$^S/O1J?HMHYZH?G9%U M0B7D1##UU*H[G$#GRCVBW<$EIAZ!5#R73?0_%X';Z3J(=ASX`)?OP=%AX!W* M^1P]LI;7E1O1?WL/+J*O:NBJ8_#YIY#?T3"MC@D#?]ZKN99:[EBL,#S0-$?B M&K,//QITM^8:O>-)A(O)X)^A)Q[T:[X6E#SH4A3=*!K5YGY`W\RA7_-8D!03 M4R%LG[?1JQ+=J7G9)`UP`WU7HCLUYWL-+++^W#/?HCLU][]8>]#E1T]UM-%\ MR2.:?K]--#5?W-VM3J^UA&](HG_S?$TV#ZW:/X>C7M[1(!0O5QON5[+-W.?0 M[>6]D+H67JB\4##J8LX/@W[>??I'0:7)']`L`C[,6[R'?C_O,R0]I")EZ-2^ M9;_%^WLQ<5W[2G?6X M#1"!^_;::>;&POLZII7;<-1$8^&][MQ$&XZJCO$RA3:0J\-B^+:N:7;,?!8$ M7A]S>!KD&5:OQ3:\7;O-/76AP9W4'?U5(XW;E%[50(>3N==)797;^/_;:W"? MK=2Y/[GQ.JFKT#._PG8RQR*:*1:7KP[/,-ADSINY/0:/&?2@-W,PTP`"7H@- M;![N-!D]Z&%E_UO8T8ZFS;Z;._1S0.GK#Y+\=[=C<>(8^;,C?B=8?WQO: M==96S3L]Y5.UJ=/D+K`3C9NNL-)S:O0J?.8Z/\N;QH7Z: M.>[*WO3>F_H=1M7(OU'";'[M/1W12X-NS;^!3HE\J*%KU>.+H\XCB7VK[@[' MM3#/N,/W0IU'$HL>#2].H.=WGKG76?D<=[.X1FK%_`__!5!+`P04````"``9 M1D4=MPO/<6("``!Y!0``!@xxx.A"\%\A_F%N=P'8EUPCJ M`#TD_D"#U]2.8Q>YTM)*(DJ1>OR(X7]?DG93JU507;0R=V9G9Y=&Z[FZNL*C MX]F/`9/Y8,:U/0PVI&LNFP%<'P MNA%D+!IE#-\)0G.B*)1&INK:29XQRV5Y1K/GML)!.8WY][LM>LQBD& M;6/D&J%8'H?#!05$,#VL;9?:5;EM?-0+8U]I-?6S1,&DZ3;X.D8Q^?[VZ2%8 MH4/J6?)_1`UJ"M?+4A[L#>5WKC3]V,G]>R%@]2$(,[Y!4YV!?6H-+I$[0J:< M-C1\8Z&[GAE[(:R)S&!3J9JUK5W3"S=JF"!J&XU]6\TBV,UEIHD9W[GO;Y2@xxx.0":'V M.,[1?\[GJ_7RX6VH,UR6N-LN%K=?EVW'XI_B9)PF_A76),^]M'C3/BPFQXMV M6JH`^PE02P,$%`````@xxx.M M5VMO&D<4_5Q+_@^W-'(A<@BX3A2;$BD!G%BU$V)#9=6QT+)[649>9NC,+#:- MW-_>>>QC%MAMI':1[&7FWG/?9X:7S^%+?]3L0?73OQH!K."HV6[!R7&[U3H& M>/YR?V]_3P/$Q+^'GRGT"9=K&"%?$.I%L.0LY-ZB%#0#*`)[08`!B#E&$4@& M_<_7U0`_$>I'<8!0^S.0D]51NSFO)<`?(C95CJP\3KQIA`*^\['`T[5$X(^3 M:3R;W;X?GTVNS_\8W'4<.67BZ@8"3WJ@A9"[`(1*`$(G2\E=G:(ZH0'QE6-L M!I$G)/ASCXM-$%_SG8@*'6D)BTO`R)L M?K1HKLYC"ET878T'G1_21VFE==7;L\@xxx. MO#B2>A>6C$L@`MJYV^=77R:7U[\I=?5V?-FQJTIXZFA?[-+"(Q3J^LWCH7]H,@S/U?OJ]JZQO_=M?P_`5-KOZ%<3^#VN M#0)D@,I&AJN$9E#7:/`6V@V]8%``?"7F24;,[NJV?=?HV`VM4%?BRM,&'!R` M>O^U"\>-AMV&-`X_D<=(X,96B-)Z4K>@xxx.' MQ(#^:XT(9525,U^R*2+):F-G8YJV)I)X$?D+XII\9&L,$A\,DF+ MI>F-NK\=ENEZW1I$`J,@4XK+?++VIX2)>UQ#757YQRZT&AOV]=Z2HQ#*L(*Y MG^;VOZ5N:)DN9$BM36<4DAEU(CL:DC*99=;IM*[!.="CTCH[,]Y\&E\T[-0_ M2J2:8[6(SP)TU#,W3#YL,K?RH3`D]ZA8$.FDM."&=20OM5L-FPNGL):&W%I4 MU4-;GR,UW(?ZA.A=C=0_YJ@_I2^ZZ:'DL6YL)>-P=S;2E+Y]"V^V^M441*#/ MZ&X<@xxx./J(?JX!F,?4E870[G*=D[$'9$Y)Q+!M`ZY(589R$ MAFA7Z,L$DZ.,.36]M;]G>&3%2%#PT3)BRH^6,PUO<+982A6;)GFQ1#]ECP>B MJJ5C<^E0'P+O+D:]TQ(G_0@5<#9-PN>(;N!^Q-5:RGCZF:I4WW>*\/TR>'N' M8+$LW"-2>*-^=G*:&4LBLER+=`7UFDK<]7#0J^4.Y$EPY897GR^'(T=L&1=V MNJ/U$F%PM-WKV<3]1D^^^!HB[60J"&467M8YDURZIIVT5$R.T2M;,2Z?V)*NKRWUIB6-H2 M*,'S)5EA?OMPHZN:+#-5$6H32XXKPF)A`7)UB@_9(;WKOB6D-U5!S+5@:MQ1 MWQ7*35DH^$B*C;U1*'M[LP=LE8%QF8%X&3$O@)D^;94=Z?$0Y49M7I\ZWX;A M>'GJ=.K$J):4*CGC,_DI8DE9GPHL9>7T:\I.V4'Q?G!19+0%"N&%R@5+8`L1 MICHAD^Q1']2'Y[[W)_<=[7!ZB,Y1NC#N]2+-:^](?V9]](.*EWA?Z%(09BR+V0&B84H(X MK6UH?J5?J?'BW<7H12\])W:<(Y6*_90RBR?$MD["^AS.3BH!!U9PBSTKE3XF MHV)(4,Z)L`S(9EGX50ZU*[&'283H_,ZZU?UZ"+\DS*@F-L=EL MUG9,[(YV?-K?^P=02P,$%`````@`JX9$'4`,&S_)`0``L`0```D```!11%1? M5C(Q+DB5D=%OTS`0QI^'Q/]P&B^E$JW$(T%(L`&J8)1U14(@9#GV)3GA^"K; M6=?_'CM)1Y(.B3529?U\W]WY^YZ15:;1"*]]T,2+ZLW3)R-F*#^!CFPY@8KM MB3HG]A.D>S)@xxx.9&_3P MG[_Y,C7`NX#.0GX(".Y.Y$U1_'SW[8.X6?UX_RM+=7'$YCMH&22D6W3#!KV< M;(#X)W;!99,Q44Y6DXJ+<0%&^@xxx.\H!+3`#AQ*_8_I*EIH MY"$[.YO,CB4OTD2IX@xxx.Q826-0%7Q<'R4HVT]76KRG;FI9FQ=:I`2S*7' M;$17FVMQ=?-I#"_65V+U93N&.W9A3-AHT=,^YVV%4+`QO"=;0M%8%8BM!^D2 M;ZR..KB^W"XN7CV0\RV3!LTB;EK+6#MK$U?/L_XJ1]S!+!WO48W>RQ)AEMR# M>>W+^RN+^W:[B<*0#Z)",^CTR.7%Y_7;R\$+NN6[!4H,HB`3(ZGQ.&`05;P& M":D`VHJ_#=K==DVGGBJ/\N"D]36%KL-X_F,>\'6]&48P<-]7?'3MF'ER*)W3 MT\9^)NHCC7F-R_\`4$L#!!0````(`(.J1!T;47)*7`(``.\%```*````4414 M7TQ/040N0YU476O;,!1]#^0_W'ATM4-QD["';5D&HR0P"-M(VZ>V&"/+C:DC M>9*\-I3\]^GJPQ]I]C(].,K5\;WGGGOD=P4C99U1"'YG*ODSF\;;8#@8#L@V M%3!^I"K)BY*R=$`NOIY^>H#P MR]7F*X;I2Z&BSQ#8MS1%":&G@xxx.V+LU`0ZC`O"G1&S!0RP`3/&\-^1%_ZNIK">A*?1]Y MS5!^!QGUY'[UJIN.]/LYK\PD$R>]:'3W60SN:&9-FF.GV=7WVYD$QK6^O&99 M'%PX[B?Q]^R>_1)42DC9'I[H'EU).%,%JVD<8H=NLIP?Q^B,2,2':70 MS9F;8)OST4.[-=?@xxx.[_->8W0RD+#C3(]Y5)54T!OC_\9_RHF/D?EH1FTF] MY2FW_#FIN%`0XM/G.C1?G9R47%)O`_^Q^0M02P,$%`````@`C*I$'6<>_<\[ M`P``XT!7I_WOM4U"3-ALI>K\`>%GOWDSXYF!ZP;N M[Q;+CQ]FB]805W"CB.UC##],\.W0IJ"@xxx.T)YXQC@'9?70?B?2B\`/7T'J!O M`IX;$]B]PT9NV7:Y4M!`.6GW,WP\NU].Y[])6'[K3H^XO+0<_[Z`4OJG/3SB M*T[<3=^0<$HDG)+HELBT?TF4?AD[2:1.&ID;VB_MU`S\Y;]OX=#-;@xxx.',!:$P_5]3N*8Q"A?JKJ`<(WZ&ZUBE@06[V=2-8OP M!^EONW]D2LW%G_!=X2)@D1_2!Z6<691K=OLZ>Y:R5\EZ+;W5Y)Q]-YF\REZY MB0\_W(6Q3,UDCM63("9[6F#;Y>QID3T>%3T_98=4II3^:B?093L]64->('+X:6C;Q^$\JWJ;]C&K/(X8/O4NIZ):8\]W'_933A-=)KH_MU#S4I5I*CT2;KL!5(L1[/!ZUF' M_=?C!%'3X]*^[)T"3A'H%(%N#ISX^UG_B@P#ESZHKC1\_M[KU9KPK/XKO(]J M9L"E3]B0)\53U1+2A+1:K9K)U"$>(LR@+/>J#G"%R_9E/W]_:6='Y-F:LRUN MYL/Q^*3XY-*ON9A]&ADFS;F8!CZ:#XW`#<1F=,]G;96QCIVE>LFL_N*_!R_B ML<]=WB&/P)7P&=X8@FVQ*7-@QW\*M<+MG1X_P)02P$"%``4 M````"`"JJU$<27&:3WL!``"H!```!P`````````!`"``````````05-#24DN M2%!+`0(4`!0````(`.1-=1II2X5U3`$``'$$```)``````````$`(````*`! M``!!3%1?2T59+DA02P$"%``4````"```4%$<1J,+-Q($``!Z"@``"@`````` M```!`"`````3`P``0T]-7TE.5#(N0U!+`0(4`!0````(`-I.41P-S2@9]`4` M`$L4```*``````````$`(````$T'``!#3TU?1$5&,BY(4$L!`A0`%`````@` M@6M6'04```8````````` M`0`@xxx.6-Z?P4``/\0```) M``````````$`(````.T7``!11%1?5C(Q+D-02P$"%``4````"`"KAD0=0`P; M/\D!``"P!```"0`````````!`"````"3'0``44147U8R,2Y(4$L!`A0`%``` M``@`@ZI$'1M1