Hi,
vielleicht hilft es dem einen oder anderen beim Start.
Getestet auf XPlain Board.
Ist nicht viel Code, aber viel Registerbeschreibung
Ich habe die Register direkt gesetzt, man braucht also keine xmega.lib!
Zum testen habe ich den internen 2 MHz Oszillator auf die PLL gegeben und mit 16 multipliziert.
Das heißt: 2 MHz rein, 32 MHz raus.
(der Code ist nach einer Frage im MCS-Forum entstanden, deshalb sind die Kommentare auf englisch)
Code:
$regfile = "xm128a1def.dat"
$crystal = 32000000 '
Ddre = &B11111111 'All Pins on PortE as Output
Dim A As Byte '
'If we use a Crystal we have to set up Frequency Range and Startup Time first
'If we use a external Clock we have to write the XOSCSEL Bit
'*************** XOSCCTRL = XOSC Register (Adress &H52) **********************
'* *
'* 7 6 Bits 7-6 FRQRANGE Crystal Frequency Range *
'* 0 0 04TO2 0.4 MHz to 2 MHz *
'* 0 1 2TO9 2 MHz to 9 MHz *
'* 1 0 9TO12 9 MHz to 12 MHz *
'* 1 1 XOSC External Oszillator *
'*-----------------------------------------------------------------------------*
'* BIT 5 32.768 Crystal Oscillator Low Power Mode *
'* 0 = OFF 1 = Low Power *
'*-----------------------------------------------------------------------------*
'*-----------------------------------------------------------------------------*
'* BIT 4 Reserved, always write to zero *
'*-----------------------------------------------------------------------------*
'* 3 2 1 0 XOSCSEL External Oscillator Select *
'* 0 0 0 1 EXTCLK External Clock *
'* 0 0 1 0 32KHZ 32.768 TOSC Startup Time 16K CLK *
'* 0 0 1 1 XTAL_256CLK 0-16 MHz Crystal Startup Time 256K CLK*
'* 0 1 1 1 XTAL_1KCLK 0-16 MHz Crystal Startup Time 1K CLK*
'* 1 0 1 1 XTAL_16KCLK 0-16 MHz Crystal Startup Time 16K CLK*
'*******************************************************************************
'For Example, if we use 4MHz Crystal:
'Out &H52 , &B01101011 ' Freq 2 to 9 MHz, Startup Time 16K Clocks, 32KHz Osc in low power Mode
'In this Example we use the internal 2MHz Oscillator
'**** CTRL = Oscillator Control Register (Adress &H50) bits 7-3 Reserved *******
'* Enables or disables Oscillators or PLL *
'* *
'* Bit 0 = RC2MEN 2MHz internal *
'* Bit 1 = RC32MEN 32MHz internal *
'* Bit 2 = RC32KEN 32KHz internal *
'* Bit 3 = XOSCEN external Oscillator *
'* Bit 4 = PLLEN PLL *
'*******************************************************************************
'Out &H50 , &B00000010 ' enable 32MHz Oscillator
'Out &H50 , &B00000001 ' enable 2MHz Oscillator
'Out &H50 , &B00000011 ' enable 32MHz AND 2MHz Oscillators
'Out &H50 , &B00001000 ' enable external Oscillator
Out &H50 , &B00000001 ' enable 2MHz Oscillator
'*************** PLLCTRL = PLL Control Register (Adress &H55) *****************
'* *
'* 7 6 Bits 7-6 PLLSCR PLL Clocksource *
'* 0 0 RC2MHz 2MHz internal *
'* 0 1 Reserved *
'* 1 0 RC32MHz 32MHz internal *
'* 1 1 XOSC External Oszillator *
'*-----------------------------------------------------------------------------*
'* BIT 5 Reserved, always write to zero *
'*-----------------------------------------------------------------------------*
'* 4 3 2 1 0 PLLFAC Pll Multiplication Factor *
'* 0 0 0 0 1 Multiplication x 1 *
'* 0 0 0 1 0 Multiplication x 2 *
'* 0 0 0 1 1 Multiplication x 3 *
'* 0 0 1 0 0 Multiplication x 4 *
'* 0 0 1 0 1 Multiplication x 5 *
'* 0 0 1 1 0 Multiplication x 6 *
'* 0 0 1 1 1 Multiplication x 7 *
'* 0 1 0 0 0 Multiplication x 8 *
'* 0 1 0 0 1 Multiplication x 9 *
'* 0 1 0 1 0 Multiplication x 10 *
'* 0 1 0 1 1 Multiplication x 11 *
'* 0 1 1 0 0 Multiplication x 12 *
'* 0 1 1 0 1 Multiplication x 13 *
'* 0 1 1 1 0 Multiplication x 14 *
'* 0 1 1 1 1 Multiplication x 15 *
'* 1 0 0 0 0 Multiplication x 16 *
'* 1 0 0 0 1 Multiplication x 17 *
'* 1 0 0 1 0 Multiplication x 18 *
'* 1 0 0 1 1 Multiplication x 19 *
'* 1 0 1 0 0 Multiplication x 20 *
'* 1 0 1 0 1 Multiplication x 21 *
'* 1 0 1 1 0 Multiplication x 22 *
'* 1 0 1 1 1 Multiplication x 23 *
'* 1 1 0 0 0 Multiplication x 24 *
'* 1 1 0 0 1 Multiplication x 25 *
'* 1 1 0 1 0 Multiplication x 26 *
'* 1 1 0 1 1 Multiplication x 27 *
'* 1 1 1 0 0 Multiplication x 28 *
'* 1 1 1 0 1 Multiplication x 29 *
'* 1 1 1 1 0 Multiplication x 30 *
'* 1 1 1 1 1 Multiplication x 31 *
'*******************************************************************************
Out &H55 , &B00010000 'PLL Clocksource = 2MHz internal Osc.
' ,Multiplicator = 16 to get 32 MHz Out
' Some Registers are protected by the "Configuration Change Protect Mechanism" (CCP Register)
' We have to disable that Protection, then write to the Register within 4 clockcycles
'*********** Configuration Change Protection Register (Adress &H34) ************
'* &H9D SMP Protected SPM/LPM *
'* &HD8 IOREG Protected IO Register *
'*******************************************************************************
Out &H34 , &HD8 'No write protection for 4 cycles '
'We can use 3 different Prescalers
'************* PSCTRLSystem Clock Prescaler Register (Adress &H34) ************
'* 7 6 5 4 3 2 1 0 (Bit7 Reserved, write to zero) *
'* R 0 0 0 0 0 PSADIV Prescaler A Div Div by 1 (NoDiv) *
'* R 0 0 0 0 1 PSADIV Prescaler A Div Div by 2 *
'* R 0 0 0 1 1 PSADIV Prescaler A Div Div by 4 *
'* R 0 0 1 0 1 PSADIV Prescaler A Div Div by 8 *
'* R 0 0 1 1 1 PSADIV Prescaler A Div Div by 16 *
'* R 0 1 0 0 1 PSADIV Prescaler A Div Div by 32 *
'* R 0 1 0 1 1 PSADIV Prescaler A Div Div by 64 *
'* R 0 1 1 0 1 PSADIV Prescaler A Div Div by 128 *
'* R 0 1 1 1 1 PSADIV Prescaler A Div Div by 256 *
'* R 1 0 0 0 1 PSADIV Prescaler A Div Div by 512 *
'* Bits 1 0 PSBCDIV Prescaler B and C *
'* 0 0 B=1 (no division) C =1 (no division) *
'* 0 1 B=1 (no division) C Div by =2 *
'* 1 0 B=4 Div by 4 C =1 (no division) *
'* 1 1 B=2 Div by 2 C = 2 Div by =2 *
'*******************************************************************************
'Out &H41 , &B00001100 'Prescaler= Prescaler A=4, B =0, C =0
Out &H41 , &B00000000 'Prescaler= No division Prescaler A, B and C
'**** STATUS Oscillator Status Register (Adress &H51) bits 7-5 Reserved ********
'* Indicates Ready Flags when Oscillator is stable *
'*-----------------------------------------------------------------------------*
'* 4 3 2 1 0 Bits 4-0 *
'* 1 0 0 0 0 PLLRDY, PLL has locked to PLL Clocksource *
'* 0 1 0 0 0 XOSCRDY. External Clock Source ready *
'* 0 0 1 0 0 RC32KRDY internal 32KHz Oscillator ready *
'* 0 0 0 1 0 RC32MRDY internal 32MHz Oscillator ready *
'* 0 0 0 0 1 RC2MRDY internal 2MHz Oscillator ready *
'*******************************************************************************
While A.0 = 0 'Wait for 2MHz Osc. to be ready
A = Inp(&H51)
Wend
'Again, we use the CTRL = Oscillator Control Register like at the beginning,
'to additional enable the PLL, (2MHz Oscillator, Bit 0 is still enabled),
Out &H50 , &B00010001 ' enable PLL
'Now we wait until the PLL is locked
While A.4 = 0 'Wait for PLL to be ready
A = Inp(&H51)
Wend
'Multiplication Factor = 16, so we should get 32MHz Clock
'**************** OSCCTRL = System Clock selection (Adress &H40) ***************
'* 2 1 0 Bits 2-0 *
'* *
'* 0 0 0 RC2MHz 2MHz internal *
'* 0 0 1 RC32MHz 32MHz internal *
'* 0 1 0 RC32KHz 32KHz internal *
'* 0 1 1 XOSC External Oszillator *
'* 1 0 0 PLL PLL *
'*******************************************************************************
Out &H34 , &HD8 'No write protection for 4 cycles '
Out &H40 , &B00000100 'Select PLL as system Clock
'***************** LOCK Clock System Lock Register (Adress &H42) ***************
'* 7 6 5 4 3 2 1 0 (R= Reseved, write to zero) *
'* R R R R R R R 0 = No Lock *
'* R R R R R R R 1 = Locked *
'*******************************************************************************
Out &H34 , &HD8 'No write protection for 4 cycles '
Out &H42 , &B00000001 'Lock System Clock Settings
'
Porte = &B00001111 'indicate init done
Wait 1
Do
Toggle Porte
Waitms 1000
Loop
End
Macht richtig Spaß mit den Prescalern und der PLL zu spielen
Gruß
Christopher
Lesezeichen