新人求教,中断方面
本帖最后由 raydead 于 2014-5-6 15:40 编辑使用的板子是arduino UNO R3
想要同时实现温度传感器和遥控器控制电机转速。单独使用遥控机控制电机转速已经实现了,温度传感器检测环境温度,并用12864显示出来也实现了。但是把两个功能集合起来,把程序结合以后。发现写入以后就不工作了。我自己分析是通信方面冲突了,估计要使用中断来解决。但是不清楚怎么办,有没有大神教一下。
附件是两个程序的整合在一起了,最后面标注掉的是12864的显示。OLED的12864,通信方式IIC。 SDA SCL管脚不是8、9 pathletboy 发表于 2014-5-4 17:37 static/image/common/back.gif
SDA SCL管脚不是8、9
那个定义了以后是可以用的。问题不是在这里 温感和显示是低速设备,电机驱动估计需要高速反应,应该是速度上的冲突。 你是否把 SSD1306 的庫重複了?
看似是用舊款 軟 i2c 版本的 OLED (我也有一片), 但應該不需要兩個不同的庫.而且, lucky 在定義後也沒再使用.
是否把兩程式合拼時, 把 OLED 的庫也重複了? 林定祥 发表于 2014-5-4 20:27 static/image/common/back.gif
温感和显示是低速设备,电机驱动估计需要高速反应,应该是速度上的冲突。
但是在单独使用温度和显示的时候,115200也是可以实现的。 Super169 发表于 2014-5-4 21:36 static/image/common/back.gif
你是否把 SSD1306 的庫重複了?
看似是用舊款 軟 i2c 版本的 OLED (我也有一片), 但應該不需要兩個不同的庫 ...
把多余的lucky的定义删除后,把CN的那个SSD1306的定义删除了以后还是不行。应该不是定义的问题。我尝试了不删除定义,仅删除OLED的显示代码部分,遥控电机工作正常;删除遥控电机部分代码,OLED和温度传感部分正常。 放出來的程式是全部了嗎?看不出大問題.
可以用好一點的方式放上來嗎, pdf 太難看了, 直接放 ino 可以嗎?
而且, 你說的"发现写入以后就不工作了。", 也沒說清楚是怎樣"不工作", 如果程式還在執行, 多加一些 Serial.print 作 debug 看看吧. Super169 发表于 2014-5-6 15:30 static/image/common/back.gif
放出來的程式是全部了嗎?看不出大問題.
可以用好一點的方式放上來嗎, pdf 太難看了, 直接放 ino 可以嗎? ...
我再发一个帖子,把INO附上来吧。不工作了就是在串口监视器已经看不到东西了,使用遥控器也没有反应,OLED的显示一直定死在一个状态。 Super169 发表于 2014-5-6 15:30 static/image/common/back.gif
放出來的程式是全部了嗎?看不出大問題.
可以用好一點的方式放上來嗎, pdf 太難看了, 直接放 ino 可以嗎? ...
我把ino上传了 本帖最后由 Super169 于 2014-5-6 15:58 编辑
有試過加入 Serial.print 作 debug 嗎?看看程式是否真的不行.
先看看是否在 display.initialize() 就當機了.
之後再看看會否是在 while(!exit) 中停不了.
程式比較簡單, 基本上是直線進行, 多放幾個 debug code, 應該不難找出問題所在.
簡單的 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引脚为输入状态
}
Super169 发表于 2014-5-6 16:00 static/image/common/back.gif
簡單的 debug 步驟, 嘗試先把 setup 改成造樣, 看看 display.initialize() 是否可以完成.
再用類似方式, 看 ...
在display.initialize()正常。输出了before和after 本帖最后由 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 測試一下吧.
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