Het PCON register

De PIC16F628A heeft een interne oscillator die twee verschillende snelheden (= dual speed) kan aannemen.
De default (de snelheid die het aanneemt als je niets opgeeft) is 4MHz.
Als de PIC in een schakeling zit met batterij- of accuvoeding, moet deze als het kan zo weinig mogelijk stroom opnemen.
Dit kun je natuurlijk doen door de PIC in slaap te brengen met de instructie SLEEP (zie het automatische theezetter project).

Maar als de PIC actief moet blijven dan kan de interne kloksnelheid verlaagt worden naar 48kHz, waardoor de PIC verhoudingsgewijs veel minder stroom opneemt dan op 4MHz snelheid.
Nadeel, maar wel logisch is dat de PIC alles veel langzamer uitvoert, daar moet dan dus wel rekening mee worden gehouden.

DELAYMS 100 bijvoorbeeld, duurt bij de langzame interne 48kHz kloksnelheid geen 0,1 seconde, maar een paar seconden!
 

Datasheet
Zie voor info hierover de datasheet van de 16F628A paragraaf 4.2.2.6 (PCON register).


Een pagina uit de datasheet van de 16F628A.
 

Zoals te zien in bovenstaand datasheet pagina, loopt de PIC op 4MHz als bit 3 (het OSCF bit (= oscillator frequency)) op '1' staat (= standaard, oftewel default).
Als je dit bit op '0' zet, dan gaat de PIC op 48kHz lopen.

 


Boven de bitvakjes is te zien wat de waarde is als de PIC wordt opgestart (de "default" heet dat).
Te zien is dat boven bit 3, het OSCF bit, een '1' staat.
En een '1' staat voor 4MHz, dat betekent dat als je zelf niets opgeeft, dat de PIC op 4MHz gaat draaien.
Zo is ook te zien dat bit 1, het POR bit, bij opstart '0' is, en dat de waarde van bit 0, bij opstart 'x', oftewel onbekend is.
De bits 2, 4, 5, 6 en 7 van het PCON register hebben geen functie in de 16F628A.


Het instellen van registers gaat in PIC Basic eenvoudig door de naam van het register op te geven.
Het register van (onder andere) de instelling van de interne kloksnelheid heet het PCON register (= Power Control register).

Hieronder een praktijkvoorbeeld om het verschil tussen de twee kloksnelheden te laten zien door het schakelen tussen de beide interne oscillatoren (48kHz en 4MHz) van een 16F628A.
Sluit hiervoor een LED met serieweerstand van 1k aan op PORTA.2:

DEVICE 16F628A                ;We gebruiken een 16F628A type
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
ALL_DIGITAL TRUE              ;Alle ingangen digitaal

DIM x AS BYTE                 ;Teller voor FOR...NEXT lussen
PORTA.2 = 0                   ;Maak PORTA.2 laag


;Hoofdprogramma
WHILE 1 = 1

  ;Dit blok wordt met de normale kloksnelheid (4MHz) uitgevoerd
  FOR x = 1 TO 6              ;6x staat voor 3x aan en 3x uit
    TOGGLE PORTA.2            ;Aan moet uit, uit moet aan
    DELAYMS 100               ;100 milliseconden (PIC op 4MHz intern kristal)
  NEXT

  ;Hier wordt bit 3 van het PCON register op '0' gezet, de PIC gaat op 48kHz draaien
  PCON.3 = 0                  ;PCON register bit 3 (OSCF) op 0 zetten (= 48kHz interne osc) 

  ;Dit blok wordt met de langzame kloksnelheid (48kHz) uitgevoerd
  FOR x = 1 TO 6              ;6x staat voor 3x aan en 3x uit
    TOGGLE PORTA.2            ;Aan moet uit, uit moet aan
    DELAYMS 100               ;100 milliseconden, maar door 48kHz is deze tijd veel langer
  NEXT

  ;Hier wordt bit 3 van het PCON register terug op '1' gezet, de PIC draait weer op 4MHz 
  PCON.3 = 1                  ;PCON register bit 3 (OSCF) op 1 zetten (= 4MHz interne osc)
WEND

Bovenstaand voorbeeld laat de LED drie maal knipperen om de 100mSec.
Daarna wordt PCON register bit 3 op '0' gezet, waardoor de PIC overschakelt op een interne kloksnelheid van 48kHz.
Hierna moet de LED weer drie maal knipperen met opnieuw tijdsopgave DELAYMS 100.
Maar de tijd blijkt nu geen 100mSec te zijn, maar maarliefst een aantal seconden!
Dat komt omdat de PIC nu op de langzame snelheid van 48kHz loopt.

