找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 1516|回復(fù): 13
打印 上一主題 下一主題
收起左側(cè)

請(qǐng)教一下,為什么我的單片機(jī)ADC_DMA進(jìn)不了中斷

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
#include "stc8h.h"
#include "eeprom.h"
#include "stdio.h"
#include "intrins.h"



typedef         unsigned char        u8;
typedef         unsigned int        u16;
typedef         unsigned long        u32;

/*************        ±¾µØ³£Á¿ÉùÃ÷        **************/
//1~16,使用的ADC轉(zhuǎn)換通道數(shù)量,必須和[ADC_DMA通道使能寄存器(DMA_ADC_CHSWx)]中啟用的ADC通道數(shù)量一致
#define ADC_CH_NUM          1  
//ADC轉(zhuǎn)換次數(shù),必須和[ADC_DMA配置寄存器2(DMA_ADC_CFG2)]設(shè)置的一致
#define ADC_SAMPLES_NUM     8   
//每個(gè)通道ADC轉(zhuǎn)換數(shù)據(jù)總字節(jié)數(shù)=2*轉(zhuǎn)換次數(shù)+4
#define ADC_DATA_SIZE       (ADC_SAMPLES_NUM*2 + 4)   

//存儲(chǔ)ADC DMA轉(zhuǎn)換結(jié)果,即ADC DMA的目的地址
u8 xdata adc_samples_buff[ADC_CH_NUM][ADC_DATA_SIZE];   
//ADC DMA轉(zhuǎn)換完成標(biāo)志
bit DmaFlag;





void Uart1_Init(void);        //4800bps@11.0592MHz
void sendByte(char dat);
void sendString(unsigned char *dat);
char putchar(char c);
void adc_dma_config(void);  
void Delay500ms(void);        //@11.0592MHz
void ADC_Init(void);


void main()
{
   u8 i,j;  
   u16 adc_value;   
   float voltage;
   Uart1_Init();
   ADC_Init();

   EA = 1;  
   printf("Hello");  

   while(1)
   {   
           if(DmaFlag)  
           {  
                      DmaFlag = 0;  
         
                      adc_value=(adc_samples_buff[0][16]<<8)+adc_samples_buff[0][17];
                      voltage   = (5*adc_value)/4096;         
                       printf("voltage: %.2fV\r\n",voltage);   

                     DMA_ADC_CR = 0xC0;      
           }
           Delay500ms();
        }

}



void adc_dma_config(void)  
{  
   P_SW2 = 0x80;  
   DMA_ADC_STA = 0x00;         //清零ADC DMA狀態(tài)寄存器
   DMA_ADC_CFG = 0x80;         //開(kāi)啟ADC DMA中斷
   DMA_ADC_RXAH = (u8)((u16)(&adc_samples_buff) >> 8); //ADC轉(zhuǎn)換數(shù)據(jù)存儲(chǔ)地址,即ADC DMA目的地址
   DMA_ADC_RXAL = (u8)((u16)(&adc_samples_buff));  
   DMA_ADC_CFG2 = 0x0A;    //每個(gè)通道ADC轉(zhuǎn)換次數(shù):8
   DMA_ADC_CHSW0 = 0x01;   //使能ADC通道1
   DMA_ADC_CHSW1 = 0x00;   
   DMA_ADC_CR = 0xC0;      //啟動(dòng)ADC DMA轉(zhuǎn)換
}  

void ADC_Init(void)
{
        P1M0=0x00;                 //設(shè)置P10為高阻輸入
        P1M1=0x01;

           ADCTIM = 0x3F;                  //設(shè)置ADC內(nèi)部時(shí)許
        ADCCFG = 0x2F;                  //設(shè)置ADC時(shí)鐘為系統(tǒng)時(shí)鐘,數(shù)據(jù)右對(duì)齊
        ADC_CONTR = 0x80;    //使能ADC模塊

}

void Uart1_Init(void)        //4800bps@11.0592MHz
{
        PCON &= 0x7F;                //波特率不倍速
        SCON = 0x50;                //8位數(shù)據(jù)位,可變波特率
        AUXR &= 0xBF;                //定時(shí)器時(shí)鐘12T模式
        AUXR &= 0xFE;                //串口1選擇定時(shí)器1為波特率發(fā)生器
        TMOD &= 0x0F;               
        TMOD |= 0x20;               
        TL1 = 0xFA;                       
        TH1 = 0xFA;                       
        ET1 = 0;                       
        TR1 = 1;                       
}



void sendByte(char dat)
{
        SBUF = dat;
        while(!TI);
        TI = 0;      
}

void sendString(unsigned char *dat)
{
        while(*dat != '\0')
        {
                sendByte(*dat++);
        }
}

char putchar(char c)
{
        sendByte(c);
        return c;
}

void ADC_DMA_Interrupt(void) interrupt 13
{
        DMA_ADC_STA = 0;
        DmaFlag = 1;
}


