久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: 請教一下,為什么我的單片機ADC_DMA進不了中斷 [打印本頁]

作者: asdadqw2    時間: 2024-7-12 13:47
標題: 請教一下,為什么我的單片機ADC_DMA進不了中斷
#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轉換通道數量,必須和[ADC_DMA通道使能寄存器(DMA_ADC_CHSWx)]中啟用的ADC通道數量一致
#define ADC_CH_NUM          1  
//ADC轉換次數,必須和[ADC_DMA配置寄存器2(DMA_ADC_CFG2)]設置的一致
#define ADC_SAMPLES_NUM     8   
//每個通道ADC轉換數據總字節數=2*轉換次數+4
#define ADC_DATA_SIZE       (ADC_SAMPLES_NUM*2 + 4)   

//存儲ADC DMA轉換結果,即ADC DMA的目的地址
u8 xdata adc_samples_buff[ADC_CH_NUM][ADC_DATA_SIZE];   
//ADC DMA轉換完成標志
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狀態寄存器
   DMA_ADC_CFG = 0x80;         //開啟ADC DMA中斷
   DMA_ADC_RXAH = (u8)((u16)(&adc_samples_buff) >> 8); //ADC轉換數據存儲地址,即ADC DMA目的地址
   DMA_ADC_RXAL = (u8)((u16)(&adc_samples_buff));  
   DMA_ADC_CFG2 = 0x0A;    //每個通道ADC轉換次數:8
   DMA_ADC_CHSW0 = 0x01;   //使能ADC通道1
   DMA_ADC_CHSW1 = 0x00;   
   DMA_ADC_CR = 0xC0;      //啟動ADC DMA轉換
}  

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

           ADCTIM = 0x3F;                  //設置ADC內部時許
        ADCCFG = 0x2F;                  //設置ADC時鐘為系統時鐘,數據右對齊
        ADC_CONTR = 0x80;    //使能ADC模塊

}

void Uart1_Init(void)        //4800bps@11.0592MHz
{
        PCON &= 0x7F;                //波特率不倍速
        SCON = 0x50;                //8位數據位,可變波特率
        AUXR &= 0xBF;                //定時器時鐘12T模式
        AUXR &= 0xFE;                //串口1選擇定時器1為波特率發生器
        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);
}

作者: coody_sz    時間: 2024-7-12 17:40
試試STC官方的例子:
STC8H系列-ADC相關程序.rar (918.47 KB, 下載次數: 3)


作者: xiaobendan001    時間: 2024-7-12 17:49
8G和8H的ADC中斷向量號好像是5吧,我看工具里面的示例里面的是5
void ADC_Isr() interrupt 5
{
    ADC_CONTR &= ~0x20;                         //清中斷標志
    P2 = ADC_RES;                               //讀取ADC結果
    ADC_CONTR |= 0x40;                          //繼續AD轉換
}

作者: 188610329    時間: 2024-7-13 13:04
看你你中斷號用的 13
那么……, 你 LJMP 那段匯編 寫了沒有?
并且,是否用的 .A51 格式? 是否正確插入了項目?
作者: asdadqw2    時間: 2024-7-14 14:44
xiaobendan001 發表于 2024-7-12 17:49
8G和8H的ADC中斷向量號好像是5吧,我看工具里面的示例里面的是5
void ADC_Isr() interrupt 5
{

STC的官方程序寫的是13
作者: asdadqw2    時間: 2024-7-14 14:46
188610329 發表于 2024-7-13 13:04
看你你中斷號用的 13
那么……, 你 LJMP 那段匯編 寫了沒有?
并且,是否用的 .A51 格式? 是否正確插入 ...

這個"stc8h.h"這個頭文件沒有嗎?我程序里還有中斷12 開的定時器2也能正常工作
作者: xiaobendan001    時間: 2024-7-14 15:00
asdadqw2 發表于 2024-7-14 14:44
STC的官方程序寫的是13

改成5試試啊,你的官方歷程截圖看看吧
作者: lkc8210    時間: 2024-7-14 17:36
asdadqw2 發表于 2024-7-14 14:44
STC的官方程序寫的是13

例程是13沒錯,但還要加中斷號48跳到13的附加操作




作者: xiaobendan001    時間: 2024-7-14 20:07
lkc8210 發表于 2024-7-14 17:36
例程是13沒錯,但還要加中斷號48跳到13的附加操作

那是處理大于31號的手段。ADC的就是5,又不大于31,為何要借用13號?13號就是保留的,讓編譯器把服務代碼放到13號的位置,然后在不如32號的位置人為添加LJMP跳轉到13號。借用其他不使用的也一樣啊。但是ADC的就是5號,直接用就行了啊,不懂為何要借用,然后還得添加匯編代碼。這不是那啥?
作者: 188610329    時間: 2024-7-14 20:31
asdadqw2 發表于 2024-7-14 14:46
這個"stc8h.h"這個頭文件沒有嗎?我程序里還有中斷12 開的定時器2也能正常工作

你如果看得是官方例程,你繼續往下翻,應該會有類似這樣的代碼:
ISR.ASM
CSEG  AT  0183H
LJMP  0063H
END
你把他做成 ASM 文件 加入到項目里才可以。
作者: lkc8210    時間: 2024-7-14 22:19
xiaobendan001 發表于 2024-7-14 20:07
那是處理大于31號的手段。ADC的就是5,又不大于31,為何要借用13號?13號就是保留的,讓編譯器把服務代碼 ...

因為他用的是DMA_ADC,而不是單純的ADC
作者: xiaobendan001    時間: 2024-7-15 07:28
lkc8210 發表于 2024-7-14 22:19
因為他用的是DMA_ADC,而不是單純的ADC

哦,沒用過H的,剛下載了PDF看了下是48號,話說DMA有啥好處?還要借用跳轉。直接用ADC中斷不行?
作者: lkc8210    時間: 2024-7-16 16:09
xiaobendan001 發表于 2024-7-15 07:28
哦,沒用過H的,剛下載了PDF看了下是48號,話說DMA有啥好處?還要借用跳轉。直接用ADC中斷不行?

不用頻繁進中斷
作者: xiaobendan001    時間: 2024-7-16 18:23
lkc8210 發表于 2024-7-16 16:09
不用頻繁進中斷

意思是時不時的關掉48號?DMA中斷也是中斷啊。5號也可以時不時 的關閉一下吧。




歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 亚洲www啪成人一区二区麻豆 | 免费三级网站 | 国产午夜激情 | 天天看天天爽 | 日本免费在线观看视频 | 亚洲精品午夜精品 | 日韩免费一区二区 | www.色婷婷 | 免费看毛片的网站 | 超碰97免费 | 精品国产一区二 | 成人午夜网 | 欧美成年人视频 | 午夜在线观看视频 | 久久久久久久97 | 国产又粗又长又爽 | 黄网免费看 | 国产成人毛片 | 天天射天天爽 | 婷婷久久五月 | 成人毛片网 | 天天摸夜夜操 | 日韩欧美精品一区 | 色妞色视频一区二区三区四区 | 一级片网址| 97精品超碰一区二区三区 | 色人人 | 亚洲91精品| 亚洲天堂免费视频 | av青青草 | www免费视频| 午夜精品久久久久久久 | 日本三极片| 加勒比一区二区三区 | 黄色大片av| 久久久一级片 | 精品蜜桃一区二区三区 | 精品久久久久久久久久久久久 | 一区二区三区四区精品 | 成人免费黄色大片 | 国产精品一区视频 |