Я бы на твоем месте крен допаял. Это самое простое.

Вот, смотри распиновку пика
3 3.3 Enabled, 2642 out, inv
4 PS on in,inv
...
15 V+12,+5 enabled out
То есть 3.3 инвертирован - 0 - запуск.
а +12 и +5 - не инвертирован.

У меня в программе логика такая:
Подаем VSB (если не было подано ранее) +5, +12.
Дожидаемся, пока не поднимется контрольный пин VSB.
Подаем +3.3.
Ждем пока не будет 3.3 корректным.
Если не произошло таймаута - поднимаем Power good и считаем, что питание подано.
Код:
		V12Enable_Pin::Set();
		while ( (timer<=100) && (!CheckVsbGood()) )
		{
			_delay_ms(1);
			timer++;
		}
		if (timer<=100)
		{
			V33Enable_Pin::Clear();
			while ( (timer<=200) && (!CheckV33()) )
			{
				_delay_ms(1);
				timer++;
			}
			if (timer<=200)
			{
				PowerOk_Pin::Set();
				PowerEnabled=true;
				AmpTimer=1;
				SetPwrLed(true);
				AddLog(145,2);//окончание включения питания - успешно
			}
			else
			{
				AddLog(147,1);//окончание включения питания - не успешно - 3.3V
				Ok=false;
			}
		}