搜索
bottom↓
回复: 17

在OurAvr的帮助下,我完成了第一个单片机试验(ATmega8 + AvrX)

[复制链接]

出0入0汤圆

发表于 2006-10-22 21:01:45 | 显示全部楼层 |阅读模式
我的工作主要是做软件,但是我小时候就喜欢电子,一直想在业余时间搞一些电子制作。由于已经有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编辑过
头像被屏蔽

出0入0汤圆

发表于 2006-10-22 22:19:11 | 显示全部楼层
谢谢分享。cool!

出0入0汤圆

发表于 2006-10-22 22:59:07 | 显示全部楼层
呵呵,顶,不知道跑多少任务的时候CPU占用率是100%,要是像UCOS一样可以看到CPU占用率就好了。



UCOS好像只可以看到总的CPU占用,看不到每个任务的占用。呵呵。



再顶,好贴啊。

出0入0汤圆

发表于 2006-10-23 08:58:32 | 显示全部楼层
好贴 要顶!

出0入0汤圆

发表于 2006-10-23 09:11:39 | 显示全部楼层
楼主请开AVRX的课程吧!

出0入0汤圆

 楼主| 发表于 2006-10-23 10:22:18 | 显示全部楼层
4楼的兄弟,我也是刚刚接触AvrX,还没有仔细研究,只是按照范例改了改程序。现在的水平哪里敢写教程呀。大家一起研究吧。

出0入0汤圆

发表于 2006-10-23 13:05:25 | 显示全部楼层
楼主强呀!牛!

自己很想在avr上跑操作系统,但一直没移植成功。

楼主能否指点指点,mailtank@126.com。

出0入0汤圆

 楼主| 发表于 2006-10-23 13:10:55 | 显示全部楼层
6楼的兄弟,AvrX移植到m8上很简单,下载了源码后修改Makefile,改成m8的配置,然后运行make,就编译出了avrx.a。



接着将avrx.a改名为libavrx.a,将其目录添加到AvrStudio的项目的库目录中,就可以看到可选库多了一个avrx,在项目中选择链接这个库,然后就可以使用AvrX的功能了。

出0入0汤圆

发表于 2006-10-23 14:13:36 | 显示全部楼层
先谢谢了,楼主。

出0入0汤圆

发表于 2006-10-23 14:40:47 | 显示全部楼层
我也刚用AvrX,跑了下自带的例程,感觉是个不错的RTOS,相对比较简单,对硬件的需求也比较少。

出0入0汤圆

发表于 2006-10-23 15:52:33 | 显示全部楼层
能详细讲讲吗?

出0入0汤圆

发表于 2006-10-23 17:56:10 | 显示全部楼层
不懂也要顶

出0入0汤圆

 楼主| 发表于 2006-10-24 10:12:54 | 显示全部楼层
昨天修改了一下代码,应该更科学:



const prog_char osccalAdjust PROGMEM = 0xA5;



int main(void)

{

    AvrXSetKernelStack(0);



        OSCCAL = pgm_read_byte(&osccalAdjust);

...



将osccalAdjust作为Flash中的常量存储,使用pgm_read_byte读取数据。执行下载软件的时候读出芯片的calibration值,并配置下载软件将这个值写入osccalAdjust对应的地址(查看编译生成的.map和.lss文件),这样就可以一次编译,写入不同的芯片的时候可以根据芯片特性使用不同的osccalAdjust值。

出0入0汤圆

发表于 2006-10-24 10:41:04 | 显示全部楼层

出0入0汤圆

发表于 2006-10-26 09:43:25 | 显示全部楼层
【楼主位】 dumm 你的程序跑不了.

出0入0汤圆

发表于 2009-6-10 10:38:28 | 显示全部楼层
LZ可以把这个做的过程些个教程啊(就是操作步骤),程序的事自己可以摸索!谢谢!

出0入0汤圆

发表于 2010-6-29 14:16:53 | 显示全部楼层
MARK

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-5-6 10:35

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

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