📄 adcb.c
字号:
#include "Headers.h"
/* Intrerupere ADCB la sfarsitul unei conversii */
#pragma interrupt saveall
void isrADCB_interrupt(void)
{
register UInt16 data;
enterCritical(); /* Intram intr-o sectiune critica pe perioada intreruperii*/
asm(move.w #$0800,X:ADCB_STAT); /* curat bitul EOSI */
data =(*(volatile word *)ADCB_RSLT0)>>3; /* extrag data utila */
// printf("dataADCB = %u\n\n ",data);
asm(bfset #$2000,X:ADCB_CR1);
exitCritical(); /* Activam controlerul de intreruperi -> parasim sectiunea critica */
}
/* Cofigurare intrerupere modul ADCB */
void initIntrADCB()
{
enterCritical(); /* Intram intr-o sectiune critica pe perioada configurarii */
asm (bfclr #$0300,SR); //permit toate tipurile de intrerupere
asm (bfset #$0003,X:IPR9); //intreruperea de SFARSIT DE CONVERSIE PENTRU ADCB
//ii atribui prioritatea 2
exitCritical(); /* Activam controlerul de intreruperi -> parasim sectiunea critica */
}
/* Initializare modul ADCB */
void ADCB_Init()
{
enterCritical(); /* Intram intr-o sectiune critica pe perioada configurarii */
asm(move.w #$0800,X:ADCB_STAT);
/**********************************************************************************************
* *
* Configurez registrul de control 1 asociat ADC-ului B *
* *
* bit 15 = 0 *
* bit 14 STOP = 0 => selectez modul de operare normal - curat bitul de stop, *
* permit initializarea de conversii ADCA *
* bit 13 START CONVERSION = 0 => inca nu dorim sa-nceapa conversia *
* bit 12 SYNC SELECT = 1 => conversia poate fi initializata prin setarea *
* bitului de start sau cu ajutorul semnalului SYNC *
* *
* bit 11 EOSIE - End Of Scan Interrupt Enable *
* = 1 => activez posib. de generare a intreruperilor ce apar la *
* sfarsitul unei secvente de conversie *
* bit 10 - 8 = 000 => dezactivez intreruperile ce pot fi generate de *
* zero Crossing, Low Limit, High Limit *
* bit 7 - 4 CHNCFG Channel configure *
* = 0000 Intrarile AN0-1,AN2-3,AN4-5,AN6-7 sunt configurate *
* ca single edge input *
* *
* bit 3 = 0 - bit rezervat *
* bit 2 - 0 ADC Control Mode (SMODE) = 000 -One Sequencial *
* La start sau Sync samplerurile sunt luate cate unul o data incepand cu *
* SAMPLE0 pana cand pana cand e intalnit primul sample disabled *
* Dca nu avem disable atunci conversia se "incheie" la SAMPLE7 *
* *
**********************************************************************************************/
asm(move.w #$0800,X:ADCB_CR1);
/***********************************************************************************************
* *
* Configurez registrul de control 2 asociat ADC-ului B *
* *
* bitii 4:0 = 15 Setez prescaler ce influenteaza frecv de conversie a ADC-ului *
* A frecv = 60MHz/(2*(5+1)) = 5 MHz - 1 ciclu ADC *
* valoarea minima este 5 *
* *
************************************************************************************************/
asm(move.w #$0005,X:ADCB_CR2);
/**********************************************************************************************
* *
* ADCB - High Limit Register *
* *
* Este utilizat pentru a impune o limita superioara pentru valoarea achizitionata *
* Verificarea limitei superioare poate fi dezactivata prin scrierea in registrul *
* ADCB_HLMT 0 ... a valorii 7FF8 *
* *
**********************************************************************************************/
asm(move.w #$7FF8,X:ADCB_HLMT0);
/**********************************************************************************************
* *
* ADCB - Low Limit Register *
* *
* Este utilizat pentru a impune o limita inferioara pentru valoarea achizitionata *
* Verificarea limitei inferioare poate fi dezactivata prin scrierea in registrul *
* ADCB_LLMT0 ... a valorii 0000 *
* *
**********************************************************************************************/
asm(move.w #$0000,X:ADCB_LLMT0);
/***********************************************************************************************
* *
* Configurez registrul ADSDIS - activez numai sample 0 *
* *
* biti 7 - 0 - 0xFE - activez numai sample 0 *
* *
***********************************************************************************************/
asm(bfset #$00FE,X:ADCB_SDIS);
/**********************************************************************************************
* *
* Configurez registrul ADLST1 si ADSLT2 *
* *
* selectez canalul ANB0 pentru Sample0 *
* *
**********************************************************************************************/
asm(move.w #$3210,X:ADCB_LST1);
/**********************************************************************************************
* *
* ADCB Offset register 0 sunt utilizati pt ca rez conv +offset sa fie stocat in ADCRSLT*
* *
*********************************************************************************************/
asm(move.w #$0000,X:ADCB_OFS0);
exitCritical(); /* Activam controlerul de intreruperi -> parasim sectiunea critica */
}
/************************************************************************************************
* Trec cele doua ADC-uri din modulul ADCB in modul POWER DOWN *
* activarea bitilor PD2-0 duce la intreruperea conversiei curente *
*************************************************************************************************/
void ADCB_POWER_DOWN_MODE(void)
{
asm(bfset #$0007,X:ADCB_POWER);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -