Converting a PIC DVM to output decimal

Thread Starter

Remembermyname

Joined Sep 6, 2015
91
I have reconfigured the circuit and written the MCU from Rev. F., but the numbering order still appears to be off. In the LSD row, the numbers count in order but roll over in the next digit occurs in the '7' position of the center digit and the most significant digit. The count is quite jumpy possibly due to the wide reading range. Perhaps the range needs to be narrowed like many DVM's using an auto range feature. I will have to devise a correct input circuit to suit this or use a single range like 300mvdc, 3vdc, 30vdc, etc as an example.

whereas -
Adc_result = ADC_Read(0) * x / 1024;
x=30 to read up to 30vdc

I will search further into dvm input circuits to see what I can find.
 

jayanthd

Joined Jul 4, 2015
945
Input circuit is not a problem. You can use just a pot or preset (trimmer). I have used then with similar 7 Segment displays and they work fine. Your circuit is similar to seven segment display except it uses 10 segment display where only one segment of a digit will be ON at a time.
 

jayanthd

Joined Jul 4, 2015
945
I will design a PCB layout using 3x 10 LED Bargraph display. You get teo board manufactured and send one board to me. I need it for testing.

I changed the microcontroller to PIC24 device. You order the PIC24. it has 16 bit Port. Code will simplify. It is also a 28 pin device. It works from 3.3V and hence we have to use LM1117 3.3V regulator with 2x 22uF 16V tantalum capacitors. I will design the PCB layout in Proteus. You get the board manufactured and send one board to me for testing. Tomorrow I will write PIC24 code. Can you use common cathode display. it will simplify the code and code will be easier to understand. For testing we will use 3x 10 LED bargraph display with 3x 3mm LEDs for decimal point. We will connect cathodes to BC337 transistor's collector and ground the emitter of transistors.

Then we just need to send

1
2
4
8
10
20
40
80
100
200

oring above values with 400 for proper digit will enable decimal point for that digit.
 
Last edited:

jayanthd

Joined Jul 4, 2015
945
Completed the PIC24FJ64GA102 code for common cathode display.

C:
unsigned int mask[] = {0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 0x0100, 0x0200};
double adcValue = 0.0, prevAdcValue = 0.0, f_fraction = 0.0;
unsigned int display[3] = {0, 0, 0};
char select = 0;
unsigned char myFlags = 0;
unsigned int whole_num = 0, fraction = 0;

sbit run_once_flag at myFlags.B0;

//Timer1
//Prescaler 1:1; PR1 Preload = 10000; Actual Interrupt Time = 2 ms
//Place/Copy this part in declaration section
void InitTimer1() {
    T1CON = 0x8000;
    T1IE_bit = 1;
    T1IF_bit = 0;
    IPC0 = IPC0 | 0x1000;
    PR1    = 10000;
}

void Timer1Interrupt() iv IVT_ADDR_T1INTERRUPT{
    T1IF_bit = 0;
    //Enter your code here
    LATA = (LATA & 0x01);

    switch(select) {
        case 0:
              LATB = display[0];
              LATA = (LATA & 0x01) | 0b1100;
              break;
        case 1:
              LATB = display[1];
              LATA = (LATA & 0x01) | 0b1010;
              break;
        case 2:
              LATB = display[2];
              LATA = (LATA & 0x01) | 0b0110;
              break;
    };

    if(++select == 3)select = 0;
}

void main() {

    ADPCFG = 0x0001;
  
    TRISA = 0x01;
    TRISB = 0x00;

    PORTA = 0x00;
    PORTB = 0x00;

    LATA = 0x00;
    LATB = 0x00;

    asm clrwdt
    Delay_ms(200);

    InitTimer1();

    while(1) {

        asm clrwdt

        adcValue = (double)ADC1_Get_Sample(0) * 300.0 / 1023.0;
        Delay_ms(10);

        if(prevAdcValue != adcValue) {

             asm clrwdt

             if((adcValue >= 0.0) && (adcValue < 1.0)) {
                  f_fraction = adcValue * 100.0;
                  fraction = (unsigned int)f_fraction;
                  asm clrwdt

                  display[0] = mask[0] | 0x0400;
                  display[1] = mask[fraction / 10];
                  display[2] = mask[fraction % 10];
             }
             else if((adcValue >= 1.0) && (adcValue < 10.0)) {
                  whole_num = (unsigned int)adcvalue;
                  f_fraction = (adcvalue * 100.0) - (whole_num * 100.0);
                  fraction = (unsigned int)f_fraction;
                  asm clrwdt

                  display[0] = mask[whole_num] | 0x0400;
                  display[1] = mask[fraction / 10];
                  display[2] = mask[fraction % 10];
             }
             else if((adcValue >= 10.0) && ((unsigned int)adcValue < 100.0)) {
                  whole_num = (unsigned int)adcvalue;
                  f_fraction = (adcvalue * 10.0) - (whole_num * 10.0);
                  fraction = (unsigned int)f_fraction;
                  asm clrwdt

                  display[0] = mask[whole_num / 10];
                  display[1] = mask[whole_num % 10] | 0x0400;
                  display[2] = mask[fraction];
             }
             else if((adcValue >= 100.0) && (adcValue < 1000.0)) {
                  whole_num = (unsigned int)adcvalue;

                  display[0] = mask[whole_num / 100];
                  display[1] = mask[(whole_num / 10) % 10];
                  display[2] = mask[whole_num % 10];
             }

             prevAdcValue = adcValue;

             asm clrwdt
             if(run_once_flag == 0) {
                T1IE_bit = 1;
                run_once_flag = 1;
             }
        }
    }
}
 

jayanthd

Joined Jul 4, 2015
945
This is the new circuit. it uses common cathode display. BC337 is used. As only one or two LED will be lit at a time the max current flowing through BC337 will be not more than 40 mA and hence for production you can use BC847 NPN transistor (SOT23). 9V DC is input into the power connector and 3.3V output powers test display and PIC24. For production display you will be using 10 to 15 LEDs in series for each LED path and hence you need to provide more voltage (2.1V drop across each LED, so 2.1 * 15 will be the voltage required for the display circuit).
For production you can go for all SMD components which will reduce the board size and cost.

New circuit is attached. I have designed circuit such that PCB layout designing will be easier. I have to change the array values in the previous post code.


Edit:

Code is almost complete. Just have to configure Oscillator and ADC registers.

C:
unsigned int mask[] = {0x8000, 0x4000, 0x2000, 0x1000, 0x0800, 0x0400, 0x0200, 0x0100, 0x0080, 0x0040};
double adcValue = 0.0, prevAdcValue = 0.0, f_fraction = 0.0;
unsigned int display[3] = {0, 0, 0};
char select = 0;
unsigned char myFlags = 0;
unsigned int whole_num = 0, fraction = 0;

sbit run_once_flag at myFlags.B0;

//Timer1
//Prescaler 1:1; PR1 Preload = 8000; Actual Interrupt Time = 2 ms
//Place/Copy this part in declaration section
void InitTimer1() {
    T1CON = 0x8000;
    T1IE_bit = 1;
    T1IF_bit = 0;
    IPC0 = IPC0 | 0x1000;
    PR1 = 8000;
}

void Timer1Interrupt() iv IVT_ADDR_T1INTERRUPT{
    T1IF_bit = 0;
    //Enter your code here
    LATA = (LATA & 0xC1) | 0x0E;

    switch(select) {
        case 0:
              LATB = display[0];
              LATA = (LATA & 0x01) | 0x02;
              break;
        case 1:
              LATB = display[1];
              LATA = (LATA & 0x01) | 0x04;
              break;
        case 2:
              LATB = display[2];
              LATA = (LATA & 0x01) | 0x08;
              break;
    };

    if(++select == 3)select = 0;
}

