作者GooLoo (平凡)
看板C_and_CPP
標題[問題] Timer1
時間Tue Dec 27 21:09:59 2016
開發平台(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);一啟動就進中斷?
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.25.178.150
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1482844201.A.E24.html
1F:→ Schottky: 你的 clear bit 完全寫錯 12/27 21:16
2F:→ Schottky: TIMSK1 &= ~(1 << OCIE1A); 這樣才是把 bit 清為 0 12/27 21:18
3F:→ GooLoo: 痾~原來如此~我以為把1改0就好 12/27 21:25
4F:推 chuegou: XD 真可愛 12/27 21:26
5F:→ chuegou: 寫單晶片要多練習位元運算喔 12/27 21:27
6F:→ GooLoo: 好的 12/27 21:32
7F:→ GooLoo: 以後會把暫存器值print,避免烏龍再發生 12/27 21:54