不知道,这是否就是开源的传说!

[复制链接]
4967|23
 楼主| gaoyuaug 发表于 2009-9-16 08:48 | 显示全部楼层 |阅读模式
本帖最后由 warm_ice 于 2009-9-16 09:42 编辑

  1. ;*****************************************************
  2. ;Company :
  3. ;File Name : sevev.asm
  4. ;Author :
  5. ;Create Data : 2009-08-14
  6. ;Last Modified : 2009-08-14
  7. ;Description :
  8. ;Version : 1.0
  9. ;*****************************************************
  10. ;*****************************
  11. list p=6612
  12. ;*****************************
  13. ie equ 00h
  14. irq equ 01h
  15. tmod equ 02h
  16. tmod1 equ 03h
  17. tl0 equ 04h
  18. th0 equ 05h
  19. tl1 equ 06h
  20. th1 equ 07h

  21. inx equ 0fh
  22. dpl equ 10h
  23. dpm equ 11h
  24. dph equ 12h
  25. setting equ 13h
  26. hlm_ace equ 14h

  27. pa equ 08h
  28. pb equ 09h
  29. pc equ 0ah
  30. duty equ 15h
  31. tbr equ 0eh
  32. sec_1 equ 20h
  33. sec_2 equ 21h
  34. min_1 equ 22h
  35. min_2 equ 24h
  36. temp equ 25h
  37. flag equ 26h
  38. m_flag equ 27h
  39. s_flag equ 28h
  40. ct0 equ 29h
  41. ct1 equ 2ah
  42. ct2 equ 2bh
  43. ct3 equ 2ch

  44. pb_bak equ 30h
  45.   
  46. org 00
  47. jmp r_start
  48. org 01h
  49. rtni
  50. org 02h
  51. jmp time0
  52. org 03h
  53. jmp time1
  54. org 04h
  55. jmp pbc
  56. ;***********************************
  57. org 0100h
  58. time0:
  59. lda flag
  60. ba1 sec
  61. orim flag,010b
  62. jmp intend
  63. sec:
  64. andim m_flag,01
  65. ba0 WW
  66. orim pa,0110b ;eorim pa,0110b
  67. call delay
  68. andim pa,0 ;
  69. ;+++++++++++++++++++++++++++++++++
  70. WW:
  71. andim flag,000b
  72. adim sec_1,01h
  73. daa sec_1
  74. ldi temp,0h
  75. adcm sec_2,00h
  76. ;***********************
  77. sbi sec_2,03
  78. bnz wait ;30sec ?
  79. andim m_flag,01
  80. bnz setflag
  81. ;***********************
  82. wait:
  83. sbi sec_2,06
  84. baz min
  85. jmp intend
  86. min:
  87. ldi sec_2,0
  88. adim min_1,01h
  89. daa min_1
  90. ldi temp,0h
  91. ;++++++++++1min++time+++++;EV_test mode
  92. ; sbi min_1,01
  93. ; bnz intend
  94. ;++++++++++30/60min++time++;work mode
  95. adcm min_2,00h
  96. sbi min_2,06h
  97. bnz intend
  98. ;++++++++++++++++++++++++++++++
  99. orim m_flag,01
  100. jmp intend
  101. setflag:
  102. orim s_flag,01
  103. intend:
  104. ldi ie,0100b
  105. ldi irq,0
  106. rtni
  107. ;***************************
  108. time1:
  109. rtni  
  110. ;***************************
  111. pbc:
  112. ldi irq,0
  113. rtni
  114. ;****************************   
  115. r_start:
  116. nop
  117. nop
  118. nop
  119.         ldi tbr,0
  120. ldi sec_1,0
  121. ldi sec_2,0
  122. ldi min_1,0
  123. ldi min_2,0
  124. ldi ct0,0
  125. ldi ct1,0
  126. ldi ct2,0

  127. ldi flag,0
  128. ldi s_flag,0
  129. ldi m_flag,0

  130. ldi pa,0
  131. ldi pb,1111b
  132. ldi pb_bak,0

  133. ldi duty,00h
  134. ldi setting,00h
  135. ldi hlm_ace,0
  136.   
  137. ldi tmod,011b
  138. ldi tl0,00h
  139. ldi th0,08h

  140. ; jmp key_scan
  141. ;+++++++++++++++++++++++++++++            
  142. mode_stop:
  143. ldi m_flag,0
  144. ldi s_flag,0
  145. ldi min_2,0
  146. ldi pa,0h;
  147. ldi tmod,011b
  148. ldi tl0,00h
  149. ldi th0,08h
  150. ldi irq,0
  151. ldi ie,0001b
  152. stop
  153. nop
  154. nop
  155. ;***************************
  156. key_scan:
  157. lda pb
  158. sta pb_bak
  159. sbi pb_bak,1111b
  160. baz key_scan   
  161. call delay_k
  162. lda pb
  163. sub pb_bak
  164. bnz key_scan
  165. eor pb_bak
  166. ba1 $+2 ;key_1
  167. jmp key_1
  168. ba2 $+2 ;key_2
  169. jmp key_2
  170. jmp key_scan
  171. key_1:
  172. ldi ie,0100b
  173. ldi irq,0
  174. ldi min_2,03h
  175. jmp main  
  176. key_2:
  177. ldi ie,0100b
  178. ldi irq,0
  179. ldi min_2,06h
  180. ;***************************************
  181. main:

  182. andim m_flag,01;after '30
  183. ba0 mode_two
  184. jmp main
  185. mode_two:
  186. ldi pa,1111b  
  187. nop
  188. nop
  189. orim pa,1101b
  190. andim s_flag,01 ;after 30s
  191. ba0 mode_stop   
  192.         jmp mode_two ;  
  193. ;+++++++++++++++++++++++++++++
  194. delay:
  195. adim ct0,01h
  196. bnc delay
  197. adim 30h,05h
  198. bnc delay
  199. ldi 30h,0
  200. rtni
  201. delay_k:
  202. ldi ct1,09
  203. ldi ct2,0eh
  204. sbi ct2,01h
  205. bnc $-1
  206. sbi ct1,01h
  207. bnc $-4
  208. rtni
  209. ;+++++++++++++++++++++++++++++
  210. END