void main() {

    asm clrwdt
   
    CM1CON = 0x00;
    CM2CON = 0x00;
    CM3CON = 0x00;

    ADPCFG = 0xFFFE;
   
    TRISA = 0xC1;
    TRISB = 0x00;

    PORTA = 0x00;
    PORTB = 0x00;

    LATA = 0x00;
    LATB = 0x00;

    Delay_ms(200);

    InitTimer1();

    while(1) {

        asm clrwdt

        adcValue = (double)ADC1_Get_Sample(0) * 300.0 / 1023.0;
        Delay_ms(10);

        if(prevAdcValue != adcValue) {

             if((adcValue >= 0.0) && (adcValue < 1.0)) {
                  f_fraction = adcValue * 100.0;
                  fraction = (unsigned int)f_fraction;

                  display[0] = mask[0] | 0x0020;
                  display[1] = mask[fraction / 10];
                  display[2] = mask[fraction % 10];
             }
             else if((adcValue >= 1.0) && (adcValue < 10.0)) {
                  whole_num = (unsigned int)adcvalue;
                  f_fraction = (adcvalue * 100.0) - (whole_num * 100.0);
                  fraction = (unsigned int)f_fraction;

                  display[0] = mask[whole_num] | 0x0020;
                  display[1] = mask[fraction / 10];
                  display[2] = mask[fraction % 10];
             }
             else if((adcValue >= 10.0) && ((unsigned int)adcValue < 100.0)) {
                  whole_num = (unsigned int)adcvalue;
                  f_fraction = (adcvalue * 10.0) - (whole_num * 10.0);
                  fraction = (unsigned int)f_fraction;

                  display[0] = mask[whole_num / 10];
                  display[1] = mask[whole_num % 10] | 0x0020;
                  display[2] = mask[fraction];
             }
             else if((adcValue >= 100.0) && (adcValue < 1000.0)) {
                  whole_num = (unsigned int)adcvalue;

                  display[0] = mask[whole_num / 100];
                  display[1] = mask[(whole_num / 10) % 10];
                  display[2] = mask[whole_num % 10];
             }

             prevAdcValue = adcValue;

             if(run_once_flag == 0) {
                T1IE_bit = 1;
                run_once_flag = 1;
             }
        }
    }
}
 

Attachments

Last edited:

Thread Starter

Remembermyname

Joined Sep 6, 2015
91
It appears that the PIC24FJ64GA102 datasheet denotes that 25ma is the maximum sourced or sunk current for any I/O pin is 25ma unless I'm reading this incorrectly. Despite its small size, it offers far more flexibility but it is an MCU I'm not yet familiar with or have worked with before. For the case of having a new test PCB fabbed, it is not exactly an inexpensive proposition just to have one or two made due to minimum order details of most manufacturers. For a test unit to be made, I will have to stick with protoboarding for now possibly using through hole components and time for parts to be procured. Unless I can locate a fab house that can make two boards without cheaply and without minimum orders.
 

jayanthd

Joined Jul 4, 2015
945
Ok. No need for the proto boards. I have debugged the PIC24 code in debugger and it is working fine. The code is complete. I will send you the code after you buy this PIC24FJ64GA102. You can buy it from here.

Buy the SPDIP version.

http://www.microchip.com/wwwproducts/en/PIC24FJ64GA102

Part Number PIC24FJ64GA102-I/SP

http://www.microchipdirect.com/Prod...=PIC24FJ64GA102&&keywords=PIC24FJ64GA102-I/ML

Approx same price as PIC18F26K22 and also same pin count.

Internal FRC Oscillator is used (8 MHz). No need for crystal.

Just buy PIC24, LM1117 - 3.3V, 2x 22uF 16V Tantalum Capacitors, 8x 120E resistors, 4x 4.7k resistors and 3x 520E resistors, 1x 3mm Green LED diffused, 3x 3mm Red LED diffused, 3x BC337-40. This is all you need and ofcourse you need display board. For display board use 3x 10 LED Red Bargraph displays. They have 20 pins and they can be connected in common cathode or common anode format. We will use common cathode connections.

PIC24FJ64GA102 has one 16 bit port and it is directly interfaced to display unit. Code has simplified and it is easier to understand.

Use 3x this display.

http://www.electroncomponents.com/Mini-Components/LEDs-LCDs/10-segment-RED-LED-Graph

It is only for testing.
 
Last edited:

MMcLaren

Joined Feb 14, 2010
861
There are some interesting options for this particular application. If you only light one LED at a time you could get rid of the transistors. Just spit-balling here but I suspect a charlie-plexed display running at the same 33% duty cycle would perform just as well while running on a much smaller (cheaper?) PIC.

Food for thought. Have fun, guys.

Cheerful regards, Mike

Edge Lighted Charlie Display.png
 

jayanthd

Joined Jul 4, 2015
945
@mike

Can you provide the code for the circuit you have posted the charliplexing C Code ?

In the real display for each LED in the Bar Graph there will be a 10 to 15 LEDs in series and hence current drawn will be only 10 to 15 mA at a time and as you mentioned transistors can be eliminated.

Let us assume in your circuit the top most Bar Graph is digit 1 (MSB) then to display 5 (0 to 9)
I should make pin 6 of the display 1 by turning ON RC1 (pins 1 to 10 of display are anodes) and at the same time
I have to make RC0 low which makes pin 15 of display low thus displaying 5 on digit 1 display. Am I correct ? And also at the same time I have to make RC2, RC3, RC4, RC5 high. Am I correct ?

