|
本帖最后由 陳聖文 于 2017-11-16 11:27 编辑
小弟公司使用arduino做開發,剛開始研究Timer1
慢慢研究datasheet兩天多始終找不出會導致整個AVR重啟的原因
預計計時為1秒印出一個'5'
不太肯定程式是否哪裡出錯
底下附上我現有的程式跟我所查到的註解
請各位大大幫我看看是否哪裡有程式錯誤或理解錯誤
感謝
- int test_A;//就是這個全域變數讓我知道每次都會reset
- ISR(TIMER1_CPMPA_vect)
- {Serial<<'5'<<endl;}
- void Set_Timer1()
- { cli(); // 禁止中斷
- TCCR1A = 0;//Timer1控制寄存器A 7:COM1A1(0) 6:COM1A0(0) 5:COM1B1(0) 4:COM1B0(0) 3:_(0) 2:_(0) 1:WGM11(0) 0:WGM10(0)
- TCCR1B = 0x0D;//Timer1控制寄存器B 7:ICNC1(0) 6:ICES1(0) 5:_(0) 4:WGM13(0) 3:WGM12(1) 2:CS12(1) 1:CS11(0) 0:CS10(1)
- /* Compare Output Mode for Channel 引腳輸出模式
- * COM1[TCCR1A 7,6,5,4]=0,不做引腳輸出
- *
- * Waveform Generation Mode 波形輸出模式
- * WGM[TCCR1B 4,3 TCCR1A 1,0]=4, 當OCR1A上數後等於TCNT1則將OCR1A歸零且舉起中斷旗標
- *
- * Input Capture Noise Canceler 使用外部震盪時選擇是否使用輸入捕捉噪聲抑制器
- * ICNC1[TCCR1B 7]=0,使用內部震盪,這個沒用
- *
- * Input Capture Edge Select 使用外部震盪時選擇上緣觸發或下緣觸發
- * ICES1[TCCR1B 6]=0,使用內部震盪,這個沒用
- *
- * Clock Select 時鐘選擇
- * CS1[TCCR1B 2,1,0]=5,使用內部震盪除1024
- */
- TCCR1C = 0;//Timer1控制寄存器C 7:FOC1A(0) 6:FOC1B(0) 5:_(0) 4:_(0) 3:_(1) 2:_(1) 1:_(0) 0:_(1)
- /* Force Output Compare for Channel 强制输出比较通道
- * FOC1[TCCR1C 7,6]=0 ,以FOC1A來說 在非PWM的模式下,只要 TCNT1等於OCR1A 或 TCNT1等於OC1A 則這個位元旗標會被舉起 不觸發中斷
- */
- OCR1A = 15625; //計數最大值 由ICR1H和ICR1L組成 幾秒*(內頻/除頻) = 1*16,000,000/1,024 = 15625
-
- TIMSK1=2;//Timer1中斷遮罩寄存器 7:_(0) 6:_(0) 5:ICIE(0) 4:_(0) 3:_(0) 2:OCIEB(0) 1:OCIEA(1) 0:TOIE(0)
- /* Timer/Counter 1 Interrupt Mask Register Timer1中斷遮罩寄存器
- *
- * Input Capture Interrupt Enable
- * ICIE[TIMSK1 5]=0 輸入捕捉中斷使能
- *
- * Output Compare B Match Interrupt Enable
- * OCIEB[TIMSK1 2]=0 輸出比較B匹配中斷使能
- *
- * Output Compare A Match Interrupt Enable
- * OCIEB[TIMSK1 1]=1 輸出比較A匹配中斷使能
- *
- * Overflow Interrupt Enable
- * TOIE[TIMSK1 1]=0 溢出中斷使能
- *
- */
- TCNT1=0; // Timer1的計數計 由TCNT1H和TCNT1L組成
- sei(); // 允許中斷
- }
- void setup()
- { DDRD=0x32;
- DDRB=0x00;
- Serial.begin(9600);
- BT_Serial.begin(9600);
- pinMode(BT_TX,INPUT);
- pinMode(BT_RX,OUTPUT);
- pinMode(CD4051_A,OUTPUT);
- pinMode(CD4051_B,OUTPUT);
- pinMode(CD4051_C,OUTPUT);
- pinMode(LED_R,OUTPUT);
- pinMode(LED_G,OUTPUT);
- pinMode(SW_X,INPUT);
- pinMode(battery_V,INPUT);
- Set_Timer1();
- Serial<<"Setup OK"<<endl;
- }
- void loop()
- { /*delay(999);*/
- Serial<<"LOOP"<<test_A++<<endl;
- if (Serial.available())
- { CMD=Serial.read();
- while(Serial.available())//如果當下不只發送一筆資料則會把所有不該出現的資料抹去
- {Serial.read();}
- switch(CMD)
- { case '0':
- //SEC=0;
- Serial<<"計時器已經歸零"<<endl;
- break;
- case 'B':
- Serial<<"電池電壓:"<<(analogRead(battery_V))<<","<<(analogRead(battery_V)*0.0049)<<"V"<<endl;
- break;
- default:
- Serial<<"mini get : "<<CMD<<endl;
- }
- while(Serial.available())//如果當下不只發送一筆資料則會把所有不該出現的資料抹去
- {Serial.read();}
- Serial.flush();//等待所有串列阜的數值都傳送完畢
- CMD=0x00;
- }
- }
复制代码 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|