logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Uruchamiamy atxmega 32khz, 2Mhz, 32Mhz w assemblerze

mrtip 20 Sty 2011 00:05 1386 3
REKLAMA
  • #1 9030402
    mrtip
    Poziom 14  
    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.

    
    ;-----------------------------------------------------------------------------------------------------------
    ; 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
  • REKLAMA
  • REKLAMA
  • #3 9031290
    mrtip
    Poziom 14  
    Witaj Light-I

    Stosuję się do tematu działu, cytuję:
    Cytat:
    Mikrokontrolery Ogólne
    Ogólne dyskusje o mikrokontrolerach. Współpraca z układami I/O, zasilanie, układy resetu i nadzoru, zagadnienia teoretyczne


    Więc DIY, nie bardzo pasuje, ponieważ daję przykład dla każdego kto będzie miał problem z ruszeniem z Xmega. Sam wiesz z doświadczenia, że uruchamiając nowość sprzętową, to informacji w internecie jest naprawdę niewiele. Najgorszą rzeczą jest zawieść się z układem czy MCU na samym początku.
  • #4 9031516
    LordBlick
    VIP Zasłużony dla elektroda
    Miałem tylko na myśli, że dział "DIY Początkujący / Niedokończone" bardziej by był odpowiedni do chwalenia się takim kodem ;) De facto to jest jedna procedura powielona 3 razy z różnymi danymi...
REKLAMA