If I have to display the decimal point also for that digit then I simply turn ON RA3 pin. Right ?

How does the brightness adjustment work ?

Ok. I got it, to display 5 on digit 1 display I have to make RC1 to RC5 as high and RC0 as low.


Still we need to use transsitors as each LED in Bar Graph display will be replaced by 10 to 15 series LEDs. We need to provide more voltage for the series LEDs and for that we have to use transistors. Can't drive LEDs directly from PIC.
 
Last edited:

MMcLaren

Joined Feb 14, 2010
861
Ah... Multiple LEDs per channel. I'm sorry, I didn't catch that in the discussion. If that's the case than Charlie-plexing would not be a good solution.

About Charlieplexing... Only the anode line and the cathode line for the lighted LED are configured as outputs while all other lines are tri-stated (inputs). The output driving the anode is high while the output driving the cathode is low. So you set both the TRIS and LAT register each time you update the display.

I would provide brightness control using an interrupt driven BAM (bit angle modulation) driver. Basically, the driver modulates the LED during eight binary weighted intervals 2^0 through 2^7 for 256 levels during each interrupt (~55% overhead). For example, if I use a 1-usec 'step' size (2 instruction cycles per step @ 8-MHz clock), the driver modulates one LED through eight binary weighted intervals during each 256-usec interrupt (about ~55% overhead). Multiplexing three digits results in a ~33% duty cycle and a ~1302-Hz refresh rate (768-usec refresh period).

I would be happy to post an example driver but it would take a while and it's probably academic since Charlie-plexing is not viable for these multi-LED per channel displays.

Cheerful regards, Mike
 
Last edited:

Thread Starter

Remembermyname

Joined Sep 6, 2015
91
The PIC24FJ64GA102-I/SP is en route to me at this time. The schematic is being entered to be captured by PCB router. I will gather the data for the components to make certain that the footprints fit the components.
I thought that brightness control was employed via PWM or is that the same as the bit angle modulation?

I hopful that we can soon understand the way this type of display works so that in the future, it may be possible to use it in other types of devices such as timers, clocks, freq counters, DVMs

Below is are images of one of the displays I worked on about a year ago. This one is about 20mm x 15mm and would be driven by 0402 LED:

IMAG2168.jpg IMAG2169.jpg
 

jayanthd

Joined Jul 4, 2015
945
Ok. You have to build this circuit. Discard all previous circuits. Common Cathode configuration will be used. Use 3x Red Bar Graph Displays for the digits and 3 Red diffused 3mm LEDs for the decimal point. This is only for testing. I will post the code tomorrow. The component cost is cheaper here but shipping cost is high. For one board the cost of the components is 8 USD including PIC24.

For PIC24 circuit 3.3V power supply is used.

In the circuit R9, R10 and R11 are not needed. They are only used for simulation.

You will need another LED for negative sign to display negative floating point values.


@mike

Now its clear to me how the charliplexing works. I will write a C code for your circuit.
 

Attachments

Last edited:

MMcLaren

Joined Feb 14, 2010
861
The PIC24FJ64GA102-I/SP is en route to me at this time. The schematic is being entered to be captured by PCB router. I will gather the data for the components to make certain that the footprints fit the components.
I thought that brightness control was employed via PWM or is that the same as the bit angle modulation?

I hopful that we can soon understand the way this type of display works so that in the future, it may be possible to use it in other types of devices such as timers, clocks, freq counters, DVMs

Below is are images of one of the displays I worked on about a year ago. This one is about 20mm x 15mm and would be driven by 0402 LED:

View attachment 114440 View attachment 114441
That display looks very nice... Are those etched plexiglass panels? And you're using a single LED per digit (panel) and not multiple LEDs per digit as jayanthd said?

BAM (Bit Angle Modulation) is a form of PWM (Pulse Width Modulation).

Cheerful regards, Mike
 
Last edited:

Thread Starter

Remembermyname

Joined Sep 6, 2015
91
@jayanthd Some questions about the new circuit. None of the inputs are marked. At J1, is 9vdc being put in? Is vss and vdd of the pic being powered from where D5 is connected? C3 and C4 I believe are physically close to vss and vdd of the PIC. 3.3v is being input to pins 1 and 20 correct. Is 3.3vdc being put in at R9, R10 and R11? Is 3.3vdc the limit of input to AN0?

