Хелпикс

Главная

Контакты

Случайная статья





Розрахунково – графічна робота



Розрахунково – графічна робота

з курсу «Мікроконтролерне керування»

Виконав студент 4 курсу РТФ

гр. РВ-11

Артеменко Д. С.

Задані параметри мого варіанту:

Швидкість 19200

Частота 1000 Гц

 

#include " NUC1xx. h"  

           

       void Timer_initial(void);

       void InterruptInit(void);

       void InitADC(void);

       void uart_tx_char(unsigned char data);

       void uart_tx_char(unsigned char data);

       void hex_to_ascii(unsigned int binary, unsigned char *ascii);

       void uart_transmit(unsigned int data);

       void InitUSART(void);

       unsigned int counter = 0;

 

int main (void) {

           

       //InterruptInit();

       Timer_initial();

       InitADC();

       //uart_transmit(data);

       //uart_tx_char(counter);

       while(1){

                   //uart_transmit(counter++);

       }

}

void uart_tx_char(unsigned char data)

{

       while(UART0-> FSR. TE_FLAG == 0)

                             ;

       UART0-> DATA = data;

}

 

void Timer_initial(void)

{

       /* Step 1. Enable and Select Timer clock source */

       SYSCLK-> CLKSEL1. TMR0_S = 0; //Select 12Mhz for Timer0 clk src

        SYSCLK-> APBCLK. TMR0_EN =1; //Enable Timer0 clock source

       /* Step 2. Select Operation mode */

       TIMER0-> TCSR. MODE=1; //Sel. periodic mode for operation mode

       /* Step 3. Select Time out period = (Period of timer clock input) * (8-bit Prescale + 1) * (24-bit TCMP)*/

       TIMER0-> TCSR. PRESCALE=0; // Set Prescale [0~255]

       TIMER0-> TCMPR = 12000; // Set TICR(TCMP) [0~16777215]

       // (1/12000000)*(0+1)*(12000)= 1msec or 1000Hz.

За формулою розраховуємо час.    

/* Step 4. Enable interrupt */

       TIMER0-> TCSR. IE = 1;

       TIMER0-> TISR. TIF = 1; //Write 1 to clear for safty

       NVIC_EnableIRQ(TMR0_IRQn); //Enable Timer0 Interrupt

       /* Step 5. Enable Timer module */

       TIMER0-> TCSR. CRST = 1; //Reset up counter

       TIMER0-> TCSR. CEN = 1; //Enable Timer0

        TIMER0-> TCSR. TDR_EN=1; // Enable TDR function

}

 

void InitADC(void) {

       /* Step 1. GPIO initial */

       GPIOA-> OFFD|=0x00800000; //Disable digital input path

       SYS-> GPAMFP. ADC7_SS21_AD6=1; //Set ADC function

       /* Step 2. Enable and Select ADC clock source, and then enable ADC module */

       SYSCLK-> CLKSEL1. ADC_S = 2; //Select 22Mhz for ADC

       SYSCLK-> CLKDIV. ADC_N = 1; //ADC clock source=22Mhz/2=11Mhz;

       SYSCLK-> APBCLK. ADC_EN = 1; //Enable clock source

       ADC-> ADCR. ADEN = 1; //Enable ADC module

       /* Step 3. Select Operation mode */

       ADC-> ADCR. DIFFEN = 0; //single end input

       ADC-> ADCR. ADMD = 0; //single mode

       /* Step 4. Select ADC channel */

       ADC-> ADCHER. CHEN = 0x80;

       /* Step 5. Enable ADC interrupt */

       ADC-> ADSR. ADF =1; //clear the A/D interrupt flags for safe

       ADC-> ADCR. ADIE = 1;

       // NVIC_EnableIRQ(ADC_IRQn);

       /* Step 6. Enable WDT module */

       ADC-> ADCR. ADST=1;

}

 

void InterruptInit(void) {

       UART0-> IER. RDA_IEN = 1; //Receive Data Available Interrupt Enable

       // Clear any previous occurred interrupt for port 3

       NVIC_ClearPendingIRQ(UART0_IRQn);

       // Set priority of port 3 interrupt

       NVIC_SetPriority(UART0_IRQn, 0);

       // Enable interrupt at NVIC

       NVIC_EnableIRQ(UART0_IRQn);

       return;

}

 

void uart_transmit(unsigned int data)

{

        unsigned char buff[5];

       hex_to_ascii(data, & buff[0]);

       uart_tx_char('V');

        uart_tx_char(buff[4]);

        uart_tx_char(buff[3]);

        uart_tx_char(buff[2]);

        uart_tx_char(buff[1]);

        uart_tx_char(buff[0]);

        uart_tx_char('\n');

        uart_tx_char('\r');

}

           

void hex_to_ascii(unsigned int binary, unsigned char *ascii)

{

        register unsigned char n;

        for(n = 0; n < = 4; n++)//??????? ???????

        ascii[n] = '0';

        for(n = 0; n < = 4; n++)//???????????? ? ???????? -?????????? ???

        {

                    ascii[n] = (binary % 10) | '0';

                    binary = binary / 10;

                    if(binary == 0) break;

        }

}         

 

void TMR0_IRQHandler(void) // Timer0 interrupt subroutine

