[問題] Timer1

作者: GooLoo (平凡)   2016-12-27 21:09:59
開發平台(Platform): (Ex: Win10, Linux, ...)
win7
編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
arduino
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
問題(Question):
Timer1暫停不了
餵入的資料(Input):
預期的正確結果(Expected Output):
按1 => 1=>0=>1=>0=>....
按2 => 停止
錯誤結果(Wrong Output):
1. 按2, Timer1不會停
程式碼(Code):(請善用置底文網頁, 記得排版)
void setup() {
Serial.begin(115200);
noInterrupts(); // disable all interrupts
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
OCR1A = 31250; // compare match register 16MHz/256/2Hz
TCCR1B |= (1 << WGM12); // CTC mode
TCCR1B |= (1 << CS12); // 256 prescaler
TIMSK1 |= (0 << OCIE1A); // enable timer compare interrupt
interrupts(); // enable all interrupts
}
ISR(TIMER1_COMPA_vect) // timer compare interrupt service routine
{
Serial.println("1");
Serial.println("0");
}
void loop() {
if (Serial.available() > 0) {
int inByte = Serial.read();
switch (inByte) {
case '1':
TIMSK1 |= (1 << OCIE1A);
TCNT1 = 0;
break;
case '2':
TIMSK1 |= (0 << OCIE1A);
TCNT1 = 0;
break;
default:
;
}
}
}
補充說明(Supplement):
1. noInterrupts() 會把serial關掉, 反而我按1沒反應, 不能用
2. TIMSK1 |= (0 << OCIE1A); 感覺怪怪的,好像不會關
3. 終端機有看到Timer1 1,0,1,0....是對的
4. 請問 case 1: TIMSK1 |= (1 << OCIE1A); 後面不寫TCNT1 = 0;
是不是第一個中斷來會比較快, 因為TCNT1在setup就已經在計數到一半了
所以TIMSK1 |= (1 << OCIE1A);一啟動就進中斷?
作者: Schottky (順風相送)   2016-12-27 21:16:00
你的 clear bit 完全寫錯TIMSK1 &= ~(1 << OCIE1A); 這樣才是把 bit 清為 0
作者: GooLoo (平凡)   2016-12-27 21:25:00
痾~原來如此~我以為把1改0就好
作者: chuegou (chuegou)   2016-12-27 21:26:00
XD 真可愛寫單晶片要多練習位元運算喔
作者: GooLoo (平凡)   2016-12-27 21:32:00
好的以後會把暫存器值print,避免烏龍再發生

Links booklink

Contact Us: admin [ a t ] ucptt.com