@MMcLaren Thank you. These are laser cut and etched from .032" acrylic. Polycarbonate is a bad choice for laser work. In this model, the layers are too thick. I was able to obtain something along .024 and will have it redone to reduce the thickness. Each layer will be fitted with one LED each resulting in 11 LEDs per display "cube". 0-9 + decimal point. Each layer is etched with a numeral and are then stacked.
 

jayanthd

Joined Jul 4, 2015
945
Yes, 9V AC or DC is input at J1. You can use 9V 350 mA DC Adapter.

Is vss and vdd of the pic being powered from where D5 is connected?
No, PIC (VDD) gets power from OUT pin of LM1117 - 3.3. VSS connects to GND (ground).

3.3v is being input to pins 1 and 20 correct.
MCLR pin 1 is not used. It is disabled. You can leave it unconnected. If pin 20 is PIC VDD then you have to connect it to OUT pin of LM1117-3.3 which is at 3.3V.


Is 3.3vdc being put in at R9, R10 and R11?
I already told you in previous post that R9, R10 and R11 is not used in hardware. It is only used in Proteus Simulation. You can safely remove them from hardware.

Is 3.3vdc the limit of input to AN0?
Yes, As PIC is working from 3.3V, ADC input is between 0 and 3.3V. POT is connected between 3.3V and GND.
 

Thread Starter

Remembermyname

Joined Sep 6, 2015
91
Is 3.3vdc being put in at R9, R10 and R11?

I already told you in previous post that R9, R10 and R11 is not used in hardware. It is only used in Proteus Simulation. You can safely remove them from hardware.
I was aware that the resistors were to be removed as a load resistor already exists at RB5. I was talking about the power input at that location. This will connect to output of LM1117.
 

jayanthd

Joined Jul 4, 2015
945
W
I was aware that the resistors were to be removed as a load resistor already exists at RB5. I was talking about the power input at that location. This will connect to output of LM1117.
When there is no R9, R10 and R11 you don't connect 3.3V to transistors.

Where is load rsistor at RB5 ? I only see 11 current limiting resistors on the display data bus.

When you get PCB manufactured send one board to me.

C1 and C2 (22uF 16V) are tantalum. Connect them properly according to the polarity.

For non polarized capacitors like 100nF 16V use Multilayer Ceramic Capacitors.

Use 1% Metal Fim Resistors for all resistors. If 5% Carbon resitors are used for current limiting resistors then due to resistance variation youy might get different brightness in displays.

A 9V 350 mA adapter will be enough.

Only one or two LEDs will be ON at a time and hence even if you set 20mA for each LED then max 40 mA flows through each transistor. So, you can use BC847 SOT23 transistors. Go for all SMD components. If you go for SMD package PIC then I will have to add programming header otherwise you will not be able to program the chip.



This is the code. Have to write a few more lines.

C:
const code unsigned int mask[] = {0x8000, 0x4000, 0x2000, 0x1000, 0x0800, 0x0400, 0x0200, 0x0100, 0x0080, 0x0040};
char select = 0;
unsigned char myFlags = 0;
unsigned int whole_num = 0, fraction = 0;
unsigned int display[3] = {0, 0, 0};
double adcValue = 0.0, prevAdcValue = 0.0, f_fraction = 0.0;

sbit run_once_flag at myFlags.B0;

//Timer1
//Prescaler 1:1; PR1 Preload = 8000; Actual Interrupt Time = 2 ms
//Place/Copy this part in declaration section
void InitTimer1() {
    T1CON = 0x8000;
    T1IE_bit = 1;
    T1IF_bit = 0;
    IPC0 = IPC0 | 0x1000;
    PR1 = 8000;
}

void Timer1Interrupt() iv IVT_ADDR_T1INTERRUPT{
    T1IF_bit = 0;
    //Enter your code here
    LATA = (LATA & 0xF1);

    switch(select) {
        case 0:
              LATB = display[0];
              LATA = (LATA & 0xF1) | 0x02;
              break;
        case 1:
              LATB = display[1];
              LATA = (LATA & 0xF1) | 0x04;
              break;
        case 2:
              LATB = display[2];
              LATA = (LATA & 0xF1) | 0x08;
              break;
    };

    if(++select == 3)select = 0;
}

