PICNIC

课题1 门打开次数计数•显示功能的实现

■ 課題1 

1. 课题1的目标

2. 创建次数计数器用变量counter

3. 内部计时器TMR1•中断处理例行程序

4. 门开关状态(RB0)→到LED#4(RB4)的正逻辑输出

5. 门开关次数的计数模块:test4

6. 把次数计数器显示到web控制页面

7. 执行例

8. 课题1的提交

9. 考察要点

■报告提交系统

 

→提问•讨论用的BBS

←返回目录

2006年4月5日 16:36 更新

 

●课题1的目标

作为课题1,完成「门开放次数计数•显示功能的实现」课题的提出。→从这儿提出课题

基本的实际制作方针如下所示。

・创建累计次数的变量(8bit)
・以TMR1时间中断的间隔(大约13.1msec)检查门的开关状态
・门开关状态(RB0)→到LED#4(RB4)的正逻辑输出
・捕捉门关→开的状态变换,次数计数器加1
・在web控制画面显示次数计数器

●创建次数计数器用变量counter(2003/10/12更新)

在寄存器BANK#3中创建累计次数的变量counter

<实际配置例>

;-------------------------------------------------------------
; 实验用内存领域 BANK#3 [RP1:RP0]=[1:1] 1B0h -- 1EFh
;-------------------------------------------------------------
; PAGE 3
counter EQU 1E0H ; 计数器#0
counter1 EQU 1E1H ; 计数器#1
counter2 EQU 1E2H ; 计数器#2
counter3 EQU 1E3H ; 计数器#3

考虑到以后,预先一次创建4个计数器。对BANK#3的寄存器的直接访问,在把STATUS寄存器的RP1与RP0设定为1之后,执行存储区切换之后进行参照。(不理解的同学请参考说明书的14页)


※2003/10/12更新处:当初,从1B0开始的4个字节预留给counter变量,但是,现在已经判明,从web控制画面上频繁地对RB5进行切换,从web浏览器连续进行reload处理的话,在1B0附近的通用寄存器的某处会有数值进入。由于这个区域实际上并没有用EQU进行变量定义,是定做的v12.asm的通用寄存器操作(RP0,RP1)的关系而产生不良,还是PIC16F877自身的问题,现在还不清楚。为了回避这个问题,变更为把从1E0开始的4个字节预留给counter变量。无论如何,因为在BANK#3是不会改变的,以下的说明和修正以前没有变化。另外,变量counter的初始化,可以在start模块的最后部分进行。

●内部计时器TMR1•中断处理例行程序

注意点:课题0中,紧接main0标签之后,为了test模块call处理,曾经追加了4个步骤,并确认了其动作。(参照课题0的这部分)

但是,在课题1之后,实际制作的模块的呼出,由于是跳越时间中断例行程序的形式,对于在课题0种紧接main0之后追加的呼出处理,请务必变为无效或者删除。(2005/5/3追记)


※针对PIC16F877+PICNIC固件v12.asm的现状的有关内部时间•中断处理关系的说明参照这儿。


从中断例行程序内部向外部call时,在某处会出现PC寄存器溢出而产生动作不良。

