gokul/six-digit-logic-clock

This code defines the physical layout and schematic connections for a multi-layer PCB featuring components like RTC modules (DS3231MZ), microcontroller (ATMEGA328P), LED display driver (MAX7219), and various passive and discrete components, with detailed footprints, pinouts, and placement for a clock and control interface.

Version
0.1.2
License
unset
Stars
0

index.circuit.tsx

PCBPCB preview for index.circuit.tsx
SchematicSchematic preview for index.circuit.tsx
import { FJ3191AH } from "./imports/c44296"
import { YTSPS_22E58LM } from "./imports/c2941005"

const segments = ["A", "B", "C", "D", "E", "F", "G"] as const
const jlc = (partNumber: string) => ({ jlcpcb: [partNumber] })

const digits = [
  { display: "DS1", role: "H10", x: -47.5, bcd: "H10" },
  { display: "DS2", role: "H1", x: -32.5, bcd: "H1" },
  { display: "DS3", role: "M10", x: -7.5, bcd: "M10" },
  { display: "DS4", role: "M1", x: 7.5, bcd: "M1" },
  { display: "DS5", role: "S10", x: 32.5, bcd: "S10" },
  { display: "DS6", role: "S1", x: 47.5, bcd: "S1" },
] as const

const digitSchPositionByRole = {
  H10: { x: -8, y: 4 }, H1: { x: -8, y: -4 },
  M10: { x: 0, y: 4 }, M1: { x: 0, y: -4 },
  S10: { x: 8, y: 4 }, S1: { x: 8, y: -4 },
} as const

const decoderPinLabels = {
  pin1: ["B"], pin2: ["C"], pin3: ["LT_N"], pin4: ["BI_N"],
  pin5: ["LE"], pin6: ["D"], pin7: ["A"], pin8: ["GND"],
  pin9: ["SEG_E"], pin10: ["SEG_D"], pin11: ["SEG_C"], pin12: ["SEG_B"],
  pin13: ["SEG_A"], pin14: ["SEG_G"], pin15: ["SEG_F"], pin16: ["VCC"],
} as const

function DisplayDigit({ display, role, x, bcd }: (typeof digits)[number]) {
  const resistorX = [x - 4.5, x - 1.5, x + 1.5, x + 4.5]
  const decoderConnections = {
    A: "net." + bcd + "_A", B: "net." + bcd + "_B",
    C: "net." + bcd + "_C", D: "net." + bcd + "_D",
    LT_N: "net.VLOGIC", BI_N: "net.VLOGIC", LE: "net.GND",
    GND: "net.GND", VCC: "net.VLOGIC",
    SEG_A: "net." + display + "_RAW_A", SEG_B: "net." + display + "_RAW_B",
    SEG_C: "net." + display + "_RAW_C", SEG_D: "net." + display + "_RAW_D",
    SEG_E: "net." + display + "_RAW_E", SEG_F: "net." + display + "_RAW_F",
    SEG_G: "net." + display + "_RAW_G",
  }
  return (
    <>
      <FJ3191AH
        name={display}
        pcbX={x}
        pcbY={0}
        pcbRotation="270deg"
        schX={digitSchPositionByRole[role].x}
        schY={digitSchPositionByRole[role].y}
        schSheetName="display_digits"
        noConnect={["dp"]}
        connections={{
          GND1: "net.GND", GND2: "net.GND",
          a: "net." + display + "_A", b: "net." + display + "_B",
          c: "net." + display + "_C", d: "net." + display + "_D",
          e: "net." + display + "_E", f: "net." + display + "_F",
          g: "net." + display + "_G",
        }}
      />
      <chip
        name={"U_DEC_" + display}
        manufacturerPartNumber="CD74HC4511M"
        supplierPartNumbers={jlc("C507225")}
        footprint="soic16"
        pinLabels={decoderPinLabels}
        pcbX={x}
        pcbY={8}
        layer="bottom"
        schX={digitSchPositionByRole[role].x}
        schY={digitSchPositionByRole[role].y - 6}
        schSheetName="display_decoders"
        connections={decoderConnections}
      />
      {segments.map((segment, index) => (
        <resistor
          key={display + "-" + segment}
          name={"R_" + display + "_" + segment}
          resistance="1kohm"
          supplierPartNumbers={jlc("C21190")}
          footprint="0603"
          pcbX={resistorX[index % 4]}
          pcbY={index < 4 ? 12 : -12}
          layer="top"
          schX={digitSchPositionByRole[role].x + index * 0.65 - 2}
          schY={digitSchPositionByRole[role].y - 2}
          schSheetName="display_decoders"
          connections={{ pin1: "net." + display + "_RAW_" + segment, pin2: "net." + display + "_" + segment }}
        />
      ))}
    </>
  )
}

