佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 1988|回复: 6

关于PIC 的 INFINITE LOOP 信号 如何关起 当用2个BUTTON的时候

[复制链接]
发表于 9-10-2012 01:19 AM | 显示全部楼层 |阅读模式

  1. #define INT8U unsigned char
  2. #define _XTAL_FREQ 20000000UL    //Crystal
  3. #include <pic.h>
  4. __CONFIG (0x3F22);
  5. #define MA   RC0
  6. #define MB   RC1
  7. #define MC   RC6
  8. #define MD   RC7
  9. #define K1() RD7==0
  10. #define K2() (RD6==0 || RC0==0 || RC1==0 || RC6==0 || RC7==0)
  11. INT8U operation_type=0;
  12. void task()
  13. {
  14. INT8U i,j;
  15. if(K1())
  16. for( ; ; )
  17. {
  18. MA=1;
  19. MD=1;
  20. __delay_ms(0.05);
  21. MA=0;
  22. MD=0;
  23. __delay_ms(0.45);
  24. MA=1;
  25. MD=1;
  26. __delay_ms(0.10);
  27. MA=0;
  28. MD=0;
  29. __delay_ms(0.40);
  30. MA=1;
  31. MD=1;
  32. __delay_ms(0.15);
  33. MA=0;
  34. MD=0;
  35. __delay_ms(0.35);
  36. MA=1;
  37. MD=1;
  38. __delay_ms(0.20);
  39. MA=0;
  40. MD=0;
  41. __delay_ms(0.3);
  42. MA=1;
  43. MD=1;
  44. __delay_ms(0.25);
  45. MA=0;
  46. MD=0;
  47. __delay_ms(0.25);
  48. MA=1;
  49. MD=1;
  50. __delay_ms(0.3);
  51. MA=0;
  52. MD=0;
  53. __delay_ms(0.2);
  54. MA=1;
  55. MD=1;
  56. __delay_ms(0.35);
  57. MA=0;
  58. MD=0;
  59. __delay_ms(0.15);
  60. MA=1;
  61. MD=1;
  62. __delay_ms(0.40);
  63. MA=0;
  64. MD=0;
  65. __delay_ms(0.10);
  66. MA=1;
  67. MD=1;
  68. __delay_ms(0.45);
  69. MA=0;
  70. MD=0;
  71. __delay_ms(0.05);
  72. MA=1;
  73. MD=1;
  74. __delay_ms(0.45);
  75. MA=0;
  76. MD=0;
  77. __delay_ms(0.05);
  78. MA=1;
  79. MD=1;
  80. __delay_ms(0.45);
  81. MA=0;
  82. MD=0;
  83. __delay_ms(0.05);
  84. MA=1;
  85. MD=1;
  86. __delay_ms(0.45);
  87. MA=0;
  88. MD=0;
  89. __delay_ms(0.05);
  90. MA=1;
  91. MD=1;
  92. __delay_ms(0.40);
  93. MA=0;
  94. MD=0;
  95. __delay_ms(0.1);
  96. MA=1;
  97. MD=1;
  98. __delay_ms(0.35);
  99. MA=0;
  100. MD=0;
  101. __delay_ms(0.15);
  102. MA=1;
  103. MD=1;
  104. __delay_ms(0.30);
  105. MA=0;
  106. MD=0;
  107. __delay_ms(0.2);
  108. MA=1;
  109. MD=1;
  110. __delay_ms(0.25);
  111. MA=0;
  112. MD=0;
  113. __delay_ms(0.25);
  114. MA=1;
  115. MD=1;
  116. __delay_ms(0.20);
  117. MA=0;
  118. MD=0;
  119. __delay_ms(0.30);
  120. MA=1;
  121. MD=1;
  122. __delay_ms(0.15);
  123. MA=0;
  124. MD=0;
  125. __delay_ms(0.35);
  126. MA=1;
  127. MD=1;
  128. __delay_ms(0.10);
  129. MA=0;
  130. MD=0;
  131. __delay_ms(0.4);
  132. MA=1;
  133. MD=1;
  134. __delay_ms(0.05);
  135. MA=0;
  136. MD=0;
  137. __delay_ms(0.45);
  138. //////negative pulse///////////////////////////////////////////////////////
  139. MB=1;
  140. MC=1;
  141. __delay_ms(0.05);
  142. MB=0;
  143. MC=0;
  144. __delay_ms(0.45);
  145. MB=1;
  146. MC=1;
  147. __delay_ms(0.10);
  148. MB=0;
  149. MC=0;
  150. __delay_ms(0.40);
  151. MB=1;
  152. MC=1;
  153. __delay_ms(0.15);
  154. MB=0;
  155. MC=0;
  156. __delay_ms(0.35);
  157. MB=1;
  158. MC=1;
  159. __delay_ms(0.20);
  160. MB=0;
  161. MC=0;
  162. __delay_ms(0.3);
  163. MB=1;
  164. MC=1;
  165. __delay_ms(0.25);
  166. MB=0;
  167. MC=0;
  168. __delay_ms(0.25);
  169. MB=1;
  170. MC=1;
  171. __delay_ms(0.3);
  172. MB=0;
  173. MC=0;
  174. __delay_ms(0.2);
  175. MB=1;
  176. MC=1;
  177. __delay_ms(0.35);
  178. MB=0;
  179. MC=0;
  180. __delay_ms(0.15);
  181. MB=1;
  182. MC=1;
  183. __delay_ms(0.40);
  184. MB=0;
  185. MC=0;
  186. __delay_ms(0.10);
  187. MB=1;
  188. MC=1;
  189. __delay_ms(0.45);
  190. MB=0;
  191. MC=0;
  192. __delay_ms(0.05);
  193. MB=1;
  194. MC=1;
  195. __delay_ms(0.45);
  196. MB=0;
  197. MC=0;
  198. __delay_ms(0.05);
  199. MB=1;
  200. MC=1;
  201. __delay_ms(0.45);
  202. MB=0;
  203. MC=0;
  204. __delay_ms(0.05);
  205. MB=1;
  206. MC=1;
  207. __delay_ms(0.45);
  208. MB=0;
  209. MC=0;
  210. __delay_ms(0.05);
  211. MB=1;
  212. MC=1;
  213. __delay_ms(0.40);
  214. MB=0;
  215. MC=0;
  216. __delay_ms(0.1);
  217. MB=1;
  218. MC=1;
  219. __delay_ms(0.35);
  220. MB=0;
  221. MC=0;
  222. __delay_ms(0.15);
  223. MB=1;
  224. MC=1;
  225. __delay_ms(0.30);
  226. MB=0;
  227. MC=0;
  228. __delay_ms(0.2);
  229. MB=1;
  230. MC=1;
  231. __delay_ms(0.25);
  232. MB=0;
  233. MC=0;
  234. __delay_ms(0.25);
  235. MB=1;
  236. MC=1;
  237. __delay_ms(0.20);
  238. MB=0;
  239. MC=0;
  240. __delay_ms(0.30);
  241. MB=1;
  242. MC=1;
  243. __delay_ms(0.15);
  244. MB=0;
  245. MC=0;
  246. __delay_ms(0.35);
  247. MB=1;
  248. MC=1;
  249. __delay_ms(0.10);
  250. MB=0;
  251. MC=0;
  252. __delay_ms(0.4);
  253. MB=1;
  254. MC=1;
  255. __delay_ms(0.05);
  256. MB=0;
  257. MC=0;
  258. __delay_ms(0.45);
  259. }
  260. }
  261. void main()
  262. {
  263.     TRISC = 0x00;
  264.     TRISD7=1;
  265.         TRISD6=1;
  266.     PORTC=0X00;
  267.     PORTD=0XFF;
  268. while(1)
  269. {
  270. task();
  271. }
  272. }
