Visual walkthrough — GPIO — input - output, pull-up - pull-down, interrupt on pin change
5.5.2 · D2· Coding › Embedded Systems & Real-Time Software › GPIO — input - output, pull-up - pull-down, interrupt on pin
Neeche har symbol pehle earn kiya gaya hai, phir use kiya gaya hai. Agar tumne kabhi resistor, transistor, ya "voltage" shabd nahi suna, Step 1 se shuru karo aur phir bhi sab samajh aayega.
Step 1 — Ek wire ka ek voltage hota hai, aur pin use read karta hai
KYA. Figure dekho. Ek GPIO pin ek metal wire ka end hai. Wire mein electricity ko ek number se describe kiya jaata hai: uska voltage, jo likha jaata hai aur volts (V) mein measure hota hai. Voltage ko socho jaise wire jo electrical "push" ya "height" par baitha hai — jaise paani ke tank mein paani ki height.
YE IDEA PEHLE KYUN. Baaki sab kuch — HIGH, LOW, pull-up, edge — bas ek voltage ka ek threshold se comparison hai. Agar tumhare paas "ek wire kisi height par baitha hai" ki picture nahi hai, toh aage kuch bhi samajh nahi aayega.
PICTURE. Wire ek height par baitha hai floor (, matlab ground, defined as — hamaara zero reference) aur ceiling (, chip ka supply voltage, jaise ) ke beech. Chhota triangle sense buffer hai — chip ki "aankh" jo wire ko dekhti hai aur decide karti hai:
- ::: wire ka actual voltage (abhi uski "height").
- ::: threshold, ek fixed height (≈ ka aadha) jisse chip compare karti hai.
- Buffer ek single bit output karta hai: agar wire line ke upar hai, agar neeche.


Step 2 — Kuch connected nahi = wire float karti hai = random reads
KYA. Sab kuch disconnect karo. Ab koi wire ko kisi height par nahi pakad raha. Sense buffer high-impedance hai — fancy tarika kehne ka ki ye bahut kam current draw karta hai, isliye ye wire ki height bhi set nahi kar sakta. Wire ek chhoti si capacitor ke roop mein reh jaati hai: ek bucket jo thodi si charge hold karti hai aur jiska voltage drift karta hai.
YE STEP KYUN HAI. Ye wahi beginner disaster hai jo parent note warn karta hai. Step 3 mein pull resistor ko justify karne ke liye, tumhe pehle problem feel karni chahiye: ek bina pakdi wire ki height upar neeche drift karti hai jab aas-paas ka noise couple hota hai.
PICTURE. Red trace threshold line ke upar neeche unpredictably wander karta hai. Har baar jab ye cross karta hai toh read … Press/not-press ka jawab pure noise hai. (Step 1b se hysteresis jab wire kisi level ke paas ho tab help karta hai, lekin yahan ye pure range mein swing karta hai, isliye ek Schmitt trigger bhi garbage read karta hai — real fix ek pull resistor hai.)

Step 3 — Ek pull-up resistor wire ko ek resting height deta hai
KYA. Wire se ceiling tak ek resistor lagao — ek component jo current jaane deta hai lekin use resist karta hai, ohms () mein measure hota hai. Ye ek pull-up hai. Jab aur kuch wire ko touch nahi karta, resistor dheeray se use se baandhta hai, isliye wo HIGH par rest karta hai.
RESISTOR KYUN, tak PLAIN WIRE NAHI? Ek plain wire pin ko hamesha ke liye HIGH mein jam kar deti — ek button bina dead short ke use neeche nahi kheench sakta. Ek resistor ek soft connection hai: idle height set karne ke liye itna strong, lekin ek button ke liye use override karne ke liye itna weak. Hum "itna weak" Step 5 mein prove karte hain.
PICTURE. Button open hone ke saath, resistor ka top par hai aur uska bottom wire hai; kyunki buffer ≈ 0 current draw karta hai, koi current nahi behta, isliye resistor mein koi voltage drop nahi aur poori wire par baithti hai → HIGH reads karti hai, rock-steady.

