PIC18F47J53 PLLDIV förvirring.

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
H.O
Inlägg: 5917
Blev medlem: 19 mars 2007, 10:11:27
Ort: Ronneby

PIC18F47J53 PLLDIV förvirring.

Inlägg av H.O »

Hej,
Om man vill köra en PIC18F47J53 på 48MHz med hjälp av den interna oscillatorn måste man använda PLL'en. Den interna oscillatorn är på 8MHz och PLL'en förväntar sig 4MHz på sin ingång. Vi behöver dela 8MHz klockan med två. Ur databladet:
18F47J53 oscillator block.png
PLLDIV <2:0> skall alltså inta värdet 6 för att prescalern skall dela med två, vilket också stöds av flera tabeller i databladet, bland annat förklaringen av CONFIG1L (där de relevanta bitarna lever):

Kod: Markera allt

bit 3-1 PLLDIV<2:0>: Oscillator Selection bits
Divider must be selected to provide a 4 MHz input into the 96 MHz PLL.
111 = No divide – oscillator used directly (4 MHz input)
110 = Oscillator divided by 2 (8 MHz input)
101 = Oscillator divided by 3 (12 MHz input)
100 = Oscillator divided by 4 (16 MHz input)
011 = Oscillator divided by 5 (20 MHz input)
010 = Oscillator divided by 6 (24 MHz input)
001 = Oscillator divided by 10 (40 MHz input)
000 = Oscillator divided by 12 (48 MHz input)
Men när man sen tittar i p18f47j53.inc (i MPASMX katalogen) så står det:

Kod: Markera allt

;   PLL Prescaler Selection:
;     PLLDIV = 12          Divide by 12 (48 MHz oscillator input)
;     PLLDIV = 10          Divide by 10 (40 MHz oscillator input)
;     PLLDIV = 6           Divide by 6 (24 MHz oscillator input)
;     PLLDIV = 5           Divide by 5 (20 MHz oscillator input)
;     PLLDIV = 4           Divide by 4 (16 MHz oscillator input)
;     PLLDIV = 3           Divide by 3 (12 MHz oscillator input)
;     PLLDIV = 2           Divide by 2 (8 MHz oscillator input)
;     PLLDIV = 1           No prescale (4 MHz oscillator input drives PLL directly)
Här visar de alltså att man i "klartext" skall skriva med vilket förhållande man vill dela klockfrekvensen och om jag kompilerar/assemblerar ett program där jag har PLLDIV=2 och laddar .hex filen i Microchip IPE så visar den mycket riktigt att med PLLDIV=2 får CONFIG1L värdet BD(hex), vilket betyder att tre PLLDIV-bitarna i CONFIG1L får värdet 6:
Config.png
Jag har inget direkt problem, allt fungerar som det ska men det är "lite" förvirrande och jag är nyfiken. Kan någon förklara var denna "ommappning" sker? Är optionerna definierade i någon fil jag missat eller sker detta automagiskt i assemblern?
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: PIC18F47J53 PLLDIV förvirring.

Inlägg av sodjan »

Med "ommappning" menar du alltså "2" => "110".
Tja, om det hade stått "110" som PLLDIV värde så hade du kanske
tvingats slå upp det för att se att det motsvarar just "dela med 2".
Att ha den faktiska delningsfaktorn kanske oftare är bättre. (?).

Det jag inte förstår är varför det finns ett "dela med 12" alternativ.
Om man redan har 48 MHz in (från OSC1/2) så kan man ju bara
köra det "rakt fram" utan att ta omvägen över PLL modulen...
Användarvisningsbild
Klas-Kenny
Inlägg: 11840
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: PIC18F47J53 PLLDIV förvirring.

Inlägg av Klas-Kenny »

Sodjan: Frågan var väl *var* ommappningen sker, inte varför.

H.O: Verkar vara definierat i ~/xc8/v1.xx/dat/cfgdata/18f47j53.cfgdata

Kod: Markera allt

CSETTING:E:PLLDIV:PLL Prescaler Selection
CVALUE:E:1:No prescale (4 MHz oscillator input drives PLL directly)
CVALUE:C:2:Divide by 2 (8 MHz oscillator input)
CVALUE:A:3:Divide by 3 (12 MHz oscillator input)
CVALUE:8:4:Divide by 4 (16 MHz oscillator input)
CVALUE:6:5:Divide by 5 (20 MHz oscillator input)
CVALUE:4:6:Divide by 6 (24 MHz oscillator input)
CVALUE:2:10:Divide by 10 (40 MHz oscillator input)
CVALUE:0:12:Divide by 12 (48 MHz oscillator input)
Talet efter CVALUE: är ju det korrekta värdet, bara skiftat ett steg åt vänster.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: PIC18F47J53 PLLDIV förvirring.

Inlägg av sodjan »

Aha, ja, kanske det... :-) Att det sker internt i verktyget är väl klart...
H.O
Inlägg: 5917
Blev medlem: 19 mars 2007, 10:11:27
Ort: Ronneby

Re: PIC18F47J53 PLLDIV förvirring.

Inlägg av H.O »

Sojan,
Absolut, att ha den faktiska delningsfaktorn är betydligt bättre! Men det är just det att i databladet står det att de tre bitarna benämnda PLLDIV skall ha värdet 6 för en delningsfaktor på två. När det sedan finns en CONFIG option som heter exakt som de tre bitarna (dvs PLLDIV) är det väl rimligt att tänka sig att CONFIG PLLDIV=6 skall ge delningsfaktor på 2 - men så är det ju uppenbarligen inte.

Det är ju ungefär som att det skulle finnas en fördefinerad bit, t.ex T0CON.PSA där det i databladet står att den ska ha värdet 0 för att prescalern SKALL vara "igång" (vilket ju kan kännas lite "bakvänt") men att man i koden skall skriva T0CON.PSA=1 för att det känns mer "logiskt".

Tack Klas-Kenny!
Men jag har jag inte XC8 installerat så i mitt fall kan det inte vara där, det måste vara i någon fil som assemblern använder eller *I* själva assemblern men om så vore fallet varför finns det då med i nån XC8-fil? Hmm.....
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: PIC18F47J53 PLLDIV förvirring.

Inlägg av sodjan »

Nu så var ju detta inget problem, men... :-)

Så om det stod "PLL prescaler divider" istället för "PLLDIV" så vore det OK? :-)

Din jämförelse med PSA haltar. Där hade det för att vara analogt med
PLLDIV ha stått "on" resp "off", där "on" = 0 och "off" = 1.
"On/off" motsvarar "none/2/3/4/5/6/10/12".

Dessutom är PLLDIV0-2 tre bitar mitt inne i ett register så att tala om ett
"värde" på dessa tre bitar blir i alla fall lite underligt. Det är skillnad då
man talar om ett register där hela registret i sig har ett värde.
Skriv svar