复制代码

请问有哪位大大 对这个有经验 。。。。就是我想 当我启动这个 INFINITE LOOP 的PWM 信号的时候。  我想一开始开启PIC 的时候 是 处于 没有信号 在 RC0 RC1 RC6 RC7. 过后当我 一个 按 RD7 BUTTON 的时候。。。启动了 RC0 RC1 RC6 的信号。。。可是当我突然想要 RD6 当做 关闭 RC0 RC1 RC6 RC7。的时候。。我对这个就没折了。。。。我尝试很多方法 来关掉这个INFINITE LOOP 还是不行。。。用SWITCH STATEMENT 也用过了。还有其他方法 也尝试过了。。。对VOID INTERRUPT 不是很熟悉。。。。。。。。请问有没有 大大能 帮忙我这个问题。。。。。。我先把 CODE 清空 到这个样子。。。。。现在 K2() RD6.....应该怎么放 才能关掉INFINITE LOOP.              简单来说 是想要 RD7  开启信号。。。。。。。RD6 中断信号。。。。。。。但是开启信号了 一定要保持 INFINITE...。。。。希望有大大能教教我方法。。。。。。。感恩不尽 本帖最后由 longcrystal 于 9-10-2012 01:57 AM 编辑

回复

使用道具 举报


ADVERTISEMENT

