极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 16300|回复: 19

新人求教,中断方面

[复制链接]
发表于 2014-5-4 16:19:47 | 显示全部楼层 |阅读模式
本帖最后由 raydead 于 2014-5-6 15:40 编辑

使用的板子是arduino UNO R3
想要同时实现温度传感器和遥控器控制电机转速。单独使用遥控机控制电机转速已经实现了,温度传感器检测环境温度,并用12864显示出来也实现了。但是把两个功能集合起来,把程序结合以后。发现写入以后就不工作了。我自己分析是通信方面冲突了,估计要使用中断来解决。但是不清楚怎么办,有没有大神教一下。
附件是两个程序的整合在一起了,最后面标注掉的是12864的显示。OLED的12864,通信方式IIC。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2014-5-4 17:37:58 | 显示全部楼层
SDA SCL管脚不是8、9
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-4 18:07:57 | 显示全部楼层
pathletboy 发表于 2014-5-4 17:37
SDA SCL管脚不是8、9

那个定义了以后是可以用的。问题不是在这里
回复 支持 反对

使用道具 举报

发表于 2014-5-4 20:27:09 | 显示全部楼层
温感和显示是低速设备,电机驱动估计需要高速反应,应该是速度上的冲突。
回复 支持 反对

使用道具 举报

发表于 2014-5-4 21:36:38 | 显示全部楼层
你是否把 SSD1306 的庫重複了?
看似是用舊款 軟 i2c 版本的 OLED (我也有一片), 但應該不需要兩個不同的庫.  而且, lucky 在定義後也沒再使用.
是否把兩程式合拼時, 把 OLED 的庫也重複了?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-5 20:32:43 | 显示全部楼层
林定祥 发表于 2014-5-4 20:27
温感和显示是低速设备,电机驱动估计需要高速反应,应该是速度上的冲突。

但是在单独使用温度和显示的时候,115200也是可以实现的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-6 15:08:53 | 显示全部楼层
Super169 发表于 2014-5-4 21:36
你是否把 SSD1306 的庫重複了?
看似是用舊款 軟 i2c 版本的 OLED (我也有一片), 但應該不需要兩個不同的庫 ...

把多余的lucky的定义删除后,把CN的那个SSD1306的定义删除了以后还是不行。应该不是定义的问题。我尝试了不删除定义,仅删除OLED的显示代码部分,遥控电机工作正常;删除遥控电机部分代码,OLED和温度传感部分正常。
回复 支持 反对

使用道具 举报

发表于 2014-5-6 15:30:21 | 显示全部楼层
放出來的程式是全部了嗎?  看不出大問題.
可以用好一點的方式放上來嗎, pdf 太難看了, 直接放 ino 可以嗎?
而且, 你說的"发现写入以后就不工作了。", 也沒說清楚是怎樣"不工作", 如果程式還在執行, 多加一些 Serial.print 作 debug 看看吧.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-6 15:37:01 | 显示全部楼层
Super169 发表于 2014-5-6 15:30
放出來的程式是全部了嗎?  看不出大問題.
可以用好一點的方式放上來嗎, pdf 太難看了, 直接放 ino 可以嗎? ...

我再发一个帖子,把INO附上来吧。不工作了就是在串口监视器已经看不到东西了,使用遥控器也没有反应,OLED的显示一直定死在一个状态。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-6 15:40:28 | 显示全部楼层
Super169 发表于 2014-5-6 15:30
放出來的程式是全部了嗎?  看不出大問題.
可以用好一點的方式放上來嗎, pdf 太難看了, 直接放 ino 可以嗎? ...

我把ino上传了
回复 支持 反对

使用道具 举报

发表于 2014-5-6 15:51:23 | 显示全部楼层
本帖最后由 Super169 于 2014-5-6 15:58 编辑

有試過加入 Serial.print 作 debug 嗎?  看看程式是否真的不行.
先看看是否在 display.initialize() 就當機了.
之後再看看會否是在 while(!exit) 中停不了.

程式比較簡單, 基本上是直線進行, 多放幾個 debug code, 應該不難找出問題所在.
回复 支持 反对

使用道具 举报

