Maybe you can employ the definition of SP500 to determine at-the-money strike: It might be because you are missing the correct strike, so the prices of calls and puts always differ.
http://www.cboe.com/micro/skew/document ... alculation of S&P 500 forward price and determination of at-the-money strike:Similar to VIX, is calculated from at and out-of-the-money puts and calls. The atthe-money strike is defined as the listed strike immediately below the S&P 500forward price. To find the forward price, find the strike for which the differencebetween the midquotes of the call and put is at a minimum."By the way, would you mind to send me your worksheet to have a look... just curious...