搜索
bottom↓
回复: 6

大家讲一讲用富士通单片机实现AD转换的程序

[复制链接]

出0入0汤圆

发表于 2011-4-11 11:37:00 | 显示全部楼层 |阅读模式
下面为主函数
main.c
#include "mb96387rs.h"
#include "global.h"
#include "uart0.h"
#include "adc.h"
volatile char res;
void main(void)
{
    ADC_init ();                 /* initialise ADC */
    UART0init ;   
    InitIrqLevels();
    __set_il(31);                /* allow all levels           */
    __EI();                     /* globally enable interrupts */

    UART0putS("\nMB96387 Series A/DC demo\n");
    UART0putS("\nAN0  is used\n");

    res=0;
    while(res !=0x4E && res !=0x6E)
    {
    while(ADCS_BUSY);          /* check & wait if ADC is operating */
    res=0;
    UART0putS("\nStart new conversion ? (Y/N): ");
    while (res != 0x59 && res != 0x79 && res != 0x4E && res != 0x6E) /* accept Y / N only */
                    res=UART0getch();
    if (res == 0x59 || res == 0x79)
            {
            UART0putS ("\nNew conversion started\n ");
            ADC_start ();             /* start ADC0 */
            }
    }
           UART0putS ("\nProgram stopped\n ");

  for(;;);   
}




ADC.c


#include "mb96387rs.h"
#include "uart0.h"

/*********************@GLOBAL_VARIABLES_START*******************/

/**********************@GLOBAL_VARIABLES_END********************/

/*********************@FUNCTION_HEADER_START*********************
*@FUNCTION NAME:        ADC_init()                                                                    *
*                                                                                                                                *
*@DESCRIPTION:                Initialisation of ADC                           *
*                                                                                                                                *
*@PARAMETER:                none                                                                                *
*                                                                                                                                *
*@RETURN:                        none                                                                                *
*                                                                                                                                *
***********************@FUNCTION_HEADER_END*********************/
void ADC_init (void)
{
   ADCS = 0xA040;  
   /* Single conversion mode, channel 0, 10-bit res. activation by software, int enable */
}

/*********************@FUNCTION_HEADER_START*********************
*@FUNCTION NAME:        ADC_start()                                                                        *
*                                                                                                                                *
*@DESCRIPTION:            ISR of ADC                                      *
*                                                                                                                                *
*@PARAMETER:                none                                                                                *
*                                                                                                                                *
*@RETURN:                        none                                                                                *
*                                                                                                                                *
***********************@FUNCTION_HEADER_END*********************/
void ADC_start (void)
{
   ADCS = (ADCS & 0xFEFF) | 0x8200;  /* start adc conversion */
}

/*********************@FUNCTION_HEADER_START*********************
*@FUNCTION NAME:        ADC_isr()                                                                                *
*                                                                                                                                *
*@DESCRIPTION:            ISR of ADC                                      *
*                                                                                                                                *
*@PARAMETER:                none                                                                                *
*                                                                                                                                *
*@RETURN:                        none                                                                                *
*                                                                                                                                *
***********************@FUNCTION_HEADER_END*********************/
__interrupt void ADC_isr (void)
{
  UART0putS("Value of ch.0: ");
  UART0PutHex(ADCR, 3);    /* send value via UART1 to Terminal */
  UART0putch(13);    /* CR */
  UART0putch(10);    /* LF */
  ADCS &= 0xBEFF;    /* clear int flag*/
}





UART0.c


#include "global.H"
#include "MB96387rs.H"
const char ASCII[] = "0123456789ABCDEF";
/*****************************************************************************
*  DESCRIPTION:    Initializes UART0 for asyncronous point-to-point
*                                communication mode, CPU CLKP=30MHz
*
*  PARAMETERS:     baudr(1200..115200),datab(7,8),par(0..2),stopb(1,2)
*
*  RETURNS:        None
*****************************************************************************/
void InitUart0(void)
{
   #if USE_UART0
  // switch port pins to input / output accordingly
  PIER13_IE4= 1; // enable SIN0
  DDR13_D5 = 1;  // SOT0 = output
  // 38400 Baud @ 48MHz
  // BGR0=48000000/Baud
  // 38400:1249
  // 115200:417
  PUCR13_PU4=1;
  PUCR13_PU5=1;
  BGR0 = 1457;   //38400 baud@56Hz
  //486;  // 115200 Baud @ 56MHz
  // 8N1
  SCR0 = 0x17;   //数据长8 发送使能 接收使能 清除接收错误
  // disable UARTs interrupt, send LSB bit first
  SSR0 = 0x00;   //接收中断关闭
  //clear serial mode register
  SMR0 = 0x00;
  //UART software reset
  SMR0_UPCL=1;
  //Restart reload counter
  SMR0_REST=1;
  // enable SOT0
  SMR0_SOE=1;
  #endif   
}

/*****************************************************************************
*  DESCRIPTION:    waits for and returns incoming character (no timeout !)
*
*  PARAMETERS:     None
*
*  RETURNS:        Character or "-1" (Error)
*****************************************************************************/
int  UART0getch (void)
{
        while(!SSR0_RDRF && !SSR0_ORE); /* wait for data in buffer */
        if (SSR0_ORE || SSR0_PE) {      /* overrun or parity error */
                SCR0=0x00;           /* reset error flags */
                return (-1);
        } else
                return (RDR0);/* return char */
}

