Witam
Napisałem jakiś czas temu start zegara z wewnętrznego generatora, działa idealnie.
Przełącza się stosując metodę zalecaną przez Atmela podczas pracy, by zaoszczędzić energię.
Poniżej zamieszczam kod w assemblerze. Są jeszcze rodzynki które piszą w assemblerze. Ja obecnie korzystam w większości z C ponieważ w ARMach używanie kodu maszynowego to przerost formy i zbyteczna strata czasu, zaś w AVRach assembler zawsze się przydaje ze względu na maksymalną optymalizację kodu.
Zapraszam na:
USBKey - AVR, USB i PS3
oraz na
Projekty elektroniczne
Pozdrawiam i życzę miłego kodowania
MrTip
Napisałem jakiś czas temu start zegara z wewnętrznego generatora, działa idealnie.
Przełącza się stosując metodę zalecaną przez Atmela podczas pracy, by zaoszczędzić energię.
Poniżej zamieszczam kod w assemblerze. Są jeszcze rodzynki które piszą w assemblerze. Ja obecnie korzystam w większości z C ponieważ w ARMach używanie kodu maszynowego to przerost formy i zbyteczna strata czasu, zaś w AVRach assembler zawsze się przydaje ze względu na maksymalną optymalizację kodu.
;-----------------------------------------------------------------------------------------------------------
; Initialize clock source
; Select manual
;
; Wszystkie modele atXmega
;
; Procedury startu zegara napisane przezemnie
; Projekty, urządzenia, sterowniki
; mrtip@wp.pl
; http://www.banerled.pl
; http://www.usbkey.pl
;-----------------------------------------------------------------------------------------------------------
rcall Select32KCLK ; 32 khz
rcall Select2MCLK ; 2 Mhz
rcall Select32MCLK ; 32 Mhz
;-----------------------------------------------------------------------------------------------------------
Select32KCLK:
lds r16, OSC_CTRL
ori r16, OSC_RC32KEN_bm
sts OSC_CTRL, r16
;do {} while ( CLKSYS_IsReady( OSC_RC32KRDY_bm ) == 0 );
c32kclk:
lds r16,OSC_STATUS
sbrs r16, 0
rjmp c32kclk
;CLKSYS_Main_ClockSource_Select( CLK_SCLKSEL_RC32K_gc );
lds r16,CLK_CTRL
andi r16, 0xF8 ; 248
ldi r17, CLK_SCLKSEL_RC32K_gc
or r17, r16
cli
ldi r16,CCP_IOREG_gc
sts CPU_CCP,r16
sts CLK_CTRL, r17
;CLKSYS_Disable( OSC_RC32MEN_bm | OSC_RC2MEN_bm );
ldi r16, OSC_RC32MEN_bm | OSC_RC2MEN_bm
sts OSC_CTRL,r16
ret
;-----------------------------------------------------------------------------------------------------------
Select2MCLK:
lds r16, OSC_CTRL
ori r16, OSC_RC2MEN_bm
sts OSC_CTRL, r16
;do {} while ( CLKSYS_IsReady( OSC_RC2MRDY_bm ) == 0 );
c2clk:
lds r16,OSC_STATUS
sbrs r16, 0
rjmp c2clk
;CLKSYS_Main_ClockSource_Select( CLK_SCLKSEL_RC2M_gc );
lds r16,CLK_CTRL
andi r16, 0xF8 ; 248
ldi r17, CLK_SCLKSEL_RC2M_gc
or r17, r16
cli
ldi r16,CCP_IOREG_gc
sts CPU_CCP,r16
sts CLK_CTRL, r17
;CLKSYS_Disable( OSC_RC32MEN_bm | OSC_RC32KEN_bm );
ldi r16, OSC_RC32MEN_bm | OSC_RC32KEN_bm
sts OSC_CTRL,r16
ret
;-----------------------------------------------------------------------------------------------------------
Select32MCLK:
;CLKSYS_Enable( OSC_RC32MEN_bm );
lds r16, OSC_CTRL
ori r16, OSC_RC32MEN_bm
sts OSC_CTRL, r16
;do {} while ( CLKSYS_IsReady( OSC_RC32MRDY_bm ) == 0 );
c32mclk:
lds r16,OSC_STATUS
sbrs r16, 1
rjmp c32mclk
;CLKSYS_Main_ClockSource_Select( CLK_SCLKSEL_RC32M_gc );
lds r16,CLK_CTRL
andi r16, 0xF8 ; 248
ldi r17, CLK_SCLKSEL_RC32M_gc
or r17, r16
cli
ldi r16,CCP_IOREG_gc
sts CPU_CCP,r16
sts CLK_CTRL, r17
;CLKSYS_Disable( OSC_RC2MEN_bm | OSC_RC32KEN_bm );
ldi r16, OSC_RC2MEN_bm | OSC_RC32KEN_bm ; 5
sts OSC_CTRL,r16
ret
;-----------------------------------------------------------------------------------------------------------
Zapraszam na:
USBKey - AVR, USB i PS3
oraz na
Projekty elektroniczne
Pozdrawiam i życzę miłego kodowania
MrTip