Step 4 — Button press karo: wire LOW tak kheench jaati hai (active-LOW)
KYA. Button ko pin aur (floor) ke beech wire karo. Press karo → wire ab button ki near-zero resistance ke zariye se connected hai. Isliye ye LOW tak gir jaati hai aur read karta hai.
BUTTON PRESS HONE PAR 0 KYUN READS KARTA HAI. Built-in pull-up ke saath, "resting = HIGH, pressed = LOW". Pressed = 0 ko active-LOW kehte hain. Ye ulta lagta hai lekin ye clean, standard wiring hai — ek wire ko ground karna electrically tidy hai aur pull-ups most chips mein built-in hote hain.
PICTURE. Ab ek complete loop exist karta hai: . Current behta hai. Poora ke upar drop hota hai (button almost kuch drop nahi karta), isliye pin ≈ → LOW par baithta hai.

Jo current ab behta hai wo Ohm's Law se set hota hai, ke upar poore supply ke saath:
- ::: poora supply voltage jo ab resistor ke upar drop ho raha hai (button pressed).
- ::: pull-up resistance.
- ::: wasted current jo poori baar jab tum button hold karte ho behta hai.
Step 5 — RESISTOR VALUE KYUN MATTER KARTA HAI: wasted current cap karne ke liye chuno
KYA. Pressed-state current hold karte waqt heat ke roop mein waste hota hai. Hum ko small rakhne ke liye itna bada choose karte hain, lekin itna bada nahi ki wo floppy ho jaaye.
KYUN. Do opposing forces — ye poora sizing argument hai:
- Bahut chhota → bada , bahut wasted power (aur heat).
- Bahut bada → itna weak ki noise wire ko idhar-udhar dha sake → waapas Step 2 disaster.
PICTURE. Curve badhte ke saath girta hai. Hum current budget line draw karte hain aur sabse chhota allowed read karte hain. Axes labelled hain: horizontal kΩ mein hai, vertical held current μA mein hai.

Step 6 — Hamesha padhna CPU waste karta hai: polling vs. interrupt
KYA. CPU ko kaise pata chalta hai ki wire badal gayi? Option A: poll — pin ko baar baar re-read karte hue loop karo. Option B: interrupt — hardware ko pin watch karne do aur CPU ko ek special function mein yank karo sirf tab jab wo change ho.
INTERRUPTS KYUN. Polling 100% CPU ko "badla? badla?" poochne mein jalata hai aur ek pulse jo do reads ke beech aata hai use miss kar sakta hai. Ek interrupt ek kandhe par thapki hai: CPU doosra kaam karta hai aur sirf event par bulaya jaata hai. Dekho Polling vs Interrupt-Driven I/O.
PICTURE. Top track: polling baar baar wire mein ghusta hai (wasted stabs grey mein dikhaye gaye hain, woh jo change pakdta hai orange mein). Bottom track: CPU sota hai jab tak falling edge ek arrow ISR mein nahi feke.

Step 7 — Falling edge par trigger karo: ek press = ek call
KYA. Ek press ek transition (HIGH to LOW) hai, jise falling edge kehte hain. Hum hardware ko batate hain: ISR (Interrupt Service Routine — woh function jahan hardware jump karta hai) ko sirf falling edge par fire karo.
EDGE KYUN, LEVEL NAHI. Ek level trigger continuously fire karta hai jab tak wire LOW hai — button hold karo aur ISR hamesha re-fire karta hai. Ek edge transition ke instant par ek baar fire karta hai → ek press per exactly ek call, jo ek button-press event deserve karta hai.
PICTURE. Wire HIGH se LOW tak girta hai; down-arrow us single falling-edge instant ko mark karta hai jahan ISR launch hota hai. Jo flat LOW follow karta hai wo koi aur calls produce nahi karta.

Step 8 — Degenerate case: contacts bounce → bahut saare false edges (PRESS aur RELEASE DONO par)
KYA. Ek mechanical switch cleanly close nahi hota. ~1–10 ms ke liye uske metal contacts physically bounce karte hain, extra transitions ka ek burst produce karte hain. Ye ek button use mein do baar hota hai:
- Press par (closing bounce): edges ka burst → bahut saare spurious falling edges.
- Release par (opening bounce): jab contacts spring apart hote hain toh ye bhi chatter karte hain → edges ka burst → bahut saare spurious rising edges.
Isliye agar tum sirf falling edge par trigger karo, press akela 5–20 baar fire karta hai; aur agar tum rising edges bhi dekh rahe ho (jaise CHANGE trigger, ya release detect karne ke liye), toh release bounce dobara fire karta hai.
YE APNA STEP KYUN CHAHIYE. Ye wahi degenerate input hai jo ideal edge model ignore karta hai. Agar tum ise handle nahi karte, tumhara one-press logic silently multiply karta hai — aur release bounce bhool jaana classic second bug hai jab log sirf press side fix karte hain.
PICTURE. Do zoomed windows side by side: press window (contacts LOW par settle ho rahe hain, spurious falling edges ✗ se marked) aur release window (contacts waapas HIGH par settle ho rahe hain, spurious rising edges ✗ se marked).

