这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » halibote523使用手记(从安装到程序编写)

共88条 5/9 |‹ 3 4 5 6 7 8 ›| 跳转至
专家
2010-10-18 19:24:29     打赏
41楼
程序要求:发生中断时候,每隔2秒的时间UART输出:Initerrupt, 没有中断时输出:NO Initerr
例程如下:INITTest.rar
现象如下:

专家
2010-10-18 19:29:43     打赏
42楼
至此:应用手记已经基本完成,手记包含了:
1、编译环境的安装
2、调试器烧写程序以及驱动的安装
3、从新建文件到详细的设置步骤
4、IO口操作调试(LED操作)
5、定时器调试(点亮与熄灭LED)
6、LIN-UART调试
7、AD转换器的调试
8、外部中断的调试
希望这些手记能带给朋友们一点点的帮助,下次总结一下容易出错的问题以及解决方法!!

菜鸟
2010-10-19 09:37:34     打赏
43楼

楼主写的非常实用,谢谢了。


专家
2010-10-19 11:07:47     打赏
44楼

专家
2010-10-19 11:27:53     打赏
45楼
下午我自己弄好板子就可以调试了,感谢楼主呵呵

专家
2010-10-21 09:10:24     打赏
46楼
系统时钟图::

专家
2010-10-27 10:42:36     打赏
47楼

中断向量解释:
例如:
ILR0 = 0xCF;      //  IRQ0:  external interrupt  ch4        --> 01
                      //  IRQ1:  external interrupt  ch5        --> 01
                      //  IRQ2:  external interrupt ch2 | ch6   --> 01
                      //  IRQ3:  external interrupt ch3 | ch7   --> 01

ILRx(x=0-5),每个x里面包含有四个中断,每个中断占用两位
CF=11 00 11 11
那么表示的是:
11:--IRQ3
00:--IRQ2
11:--IRQ1
11:--IRQ0
即高位表示的是后面的中断,地位表示的是最开始的中断
优先级可以设置为0-3级
优先级:ILR0>ILR5,同一级里面,设置的数值越小,那么优先级就越大,也就是00>11


菜鸟
2010-10-27 12:33:11     打赏
48楼

专家
2010-10-28 15:08:51     打赏
49楼

模拟I2C程序,EEPROM器件是:AT24C1024,也就是1k bit的,即128k字节
通过串口程序来验证:先写I2C,后读I2C,两者的数相同!!(以下程序中的puts:为串口输出的字符,串口程序参考的UART实验)

#include "mb95200.h"
u8 E0;    //非应答信号标志位
u8 NACK=0;    //错误标志位

#define   SDA    PDR0_P06
#define   SDA_D  DDR0_P06
#define   SCL    PDR0_P05
#define   SCL_D  DDR0_P05
#define WriteDeviceAddress   0xa0   //写I2C外围器件的寻址地址
#define ReadDeviceAddress   0xa1   //读I2C外围器件的寻址地址

void WriteI2C(u8 *Wdata,u8 RomAddress,u8 number); // 写n个字节数据子程序
void ReadI2C(u8 *RamAddress,u8 RomAddress,u8 bytes); // 读n个字节数据子程序

void delay5us(u16 len)
{
    u16 i;
    for(i=0;i<len;i++)
    __wait_nop();
}
void Start(void)    //启动I2C总线子函数
{
   SCL_D=1;
   SCL=1;
   SDA_D=1;
   SDA=1;
  
   delay5us(5);
   SDA=0;
   delay5us(5);
   SCL=0;
}
void Write8Bit(u8 n) //写一个字节数据子程序,n为待发送的数据
{
   u8 i,temp;
   for(i=8;i>0;i--)
      {
      SCL_D=1;
      SDA_D=1;
      temp=n&0x80;
      if(temp==0x80)  SDA=1;
      else            SDA=0;
      SCL=1;
      delay5us(5);
      SCL=0;
      SDA=0;
      n=n<<1;
      }
}

void Stop(void)    //停止I2C总线数据传送子函数
{
   SDA_D=1;
   SDA=0;
   SCL_D=1;
   SCL=1;
   delay5us(5);
   SDA=1;
   delay5us(5);
   SCL=0;
}
void Ack(void)    //发送应答位子程序
{
   SDA_D=1;
   SDA=0;
   SCL_D=1;
   SCL=1;
   delay5us(5);
   SCL=0;
   SDA=1;
}