Dit zijn dus dingen waar je rekening mee moet houden.
Ook seriële communicatie instructies als SERIN en SEROUT zullen niet goed meer werken.
Daarvoor zul je de PIC weer even naar 4MHz moeten omschakelen in het programma.
(Het wordt aangeraden om PIC's met seriële communicatie op een kristal te laten draaien en niet op de interne oscillator)

Het verlagen naar 48kHz gaat simpel door PCON.3 = 0 in je programma op te geven.
Terug gaan naar 4MHz doe je door bit 3 van het PCON register weer op '1' te zetten: PCON.3 = 1.


Register bitnamen
Zoals je ziet in de datasheet hebben de bits afzonderlijk ook elk een naam.
PCON bit 0 heet BOR (= brown out reset), bit 1 heet POR (= power on reset) en bit 3 heet OSCF (= oscillator frequency).
Die bits mag je ook in het PIC Basic programma bij hun naam noemen, maar dan moet je het wel aan de compiler doorgeven.
Het volgende voorbeeld is hetzelfde als het vorige, alleen wordt nu het bit bij naam genoemd.

DEVICE 16F628A                ;We gebruiken een 16F628A type
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
ALL_DIGITAL TRUE              ;Alle ingangen digitaal

;Registernamen
SYMBOL OSCF         = PCON.3  ;Bit 3 van het PCON register heeft de naam OSCF

DIM x AS BYTE                 ;Teller voor FOR...NEXT lussen
PORTA.2 = 0                   ;Maak PORTA.2 laag


;Hoofdprogramma
WHILE 1 = 1

  ;Dit blok wordt met de normale kloksnelheid (4MHz) uitgevoerd
  FOR x = 1 TO 6              ;6x staat voor 3x aan en 3x uit
    TOGGLE PORTA.2            ;Aan moet uit, uit moet aan
    DELAYMS 100               ;100 milliseconden (PIC op 4MHz intern kristal)
  NEXT

  ;Hier wordt bit 3 van het PCON register (OSCF) op '0' gezet, de PIC gaat op 48kHz draaien
  OSCF = 0                    ;OSCF bit (PCON register bit 3) op 0 zetten (= 48kHz int osc) 

  ;Dit blok wordt met de langzame kloksnelheid (48kHz) uitgevoerd
  FOR x = 1 TO 6              ;6x staat voor 3x aan en 3x uit
    TOGGLE PORTA.2            ;Aan moet uit, uit moet aan
    DELAYMS 100               ;100 milliseconden, maar door 48kHz is deze tijd veel langer
  NEXT

  ;Hier wordt bit 3 van het PCON register (OSCF) terug op '1' gezet, de PIC draait op 4MHz 
  OSCF = 1                    ;OSCF bit (PCON register bit 3) op 1 zetten (= 4MHz int osc)
WEND

Door bovenin je programma (bij Registernamen) de namen aan de diverse bitnummers te geven, kun je verder in je programma de namen gebruiken in plaats van de losse bitnummers op te geven.
Dus om de PIC op 48kHz te laten draaien mag je nu ook OSCF = 0 in plaats van PCON.3 = 0 opgeven, zoals in bovenstaand voorbeeld is gedaan.
Voor de werking en de grootte van het programma in de PIC maakt het niets uit, het is maar wat je zelf het makkelijkst vindt.

In bovenstaand voorbeeld heeft alleen bit 3 van het PCON register een naam gekregen (namelijk OSCF), maar je kunt dit natuurlijk bij alle bits van alle registers doen.
Als het register of de bitnaam niet bestaat in het opgegeven PIC type, zal het niet vet en donkergroen gekleurd weergegeven worden.


Een beknopt overzicht van de registers is ook in de PIC Basic IDE zelf te vinden.
De namen kun je zelfs automatisch door de PIC Basic IDE in je programma laten plaatsen.
Dit doe je met behulp van de Code Explorer.


Zet eerst de cursor klaar op de plek vanaf waar straks de code moet komen.
 


Om de Code Explorer te openen (als dat nog niet het geval is):
Klik op View > Code Explorer.
 


Open de "16F628A" map om in het SFR overzicht te komen.
(SFR = Special Function Registers).

 


De registers zijn op alfabetische volgorde te zetten.
1. Klik hiervoor op de knop met het pijltje.
2. Klik op "Sort Nodes" (er komt een 'V' voor te staan).
3. Klik op punt 3 als je de Code Explorer wilt sluiten.

 


Zoek het PCON register in de lijst en klik hierop om het te openen.
 


Nu krijg je een overzicht van het PCON register.
Door op een bitnaam te klikken krijg je extra informatie van dat bit.

 


De IDE kan de namen (OSCF, NOT_POR en NOT_BOD) eventueel automatisch in je programma plaatsen.
Klik daarvoor op: "Generate and insert code at the current cursor position".

 


De Code Explorer heeft bovenstaande drie registernamen automatisch ingevuld.
 


Maak er een gewoonte van om de code meteen even netjes uit te lijnen.
 


Voor uitgebreide informatie over de registers ben je echter aangewezen op de datasheet van de gebruikte PIC.
Door de veelheid aan informatie die in de datasheet staat lijkt het een moeilijk boekwerk.
Maar als je echt gericht zoekt naar een onderwerp waarover je meer wilt weten, zul je zien dat het eigenlijk helemaal niet zo moeilijk is.
Je moet echter wel redelijk goed (technisch) Engels kunnen.
Download de datasheet van de 16F628A en blader het eens door, je kunt er veel uit leren.

Datasheet 16F628A downloaden

 

N.B. Bij de 16F628A is het 48kHz, maar bij de 16F628 (dus zonder A) is de lage interne frequentie 37kHz.

(Later meer over het PCON register).