[问题] 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