PIC18F47J53 PLLDIV förvirring.
Postat: 9 oktober 2016, 15:49:07
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:
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):
Men när man sen tittar i p18f47j53.inc (i MPASMX katalogen) så står det:
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:
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?
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:
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)
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)
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?