发表于 12-10-2012 12:05 AM | 显示全部楼层
你的task() 里面的code长到 。。。而却都是重复又重复。。。为何不用looping method 喔(估计是新手吧)
优化成这样吧你  Example:
for(i=0;i<=max ; i+=0.05){
     MA=1; MD=1;
     delayMs(starting point + i);
     MA=0; MD=0;
     delayMs(starting point - i);
} (concept 是酱,自己想)
基本上要跳出infinity loop 写 break; 就可以料。。。
回复

使用道具 举报

 楼主| 发表于 12-10-2012 08:06 PM | 显示全部楼层
keat88 发表于 12-10-2012 12:05 AM
你的task() 里面的code长到 。。。而却都是重复又重复。。。为何不用looping method 喔(估计是新手吧)
...

謝謝你的回答。。。。。用一個BUTTON 寫   ON /OFF 做到了。。。但是如果用其他BUTTON 來OFF那個INFINITE LOOP 還沒真正去試。。。。。


你說我的CODE 很長。。。我差不多算 新手之間 ,本身沒什麽時間學 MCU 。,。。所以故意為了PROJECT 的效果能達到我要 的 要求 就寫到 重負那麼長了


Uploaded with ImageShack.us



如果用你这个CONCEPT 能写出 不一样的 DELAY 我当然想。。。。谢谢你的建议丫。。。
所以想问最后一下  如果 DELAY是在不同的情况 发生  有时候 0.05ms 有时候 是0.45MS  有时候 是0.02MS 有时候是 0.06ms    都能用LOOPING 来写?? 想确认下。。我相信是可以

大概个人觉得是写 个 ARRAY TABLE 假设unsigned char  pwm[31]={11,32,52,73,92,111,129,145,160,173,185,195,203,209,214,216,214,209,203,195,185,173,160,145,129,111,92,73,52,32,11};

假设31 PULSE   。。配合你说的 delayMs(pwn[max] + i); 方法~~

MAX 可能到 31就好 如果要做31个PULSE.......但是我这样说很简单。。。可能自己还要 另外++其他 LOOP 的东西~~~。。。可能要等以后才把 CODE 简易一下。。。。~~现在要集中做project先~~~~谢谢指导。

SPWM

SPWM
回复

使用道具 举报

发表于 13-10-2012 07:18 AM | 显示全部楼层
longcrystal 发表于 12-10-2012 08:06 PM
謝謝你的回答。。。。。用一個BUTTON 寫   ON /OFF 做到了。。。但是如果用其他BUTTON 來OFF那個INFINITE ...

不知道你讲什么pun...你还是照办规填写下资料吧,不然我都不知道你要做莫的,很难帮你的
回复

使用道具 举报

 楼主| 发表于 13-10-2012 10:40 AM | 显示全部楼层
keat88 发表于 13-10-2012 07:18 AM
不知道你讲什么pun...你还是照办规填写下资料吧,不然我都不知道你要做莫的,很难帮你的

好吧謝謝你。。。我只是想講 。。。你說的方法。。。我大概簡易講一下 是不是這個道理~~~

你也是叫我自己想。。。。我還是 先做到東西才回 這個貼吧。。。。暫時沒東西了
回复

使用道具 举报

发表于 20-11-2012 12:06 PM | 显示全部楼层
longcrystal 发表于 13-10-2012 10:40 AM
好吧謝謝你。。。我只是想講 。。。你說的方法。。。我大概簡易講一下 是不是這個道理~~~

你也是叫我自 ...

很多方法可以做到你的pwm。 不过先从简单开始, 既然你已经写了你的pwm code. 看起来不难。
一开始, 你用loop来做检查RD7的讯号, 然后当RD7 == 0 , 开始pwm loop.

你用infinite loop来做pwm loop, 不妨想想, 除了pwm, 你的pwm loop还可以做其他的动作吗?

回复

使用道具 举报

Follow Us
发表于 29-11-2012 10:09 AM | 显示全部楼层
要产生正弦波, 有很多方法。。楼主为何不看看版规呢?
回复

使用道具 举报

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

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 23-2-2025 06:50 PM , Processed in 0.146034 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表