查看: 4996|回复: 3

【Atmel XMEGA-A3BU手记】第五元素

[复制链接]
  • TA的每日心情
    郁闷
    2024-10-28 10:11
  • 签到天数: 1703 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    发表于 2013-5-10 13:14:52 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 nemon 于 2013-5-10 13:33 编辑

    一直很奇怪,为什么在电影里UFO总是降临在USA,小怪兽总是格外关爱某岛国,而某古国来的却大多是鬼子……
    1997年,吕克·贝松拍了一部片子《第五元素》(The Fifth Element),Hollywood故事风格:23世纪火热星球将撞击地球,只有凑齐代表风、火、水、土四块元素神石,然后连同第五元素才可以避免这个劫难。地球人靠外星蒙督沙瓦人的帮助,利用第五元素残骸的DNA重新构造了第五元素:一个漂亮的红发女郎——莉露。莉露从实验室跑了出来,无意中撞到了科本·达拉斯(布鲁斯·威利斯 饰演)驾驶的出租车上。后面就老套了——在达拉斯的帮助下,莉露克服了编剧设置的重重困难,击溃了所有挡路的配角、在好莱坞高质量的音效与视觉效果之中把观众按在座位上直至电影结束……
    HC1080UB_5thElement_multipass_Lg.jpg
    按照上学的时候读后感的要求,看到什么就一定要能体会出一些东西,于是楼主伸出泛着油炸食物香味的右手,搔搔一头乱发,写出了下面这堆废话——
    看到本片的剧照,左边的人给我的启示是“岁月是把杀猪刀”——忆往昔,濯濯童山上还是草木茂盛,30年过去草原变戈壁了。
    剧照右边,这个就是“第五元素”?为毛别的元素都是石头,这个妞的外形和材质却与其他四个差别这么大?等等,好像真有点什么启示了……
    XMEGA A3BU Xplained kit.PNG

    大家知道,XMEGA A3BU Xplained kit上按钮不多,加上左下角的电容按键,一共才4个按钮。如果要用来做游戏机中控制四个方向的键,就都要用上了,那么怎么退出游戏状态呢,在《第五元素》那位红发女士的启发下,楼主勇敢的使用“祭祀”技能,在使用了排叉、咯吱、花生米等传统祭品表达了对五脏庙的敬意之后,楼主想到了一个狡猾的注意,就是——用光感当按钮。
    使用XMEGA A3BU Xplained kit自带的demo,可以看到第2项就是Lightsensor,利用这个工具实验得知,遮住光感后adc的采样值会降到100以下。然后打开demo源文件,示例对应的代码是lightsensor.h和lightsensor.c,核心的函数是这样的:
    1. void lightsensor_application(void)
    2. {
    3.         struct keyboard_event input_key;
    4.         char string_buf[10];
    5.         uint32_t lightsensor_val = 0;
    6.         uint8_t scaled;
    7.         uint8_t iterations = 0;

    8.         // Clear screen
    9.         gfx_mono_draw_filled_rect(0, 0, 128, 32, GFX_PIXEL_CLR);

    10.         // Put icons at the bottom of the screen indicating light intensity
    11.         gfx_mono_put_bitmap(&bitmap_moon, 1, 24);    // ~1 lux
    12.         gfx_mono_put_bitmap(&bitmap_cloud, 30, 24);  // ~200 lux
    13.         gfx_mono_put_bitmap(&bitmap_indoor, 60, 24); // ~400 lux
    14.         gfx_mono_put_bitmap(&bitmap_sun, 118, 24);   // ~850 lux

    15.         // Draw static strings outside the loop
    16.         gfx_mono_draw_string("Lightsensor", 0, 0, &sysfont);
    17.         gfx_mono_draw_string("Raw value:", 0, 8, &sysfont);

    18.         while (true) {
    19.                 // Start an ADC conversion of the lightsensor
    20.                 lightsensor_measure();

    21.                 while (!lightsensor_data_is_ready()) {
    22.                         // Wait until the conversion is complete
    23.                 }

    24.                 lightsensor_val += lightsensor_get_raw_value();

    25.                 // Let's average some samples to be outputted
    26.                 if (iterations++ >= LIGHTSENSOR_NUM_SAMPLES) {
    27.                         iterations = 0;
    28.                         lightsensor_val /= LIGHTSENSOR_NUM_SAMPLES;
    29.                         snprintf(string_buf, sizeof(string_buf), "%4ld", lightsensor_val);
    30.                         gfx_mono_draw_string(string_buf, 70, 8, &sysfont);
    31.                         // Scale down to LCD width for drawing bar
    32.                         scaled = lightsensor_val >> 4;

    33.                         // Graphic bar representing the light level
    34.                         gfx_mono_draw_filled_rect(0, 17,scaled, 7, GFX_PIXEL_SET);
    35.                         gfx_mono_draw_filled_rect(scaled, 17,128 - scaled, 7,
    36.                                         GFX_PIXEL_CLR);

    37.                         lightsensor_val = 0;
    38.                 }

    39.                 // exit if the "back" button has been pressed and released
    40.                 keyboard_get_key_state(&input_key);
    41.                 if ((input_key.keycode == KEYBOARD_BACK) &&
    42.                                 (input_key.type == KEYBOARD_RELEASE)) {
    43.                         break;
    44.                 }
    45.         }
    46. }
    复制代码
    稍加修改,把用于显示和控制退出的部分去掉,由于多次采样的while循环改成for循环,减少采样次数,把平均值滤波的结果返回,就成了这样子:
    1. unsigned long get_lightsensor_value(void)
    2. {
    3.         unsigned long lightsensor_val = 0;
    4.         uint8_t iterations = 0;
    5.        
    6.         lightsensor_val=0;
    7.         for (iterations=0;iterations<LIGHTSENSOR_NUM_SAMPLES;iterations++)
    8.         {
    9.                 // Start an ADC conversion of the lightsensor
    10.                 lightsensor_measure();

    11.                 while (!lightsensor_data_is_ready()) {
    12.                         // Wait until the conversion is complete
    13.                 }

    14.                 lightsensor_val += lightsensor_get_raw_value();
    15.         }
    16.         lightsensor_val /= LIGHTSENSOR_NUM_SAMPLES;
    17.         return lightsensor_val;
    18. }
    复制代码
    这样,我们自己的函数中,使用
    1. get_lightsensor_value()<100
    复制代码
    作为条件,当手指头按在光感上时这个表达式为真,当脚趾头按在光感上时这个表达式也为真,这样就完成了把光感当按钮的功能了。但是不足之处也很明显,就是当有一个胖子遮天蔽日的站在你身边的时候,这个表达式也为真……


    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2020-9-28 10:10
  • 签到天数: 1018 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2013-5-10 13:50:22 | 显示全部楼层
    楼主的文字功底了得!!!咱要虚心学习~~~{:soso_e183:}
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    郁闷
    2014-5-6 10:38
  • 签到天数: 24 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    发表于 2013-5-10 14:08:36 | 显示全部楼层
    有胖子也没关系,监测跳变就行了,只要留有一定的动作范围都可以监测到的~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2020-9-28 10:10
  • 签到天数: 1018 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2013-5-14 08:28:26 | 显示全部楼层
    powerdruy 发表于 2013-5-13 22:28
    @xinxincaijq 好好学学尼莫的文笔,毫不相关的东西都能扯到一块去,这绝对是一个好销售  ...

    确实要向楼主好好学习!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /5 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-12-21 01:29 , Processed in 0.143523 second(s), 22 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.