PICNIC

课题2 门开放时间的检测•报警功能的实现

■ 課題2 

1. 课题2的目标

2. 关于用来检查socket超时的计时器timer

3. 把timer内的各位作为时间后分频器使用

4. 实验1:计时器timer的利用

5. 实验2:新建计数器 counter1的利用

6. 实验3:在「门打开状况」超时之后,警报动作

7. 执行例

8. 课题2的提交

9. 考察要点

■报告提交系统

 

→提问•讨论用的BBS

←返回目录

2006年4月5日 16:53 更新

 

●课题2的目标

作为课题2,完成「门开放时间检测•报警功能的实现」课题的提出。→从这儿提出

基本的实际操作方针如下所示:

・把计数器counter作为TMR1中断的后分频器来利用
・以TMR1中断(大约13.1msec)的间隔检查门的开闭状况
・设定超时时间
・在「门打开状况」超时之后,警报动作

●关于用来检查socket超时的计时器timer

(1)概要

中断例行程序内的int_tmr2以TMR1中断(13.1msec)间隔被呼出,紧接着,把用于socket超时检查的计数器timer(寄存器BANK#1)+1。

<中断例行程序int_tmr2标签附近的实际配置>

int_tmr2	; socket超时确认
bsf STATUS,RP0 ; BANK#1
MOVLW 1
ADDWF timer,1 ; timer++1
btfsc STATUS,C ;循环溢出确认
GOTO dec_tm ; socket用时钟管理
; --> 返回到dec_tm9。
dec_tm9 ; 在呼出dec_tm后的返回标签
CLRF STATUS ;

由于计数器是8bit,在累计256次以后就会溢出,呼出dec_tm。花费在这上面的时间为:
13.107msec x 256次计数 = 3355.392msec(=大约3.36秒)。


(2)增加部分的改良

由于timer只是+1,其后已经不使用Wreg,所以比起「MOVLW + ADDWF + Carry标签确认」,「INCF + Zero标签确认」也许能够节约1段字节。

对于ADD(SUB)系列演算命令与INC(DEC)系列演算命令 由于演算后的STATUS标签的变化是不同的(ADD系列为 C,DC,Z, INC系列仅有Z变化),要适当区分使用。

有关详细内容参照下面的数据清单的命令详解。

ADDWF命令:
PIC16F87x MIDRANGE Reference Manual page531
microchip/33023a.pdf#page=531

INCF命令:
PIC16F87x MIDRANGE Reference Manual page546
microchip/33023a.pdf#page=546

这样,执行INCF+Zero标签确认的版本只要按照下面这样操作就行了。

<改良方案>

int_tmr2	; socket超时确认
bsf STATUS,RP0 ; BANK#1
INCF timer,1 ; timer++1
btfsc STATUS,Z ; 循环溢出确认
GOTO dec_tm ; socket用时钟管理
; --> 返回至dec_tm9
dec_tm9 ; 呼出dec_tm后的返回标签
CLRF STATUS ;
;

 

●把timer内的各位作为时间后分频器使用

计数器timer的各位(bit0~7)可以看作以TMR1中断间割(大约13.1msec)进行1:2~1:256分频的后分频器。

表1:timer各位的周期

----------------------------------------
bit | 分频比 | 周期(msec)
----------------------------------------
bit0 | 1:2 | 26.2
bit1 | 1:4 | 52.4
bit2 | 1:8 | 104.8
bit3 | 1:16 | 209.7
bit4 | 1:32 | 419.4
bit5 | 1:64 | 838.8
bit6 | 1:128 | 1677.6
bit7 | 1:256 | 3355.3
----------------------------------------

最上位(bit7)周期大约3.36秒。稍微有点过长。Bit5的周期大约是0.84秒,在这时测量门打开时间正合适。

●实验1:计时器timer的利用

作为先前在课题1作成的test4模块的替代,被呼出后,利用计时器timer的bit5的分频比(1:64),进行大约每隔0.84秒,RB4(LED#4)亮灯⇔灭灯的输出。可以作为后分频器的动作确认。

作为PIC单片机的条件分支命令,用AND命令来实行位掩码,在那个领域全部是0的时候,来确认Z图框是否被确定是最简单的方法。

因此,在用timer:bit5的分频比(1:64)进行分支处理的场合,在进行bit5~0是否全是0的确认之后,变更RB4的输出值(H⇔L)就行了。

<特定位值的交换方法H⇔L>

执行XOR演算命令。使位掩码对应如下的话,可以利用一次XOR命令来进行H⇔L值的变更,非常便利。
・希望把值变更的位 1
・希望把值保留的位 0

例:把W寄存器的bit4进行值交换

   XORLW B'00010000'

<test5模块的实际配置例>


test5
; 从中断例行程序的登录要点

; Wreg <- timer
; bit掩码 [0011.1111]
; bit5—0是否全为0?
 → test5_09

; 变更RB4的输出状态
; 读出PORTB→regW
; 交换bit4的值至H⇔L
; regW→至PORTB的输出

test5_09
; 返回至中断例行程序

#没有必要再从中断例行程序执行goto test5

试着执行后,能够确认LED#4大约闪烁了1.6秒
(为什么?→提示:数36次“闪烁”大约要用1分钟)

LED的闪烁完全就象心脏的跳动

 

●実験2:新建计数器counter1的利用

作为借用计时器timer的替代,利用新建的计数器counter(BANK#3),执行与test5模块同样的动作试试看。当然,counter1的添加必须在先前完成。

(变更处)

bsf STATUS,RP1
bsf STATUS,RP0 ; 寄存器BANK#3

incf counter1,0 ; Wreg <- counter1 + 1
movwf counter1 ; counter1 <- Wreg

bcf STATUS,RP1
bcf STATUS,RP0 ; 寄存器BANK#0

●実験3:在「门打开状况」超时之后,警报动作

利用新建的计数器counter2,进行测量「门打开状态」时间,超时时间设定以及通知处理,制作test6模块

Counter2是在实验1•2中作成的“心跳”的周期timer(或者是counter1)被累计的。(大约每0.84秒+1)

对于根据门的状态的条件分支处理,参考在课题0•实验4中作成的test2模块

<规格>

・「门打开状态」在持续一定时间的场合,警报动作
・超时时间大约10秒
・关上门后警报停止

<处理概要>

・门关闭时 : RB7(警报) off
         设定counter2为0

・门打开时 : timer分频处理
        counter2有没有超过了一定的计数 ?
        →超过的场合:RB7(警报) on
        →没有超过的场合:把counter2+1

<超时时间的计算例>

在打开门时,计数器counter2以TMR1中断间隔的1:64分频的大约0.84秒累计

例如,思考在要求「打开门后,希望大约在10秒左右警报动作」的场合。

在这种场合,到超时的累计数为10 / 0.84 = 11.90…,counter2从0开始计数,结果,超时的「上限值」=12。

提示之一:
由于counter是8bit计数器,可以在0-255范围内计数,超时时间的最大值是,0.84秒x 255次计数 = 214.2秒(大约3分半钟)。还想再设定超过这个的超时时间的场合,可以通过从上位(例如:从bit7)来获取timer(或者是counter1)的分频比。

提示之二:
想提高超时时间精度的场合,可以从下位获取分频比,作为累计数,能够获取较大的数值就行了。

提示之三:
在程序找错时,如果能够显示counter2的值的话,是非常方便的。为此,参考在先前的课题1中实际配置的「在门开闭次数计数器counter web控制画面的显示( put_count模块)」

●执行例

关门的状态 → 打开门 →(经过10秒钟)→ 超时,警报动作
→ 关上门的话,警报停止 → (返回至最初)


●课题2的提交

【课题2】(实验3)
制作进行测量「门打开状态」的时间,超时时间的设定以及通知处理的test6模块。超时的时间设定为10秒。利用门传感器,web控制画面,计数器值的变化来确认是否按照规格正常动作。

(1)完成实现「打开门状态」超时后,警报动作的test6模块的制作

(2)利用门传感器状态,web控制画面上的RB5状态变化功能,确认是否按照规格正常动作

(3)变更汇编源代码文件的版本编号为ver1.2.0.7

另外,把web控制换面的封面部分,适当地变更为自己的学籍编号等。

(4)把完成的汇编源程序文件以v1207e2.asm命名保存(全部使用半角英文字母数字•字母用小写,半角日文片假名•绝对不可以使用全角文字命名文件名)

(5)从以下的报告提出系统,上传v1207e2.asm ,在接收到报告后进行评分。

<提出方法>
利用报告提出系统(具有文件上传功能),提出编写的程序中的汇编•源程序文件(后缀为*.asm的文件。不是*.hex) 

提出的文件,在经过动作确认后,假如有动作不良的场合需要再次提出,动作ok的场合,评判为完了。

报告课题0(课题编号:picnic-exp02)的提出从这儿进入

(6)显示「等待评判」,请稍微等待。评判结果长时间不出来的场合,请发送邮件至这儿

(7)被评判为再次提出的场合,修改指出的不完善的地方更改v1207e2a.asm等文件名,再次提出。

(8)不是(7)的场合(评判为完了),报告课题2被受理,完了。

 

●考察要点

在下面举出针对这次的规格与实际操作的考察点。无须作为报告来回答,但是程序完成•报告提出之前,必须自己归纳思考

 

[1]假定超时时间设定范围在数秒~数小时的场合,由于这次实际配置的8bit计数器的原因,在后分频器会产生故障。应该如何改善以满足这样的要求?

[2]内部时钟本身由于是使用了由水晶振动器产生的外部时钟的分频,精度非常高(与石英表相同)。不是作为开门报警,作为24小时制时钟实际使用,以一定的时间间隔使继电器进行开,闭动作也是很容易的。但是,把时钟(20MHz)以1:2^n分频的场合,原样不变的话,无法成为1秒单位,1分单位,1小时单位的计数器。为了分别以counter1,2,3来计算,使用,应该如何进行分频处理?

[3]次数计数器counter2在复位后,在某处应该被设定为初始值=0这个具体地可以在何处实际操作?

信州大学インターネット大学院

wasaki@cs.shinshu-u.ac.jp
Copyright(c) 2005 Katsumi Wasaki. All rights reserved.