看板 C_and_CPP 關於我們 聯絡資訊
開發平台(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://www.ptt.cc/bbs/C_and_CPP/M.1482844201.A.E24.html
Schottky: 你的 clear bit 完全寫錯 12/27 21:16
Schottky: TIMSK1 &= ~(1 << OCIE1A); 這樣才是把 bit 清為 0 12/27 21:18
GooLoo: 痾~原來如此~我以為把1改0就好 12/27 21:25
chuegou: XD 真可愛 12/27 21:26
chuegou: 寫單晶片要多練習位元運算喔 12/27 21:27
GooLoo: 好的 12/27 21:32
GooLoo: 以後會把暫存器值print,避免烏龍再發生 12/27 21:54