void main() {

    asm clrwdt
  
    CM1CON = 0x0000;
    CM2CON = 0x0000;
    CM3CON = 0x0000;

    AD1PCFG = 0xFFFE;
  
    TRISA = 0x0001;
    TRISB = 0x0000;

    PORTA = 0x0000;
    PORTB = 0x0000;

    LATA = 0x0000;
    LATB = 0x0000;

    Delay_ms(200);

    InitTimer1();

    while(1) {

        asm clrwdt

        adcValue = (double)ADC1_Read(0);
        Delay_ms(20);

        if(prevAdcValue != adcValue) {

             if((adcValue >= 0.0) && (adcValue < 1.0)) {
                  f_fraction = adcValue * 100.0;
                  fraction = (unsigned int)f_fraction;

                  display[0] = mask[0] | 0x0020;
                  display[1] = mask[fraction / 10];
                  display[2] = mask[fraction % 10];
             }
             else if((adcValue >= 1.0) && (adcValue < 10.0)) {
                  whole_num = (unsigned int)adcvalue;
                  f_fraction = (adcvalue * 100.0) - (whole_num * 100.0);
                  fraction = (unsigned int)f_fraction;

                  display[0] = mask[whole_num] | 0x0020;
                  display[1] = mask[fraction / 10];
                  display[2] = mask[fraction % 10];
             }
             else if((adcValue >= 10.0) && ((unsigned int)adcValue < 100.0)) {
                  whole_num = (unsigned int)adcvalue;
                  f_fraction = (adcvalue * 10.0) - (whole_num * 10.0);
                  fraction = (unsigned int)f_fraction;

                  display[0] = mask[whole_num / 10];
                  display[1] = mask[whole_num % 10] | 0x0020;
                  display[2] = mask[fraction];
             }
             else if((adcValue >= 100.0) && (adcValue < 1000.0)) {
                  whole_num = (unsigned int)adcvalue;

                  display[0] = mask[whole_num / 100];
                  display[1] = mask[(whole_num / 10) % 10];
                  display[2] = mask[whole_num % 10];
             }

             prevAdcValue = adcValue;

             if(run_once_flag == 0) {
                T1IE_bit = 1;
                run_once_flag = 1;
             }
        }
    }
}
 
Last edited:

Thread Starter

Remembermyname

Joined Sep 6, 2015
91
W
When there is no R9, R10 and R11 you don't connect 3.3V to transistors.
Then you would want to clarify to remove the power input as well. It is easy for a trained engineer to understand what is involved with a microcontroller and its necessary support components. For someone who is not as astute to Proteus, it is not always easy for one who has not worked with it before to assume these necessities. Please understand that my access to Proteus is limited and will get access it when I can. The schematic and pcb software I use do not face legal barriers (like MikroC and Proteus do in my country) but require very specific details to create the complete circuit. Due to this, I do my best not to assume. That is why I ask many specific questions.

Where is load rsistor at RB5 ? I only see 11 current limiting resistors on the display data bus.
Correction. It is a current limiting resistor in RN2 that is connected to RB5.

When you get PCB manufactured send one board to me.
This was already agreed upon from the first request.

C1 and C2 (22uF 16V) are tantalum. Connect them properly according to the polarity.

For non polarized capacitors like 100nF 16V use Multilayer Ceramic Capacitors.

Use 1% Metal Fim Resistors for all resistors. If 5% Carbon resitors are used for current limiting resistors then due to resistance variation youy might get different brightness in displays.
I already have been using these. Tighter tolerances are necessary in the final model.

Only one or two LEDs will be ON at a time and hence even if you set 20mA for each LED then max 40 mA flows through each transistor. So, you can use BC847 SOT23 transistors. Go for all SMD components. If you go for SMD package PIC then I will have to add programming header otherwise you will not be able to program the chip.
Ongoing changes being made to components will delay procurement of the parts. It is not advantageous to obtain parts only to change them for other parts after they have been ordered. Here where I live, parts can be obtained cheaply from off shore sources but can take upwards of six weeks to receive them and in some cases, with high shipping costs. Parts can also in some cases be procured locally but can be expensive in return.

I would love to go all SMD but through-hole parts have already been ordered per your previous request. I have not yet completed an SMD oven (another project) to perform this level of work properly and quickly. Otherwise, hand soldering SMD will require time and patience.

The PIC24FJ64GA102-I/SP (SPDIP) has already been ordered per your previous suggestion. Regardless the IC package, it may be advantageous to add the ICSP header to the circuit.

This is why I have suggested prototyping the circuit until the unit is complete and no more changes are eminent. Once the circuit is complete and verified operational, then a working circuit can be built.
 
Last edited:
Top