作者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/cn.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