在中断例行程序内,增加无用的编码事实是困难的(程序内存PAGE#0已经满了)。

从中断例行程序中,把存在于程序内存PAGE#3的外部模块PCLATH , goto 跳越→中断→中断程序内的返回用Tag,按照这样返回是容易的,所以我们采用这种方法。


中断例行程序侧的呼出
<实际操作>

int_tmr1        ; DHCP请求结束的超时确认
bcf PIR1,TMR1IF
BSF STATUS,RP0
MOVF dhcp_done,0
andlw 7FH
btfss STATUS,Z
DECF dhcp_done,1
bcf STATUS,RP0
;;++++++++++++++++++++++++++++++++++++++
movlw HIGH (test4) ; 获取test4 >> 8 页面的位置
movwf PCLATH ; 设定页面选择寄存器
goto test4 ; 转移至test4模块
int_tmr9 ; →从test4返回时到这里
clrf PCLATH ; 设定页面选择寄存器
;;++++++++++++++++++++++++++++++++++++++
int_tmr2 ; socket超时确认

在上面的例子中,从中断处理例行程序内部是按这样的顺序执行的:

int_tmr1→转移到test4→(计数处理)→返回int_tmr9→int_tmr2

●门开关状态(RB0)→到LED#4(RB4)的正逻辑输出

参照指南(课题0)中的实验4(test2模块)

【实验4】RB0(门传感器)→输出到RB4(LED#4)的test2模块的制作

 

●门开关次数的计数模块:test4

一定是从中断处理例行程序以13.1msec的间隔被呼出。
基本的操作可以以指南中的实验4(test2模块)为基础。

由于是从中断例行程序中的呼出,在指南(课题0)中说明的,由wk2,wk1保存STATUS,W寄存器的值是危险的

・不对STATUS值进行维护
・对于W寄存器值得暂时保存,可以借用LCD显示用的变量tmp(可能没问题)。


把计数器counter变量+1的时机在以作成的test2模块为基础的场合,处理的概要如下所示:

・门有没有打开?(RB0的确认)
・「1个步骤以前门的状态」,也就是进行RB4的位检查
・假如一个步骤之前门是关闭的,这个时机就是门关→闭的状态变化瞬间
计数器值+1

test4模块侧
<实际配置的雏形>

;----------------------------------------------------------------------
; test4模块 [ver0.6]
;----------------------------------------------------------------------
org 1E00h
test4
; 从中断例行程序进入要点
clrF STATUS ; 清空STATUS寄存器
;;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
................
※按照上述说明配置
门的开闭状态(RB0)→LED#4(RB4)
检测出门闭→开的状态变化 计数器+1
................
;;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; 复归至中断例行程序
movlw HIGH (int_tmr9) ; 获取int_tmr9 >> 8 PAGE位置
movwf PCLATH ; 设定PAGE控制寄存器
goto int_tmr9 ; 转移至int_tmr9
;----------------------------------------------------------------------

●把次数计数器显示到web控制页面

把累计的变量counter的值(8bit)在web控制画面显示。
对于显示位置,Status:与显示信息包数的部分替换。(借用控制编码'$9')

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
<变更前>
goto put_send_packet ; 9:传送信息包数

<变更后>
goto put_counter ; 9:实验用计数器显示[ver0.6]
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


实验用计数器counter显示用的模块put_counter的处理如下所示:

<处理顺序的例子>

put_counter     ; 用于实验计数器的显示
至BANK#3的切换
Wreg <-- counter
至BANK#0的切换
val <-- Wreg
put_decimal模块的呼出(8bit10进制显示用・引数val)

●执行例

电源投入之后 → 在开闭一次门之后 → .... → 第10次

对应门的状态,LED#4(RB4)亮灯,灭灯

●课题1的提交

【课题1】
完成实现门开闭次数计数•显示功能的各种模块的制作。利用门传感器的状态,web控制画面,计数器值的变化来确认模块是否按照规格正常动作。

(1)完成实现门开闭次数计数•显示功能的各种模块的制作。

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

(3)变更汇编源程序文件的版本编号为ver1.2.0.6

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

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

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

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

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

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

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

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

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

 

●考察要点

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

 

[1]由于使用了8bit计数器,在门开闭256次时,变量会溢出,次数恢复至0为了防止这个该如何进行改善?

[2]作为门的开闭次数,假如使用16bit计数器,在实际使用时,不产生溢出。为此,需要更改的是哪部分?

[3]在把响铃时间非常长(TMR1时间中断间隔的3倍左右)的门开关闭合的场合,对于1次的开闭动作,有可能会累计为2次以上,存在发生这样错误计数可能性为了防止这个该如何进行改善?

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

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

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