2015-02-05 136 views
0

我正在爲作業任務編寫一些代碼,其中一部分任務是讓16x2 LCD顯示一個顯示arduino已經運行多長時間的時鐘。該時鐘需要運行一個定時器中斷。我已經得到了該部分的工作,但第二部分的任務是另一箇中斷(外部按鈕作爲信號),將時鐘重置爲全0。目前ISR似乎沒有做任何事情。有任何想法嗎?Arduino Uno上的兩個ISR

#include <LiquidCrystal.h> 
#include <TimerOne.h> 

int buttonPin = 2; 
LiquidCrystal lcd(12, 11, 6, 5, 4, 3); 
int secs, tens, minutes, tenminutes, hours, tenhours; 
volatile long counter = 0; 

void setup() { 
    Timer1.initialize(100000); 
    Timer1.attachInterrupt(timerISR); 
    pinMode(buttonPin, INPUT_PULLUP); 
    attachInterrupt(0, buttonPressISR, CHANGE); 
    lcd.begin(16, 2); 
    lcd.setCursor(0,1); 
    lcd.print("0"); 
    lcd.setCursor(1,1); 
    lcd.print("0"); 
    lcd.setCursor(2, 1); 
    lcd.print(":"); 
    lcd.setCursor(3,1); 


lcd.print("0"); 
    lcd.setCursor(4,1); 
    lcd.print("0"); 
    lcd.setCursor(5, 1); 
    lcd.print(":"); 
    lcd.setCursor(6,1); 
    lcd.print("0"); 
    lcd.setCursor(7,1); 
    lcd.print("0"); 

} 

void loop() { 
    secs = (counter/10) % 10; 
    tens = (counter/100) % 6; 
    minutes = (counter/600) %10; 
    tenminutes = (counter/6000) %6; 
    hours = (counter/36000) %10; 
    tenhours = (counter/360000) %10; 
    lcd.setCursor(7, 1); 
    lcd.print(secs); 
    lcd.setCursor(6,1); 
    lcd.print(tens); 
    lcd.setCursor(4, 1); 
    lcd.print(minutes); 
    lcd.setCursor(3, 1); 
    lcd.print(tenminutes); 
    lcd.setCursor(1, 1); 
    lcd.print(hours); 
    lcd.setCursor(0, 1); 
    lcd.print(tenhours); 

} 

void buttonPressISR() { 
    counter = 0; 
} 

void timerISR() { 
    counter++; 
} 

回答

0

你知道有一個Arduino堆棧交換測試網站的Arduino問題?

我在代碼中看不到任何明顯的錯誤。你是否知道代碼上的中斷引腳0實際上是Arduino上的數字引腳2?

+0

呵呵,我以爲我是在arduino堆棧交換。必須弄錯提交的問題。另外,我知道引腳2是中斷0 - 我已將buttonPin分配給2,並將其中斷分配爲0. – Charles 2015-02-05 16:34:02

+0

OK也許可以通過在buttonPressISR功能中將LED引腳設置爲高來開始調試,然後您至少可以看到如果這是你的中斷或你的時間算法的問題。 – blarg 2015-02-05 16:37:40

+0

另外,如果您可以設置波特率爲與串行監視器兼容的一個,那麼我會通過Serial.println發送'counter'來查看發生了什麼。波特率爲 – blarg 2015-02-05 16:38:50