Waarom pull-up weerstanden?

Pull-up (en pull-down) is het elektrisch hoog of laag maken van een lijn die in rust is.
Onderstaand verhaal gaat uit van een pull-up, maar het geldt net zozeer voor een pull-down.

Bij een pull-up weerstand wordt een lijn door middel van een weerstand verbonden met de VCC, VDD, V+, of hoe je het ook wilt noemen, met de + lijn dus.
Hierdoor zal de lijn als deze in rust is een hoog potentiaal hebben.

Stel je voor een ingang van een PIC die met een schakelaar verbonden kan worden naar massa.
Als de schakelaar gesloten is dan hangt de ingang dus ook aan massa.
Maar wat voor spanning staat er op de ingangspin van de PIC als de schakelaar geopend is?
Inderdaad... onbekend, de spanning kan gaan zweven.
De spanning kan tussen +2V en +5V liggen waardoor de PIC dus ziet dat de schakelaar geopend is.
Maar de spanning kan net zo goed tussen 0V en +1V liggen, waardoor de PIC denkt dat de schakelaar nog steeds gesloten is, terwijl dat dus niet zo is.

Dit zijn vaak die "vreemde" verhalen die je hoort.
"Als ik met mijn hand in de buurt kom, doet ie het wel" en "Soms doet ie het goed, maar er zijn ook dagen dat ie helemaal niets wil".


Pull-up
Door nu een weerstand (normaal 10kΩ) tussen ingang van de PIC en de +5V te plaatsen is het euvel verholpen.
Als de schakelaar gesloten is, is de ingang verbonden met 0V (massa, GND, ground) en als de schakelaar nu wordt geopend dan wordt de ingang door de pull-up weerstand naar +5V omhoog getrokken (= pull-up).

Dit betekent echter dat er voor elke zwevende ingang een pull-up weerstand op de print zou moeten worden geplaatst.
Microchip is nu zo slim geweest om sommige poorten van de PIC met pull-up weerstanden uit te voeren, door nu voor schakelaars e.d. deze poorten te kiezen, kun je jezelf een paar weerstanden en ruimte op het printje besparen.
Voor de op deze website veel gebruikte PIC-type 16F628A zijn poort B.0 t/m poort B.7 uitgevoerd met inwendige (on-chip of on-board) pull-up weerstanden die je softwarematig al dan niet kunt inschakelen.
In PIC Basic gaat dat wel heel simpel, gewoon intikken: PORTB_PULLUPS ON of PORTB_PULLUPS OFF.

Heb je echter meer dan 8 ingangen op een PIC16F628A nodig, dan kun je ook (delen van) poort A als ingangen gebruiken.
Dat houdt wel in dat je op deze ingangen zelf pull-up weerstanden moet plaatsen!
 

Pull-down
Voor pull-down geldt precies hetzelfde, maar dan andersom.
Dus hier zit de schakelaar aan de +5V en de pull-down weerstand aan GND.
Pull-down komt echter minder vaak voor en zit ook niet standaard in een PIC gebakken.


Het is van belang dat de programmaregel PORTB_PULLUPS ON ná de TRIS instelling staat, anders is het in sommige gevallen mogelijk dat er bij het opstarten van de PIC een superkort pulsje op elke (PORTB) uitgang komt, afhankelijk van de opzet van het schema.
Omdat PORTB_PULLUPS ON de pull-up weerstanden van alle PORTB poorten tegelijk aanzet, wordt een poort die als uitgang wordt gebruikt hierdoor HOOG als deze nog niet als uitgang is ingesteld.
Als de PORTB_PULLUPS ON dus eerder wordt ingesteld dan de TRIS is de poort HOOG in de tijd die de PIC nodig heeft tussen het instellen van deze twee regels.
Door eerst TRIS in het programma in te stellen, en daaronder pas PORTB_PULLUPS ON op te geven is het probleem opgelost.


Bij veel PIC types, zoals de kleine maar fijne 12F675, kun je de inwendige pull-up weerstanden voor elke poort apart (= individueel) in- of uitschakelen, in de datasheet van de desbetreffende PIC heet dat individual programmable weak pull-ups.
Bij andere PIC types, zoals de in de cursus gebruikte 16F628A, is het individueel inschakelen van de inwendige pull-ups niet mogelijk, daar is het een kwestie van óf allemaal ingeschakeld, óf allemaal uitgeschakeld.
Lees dus altijd de datasheet van het PIC type dat je gebruikt.
Elke PIC schakelt automatisch een ingeschakelde inwendige pull-up van een poort uit als deze als uitgang is/wordt ingesteld, daar heb je zelf geen omkijken naar.