/*****************************************************************************
*  DESCRIPTION:    sends a single character  (no timeout !)
*
*  PARAMETERS:     Character
*
*  RETURNS:        None
*****************************************************************************/
void UART0putch (unsigned char ch)   
{
        while (!SSR0_TDRE);     /* wait for empty buffer */
        TDR0 = (unsigned char)ch;        /* fill register */
}

/*****************************************************************************
*  DESCRIPTION:    sends a complete string (0-terminated)
*
*  PARAMETERS:     Pointer to (constant) file of bytes in mem
*
*  RETURNS:        None
*****************************************************************************/
void UART0putS(const char *buf)               
{
        while (*buf != '\0')
    {
     if(*buf == 10){  UART0putch(13);  }         /* correct CR LF seq */
     UART0putch(*buf++);                /* send every char of string */
    }
}

/*****************************************************************************
*  DESCRIPTION:    sends a x-digit Hex-number (as ASCII charcaters)
*                  to terminal via ext. UART
*
*  PARAMETERS:     Value and number of Hex-digits (e.g. FF = 2 Hex digits)
*
*  RETURNS:        NONE
*****************************************************************************/
void UART0PutHex(unsigned long n, unsigned char digits)
{
  unsigned char i,ch,div=0;

  UART0putS("0x");                        /* hex string */
  div=(digits-1) << 2;                /* init shift divisor */

  for (i=0; i<digits; i++) {
    ch = (n >> div) & 0xF;        /* get hex-digit value */
    UART0putch(ASCII[ch]);        /* prompt to terminal as ASCII */
    div-=4;                                        /* next digit shift */
  }

下面是用到的头文件

ADC.h


#ifndef _ADC_H
#define _ADC_H

void ADC_start (void);
void ADC_init (void);
#endif



GLOBAL.h


#ifndef _GLOBAL_H
#define _GLOBAL_H

#define LCD 0        /* use (1) or don't use (0) LCD on MB91360-Starterkit */


typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned long DWORD;


#define ERROR   -1
#define OK        0
#define TRUE    1
#define FALSE   0
#define ON      TRUE
#define OFF     FALSE

#define BIN2BYTE(a) ( ((0x##a##L>>21) & 0x80) + ((0x##a##L>>18) & 0x40) \
                    + ((0x##a##L>>15) & 0x20) + ((0x##a##L>>12) & 0x10) \
                    + ((0x##a##L>>9) & 0x08) + ((0x##a##L>>6) & 0x04)  \
                    + ((0x##a##L>>3) & 0x02) + (0x##a##L & 0x01))



#endif /* GLOBAL_H */



#ifndef _UART0_H
#define _UART0_H

void UART0init(unsigned long baudr, unsigned char datab, unsigned char par, unsigned char stopb);
int  UART0getch (void);
void UART0putch (unsigned char ch);
void UART0putS(const char *buf);
void UART0PutHex(unsigned long n, unsigned char digits);
#endif

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2011-4-11 11:40:01 | 显示全部楼层
我用SOFTUNE WORKBENCH 软件,老出现警告
*** W1372L: The section is placed outside the RAM area or the I/O area (MONDEBDATA)
*** W1370L: The section is placed outside the ROM area (TESTPATTERN)
*** W1370L: The section is placed outside the ROM area (MONDEBCODE)
懂的同学能不能帮我看一下这个程序啊。这是我的毕业设计,很是感谢

出0入0汤圆

发表于 2011-4-11 12:58:48 | 显示全部楼层
编译环境配置不对,不用管!

出0入0汤圆

 楼主| 发表于 2011-4-11 13:48:35 | 显示全部楼层
回复【2楼】tjjack
-----------------------------------------------------------------------

已经调试没有问题了,不过也谢谢你啊。

出0入0汤圆

发表于 2014-6-12 19:05:16 | 显示全部楼层
我也遇到一个问题。使用MB95F263K的内部EEPROM.死活写不进。而且死机。

       void Eeprom_Handle(void)
      {
         ucRet = EEPROM_Check(E2P_16B, &cData);      //确认这个地址是否可以使用
         if (ucRet==OK)                              //可以使用
        {
          if(cData!=CONSISTENT)                   //数据不一致
          ucRet = EEPROM_Define(E2P_16B);         //重新定义一个数据区域
          if(ucRet==OK)                           //定义成功
         {
          i=0;
          ucRet = EEPROM_B_Read(i,&rData);    //读取0地址的数据
          if(ucRet==OK)                       //读取成功
         {
           light_grade=rData;
           if(light_grade>3)              //数据不对
          {
             light_grade=0;
             add=0;
             WDTC = 0x55;
             ucRet = EEPROM_B_Write(add,wData,&OverflowF);
             if(ucRet==OK)
            {
               __wait_nop();
               i=0;
               ucRet = EEPROM_B_Read(i,&rData);
               if(ucRet==OK)                       //读取成功
               
                  u8_Check_Data=rData;
                   __wait_nop();
                   __wait_nop();
               }
      
        }
        else {eeprom_error=1;}
       }
     }
      else {eeprom_error=1;}
    }
     else {eeprom_error=1;}
   }
   else {eeprom_error=1;}
}

出0入0汤圆

发表于 2014-6-12 19:06:26 | 显示全部楼层

我问过技术人员。他们叫我注意:
1,请确认是否包含了库文件;
2、请确认是否制定FLASH RON的低位存储区的4K为EEPROM使用。
3、请确认是否添加EEPROM后台处理程序;

但是还是不行

回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-20 10:16

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表