const counterPinLabels = {
  pin1: ["C1_CLK0"], pin2: ["C1_RESET"], pin3: ["C1_Q0"], pin4: ["C1_Q3"],
  pin5: ["C1_Q2"], pin6: ["C1_Q1"], pin7: ["GND"], pin8: ["C2_Q1"],
  pin9: ["C2_Q2"], pin10: ["C2_Q3"], pin11: ["C2_Q0"], pin12: ["C2_RESET"],
  pin13: ["C2_CLK0"], pin14: ["C2_CLK1"], pin15: ["VCC"], pin16: ["C1_CLK1"],
} as const

const andPinLabels = {
  pin1: ["1A"], pin2: ["1B"], pin3: ["1Y"], pin4: ["2A"], pin5: ["2B"], pin6: ["2Y"],
  pin7: ["GND"], pin8: ["3Y"], pin9: ["3A"], pin10: ["3B"], pin11: ["4Y"],
  pin12: ["4A"], pin13: ["4B"], pin14: ["VCC"],
} as const

const orPinLabels = andPinLabels

const schmittPinLabels = {
  pin1: ["1A"], pin2: ["1Y"], pin3: ["2A"], pin4: ["2Y"], pin5: ["3A"], pin6: ["3Y"],
  pin7: ["GND"], pin8: ["4Y"], pin9: ["4A"], pin10: ["5Y"], pin11: ["5A"],
  pin12: ["6Y"], pin13: ["6A"], pin14: ["VCC"],
} as const

const oscPinLabels = {
  pin1: ["Q12"], pin2: ["Q13"], pin3: ["Q14"], pin4: ["Q6"],
  pin5: ["Q5"], pin6: ["Q7"], pin7: ["Q4"], pin8: ["GND"],
  pin9: ["OSC1"], pin10: ["OSC2"], pin11: ["OSC3"], pin12: ["RESET"],
  pin13: ["Q9"], pin14: ["Q8"], pin15: ["Q10"], pin16: ["VCC"],
} as const

const dffPinLabels = {
  pin1: ["CLR1_N"], pin2: ["D1"], pin3: ["CLK1"], pin4: ["PRE1_N"],
  pin5: ["Q1"], pin6: ["NQ1"], pin7: ["GND"], pin8: ["NQ2"],
  pin9: ["Q2"], pin10: ["PRE2_N"], pin11: ["CLK2"], pin12: ["D2"],
  pin13: ["CLR2_N"], pin14: ["VCC"],
} as const