Fix — debounce. Pehle edge ke baad, ~20 ms ke liye aur edges ignore karo — ye press aur release bounce dono cover karta hai kyunki har burst guard window se chhota hota hai. Pseudocode mein: ISR mein now record karo aur bail out karo agar now - last < 20 ms. Ya wire ko ek RC network se filter karo jo Schmitt-trigger input ko feed karta hai (Step 1b), jo chhoti wobbles ko hardware mein clean karta hai. Full treatment dekho Switch Debouncing mein.
Ek-picture summary
Upar sab kuch, ek single circuit-plus-timeline mein compress kiya gaya: pull-up resting HIGH set karta hai, button use well-sized ke zariye LOW karta hai, Schmitt-trigger input near-threshold wobble clean karta hai, aur ek clean falling edge (dono bounces debounce karne ke baad) ISR ko exactly ek baar fire karta hai.

Recall Feynman retelling — plain words mein poori walkthrough
Ek pin ek wire ka end hai, aur chip jo care karti hai wo bas itna hai ki wire kitni upar baitha hai: beech wali line ke upar = HIGH (1), neeche = LOW (0). Real chips ek line nahi balki do close lines use karti hain (Schmitt trigger), isliye beech mein hover karne wali wire apna last jawab rakhti hai instead of chattering ke. Bina kuch lagayi wire swing mein hawa ki tarah hoti hai — drift karti hai aur jawab random noise hota hai. Isliye hum wire se ceiling tak ek soft rubber band baandhte hain: wahi pull-up resistor hai. Ye wire ko high rakhta hai lekin dheeray se, isliye jab tum ek button press karte ho jo wire ko floor se connect karta hai, wire LOW tak gir jaati hai — isliye "pressed = 0". Band ke liye plain wire use nahi kar sakte, kyunki ek bada enough resistor wasted electricity trickle tiny rakhta hai jab button hold kiya jaata hai; bahut chhota power waste karta hai, bahut bada aur noise waapas aa jaata hai — isliye lagbhag 33 kΩ. Ab, wire ko "kya tum badli?" ek million baar per second poochne ki jagah (polling, jo CPU jalata hai aur ek blink miss kar sakta hai), hum hardware ko humhein sirf us exact instant par kandhe par thapki dene dete hain jab wire high se low girti hai — wahi falling-edge interrupt hai, aur ye hamaari tiny ISR ko ek press per ek baar run karta hai. Ek pakad: real switches kuch milliseconds ke liye chatter karte hain — press karte waqt bhi AUR chhodte waqt bhi — isliye hum ~20 ms ke liye koi extra thapki ignore karte hain. Ye poora safar hai: bare wire → floating chaos → pull-up rest → button pulls low → sized resistor → do clean thresholds → kandhe par thapki edge par → dono taraf chatter ignore karo.
Recall Chain ko memory se rebuild karo
Ideal model mein exactly par buffer kya read karta hai, aur real chips ise kaise avoid karte hain? ::: Ideally undefined (ya kisi bhi taraf tip karta hai, chatter kar sakta hai); real chips ek Schmitt trigger use karte hain do thresholds ke saath taaki output stick kare. Floating input randomly kyun read karta hai? ::: Koi component uska voltage set nahi karta, isliye ye threshold ke upar noise pick up karte hue drift karta hai. Pull-up kya karta hai jab button open ho? ::: Wire ko se baandhta hai; koi current nahi behta isliye koi drop nahi → clean HIGH. Pull-up "weak" (large) kyun hona chahiye? ::: Taaki ek real driver use override kar sake aur held-current small rahe. Level nahi, edge par trigger kyun karo? ::: Ek edge har transition par ek baar fire karta hai; ek level hamesha ke liye re-fire karta hai jab tak hold kiya jaaye. Ek button use se bahut saare interrupts kyun aate hain, aur kab? ::: Contacts BOTH press par (falling burst) aur release par (rising burst) bounce karte hain; aur edges ~20 ms ke liye ignore karo (debounce).