warm_ice 发表于 2009-9-16 09:07 | 显示全部楼层
不明白楼主想表达什么意思.可否详细说明?
 楼主| gaoyuaug 发表于 2009-9-16 09:22 | 显示全部楼层
写着玩,因为板子IO限制了,
orim pa,1101b
改成
andim pa,1110b
SH66P12只能是低电平PBC中断吗?
warm_ice 发表于 2009-9-16 09:26 | 显示全部楼层
写着玩,因为板子IO限制了,
orim pa,1101b
改成
andim pa,1110b
SH66P12只能是低电平PBC中断吗?
gaoyuaug 发表于 2009-9-16 09:22


SH66P12只能是低电平PB中断.
 楼主| gaoyuaug 发表于 2009-9-16 09:35 | 显示全部楼层
延时部份有两种:
前一种我是借鉴了手册,在中断里调用不会溢出。
而后一种在中断里调用会溢出,这是为什么呢?
warm_ice 发表于 2009-9-16 09:49 | 显示全部楼层
延时部份有两种:
前一种我是借鉴了手册,在中断里调用不会溢出。
而后一种在中断里调用会溢出,这是为什么呢?
gaoyuaug 发表于 2009-9-16 09:35

初步看了一下,先说一下看到的问题:
1.中断服务程序,进入时先要保存累加器A,一般是用STA指令,将累加器A的值保存到一个寄存器中,中断服务程序结束后,在RTNI返回前,恢复累加器A的值,一般用LDA指令;中断退出的最后3条一定为:
     恢复  IE
     恢复  A
     RTNI

2.一般中断中不会再调用延时程序;一是怕中断过长,影响正常程序运行,二是怕产生嵌套,超过4次嵌套就会产生溢出错误.
 楼主| gaoyuaug 发表于 2009-9-16 10:12 | 显示全部楼层
因为我不知道A里面是什么内容,要不要保存?
warm_ice 发表于 2009-9-16 10:34 | 显示全部楼层
因为我不知道A里面是什么内容,要不要保存?
gaoyuaug 发表于 2009-9-16 10:12

当然是不知道的,它是任何值都有机会,一定要保存.
 楼主| gaoyuaug 发表于 2009-9-16 10:57 | 显示全部楼层
