Robofun 機器人論壇

標題: 以timer1 OCIE1A 中斷方式,在LCD.print 無法顯示 [打印本頁]

作者: ivan805    時間: 2016-8-3 17:28
標題: 以timer1 OCIE1A 中斷方式,在LCD.print 無法顯示
各位大大,請問一下


我打了個簡單的代碼,
僅僅是要在LCD顯示一行字 hello, world 2,問題是~~ 都顯示不出來?!


因我有其他的需求,
所以,我是用中斷的方式,來叫LCD顯示,
OCIE1A 致能 ''比較中斷'',去執行上述功能,
但怎麼都無法顯示呢?


代碼很簡單,沒幾行,真的找不出來哪裡有錯,麻煩各位先進,指教一下.
  1. #include <LiquidCrystal_I2C.h>

  2. LiquidCrystal_I2C lcd(0x27, 16, 2);

  3. ISR (TIMER1_COMPA_vect) {
  4.   lcd.setCursor(0, 1);
  5.   lcd.print("hello world 2");
  6.   }

  7. void setup() {
  8.   lcd.init();
  9.   lcd.backlight();
  10.   lcd.print("hello world");

  11.   noInterrupts();
  12.   TCCR1A = 0x00;
  13.   TCCR1B = 0x00;
  14.   TCNT1 = 0;
  15.   OCR1A = 15625;  //compare register放入15625, 計等於1秒的時間
  16.   TCCR1B |= (1<<WGM12); //ctc mode
  17.   TCCR1B |= (1<<CS12) | (1<<CS10);  //prescaler=1024
  18.   TIMSK1 |= (1<<OCIE1A);
  19.   interrupts();
  20. }

  21. void loop() {
  22. }
複製代碼


作者: 超新手    時間: 2016-8-3 20:18
我猜應該是 lcd 用到 i2c
而i2c用到 twi 中斷
然後你在timer1中斷裡等待
twi 中斷
所以就卡死在中斷中
作者: ivan805    時間: 2016-8-4 00:01
回復 2# 超新手
哦~ 這樣哦~那我改一下lcd好了,不要用I2C的方式,
試試看,結果如何,
再上來跟大家update.
感謝這位大大

作者: 超新手    時間: 2016-8-4 05:17
可以試試加上 interrupts,如下
ISR (TIMER1_COMPA_vect) {
interrupts();
  lcd.setCursor(0, 1);
  lcd.print("hello world 2");
  }
作者: ivan805    時間: 2016-8-4 15:04
已試,ok了!
果然是這邊的問題,
再次感謝大大的協助,感謝您的熱心.




歡迎光臨 Robofun 機器人論壇 (https://robofun.net/forum/) Powered by Discuz! X3.2