|
我的工作主要是做软件,但是我小时候就喜欢电子,一直想在业余时间搞一些电子制作。由于已经有15年没有做过电子方面的东西了,以前的知识大多都不够用,现在都流行MCU,因此我也就打算从MCU开始。
动手之前,我找了很多开发资料。其中51的最多,不过我还是选择从AVR入手。不为别的,就因为OurAvr这个网站:自由、开放(我做软件的时候就很喜欢开源项目,参加或启动了多个开源的软件项目),社区论坛的风气特别好!
收集了足够的资料后,我昨天去中发买了一些元件回来,搭了一个简单的电路:ATmega8L、使用内置RC、做好ISP插座、将两个LED连接到PB0和PB1(用470欧电阻限流)。电路焊接完成后我就用AvrStudio + WinAvr写了一个简单的程序,用SL-ISP和Avrdude下载到MCU中,运行成功了,很顺利。
接着我编译了一个ATmega8的AvrX库,写了一个简单的AvrX程序:一个LED渐亮渐暗,另一个LED按照0.5Hz的频率闪烁。很顺利,也成功了。
下面是AvrX程序代码:
#include "avrx-io.h"
#include "avrx-signal.h"
#include "serialio.h"
#include "avrx.h"
#include "hardware.h"
TimerControlBlock timer1, timer2;
AVRX_SIGINT(SIG_OVERFLOW0)
{
IntProlog();
TCNT0 = TCNT0_INIT;
AvrXTimerHandler();
Epilog();
}
#define LED_ON(port, bit) port |= _BV(bit)
#define LED_OFF(port, bit) port &= ~_BV(bit)
#define LED_SWITCH(port, bit) port ^= _BV(bit)
AVRX_GCC_TASKDEF(task1, 8, 3)
{
int r = 0;
int d = 1;
while (1)
{
r += d;
if (r <= 0)
d = 1;
else if (r >= 5)
d = - 1;
char i;
for (i = 0; i < 15; i ++)
{
AvrXStartTimer(&timer1, r);
AvrXWaitTimer(&timer1);
//AvrXDelay(&timer1, r);
LED_ON(PORTB, PORTB1);
AvrXStartTimer(&timer1, 5 - r);
AvrXWaitTimer(&timer1);
//AvrXDelay(&timer1, 10 - r);
LED_OFF(PORTB, PORTB1);
}
}
}
AVRX_GCC_TASKDEF(task2, 8, 2)
{
while (1)
{
AvrXDelay(&timer2, 1000);
LED_SWITCH(PORTB, PORTB0);
}
}
volatile unsigned char osccalAdjust = 0xFF;
int main(void)
{
AvrXSetKernelStack(0);
OSCCAL = osccalAdjust;
DDRB = 0xFF;
PORTB = 0x00;
MCUCR = _BV(SE); // Initialize Timer Hardware
TCNT0 = TCNT0_INIT;
TCCR0 = TMC8_CK256;
TIMSK = _BV(TOIE0); // Enable Timer overflow interrupt
AvrXRunTask(TCB(task1));
AvrXRunTask(TCB(task2));
Epilog(); // Switch from AvrX Stack to first task
while(1);
return 0;
}
由于有十几年没有动电烙铁了,焊接技术退步很多,惨不忍睹啊。
这些程序都是用并口ISP下载线下载的。下一步打算做USBAsp,因为我平时用的笔记本电脑只有USB口。如果顺利,下个星期周末开工。
-----此内容被dumm于2006-10-22,21:04:50编辑过
-----此内容被dumm于2006-10-22,21:05:54编辑过 |
|