我的中断是500ms一次,
而里面的延时不到20ms,怎么不能调用呢?
warm_ice 发表于 2009-9-16 11:12 | 显示全部楼层
我的中断是500ms一次,
而里面的延时不到20ms,怎么不能调用呢?
gaoyuaug 发表于 2009-9-16 10:57

我没说过不可以调用,只是说通常不这样做而已.
 楼主| gaoyuaug 发表于 2009-9-16 11:21 | 显示全部楼层
打扰一下
因为我采用第二种延时,中断里调用会溢出,
所以我采用了第一种延时的方法。
两种延时,都在一个子程序里,
我没搞懂,请帮我解一下这两种方法有什么区别?
warm_ice 发表于 2009-9-16 11:28 | 显示全部楼层
打扰一下
因为我采用第二种延时,中断里调用会溢出,
所以我采用了第一种延时的方法。
两种延时,都在一个子程序里,
我没搞懂,请帮我解一下这两种方法有什么区别? ...
gaoyuaug 发表于 2009-9-16 11:21

不好意思,能给我标示一下么,哪部分是第一种,哪部分是第二种,看着有点乱.
 楼主| gaoyuaug 发表于 2009-9-16 11:33 | 显示全部楼层
delay:

adim ct0,01h

bnc delay

adim 30h,05h

bnc delay

ldi 30h,0

rtni

delay_k:

ldi ct1,09

ldi ct2,0eh

sbi ct2,01h

bnc $-1

sbi ct1,01h

bnc $-4

rtni

;+++++++++++++++++++++++++++++

就是上面这两段

有条指令改下:pb—bak equ 02fh
warm_ice 发表于 2009-9-16 11:39 | 显示全部楼层
delay:

adim ct0,01h

bnc delay

adim 30h,05h

bnc delay

ldi 30h,0

rtni

delay_k:

ldi ct1,09

ldi ct2,0eh

sbi ct2,01h

bnc $-1

sbi ct1,01h

bnc $-4

rtni

;+++++++++++++++++++++++++++++

就是上 ...
gaoyuaug 发表于 2009-9-16 11:33


单看这2个延时程序本身都是没有问题的,只是第二种方法的延时时间明显要大于第一种方法.
mbutterfly 发表于 2009-9-16 12:05 | 显示全部楼层
晕,本来是开源的事情,后来又扯到了中断上;P
 楼主| gaoyuaug 发表于 2009-9-16 13:17 | 显示全部楼层
我是想在1s的周期内有个20ms左右的高电平。
因为这个程序我在编译的时候,发现在中断里调用软件延时,会溢出。
而换一种方法延时,再调用就不会溢出,所以我还是不懂。
warm_ice 发表于 2009-9-16 13:30 | 显示全部楼层
我是想在1s的周期内有个20ms左右的高电平。
因为这个程序我在编译的时候,发现在中断里调用软件延时,会溢出。
而换一种方法延时,再调用就不会溢出,所以我还是不懂。 ...
gaoyuaug 发表于 2009-9-16 13:17

仿真器ICE66有个TRACE的功能,程序运行至溢出时,程序会停下来,这时按CTRL+T键可以调出从停下来的这条程序之前运行的8K程序,您可以依据这个来查看错误出在哪里.
 楼主| gaoyuaug 发表于 2009-9-16 13:47 | 显示全部楼层
我是想说这个程序里的两种软件延时,
在算法上有什么区别?
这么说来,软件的思路是正确的。
warm_ice 发表于 2009-9-16 13:51 | 显示全部楼层
我是想说这个程序里的两种软件延时,
在算法上有什么区别?
这么说来,软件的思路是正确的。
gaoyuaug 发表于 2009-9-16 13:47

一个是加一个是减,都可以实现,当然也可以写足够多的NOP指令.这些都是形式,目的就是延时.
我说让你用一下TRACE功能,就是看一下你说有溢出错误的程序的问题出在哪.
 楼主| gaoyuaug 发表于 2009-9-16 13:59 | 显示全部楼层
就是这段:
;***********************************

org 0100h

time0:

lda flag

ba1 sec

orim flag,010b

jmp intend

sec:

andim m_flag,01

ba0 WW

orim pa,0110b ;eorim pa,0110b

call delay

andim pa,0 ;

;+++++++++++++++++++++++++++++++++

之前,我编译的时候会溢出;
所以,我换了种方法,就不溢出了
唉,不管了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

31

主题

188

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部