存档

文章标签 ‘MCU’

IAR中MSP430中断服务函数的定义

2008年7月17日

//为了保证代码可以在IAR编译器的任何版本中都能正确得到编译,所以作以下的条件编译。

#ifdef __IAR_SYSTEMS_ICC__              //如果编译器是IAR, 那么以下将被编译。

#if __VER__ >= 200

#pragma vector=USART0RX_VECTOR          //在IAR2.0以上中断函数声明。

__interrupt void SPI0_rx (void)

#else                                   //在IAR2.0以下中断函数声明。

interrupt[USART0RX_VECTOR] void SPI0_rx (void)

#endif                                  //IAR中断函数声明结束。

{ }

在上述中

USART0RX_VECTOR 是定义中断地址宏,其实就是一个中断矢量值,例如,地址, 0xffe0 。

这个中断矢量有芯片型号决定,一旦信号确定,那么所有的终端矢量也就确定了。

SPI0_rx 是中断函数名称,使用者可以根据自己的喜好来编写这个函数名。

点此在新窗口浏览图片 实际例程

//**************************************************************************
//例程描述:利用定时器定时功能,实现P1.0方波输出。

#include

{
WDTCTL = WDTPW + WDTHOLD;          //停止看门狗WDT,不使用内部看门狗定时器。
P1DIR |= 0×01;                     //设置P1.0口方向为输出。
CCTL0 = CCIE;                      //设置捕获/比较控制寄存器中CCIE位为1,CCR0捕获/比较功能中断为允许。
CCR0 = 50000;                      //捕获/比较控制寄存器CCR0初值为5000。
TACTL = TASSEL_2 + MC_2;           //设置定时器A控制寄存器TACTL,使时钟源选择为SMCLK辅助时钟。
_BIS_SR(LPM0_bits + GIE);          //进入低功耗模式LPM0和开中断
}

//定时器A 中断服务程序区
//当IAR编译器版本大于或等于2.0以上时,则中断写法格式如下。
#pragma vector=TIMERA0_VECTOR        //定时器A0中断向量
__interrupt void Timer_A (void)      //中断函数
{
P1OUT ^= 0×01;                    //P1.0取反输出
CCR0 += 50000;                    //重新载入CCR0捕获/比较数据寄存器数据
}

//程序结束
//**************************************************************************

Jacob 技术 ,

使用PCMICIA卡转并口(NM9805芯片)仿真MSP430

2008年7月15日

IAR for MSP430中直接识别PC卡并口地址(0xFFFE),直接仿真。 over

PS:IAR这点做的还是比较好的,幻想下,是不是IAR for AVR、51或者ARM也可以用了呢?有空试下~

=======
花了一个多小时把IAR AVR拖下来,安装,发现支持设备很多,但是没有并口下载器,想想也对,并口只能下载不能调试哦。呵呵

51暂时用不到,ARM的ADS平台已经很成熟了就不折腾了。

Jacob 技术

AVR口线方式驱动DDS模块(旧),芯片AD9850

2007年7月31日

把模块上那块万恶的CPLD拆了,直接驱动口线,成功驱动~模块产生的正弦波很漂亮,频率能到很高,到普源25M的示波器极限是没什么问题。芯片转换出来的方波就不行了,上M就不漂亮~

对输入AD9850的标准正弦波,进行直接数字合成生成。输入频率最高为125MHZ,可生成0-Fclk/2范围内的任意频率正弦波和方波。

+3.3V或+5V单电源工作,正常,掉电模式。
可输入的时钟频率最高可达125MHZ
频率分辨率达到2^-32

AD9850 采用直接数字合成技术,利用片内集成的高性能的DAC和高速比较器,形成完全可编程的频率合成器和时钟发生器。可输入的时钟频率最高可达125MHZ,具有32bit的频率字使得频率分辨率达到2-32; 5bit来进行相位调制,允许输出以180o,90o,45o,22.5o,11.25o,以及它们的任意组合和相位角为增量跳变。具有可选的串行或并行数据传输方式。

此模块应用中,dds9850采用的是并行输入方式。

并行输入方式下,内部40bit的寄存器装载5个8位的字节。如下为并行输入时的频率字:W0包含相位调制字,掉电模式控制和装载模式控制。接下来的W2到W5是32bit的频率控制字。

Jacob 技术 ,

E2PROM操作,解决重启问题

2007年7月29日

#define EERE 0
#define EEWE 1
#define EEMWE 2