发表于 2014-5-6 16:00:51 | 显示全部楼层
簡單的 debug 步驟, 嘗試先把 setup 改成造樣, 看看 display.initialize() 是否可以完成.
再用類似方式, 看看在那裡當機了.


  1. void setup()
  2. {
  3. //  delay(1000);
  4.   Serial.begin(115200);                        //设定通讯波特率为115200
  5.   Serial.println("Before display.initialize()");
  6.   display.initialize();
  7.   Serial.println("After display.initialize()");
  8.   level=0;//assignment speed level
  9.   mspeed=0;
  10.   pinMode(5,OUTPUT);
  11.   pinMode(IR_LED, INPUT);        //设定pinMode引脚为输入状态
  12. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-6 16:04:06 | 显示全部楼层
Super169 发表于 2014-5-6 16:00
簡單的 debug 步驟, 嘗試先把 setup 改成造樣, 看看 display.initialize() 是否可以完成.
再用類似方式, 看 ...

在display.initialize()正常。输出了before和after
回复 支持 反对

使用道具 举报

发表于 2014-5-6 16:12:16 | 显示全部楼层
本帖最后由 Super169 于 2014-5-6 16:14 编辑

那嘗試在 loop 之內加入類似的測試.
比如你原本的程式, 在 loop 的末端是有 serial.print 的, 而你之前說 串口完全沒有資料, 即程式不能到達 loop 的末端了, 就是在中間卡住了.

可以卡住的地方, 如不是硬件問題, 就可能是 while loop 了.
程式中主要有三個 while loop:

while(!exit)

while( digitalRead(IR_LED) == LOW )

while( digitalRead(IR_LED) == HIGH ) {... break; }

這裡有點不合理, 必須要出現 IR_LED 先 LOW 再 HIGH, 如果 IR_LED 一直是 LOW, 又或 一直是 HIGH 而不能觸發 break, 就會卡死了.
相信在這裡卡死的機會非常高 (我沒使用過 IR, 不知是否正常), 加入 debug code 測試一下吧.

回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-6 16:17:01 | 显示全部楼层
Super169 发表于 2014-5-6 16:12
那嘗試在 loop 之內加入類似的測試.
比如你原本的程式, 在 loop 的末端是有 serial.print 的, 而你之前說  ...

测试了,在赋值语句
mode=1;
这句以后的
  1.   if( digitalRead(IR_LED) == LOW)
  2.   {
  3.     Serial.println("Before int count = 0;");
  4.     int count = 0;
  5.     int exit = 0;
  6.     Serial.println("After int count = 0;");
  7.     Serial.println("Before while");
  8.     while(!exit)                                                               
  9.     {
  10.       while( digitalRead(IR_LED) == LOW )
  11.         delayMicroseconds(MICRO_STEP);
  12.       unsigned long start = micros();
  13.       int max_high = 0;
  14.       while( digitalRead(IR_LED) == HIGH )
  15.       {
  16.         delayMicroseconds(MICRO_STEP);
  17.         max_high += MICRO_STEP;
  18.         if( max_high > IDLE_PULSE )
  19.         {
  20.           exit = 1;
  21.           break;
  22.         }
  23.       }
  24.       unsigned long duration = micros() - start;
  25.       pulses[count++] = duration;
  26.     }
  27.     Serial.println("After while");
  28.     for(int i=3; i<4; i++)
  29.     {
  30.       for(int j=0;j<8;j++)
  31.       {
  32.                 if(pulses[i*8+j+1] < IDLE_PULSE)
  33.         {
  34.            IRCOM[i]=IRCOM[i] >> 1;           
  35.            if((pulses[i*8+j+1])>1000)
  36.               {IRCOM[i] = IRCOM[i] | 0x80;}         
  37.         }
  38.        z=pulses[i*8+j+1];
  39.        if(z<800)
  40.           w=10000000;  
  41.        else         
  42.           w=00000000;  
  43.        f=f>>1;   
  44.        f=f+w;      
  45.      }//end for j
  46.     }//end for i
  47.     n=int(f);
复制代码
这段都没有执行
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-13 22:38 , Processed in 0.063051 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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