raydead 发表于 2014-5-4 16:19:47

新人求教,中断方面

本帖最后由 raydead 于 2014-5-6 15:40 编辑

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

pathletboy 发表于 2014-5-4 17:37:58

SDA SCL管脚不是8、9

raydead 发表于 2014-5-4 18:07:57

pathletboy 发表于 2014-5-4 17:37 static/image/common/back.gif
SDA SCL管脚不是8、9

那个定义了以后是可以用的。问题不是在这里

林定祥 发表于 2014-5-4 20:27:09

温感和显示是低速设备,电机驱动估计需要高速反应,应该是速度上的冲突。

Super169 发表于 2014-5-4 21:36:38

你是否把 SSD1306 的庫重複了?
看似是用舊款 軟 i2c 版本的 OLED (我也有一片), 但應該不需要兩個不同的庫.而且, lucky 在定義後也沒再使用.
是否把兩程式合拼時, 把 OLED 的庫也重複了?

raydead 发表于 2014-5-5 20:32:43

林定祥 发表于 2014-5-4 20:27 static/image/common/back.gif
温感和显示是低速设备,电机驱动估计需要高速反应,应该是速度上的冲突。

但是在单独使用温度和显示的时候,115200也是可以实现的。

raydead 发表于 2014-5-6 15:08:53

Super169 发表于 2014-5-4 21:36 static/image/common/back.gif
你是否把 SSD1306 的庫重複了?
看似是用舊款 軟 i2c 版本的 OLED (我也有一片), 但應該不需要兩個不同的庫 ...

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

Super169 发表于 2014-5-6 15:30:21

放出來的程式是全部了嗎?看不出大問題.
可以用好一點的方式放上來嗎, pdf 太難看了, 直接放 ino 可以嗎?
而且, 你說的"发现写入以后就不工作了。", 也沒說清楚是怎樣"不工作", 如果程式還在執行, 多加一些 Serial.print 作 debug 看看吧.

raydead 发表于 2014-5-6 15:37:01

Super169 发表于 2014-5-6 15:30 static/image/common/back.gif
放出來的程式是全部了嗎?看不出大問題.
可以用好一點的方式放上來嗎, pdf 太難看了, 直接放 ino 可以嗎? ...

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

raydead 发表于 2014-5-6 15:40:28

Super169 发表于 2014-5-6 15:30 static/image/common/back.gif
放出來的程式是全部了嗎?看不出大問題.
可以用好一點的方式放上來嗎, pdf 太難看了, 直接放 ino 可以嗎? ...

我把ino上传了

Super169 发表于 2014-5-6 15:51:23

本帖最后由 Super169 于 2014-5-6 15:58 编辑

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

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

Super169 发表于 2014-5-6 16:00:51

簡單的 debug 步驟, 嘗試先把 setup 改成造樣, 看看 display.initialize() 是否可以完成.
再用類似方式, 看看在那裡當機了.


void setup()
{
//delay(1000);
Serial.begin(115200);                        //设定通讯波特率为115200
Serial.println("Before display.initialize()");
display.initialize();
Serial.println("After display.initialize()");
level=0;//assignment speed level
mspeed=0;
pinMode(5,OUTPUT);
pinMode(IR_LED, INPUT);        //设定pinMode引脚为输入状态
}

raydead 发表于 2014-5-6 16:04:06

Super169 发表于 2014-5-6 16:00 static/image/common/back.gif
簡單的 debug 步驟, 嘗試先把 setup 改成造樣, 看看 display.initialize() 是否可以完成.
再用類似方式, 看 ...

在display.initialize()正常。输出了before和after

Super169 发表于 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 測試一下吧.

raydead 发表于 2014-5-6 16:17:01

Super169 发表于 2014-5-6 16:12 static/image/common/back.gif
那嘗試在 loop 之內加入類似的測試.
比如你原本的程式, 在 loop 的末端是有 serial.print 的, 而你之前說...

测试了,在赋值语句
mode=1;
这句以后的if( digitalRead(IR_LED) == LOW)
{
    Serial.println("Before int count = 0;");
    int count = 0;
    int exit = 0;
    Serial.println("After int count = 0;");
    Serial.println("Before while");
    while(!exit)                                                               
    {
      while( digitalRead(IR_LED) == LOW )
      delayMicroseconds(MICRO_STEP);
      unsigned long start = micros();
      int max_high = 0;
      while( digitalRead(IR_LED) == HIGH )
      {
      delayMicroseconds(MICRO_STEP);
      max_high += MICRO_STEP;
      if( max_high > IDLE_PULSE )
      {
          exit = 1;
          break;
      }
      }
      unsigned long duration = micros() - start;
      pulses = duration;
    }
    Serial.println("After while");
    for(int i=3; i<4; i++)
    {
      for(int j=0;j<8;j++)
      {
                if(pulses < IDLE_PULSE)
      {
         IRCOM=IRCOM >> 1;         
         if((pulses)>1000)
            {IRCOM = IRCOM | 0x80;}         
      }
       z=pulses;
       if(z<800)
          w=10000000;
       else         
          w=00000000;
       f=f>>1;   
       f=f+w;      
   }//end for j
    }//end for i
    n=int(f);这段都没有执行
页: [1] 2
查看完整版本: 新人求教,中断方面