예제 #1
0
        private void buttonVDDOn_Click(object sender, EventArgs e)
        {
            float vdd = 0;
            float vpp = 0;

            labelGood.Visible     = false;
            labelVDDShort.Visible = false;
            labelVDDLow.Visible   = false;
            labelReadVDD.Text     = "";

            // set VDD with a low threshold
            float voltage = (float)numericUpDown1.Value;

            if (Pk2.SetVDDVoltage(voltage, 0.45F))
            {
                // turn on VDD
                Pk2.ForcePICkitPowered();
                if (Pk2.VddOn())
                {
                    // check status first for shorts
                    if (Pk2.PowerStatus() != KONST.PICkit2PWR.vdd_on)
                    { //short!
                        labelVDDShort.Visible = true;
                        labelReadVDD.Text     = "Short!";
                    }
                    else
                    {// status OK, read VDD voltage
                        if (Pk2.ReadPICkitVoltages(ref vdd, ref vpp))
                        {
                            labelReadVDD.Text = string.Format("{0:0.0} V", vdd);
                            float expectedVDD = (float)numericUpDown1.Value;
                            if (expectedVDD > 4.6F)
                            {
                                expectedVDD = 4.6F;  // There is a typical drop for VDD > 4.6V
                                                     // don't count that
                            }
                            if ((expectedVDD - vdd) > 0.2F)
                            {
                                labelVDDLow.Visible = true;
                            }
                            else
                            {
                                labelGood.Visible = true;
                            }
                        }
                    }
                }
            }
        }
예제 #2
0
        private void buttonCalibrate_Click(object sender, EventArgs e)
        {
            float Vdd = 0, Vpp = 0;
            float measuredVdd = 0;
            bool  calSucceed  = true;

            try
            {
                measuredVdd = float.Parse(textBoxVDD.Text);
            }
            catch
            {
                MessageBox.Show("Invalid 'volts measured' value.");
                return;
            }

            // Cal the ADC results
            Pk2.ReadPICkitVoltages(ref Vdd, ref Vpp);
            measuredVdd /= Vdd;  //ratio
            if (measuredVdd > 1.25F)
            {
                measuredVdd = 1.25F;
                calSucceed  = false;
            }
            if (measuredVdd < 0.75F)
            {
                measuredVdd = 0.75F;
                calSucceed  = false;
            }
            float calFactor = 256F * measuredVdd;              // 512 is 1:1 calibration factor

            Pk2.SetVoltageCals((ushort)calFactor, 0x00, 0x80); // leave Vdd cals unchanged for now.

            // Now that we have an accurate ADC reading, we can self-cal the VDD setpoints.
            // Vdd Offset = (3 - (4*V3)/V4)*CCP4
            // Vdd CalFactor = 1/(V4 - V3) * 128.
            //     where V3 = actual voltage at SetVDDVoltage(3.0)
            //           V4 = actual voltage at SetVDDVoltage(4.0)
            //           CCP4 = CalculateVddCPP(4.0F) >> 6
            float offset = 0;
            float calCCP = 0;
            float Vdd3v  = 0;

            Pk2.SetVDDVoltage(3.0F, 2.00F);
            Thread.Sleep(150);
            Pk2.ReadPICkitVoltages(ref Vdd, ref Vpp);
            Vdd3v = Vdd;
            Pk2.SetVDDVoltage(4.0F, 2.70F);
            Thread.Sleep(150);
            Pk2.ReadPICkitVoltages(ref Vdd, ref Vpp);
            offset = (3 - (4 * Vdd3v) / Vdd) * (Pk2.CalculateVddCPP(4.0F) >> 6);
            if (offset > 127F)
            {
                offset     = 127F;
                calSucceed = false;
            }
            if (offset < -128F)
            {
                offset     = -128F;
                calSucceed = false;
            }
            calCCP = (1 / (Vdd - Vdd3v)) * 128;
            if (calCCP > 173) // 135%
            {
                calCCP     = 173;
                calSucceed = false;
            }
            if (calCCP < 83) // 65%
            {
                calCCP     = 83;
                calSucceed = false;
            }

            if (calSucceed)
            {
                labelGoodCal.Visible = true;
                labelBadCal.Visible  = false;
                Pk2.SetVoltageCals((ushort)calFactor, (byte)offset, (byte)(calCCP + 0.5));
            }
            else
            {
                labelGoodCal.Visible = false;
                labelBadCal.Visible  = true;
                Pk2.SetVoltageCals(0x0100, 0x00, 0x80); // leave uncal'd
            }
            buttonCalibrate.Enabled = false;
            Pk2.VddOff();
        }
예제 #3
0
        private void buttonTestVPP_Click(object sender, EventArgs e)
        {
            float vdd = 0;
            float vpp = 0;

            labelVPPLow.Visible      = false;
            labelVPPMCLR.Visible     = false;
            labelVPPMCLROff.Visible  = false;
            labelVPPPass.Visible     = false;
            labelVPPShort.Visible    = false;
            labelVPPVDDShort.Visible = false;
            labelReadVPP.Text        = "";

            Thread.Sleep(250); // sleep a bit to let VDD bleed down.

            // check for a powered target first
            if (Pk2.CheckTargetPower(ref vdd, ref vpp) == KONST.PICkit2PWR.selfpowered)
            {
                Pk2.VddOff();
            }
            else
            {
                Pk2.SetVDDVoltage((float)numericUpDown1.Value, 0.85F);
                Pk2.VddOn();
            }
            // Set VPP voltage
            float expectedVPP;

            if (Pk2.DevFile.Families[Pk2.GetActiveFamily()].Vpp > 1)
            {
                expectedVPP = Pk2.DevFile.Families[Pk2.GetActiveFamily()].Vpp;
            }
            else
            {
                expectedVPP = (float)numericUpDown1.Value;
            }
            Pk2.SetVppVoltage(expectedVPP, 0.50F);
            byte[] vppscript = new byte[8];
            vppscript[0] = KONST._VPP_OFF;
            vppscript[1] = KONST._VPP_PWM_ON;
            vppscript[2] = KONST._DELAY_LONG;
            vppscript[3] = 30;
            vppscript[4] = KONST._MCLR_GND_OFF;
            vppscript[5] = KONST._VPP_ON;
            vppscript[6] = KONST._DELAY_LONG;
            vppscript[7] = 20;
            Pk2.SendScript(vppscript);

            // check status first for shorts
            KONST.PICkit2PWR status = Pk2.PowerStatus();
            if ((status == KONST.PICkit2PWR.vdderror) || (status == Constants.PICkit2PWR.vddvpperrors))
            { //VDD short!
                labelVPPVDDShort.Visible = true;
            }
            else if (status == KONST.PICkit2PWR.vpperror)
            {//VPP short
                labelVPPShort.Visible = true;
                labelReadVPP.Text     = "Short!";
            }
            else if (status != Constants.PICkit2PWR.no_response)
            {   // status OK, read VPP voltage
                if (Pk2.ReadPICkitVoltages(ref vdd, ref vpp))
                {
                    labelReadVPP.Text = string.Format("{0:0.0} V", vpp);
                    if ((expectedVPP - vpp) > 0.3F)
                    {
                        labelVPPLow.Visible = true;
                    }
                    else
                    {
                        labelVPPPass.Visible = true;
                    }
                }
            }
        }