新的点灯程序

昨天看了下《嵌入式C编程与atmel avr》后,立刻照着上面做了个程序,没想到一次成功,哈哈。(这本书还是不错,老外写的,可惜现在已经买不到了,我看的是扫描版。)

这个程序主要是演示中断和计数器,目的让LED灯每隔大概半秒闪一次。

#define LED_PORT_DDR        DDRB
#define LED_PORT_OUTPUT     PORTB
#define LED_BIT             0
unsigned int timecount = 0;

ISR(TIM0_OVF_vect) {
	TCNT0 =0;
	if(++timecount == 31){
		LED_PORT_OUTPUT ^= _BV(LED_BIT);//toggle
		timecount = 0; //reset
	}
}

int __attribute__((noreturn)) main(void)
{
uchar   i;

    wdt_enable(WDTO_1S);
    odDebugInit();
    DBG1(0x00, 0, 0);       /* debug output: main starts */
    usbInit();
    usbDeviceDisconnect();  /* enforce re-enumeration, do this while interrupts are disabled! */
    i = 0;
    while(--i){             /* fake USB disconnect for > 250 ms */
        wdt_reset();
        _delay_ms(1);
    }
    usbDeviceConnect();
    LED_PORT_DDR |= _BV(LED_BIT);   /* make the LED bit an output */
    // 1:1024 presc.
    TCCR0B = 0x05;
    TCNT0 =0;
    TIMSK= 1 << TOIE0; //unmark Timer 0 overflow interrup

    sei();
    DBG1(0x01, 0, 0);       /* debug output: main loop starts */
    for(;;){                 /* main event loop */
        DBG1(0x02, 0, 0);   /* debug output: main loop iterates */
        wdt_reset();
        usbPoll();
    }
}

解释如下:

  1. AVR-GCC里面中断用推荐用宏ISR,老的代码用SIGNAL。
  2. attiny45的频率为16.5MHZ,这个频率对于半秒来说太快,所以要用prescaler来降低计数的节拍频率,最小的是原来的频率的1/1024,16.5Mhz / 1024 = 15.625KHZ。上面的设置TCCR0B就是这个用途。这样系统每滴答一次需要1/15.625khz = 64 微秒,计数器为8位,所以滴答256次后就异常了,而这个异常代码是能捕获的,所以能捕获到的最小的计时单位为:64 * 256微秒 = 16 毫秒, 这个离500毫秒还有段距离,所以要用一个全局变量timeout,当timeout递增到31次时,大概就是500毫秒了。这个时候就可以点灯了。
  3. 接下来就要打开中断了,TIMSK这句就是enable Time0的溢出中断。
  4. TCCR0A是用来设置PWM的,要设置prescaler需要用TCCR0B。

数据达到最大值而产生的异常在单片机里面成了一个有实际用途的中断,这种思路真是很奇特。如果一个单片机的中断越多,那么功能也越强大,因为代码能相应更多的事件,而且代码也更清晰。有点类似观察者模式。

接下来做的事情就是测风扇的转速(RPM),思路应该差不多。外行搞单片机还是循序渐进好,首先要有个能够work的东东,不管这个东东有多么小。然后开始滚。 

DIY苹果蓝牙

介绍下:这个是参考网上例子做的一个PC机上的苹果蓝牙无线一体的适配器。这个蓝牙本来笔记本上用的,放到PC上来就要做些调整。主要调整就是把USB的5V电压转成其需要的3.3V电压,上面的三脚贴片就是转换电压的。但是最难的还是布线上面,一则蓝牙的数据线是扁平的接口,比较难弄,二则板上的USB口不好固定。感觉如果不重新印刷电路板要做最后的成品干净利落是很难的。

为搞这个东西前后损失了4个蓝牙适配器。掩面。东西太小,手太糙。

 

 

 

Tagged

我玩星际争霸

玩星际争霸二了快半年,颇有感触啊!

即时战略游戏的一个要求是反应快。面对瞬息万变的局面,要快速转变打法,一旦发现别人出克制你的兵种,得马上调整。在敌人防守、屯兵、开野矿、或者偷袭的情况下,自己的打法也不同。切不可一条路走到黑。我这个人一直都是慢半拍的,还有点一根筋,真要命。

我以前玩游戏跟电脑玩的多,跟人玩的少。确实跟人玩更有意思点,不过我容易紧张,一盘游戏下来就发现肩酸。紧张的话就思路混乱,微操作也很难了。过于注重胜负的人就容易这样。

有计划的更容易战胜对手。比如你几兵营开具、暴某种兵,对方如果没有及时发现,一般很难应对。这个跟围棋下子求“先”很一样,谁先变谁就能掌握主动。如果想后发制人,一陷入被动就难办了。

兵贵神速,贵在奇。稳扎稳打是一法,就是容易疲于奔命、陷入被动。

对于“玩”要辩证的看,玩并不是玩物丧志,只是一种更快学习的手段。

 

最近家中被盗

最近家中被盗,小偷半夜从窗户侵入室内,将手机、首饰、笔记本电脑银行卡等细软一具卷走,估计直接经济损失人民币3万。意外的是小偷从包中捡出工作牌牌,这样我第二日可以正常朝九晚五,虽不能连上办公网络发出自己存在的证明,但还好没有发生被拒之门外的尴尬。还有一喜就是我手机卡办了实名制,花15元就重新找回自己(身份证我保管的很好)。所以被盗后情绪还算稳定,也为小偷的贴心而感动:盗亦有道啊尼码的。

我手机原来用的是用了两年多的HTC G1,被盗前电池撑半天都难,程序打开也很慢。被盗后我换了个Nokia 2630c,400¥,支持WCDMA,而且电池据我观察撑个3天没问题。不想换智能机,没钱。android, ios哥都折腾过,智能机不就是愤怒的小鸟+僵尸+切西瓜+切绳子么。无趣。地铁上还是发发呆好,上了一天班么,回回血。

ipod Touch也没了,想买个ipod Nano,发现现在的新版的是很小,还触摸屏的,不过要别在胸前,有点傻。其实我只想在地铁上听听歌,这样比较容易发呆。于是搞了个微软的zune,8G,400¥。(后来发现这货不能显示中午歌曲名,好吧,我忍。)

死里逃生的人大概都有这种感觉:重来一次生命是多么不容易,重来一次鸡肋的体验是多么的恶心人。