void Delay500ms(void)        //@11.0592MHz
{
        unsigned char data i, j, k;

        _nop_();
        _nop_();
        i = 22;
        j = 3;
        k = 227;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:1034262 發(fā)表于 2024-7-12 17:40 | 只看該作者
試試STC官方的例子:
STC8H系列-ADC相關(guān)程序.rar (918.47 KB, 下載次數(shù): 3)

回復(fù)

使用道具 舉報(bào)

板凳
ID:1109793 發(fā)表于 2024-7-12 17:49 | 只看該作者
8G和8H的ADC中斷向量號(hào)好像是5吧,我看工具里面的示例里面的是5
void ADC_Isr() interrupt 5
{
    ADC_CONTR &= ~0x20;                         //清中斷標(biāo)志
    P2 = ADC_RES;                               //讀取ADC結(jié)果
    ADC_CONTR |= 0x40;                          //繼續(xù)AD轉(zhuǎn)換
}
回復(fù)

使用道具 舉報(bào)

地板
ID:624769 發(fā)表于 2024-7-13 13:04 | 只看該作者
看你你中斷號(hào)用的 13
那么……, 你 LJMP 那段匯編 寫了沒(méi)有?
并且,是否用的 .A51 格式? 是否正確插入了項(xiàng)目?
回復(fù)

使用道具 舉報(bào)

5#
ID:298743 發(fā)表于 2024-7-14 14:44 | 只看該作者
xiaobendan001 發(fā)表于 2024-7-12 17:49
8G和8H的ADC中斷向量號(hào)好像是5吧,我看工具里面的示例里面的是5
void ADC_Isr() interrupt 5
{

STC的官方程序?qū)懙氖?3
回復(fù)

使用道具 舉報(bào)

6#
ID:298743 發(fā)表于 2024-7-14 14:46 | 只看該作者
188610329 發(fā)表于 2024-7-13 13:04
看你你中斷號(hào)用的 13
那么……, 你 LJMP 那段匯編 寫了沒(méi)有?
并且,是否用的 .A51 格式? 是否正確插入 ...

這個(gè)"stc8h.h"這個(gè)頭文件沒(méi)有嗎?我程序里還有中斷12 開(kāi)的定時(shí)器2也能正常工作
回復(fù)

使用道具 舉報(bào)

7#
ID:1109793 發(fā)表于 2024-7-14 15:00 | 只看該作者
asdadqw2 發(fā)表于 2024-7-14 14:44
STC的官方程序?qū)懙氖?3

改成5試試啊,你的官方歷程截圖看看吧
回復(fù)

使用道具 舉報(bào)

8#
ID:161164 發(fā)表于 2024-7-14 17:36 | 只看該作者
asdadqw2 發(fā)表于 2024-7-14 14:44
STC的官方程序?qū)懙氖?3

例程是13沒(méi)錯(cuò),但還要加中斷號(hào)48跳到13的附加操作



回復(fù)

使用道具 舉報(bào)

9#
ID:1109793 發(fā)表于 2024-7-14 20:07 | 只看該作者
lkc8210 發(fā)表于 2024-7-14 17:36
例程是13沒(méi)錯(cuò),但還要加中斷號(hào)48跳到13的附加操作

那是處理大于31號(hào)的手段。ADC的就是5,又不大于31,為何要借用13號(hào)?13號(hào)就是保留的,讓編譯器把服務(wù)代碼放到13號(hào)的位置,然后在不如32號(hào)的位置人為添加LJMP跳轉(zhuǎn)到13號(hào)。借用其他不使用的也一樣啊。但是ADC的就是5號(hào),直接用就行了啊,不懂為何要借用,然后還得添加匯編代碼。這不是那啥?
回復(fù)

使用道具 舉報(bào)

10#
ID:624769 發(fā)表于 2024-7-14 20:31 | 只看該作者
asdadqw2 發(fā)表于 2024-7-14 14:46
這個(gè)"stc8h.h"這個(gè)頭文件沒(méi)有嗎?我程序里還有中斷12 開(kāi)的定時(shí)器2也能正常工作

你如果看得是官方例程,你繼續(xù)往下翻,應(yīng)該會(huì)有類似這樣的代碼:
ISR.ASM
CSEG  AT  0183H
LJMP  0063H
END
你把他做成 ASM 文件 加入到項(xiàng)目里才可以。
回復(fù)

使用道具 舉報(bào)

11#
ID:161164 發(fā)表于 2024-7-14 22:19 | 只看該作者
xiaobendan001 發(fā)表于 2024-7-14 20:07
那是處理大于31號(hào)的手段。ADC的就是5,又不大于31,為何要借用13號(hào)?13號(hào)就是保留的,讓編譯器把服務(wù)代碼 ...

因?yàn)樗玫氖荄MA_ADC,而不是單純的ADC
回復(fù)

使用道具 舉報(bào)

12#
ID:1109793 發(fā)表于 2024-7-15 07:28 | 只看該作者
lkc8210 發(fā)表于 2024-7-14 22:19
因?yàn)樗玫氖荄MA_ADC,而不是單純的ADC

哦,沒(méi)用過(guò)H的,剛下載了PDF看了下是48號(hào),話說(shuō)DMA有啥好處?還要借用跳轉(zhuǎn)。直接用ADC中斷不行?
回復(fù)

使用道具 舉報(bào)

13#
ID:161164 發(fā)表于 2024-7-16 16:09 | 只看該作者
xiaobendan001 發(fā)表于 2024-7-15 07:28
哦,沒(méi)用過(guò)H的,剛下載了PDF看了下是48號(hào),話說(shuō)DMA有啥好處?還要借用跳轉(zhuǎn)。直接用ADC中斷不行?

不用頻繁進(jìn)中斷
回復(fù)

使用道具 舉報(bào)

14#
ID:1109793 發(fā)表于 2024-7-16 18:23 | 只看該作者
lkc8210 發(fā)表于 2024-7-16 16:09
不用頻繁進(jìn)中斷

意思是時(shí)不時(shí)的關(guān)掉48號(hào)?DMA中斷也是中斷啊。5號(hào)也可以時(shí)不時(shí) 的關(guān)閉一下吧。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表