export default function ClockBoard() {
  return (
    <board
      name="CLOCKBOARD"
      width="120mm"
      height="45mm"
      borderRadius="20mm"
      layers={4}
      thickness="1.6mm"
      title="Six Digit Logic IC Clock - 1S Li-ion"
      minViaHoleDiameter="0.3mm"
      minViaPadDiameter="0.6mm"
      minViaEdgeToPadEdgeClearance="0.09mm"
      minTraceToPadEdgeClearance="0.07mm"
      defaultTraceWidth="0.2mm"
      schLayout={{ layoutMode: "relative" }}
      schTraceAutoLabelEnabled
      schMaxTraceDistance={0.5}
      autorouter={{
        preset: "tscircuit_beta",
        allowViaInPad: false,
        traceClearance: "0.2mm",
        serverCacheEnabled: false,
      }}
    >
      <schematicsheet name="power" displayName="1 - 3.7V Li-ion Input" sheetIndex={0}>
        <schematicsection name="entry" displayName="1S LI-ION HEADER, SWITCH AND PROTECTION" />
        <pinheader
          name="J_POWER"
          pinCount={2}
          pitch="2.54mm"
          footprint="pinrow2_p2.54"
          pcbX={0}
          pcbY={20}
          schX={-7}
          schY={2}
          schSectionName="entry"
          connections={{ pin1: "net.LI_BAT_RAW", pin2: "net.GND" }}
        />
        <YTSPS_22E58LM
          name="SW_POWER"
          pcbX={0}
          pcbY={-18}
          layer="top"
          schX={-3}
          schY={2}
          schSectionName="entry"
          noConnect={["pin3", "pin6"]}
          connections={{ pin2: "net.LI_BAT_RAW", pin5: "net.LI_BAT_RAW", pin1: "net.LI_BAT_SW", pin4: "net.LI_BAT_SW" }}
        />
        <chip
          name="Q_REVERSE"
          manufacturerPartNumber="AO3401A"
          supplierPartNumbers={jlc("C15127")}
          footprint="sot23"
          pinLabels={{ pin1: ["G"], pin2: ["S"], pin3: ["D"] }}
          pcbX={1}
          pcbY={16}
          layer="bottom"
          schX={1}
          schY={2}
          schSectionName="entry"
          connections={{ G: "net.GND", D: "net.LI_BAT_SW", S: "net.VLOGIC" }}
        />
        <capacitor name="C_POWER_BULK" capacitance="100uF" footprint="1206" pcbX={2} pcbY={13} layer="bottom" schX={5} schY={2} schSectionName="entry" connections={{ pin1: "net.VLOGIC", pin2: "net.GND" }} />
        <capacitor name="C_POWER_HF" capacitance="1uF" supplierPartNumbers={jlc("C15849")} footprint="0805" pcbX={-14} pcbY={10} layer="bottom" schX={5} schY={-2} schSectionName="entry" connections={{ pin1: "net.VLOGIC", pin2: "net.GND" }} />
      </schematicsheet>

      <schematicsheet name="timebase" displayName="2 - Crystal Timebase and Controls" sheetIndex={1}>
        <schematicsection name="clock" displayName="32.768 kHz OSCILLATOR AND 1 Hz DIVIDER" />
        <schematicsection name="controls" displayName="SCHMITT-DEBOUNCED SET BUTTONS" />
        <chip
          name="U_XO"
          manufacturerPartNumber="ASDMB-32.768KHZ-LC-T"
          footprint="soic8"
          pinLabels={{ pin1: ["EN"], pin2: ["NC2"], pin3: ["NC3"], pin4: ["GND"], pin5: ["OUT"], pin6: ["NC6"], pin7: ["NC7"], pin8: ["VCC"] }}
          pcbX={-38}
          pcbY={18}
          layer="bottom"
          schX={-11}
          schY={3}
          schSectionName="clock"
          noConnect={["NC2", "NC3", "NC6", "NC7"]}
          connections={{ EN: "net.VLOGIC", GND: "net.GND", OUT: "net.CLK_32K", VCC: "net.VLOGIC" }}
        />
        <chip
          name="U_OSC"
          manufacturerPartNumber="CD74HC4060M"
          supplierPartNumbers={jlc("C507245")}
          footprint="soic16"
          pinLabels={oscPinLabels}
          pcbX={-24}
          pcbY={14}
          layer="bottom"
          schX={-7}
          schY={3}
          schSectionName="clock"
          noConnect={["Q4", "Q5", "Q6", "Q7", "Q8", "Q9", "Q10", "Q12", "Q13", "OSC2", "OSC3"]}
          connections={{ Q14: "net.CLK_2HZ", OSC1: "net.CLK_32K", RESET: "net.RESET_GLOBAL", GND: "net.GND", VCC: "net.VLOGIC" }}
        />
        <chip
          name="U_DIV2"
          manufacturerPartNumber="74HC74D"
          supplierPartNumbers={jlc("C5606")}
          footprint="soic14"
          pinLabels={dffPinLabels}
          pcbX={-8}
          pcbY={18}
          layer="bottom"
          schX={6}
          schY={3}
          schSectionName="clock"
          noConnect={["Q2", "NQ2"]}
          connections={{ CLR1_N: "net.VLOGIC", D1: "net.CLK_1HZ_N", CLK1: "net.CLK_2HZ", PRE1_N: "net.VLOGIC", Q1: "net.CLK_1HZ", NQ1: "net.CLK_1HZ_N", GND: "net.GND", PRE2_N: "net.VLOGIC", CLK2: "net.GND", D2: "net.GND", CLR2_N: "net.VLOGIC", VCC: "net.VLOGIC" }}
        />
        <resistor name="R_POR" resistance="100kohm" footprint="0603" pcbX={6} pcbY={20} layer="bottom" schX={-8} schY={-5} schSectionName="controls" connections={{ pin1: "net.VLOGIC", pin2: "net.POR_RC" }} />
        <capacitor name="C_POR" capacitance="1uF" footprint="0805" pcbX={12} pcbY={20} layer="bottom" schX={-5} schY={-5} schSectionName="controls" connections={{ pin1: "net.POR_RC", pin2: "net.GND" }} />
        <chip
          name="U_NOT"
          manufacturerPartNumber="74HC14D"
          supplierPartNumbers={jlc("C5604")}
          footprint="soic14"
          pinLabels={schmittPinLabels}
          pcbX={22}
          pcbY={17}
          layer="bottom"
          schX={0}
          schY={-4}
          schSectionName="controls"
          noConnect={["4Y", "5Y", "6Y"]}
          connections={{ "1A": "net.POR_RC", "1Y": "net.RESET_GLOBAL", "2A": "net.MINUTE_BUTTON", "2Y": "net.MINUTE_PULSE", "3A": "net.HOUR_BUTTON", "3Y": "net.HOUR_PULSE", "4A": "net.GND", "5A": "net.GND", "6A": "net.GND", GND: "net.GND", VCC: "net.VLOGIC" }}
        />
        <pushbutton name="SW_HOUR" footprint="pushbutton_id1.3mm_od2mm" pcbX={-20} pcbY={-18} layer="top" schX={-8} schY={-9} schSectionName="controls" noConnect={["pin3", "pin4"]} connections={{ pin1: "net.HOUR_BUTTON", pin2: "net.GND" }} />
        <resistor name="R_SET_HOUR" resistance="100kohm" footprint="0603" pcbX={-27} pcbY={-18} layer="top" schX={-11} schY={-9} schSectionName="controls" connections={{ pin1: "net.VLOGIC", pin2: "net.HOUR_BUTTON" }} />
        <capacitor name="C_SET_HOUR" capacitance="100nF" footprint="0603" pcbX={-31} pcbY={-18} layer="top" schX={-8} schY={-12} schSectionName="controls" connections={{ pin1: "net.HOUR_BUTTON", pin2: "net.GND" }} />
        <pushbutton name="SW_MINUTE" footprint="pushbutton_id1.3mm_od2mm" pcbX={20} pcbY={-18} layer="top" schX={2} schY={-9} schSectionName="controls" noConnect={["pin3", "pin4"]} connections={{ pin1: "net.MINUTE_BUTTON", pin2: "net.GND" }} />
        <resistor name="R_SET_MINUTE" resistance="100kohm" footprint="0603" pcbX={27} pcbY={-18} layer="top" schX={-1} schY={-9} schSectionName="controls" connections={{ pin1: "net.VLOGIC", pin2: "net.MINUTE_BUTTON" }} />
        <capacitor name="C_SET_MINUTE" capacitance="100nF" footprint="0603" pcbX={31} pcbY={-18} layer="top" schX={2} schY={-12} schSectionName="controls" connections={{ pin1: "net.MINUTE_BUTTON", pin2: "net.GND" }} />
      </schematicsheet>

      <schematicsheet name="counter_logic" displayName="3 - Seconds, Minutes and Hours Logic" sheetIndex={2}>
        <schematicsection name="counters" displayName="DUAL BCD RIPPLE COUNTERS" />
        <schematicsection name="gates" displayName="MOD-60, MOD-24 AND MANUAL ADVANCE" />
        <chip
          name="U_CNT_SEC" manufacturerPartNumber="74HC390D" supplierPartNumbers={jlc("C5384")} footprint="soic16" pinLabels={counterPinLabels}
          pcbX={-48} pcbY={-12} layer="bottom" schX={-9} schY={4} schSectionName="counters"
          connections={{ C1_CLK0: "net.CLK_1HZ", C1_RESET: "net.RESET_GLOBAL", C1_Q0: "net.S1_A", C1_Q1: "net.S1_B", C1_Q2: "net.S1_C", C1_Q3: "net.S1_D", C1_CLK1: "net.S1_A", C2_CLK0: "net.S1_D", C2_RESET: "net.SEC_TENS_RESET", C2_Q0: "net.S10_A", C2_Q1: "net.S10_B", C2_Q2: "net.S10_C", C2_Q3: "net.S10_D", C2_CLK1: "net.S10_A", GND: "net.GND", VCC: "net.VLOGIC" }}
        />
        <chip
          name="U_CNT_MIN" manufacturerPartNumber="74HC390D" supplierPartNumbers={jlc("C5384")} footprint="soic16" pinLabels={counterPinLabels}
          pcbX={-6} pcbY={-12} layer="bottom" schX={0} schY={4} schSectionName="counters"
          connections={{ C1_CLK0: "net.MINUTE_CLOCK", C1_RESET: "net.RESET_GLOBAL", C1_Q0: "net.M1_A", C1_Q1: "net.M1_B", C1_Q2: "net.M1_C", C1_Q3: "net.M1_D", C1_CLK1: "net.M1_A", C2_CLK0: "net.M1_D", C2_RESET: "net.MIN_TENS_RESET", C2_Q0: "net.M10_A", C2_Q1: "net.M10_B", C2_Q2: "net.M10_C", C2_Q3: "net.M10_D", C2_CLK1: "net.M10_A", GND: "net.GND", VCC: "net.VLOGIC" }}
        />
        <chip
          name="U_CNT_HOUR" manufacturerPartNumber="74HC390D" supplierPartNumbers={jlc("C5384")} footprint="soic16" pinLabels={counterPinLabels}
          pcbX={48} pcbY={-12} layer="bottom" schX={9} schY={4} schSectionName="counters"
          connections={{ C1_CLK0: "net.HOUR_CLOCK", C1_RESET: "net.HOUR_RESET", C1_Q0: "net.H1_A", C1_Q1: "net.H1_B", C1_Q2: "net.H1_C", C1_Q3: "net.H1_D", C1_CLK1: "net.H1_A", C2_CLK0: "net.H1_D", C2_RESET: "net.HOUR_RESET", C2_Q0: "net.H10_A", C2_Q1: "net.H10_B", C2_Q2: "net.H10_C", C2_Q3: "net.H10_D", C2_CLK1: "net.H10_A", GND: "net.GND", VCC: "net.VLOGIC" }}
        />
        <chip
          name="U_AND" manufacturerPartNumber="74HC08D" supplierPartNumbers={jlc("C5600")} footprint="soic14" pinLabels={andPinLabels}
          pcbX={-33} pcbY={-11} layer="bottom" schX={-2} schY={-5} schSectionName="gates" noConnect={["4Y"]}
          connections={{ "1A": "net.S10_B", "1B": "net.S10_C", "1Y": "net.SEC_AT_6", "2A": "net.M10_B", "2B": "net.M10_C", "2Y": "net.MIN_AT_6", "3A": "net.H10_B", "3B": "net.H1_C", "3Y": "net.HOUR_AT_24", "4A": "net.GND", "4B": "net.GND", GND: "net.GND", VCC: "net.VLOGIC" }}
        />
        <chip
          name="U_OR" manufacturerPartNumber="74HC32D" supplierPartNumbers={jlc("C5601")} footprint="soic14" pinLabels={orPinLabels}
          pcbX={18} pcbY={-10} layer="bottom" schX={5} schY={-5} schSectionName="gates"
          connections={{ "1A": "net.S10_C", "1B": "net.MINUTE_PULSE", "1Y": "net.MINUTE_CLOCK", "2A": "net.M10_C", "2B": "net.HOUR_PULSE", "2Y": "net.HOUR_CLOCK", "3A": "net.RESET_GLOBAL", "3B": "net.SEC_AT_6", "3Y": "net.SEC_TENS_RESET", "4A": "net.RESET_GLOBAL", "4B": "net.MIN_AT_6", "4Y": "net.MIN_TENS_RESET", GND: "net.GND", VCC: "net.VLOGIC" }}
        />
        <chip
          name="U_OR_RESET" manufacturerPartNumber="74HC32D" supplierPartNumbers={jlc("C5601")} footprint="soic14" pinLabels={orPinLabels}
          pcbX={36} pcbY={-10} layer="bottom" schX={10} schY={-5} schSectionName="gates" noConnect={["2Y", "3Y", "4Y"]}
          connections={{ "1A": "net.RESET_GLOBAL", "1B": "net.HOUR_AT_24", "1Y": "net.HOUR_RESET", "2A": "net.GND", "2B": "net.GND", "3A": "net.GND", "3B": "net.GND", "4A": "net.GND", "4B": "net.GND", GND: "net.GND", VCC: "net.VLOGIC" }}
        />
      </schematicsheet>

      <schematicsheet name="display_decoders" displayName="4 - BCD to Seven-Segment Drivers" sheetIndex={3}>
        <schematicsection name="drivers" displayName="SIX STATIC CMOS DECODERS AND CURRENT LIMITING" />
        {digits.map((digit) => <DisplayDigit key={digit.display} {...digit} />)}
      </schematicsheet>
      <schematicsheet name="display_digits" displayName="5 - Six-Digit LED Display" sheetIndex={4}>
        <schematictext text="HOURS" schX={-8} schY={8} fontSize={0.45} />
        <schematictext text="MINUTES" schX={0} schY={8} fontSize={0.45} />
        <schematictext text="SECONDS" schX={8} schY={8} fontSize={0.45} />
      </schematicsheet>

      <capacitor name="C_LOGIC_1" capacitance="100nF" footprint="0603" pcbX={-20} pcbY={-5} layer="bottom" connections={{ pin1: "net.VLOGIC", pin2: "net.GND" }} />
      <capacitor name="C_LOGIC_3" capacitance="100nF" footprint="0603" pcbX={-42} pcbY={-19} layer="bottom" connections={{ pin1: "net.VLOGIC", pin2: "net.GND" }} />
      <capacitor name="C_LOGIC_4" capacitance="100nF" footprint="0603" pcbX={-6} pcbY={-19} layer="bottom" connections={{ pin1: "net.VLOGIC", pin2: "net.GND" }} />
      <capacitor name="C_LOGIC_5" capacitance="100nF" footprint="0603" pcbX={42} pcbY={-19} layer="bottom" connections={{ pin1: "net.VLOGIC", pin2: "net.GND" }} />
      <capacitor name="C_LOGIC_6" capacitance="100nF" footprint="0603" pcbX={-33} pcbY={-17} layer="bottom" connections={{ pin1: "net.VLOGIC", pin2: "net.GND" }} />
      <capacitor name="C_LOGIC_7" capacitance="100nF" footprint="0603" pcbX={25} pcbY={-5} layer="bottom" connections={{ pin1: "net.VLOGIC", pin2: "net.GND" }} />
      <capacitor name="C_LOGIC_8" capacitance="100nF" footprint="0603" pcbX={34} pcbY={-16} layer="bottom" connections={{ pin1: "net.VLOGIC", pin2: "net.GND" }} />

      <silkscreentext text="HH" pcbX={-40} pcbY={17} fontSize="1mm" />
      <silkscreentext text="MM" pcbX={0} pcbY={17} fontSize="1mm" />
      <silkscreentext text="SS" pcbX={40} pcbY={17} fontSize="1mm" />
      <silkscreentext text="HOUR" pcbX={-20} pcbY={-21} fontSize="0.7mm" />
      <silkscreentext text="MIN" pcbX={20} pcbY={-21} fontSize="0.7mm" />
      <silkscreentext text="1S LI-ION 3.7V" pcbX={0} pcbY={17} fontSize="0.7mm" />
      <silkscreentext text="LOGIC IC CLOCK - NO MCU" pcbX={0} pcbY={-21} layer="bottom" fontSize="0.7mm" />
      <silkscreentext text="J1: + 3.0-4.2V / GND" pcbX={0} pcbY={12} layer="bottom" fontSize="0.7mm" />

      <copperpour connectsTo="net.GND" layer="top" clearance="0.2mm" boardEdgeMargin="0.3mm" />
      <copperpour connectsTo="net.GND" layer="bottom" clearance="0.2mm" boardEdgeMargin="0.3mm" />
    </board>
  )
}