{

       unsigned int tmpres;

       TIMER0-> TISR. TIF =1;

           

       ADC-> ADSR. ADF=1;

       //while(ADC-> ADSR. ADF==0)

       //    ;

       //tmpres = (ADC-> ADDR[7]. RSLT*312 > > 8);

       uart_transmit(ADC-> ADDR[7]. RSLT);

       ADC-> ADCR. ADST=1;

}

       INCLUDE reg_def. s

       AREA |. text|, CODE, READONLY

           

SystemInit             PROC

                                          EXPORT SystemInit        [WEAK]

                                         ; IMPORT ref_def

           LDR R0, =0x50000100

          ; Unlock Register               

           LDR R1, =0x59

           STR R1, [R0]

           LDR R1, =0x16

           STR R1, [R0]

           LDR R1, =0x88

           STR R1, [R0]

                                              

; Init Clock Gen for 48 MHz

       LDR          R0, =CLK_BA

       LDR          R1, =0x1D; Enable external 4~24 MHz high speed crystal

       STR           R1, [R0]; XTL12M_EN = 1

           

       LDR          R1, =0x0000C22E; IN_DV = 0x1, OUT_DV = 0x3, FB_DV = 0x2E

       STR           R1, [R0, #PLLCON]; PLLFOUT = 48 MHz from PLL 

           

       MOVS       R1, #0x3; SysTick clock source select HCLK/2

       LSLS R1, R1, #3

       MOVS       R2, #0x2

       ORRS R1, R2; CLK SRC for CPUCLK, HCLK, PCLK - PLLFOUT

       STR           R1, [R0, #CLKSEL0]

           

       MOVS       R1, #0                   ; HCLK_N = 0, divide by 1           

       STR           R1, [R0, #CLKDIV]; PLLFOUT = 48 MHz from PLL

           

; Init GPIO for LED's

       LDR R0, =GP_BA

       LDR          R1, =0x55000000

       LDR          R2, =GPIOC_PMD

       STR           R1, [R0, R2]

           

       LDR          R1, =0x0000F000

       LDR          R2, =GPIOC_DOUT

       STR           R1, [R0, R2]  

           

; Init UART0

; Eiio? ao? ao? y aeaia? a IE aey? iaioe c UART

       LDR R0, =GCR_BA

      ; PB. 0 & PB. 1 Pin Function Selection

       MOVS       R2, #0x3; 1-UART0 TXD & RXD

       STR           R2, [R0, #GPB_MFP]; Aecia? aiiy? a? eio? iaioe iiaoey UART0

       LDR          R0, =UART0_BA

       MOVS       R2, #0

       STR        R2, [R0, #UA_FUN_SEL]; Neaiae Reset aey UART0

       LDR          R0, =GCR_BA    ; SYS-> IPRSTC2. UART0_RST = 1;

       MOVS       R2, #0x1   ; SYS-> IPRSTC2. UART0_RST = 0;

       LSLS R2, #16

       STR           R2, [R0, #IPRSTC2]

       MOVS       R2, #0x0

       STR           R2, [R0, #IPRSTC2]; Aa? ieiaiiy UART0

       LDR          R0, =CLK_BA    ; SYSCLK-> APBCLK. UART0_EN = 1;

       MOVS       R2, #0x1;

       LSLS R2, #16

       STR           R2, [R0, #APBCLK]; Neaiae neeaaiiy aey aooa?? a Tx oa Rx FIFO

       LDR          R0, =UART0_BA; Set Rx Trigger Level (FCR. RFITL)

       MOVS       R2, #0x6;

       STR           R2, [R0, #UA_FCR]; Oiiao aaieo: e-ou? ic?. aaieo, noiiiaeo a? o,

       LDR          R0, =UART0_BA; ia? aa?? ea ia ia? i? nou

       MOVS       R2, #0x3; 1 StopBits; No Parity;

       STR           R2, [R0, #UA_LCR]; Set Time-Out (TOR. TOIC)

       LDR          R0, =UART0_BA

       MOVS       R2, #0x1;

       LSLS R2, #12; TX Delay Time Value

       STR           R2, [R0, #UA_TOR]; Iaeaoooaaiiy oaeoiaiai neaiaeo aey iiaoey UART0

       LDR          R0, =CLK_BA; SYSCLK-> CLKSEL1. UART_S = 0;

       LDR          R1, =0x00000000; XTL12M to UART

       STR           R1, [R0, #CLKSEL1]; Mode 2, Baud rate = UART_CLK / (A+2), A must > =3

       LDR          R0, =UART0_BA; Baud rate =2400

       LDR          R2, =0x3f00026F; DIV_X_EN=1; DIV_X_ONE=1; A=0x66  

       З дата шиту до мікроконтролера обираємо формулу і розраховуємо 0x3f00026F

       STR           R2, [R0, #UA_BAUD]        

                                              

; SysTick Timer Init to form 1 ms                                                                

      ; LDR        R0, =SCS_BA

      ; LDR        R1, =47999

      ; STR         R1, [R0, #SYST_RVR]

      ; MOVS     R1, #0

      ; STR         R1, [R0, #SYST_CVR]

      ; MOVS                 R1, #5

      ; STR         R1, [R0, #SYST_CSR]

                       

                       

                     ; Lock register

                                          LDR R0, =0x50000100

           MOVS R1, #0

           STR R1, [R0]

 

                                          BX LR

                                          ENDP

       END



  

© helpiks.su При использовании или копировании материалов прямая ссылка на сайт обязательна.