void E2PROM_Write(unsigned int Addr,unsigned char Data)
{
while(EECR & (1< EEAR=Addr;
EEDR=Data;

EECR|=(1<

EECR|=(1< }

unsigned char E2PROM_Read(unsigned int Addr)
{
while(EECR & (1<

EEAR=Addr;
EECR|=(1<

return EEDR;
}

E2PROM读写函数,没有考虑中断的影响,毕竟这东西用的不多,本来以为这样子就可以用了,写了段记录开机次数的程序。

temp=E2PROM_Read(0×00a);

E2PROM_Write(0×00a,temp+1);

运行,结果0×00a地址的值确实在增加,只不过是不停的增加,换句话来说就是单片机不停的重启,查了写资料,发现是看门狗的缘故,在写E2PROM的时候必须喂狗,不然单片机就会复位。看门狗的操作我还不会,所以就从熔丝把看门狗关了,程序运行正常。明天有时间研究看门狗去。。。

Jacob 技术 , ,

CVAVR与AVR Studio程序联调

2007年7月12日

没看到有资料介绍这个,虽然很简单

1. 进入CV主界面,点图标栏上的甲壳虫标志,弹出一个对话框,在这里选择AVR Studio主程序的位置,和版本。

2. 确定后,一个警告框提示你编译时将多生成一个cof文件用于调试,用于调试的AVR Sudio的版本不能小于4.06,确定后即可进入AVR Studio界面。

3. 点OPEN打开生成的cof文件。这里提示将生成用于调试的aps文件,确定后选择调试器的类型和仿真芯片的类型,这是目标板和仿真器都要供电。

4. 右边的方框里显示代码文件,有一个黄色的箭头指向将要执行的语句,在这里可以和别的仿真器一样实现断点,单步执行等操作。左侧可以看到寄存器值等。

Jacob 技术

智能小车进度20070508

2007年5月8日

2007-05-8,20:46:37
实现摄像头采样并且通过串口发送上位机,上位机C++程序显示出来采样的图形。

单片机未超频,AD速度2M。

MC33886实现反转减速。

下面要做的是两部分的程序算法,和摄像头的物理固定。

借了个电视机~~呵呵

Jacob 技术

智能小车进度20070505

2007年5月6日

实现角度PD算法和速度P算法。采用差量值进行控制。弯道控制的比较好,比较平稳。直道速度大概在2.1m/s,弯道速度大概是1.4m/s。比去年的特等奖清华还是差了不少的。有待改进。

下面要做的事情是想办法尽量提高直道的速度,也就是提高弯道的制动性能。第一版大概就这样了。

校内比赛如果通过了,做第二版的小车。做下面几个方面的改正:采用摄像头以提高前瞻性。采用高精度编码器或者红外编码器代替霍尔测速。加入电机反转刹车。

另外摄像头的程序写了一些。可能不能直接用。如果需要再继续改吧。

Jacob 技术

智能小车进度20070501

2007年5月1日

小车可以实现恒定PWM运行,弯道直道都可以跑了。速度在弯道会减速,直道加速,但并不恒速。所以直道长了加速过快在下一弯道的时候会冲出去。

恒速算法已经写好了。大概的原理就是用霍尔测速,然后闭环控制PWM的值增减,如车速大于设定值则减小PWM值,如测速小于设定值则增加。这一点在路面上体现的很好。

下面要做的事情是写一个直道弯道加减速的算法。也就是PID控制。具体的还没想好。

还做了一件事情,完成了电池电量检测的硬件和软件。如电量过低就报警以免损坏电池。当然了,这个微不足道。

Jacob 技术

中断去抖

2007年4月25日

中断时间很宝贵,不能有任何延时,只能在里面设置N多的标志位,出中断处理所有需要响应的程序。

按键去抖,我的做法是:
1、响应按键中断后做一个按键开始的标志位,并开始定时器。
2、在定时器20ms后判断按键还存在不,再过20ms后再判断,如果都有按键,说明是真的有按键。
3、关闭定时器,清按键开始标志位,并执行按键程序。

Jacob 技术

无线串口

2007年4月17日

给小车做了个无线串口,超再生模块做的,比市面上买的无线数传设备差多了,波特率上不去,最高9600,4800比较稳定,不过用来调试小车应该是足够了。

原理很简单就是把串口数据通过无线模块发送出去,因为无线模块没有数据传送时是低电平的,而串口数据正好相反,所以加了块7404反向,连单片机也省了。手头上没有74HC04,用的LS的,可能波特率提不上去也有这个因素吧。芯片取电接收端用的usb口直接取电,发送端把串口1号角改成5V电源线了。谁能告诉我RS232怎么偷电?MAX232出来的电平过7805以后只有3.5V左右了,完全不能用。难道要加开关电源?

另外S12的串口程序写出来了,简简单单的发送数据,呵呵。

从Freescale申请的样片参加电子设计大赛的时候送过来了,两片9S12A512,两片MC33886,芯片价值300多块,邮费600多。。。。只能说明Freescale真有钱。费了好大周折好不容易从学校那里搞的33886竟然能这么容易到手。

Jacob 技术