void NoAck(void)   //发送非应答位子程序
{
   SDA_D=1;
   SDA=0;
   SCL_D=1;
   SCL=1;
   delay5us(5);
   SCL=0;
   SDA=0;
}
void TestAck(void) //应答位检查子程序,若检测不到非应答信号
{
   SDA=1;
   SCL=1;
   SDA_D=0;
   E0=0;
   delay5us(1);
   if(SDA==1) E0=1;
   SCL=0;
}
u8 Read8Bit(void)   //读一个字节数据子程序
{
    uchar temp,rbyte=0;
    for(temp=8;temp>0;temp--)
      {
      SDA_D=0;
      SDA=1;
      SCL_D=1;
      SCL=1;
      delay5us(5);
       rbyte=rbyte<<1;
      rbyte=rbyte|((u8)(SDA));
      SCL=0;
      }
    return(rbyte);
}
void WriteI2C(u8 *Wdata,u8 RomAddress,u8 number) // 写n个字节数据子程序
{     //*Wdata为待发送数据的首地址,RomAddress为待I2C外围器件的数据写入首地址,number为写字节的个数
   Start(); //启动
   Write8Bit(WriteDeviceAddress); //写入器件的寻址地址
   TestAck();    //应答检查
   if(E0==1)
    {
    NACK=1;   //若非应答表明器件错误或已坏,置错误标志位NACK
    puts("NACK00\n");
    return;
    }
   Write8Bit(0x00); //写入I2C器件页地址
   TestAck();    //应答检查
   if(E0==1)
    {
    NACK=1;   //若非应答表明器件错误或已坏,置错误标志位NACK
    puts("NACK01\n");
    return;
    }
   Write8Bit(RomAddress); //写入I2C器件的数据存储首地址
   TestAck();    //应答检查
   if(E0==1)
    {
    NACK=1;   //若非应答表明器件错误或已坏,置错误标志位NACK
    puts("NACK02\n");
    return;
    }
   //zhai start
   //zhai end
   for(;number!=0;number--)   //循环,逐个字节发送
     {
     Write8Bit(*Wdata); //写一个字节
     TestAck();    //应答检查
     if(E0==1)
       {
       NACK=1;   //若非应答表明器件错误或已坏,置错误标志位NACK
       puts("NACK03\n");
       return;
       }
     Wdata++;         //指针增加,指向下一个数据
     }
   Stop();     //全部发送完则停止
}
void ReadI2C(u8 *RamAddress,u8 RomAddress,u8 bytes) // 读n个字节数据子程序
{   //RamAddress为接收数据缓冲区的首地址,RomAddress为待I2C外围器件的数据读取首地址,bytes为写字节的个数
   Start(); //启动
   Write8Bit(WriteDeviceAddress); //写入器件的寻址地址
   TestAck();    //应答检查
   if(E0==1)
    {
    NACK=1;   //若非应答表明器件错误或已坏,置错误标志位NACK
    puts("NACK10\n");
    return;
    }
   Write8Bit(0x00); //写入I2C器件页地址
   TestAck();    //应答检查
   if(E0==1)
    {
    NACK=1;   //若非应答表明器件错误或已坏,置错误标志位NACK
    puts("NACK11\n");
    return;
    }
   Write8Bit(RomAddress); //写入I2C器件内部数据的读取首地址(页内地址)
   TestAck();    //应答检查
   if(E0==1)
    {
    NACK=1;   //若非应答表明器件错误或已坏,置错误标志位NACK
    puts("NACK12\n");
    return;
    }
  
   Start(); //重新启动
   Write8Bit(ReadDeviceAddress); //写入器件的寻址地址 0xA1
   TestAck();    //应答检查
   if(E0==1)
   {
    NACK=1;   //若非应答表明器件错误或已坏,置错误标志位NACK
    puts("NACK13\n");
    return;
   }
   while(bytes!=1)     //循环读入字节数据
    {
    *RamAddress=Read8Bit(); //读入一个字节
    Ack();                //应答
    RamAddress++;      //地址指针递增
    bytes--;     //待读入数据个数递
   }
  *RamAddress=Read8Bit(); //读入最后一个字节数据
  NoAck();   //非应答
  Stop();    //停止
}


专家
2010-10-28 15:16:41     打赏
50楼
原理图如下:



共88条 5/9 |‹ 3 4 5 6 7 8 ›| 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]