Arduino mini ATmega328-328P Timer1 導致整個reset
本帖最后由 陳聖文 于 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控制寄存器A7:COM1A1(0) 6:COM1A0(0) 5:COM1B1(0) 4:COM1B0(0) 3:_(0) 2:_(0) 1:WGM11(0) 0:WGM10(0)
TCCR1B = 0x0D;//Timer1控制寄存器B7: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=0,不做引腳輸出
*
*Waveform Generation Mode 波形輸出模式
*WGM=4, 當OCR1A上數後等於TCNT1則將OCR1A歸零且舉起中斷旗標
*
*Input Capture Noise Canceler 使用外部震盪時選擇是否使用輸入捕捉噪聲抑制器
*ICNC1=0,使用內部震盪,這個沒用
*
* Input Capture Edge Select 使用外部震盪時選擇上緣觸發或下緣觸發
*ICES1=0,使用內部震盪,這個沒用
*
*Clock Select 時鐘選擇
*CS1=5,使用內部震盪除1024
*/
TCCR1C = 0;//Timer1控制寄存器C7:FOC1A(0) 6:FOC1B(0) 5:_(0) 4:_(0) 3:_(1) 2:_(1) 1:_(0) 0:_(1)
/*Force Output Compare for Channel 强制输出比较通道
*FOC1=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=0 輸入捕捉中斷使能
*
*Output Compare B Match Interrupt Enable
*OCIEB=0 輸出比較B匹配中斷使能
*
*Output Compare A Match Interrupt Enable
*OCIEB=1 輸出比較A匹配中斷使能
*
*Overflow Interrupt Enable
*TOIE=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;
}
}
本帖最后由 t3486784401 于 2017-11-16 14:37 编辑
Arduino 的编译器 IDE 好像主动管理了定时器,如果你再手动配置定时器的话,目测打架。
建议做如下尝试:
1)在 setup 当中不初始化定时器,在 loop 当中打印定时器控制寄存器 TCCRx,你就知道是不是编译器干了多余的事情了。
2)编译器的某些事件驱动系统(或功能)是用定时器的,所以你再配置就打架了,免不了出问题。
我用 Leonardo 的时候就是,如果修改了定时器,虚拟的CDC串口就会消失,说明定时器在带动USB通信。
3)我到现在没看到 Arduino 直接操作底层定时器的资料,如果有的话 LZ 给分享下啊。
要真是 IDE 的问题,楼主直接换编译器吧,反正 m328p 没啥特别难写的代码 t3486784401 发表于 2017-11-16 14:36
Arduino 的编译器 IDE 好像主动管理了定时器,如果你再手动配置定时器的话,目测打架。
建议做如下尝试:
看來真跟你所說的一樣
arduino的編譯起自已就會用了
http://greatli69.pixnet.net/blog/post/447813695-arduino-timer%E8%A8%AD%E7%BD%AE%E8%88%87%E4%BD%BF%E7%94%A8
看來我需要找個新編譯器,有推薦的嗎? 你应该用arduino的定时器组件,不要自己设置寄存器的形式。入乡随俗呢 daiqx 发表于 2017-11-17 11:02
你应该用arduino的定时器组件,不要自己设置寄存器的形式。入乡随俗呢
可是感覺整個站存器的控制權不再我手上就覺得好奇怪@@
陳聖文 发表于 2017-11-16 16:25
看來真跟你所說的一樣
arduino的編譯起自已就會用了
http://greatli69.pixnet.net/blog/post/447813695-a ...
你这是个什么网站,我怎么打不开呢?
Arduino给我的感觉就是玩具,是给非专业人员的玩具,mega328直接裸机编程就好了,不然会各种掉坑 陳聖文 发表于 2017-11-16 16:25
看來真跟你所說的一樣
arduino的編譯起自已就會用了
http://greatli69.pixnet.net/blog/post/447813695-a ...
我用的是 ICCAVR v7.22,除了已知 sin/cos/tan 定义域不是±∞,其他都还好。
比较喜欢这个编译器的傻劲,你 C 怎么写底层汇编就怎么走,不会随便优化掉。
不用 IAR 是受不了这个的优化处理,经常莫名的把某些东西优化掉了,看着省几个空间实则浪费了感情。 本帖最后由 陳聖文 于 2017-11-18 16:51 编辑
youkebing 发表于 2017-11-17 12:19
你这是个什么网站,我怎么打不开呢?
某台灣網友將http://www.robotshop.com/letsmakerobots/arduino-101-timers-and-interrupts這個網站的內容擷取漢化
簡單來說就是arduino確實有用掉一些Timer,後續作工程開發結果我要使用這些timer會導致系統掛掉
不知怎地內容和文字不能複製
而且不知怎搞得5.5MB的螢幕截圖.png不給上傳 qiqirachel 发表于 2017-11-17 13:24
Arduino给我的感觉就是玩具,是给非专业人员的玩具,mega328直接裸机编程就好了,不然会各种掉坑 ...
話說用arduino mini可以直接當裸機使用嗎?
要bootloader嗎?燒錄時可以跟arduino mini 一樣嗎?
陳聖文 发表于 2017-11-18 16:49
話說用arduino mini可以直接當裸機使用嗎?
要bootloader嗎?燒錄時可以跟arduino mini 一樣嗎?
...
超简单看以下。
Atmel Studio 7.0现可应用Arduino IDE 的原程式(.ino)及编释可上传HEX
https://www.amobbs.com/thread-5676927-1-1.html
陳聖文 发表于 2017-11-18 16:47
某台灣網友將http://www.robotshop.com/letsmakerobots/arduino-101-timers-and-interrupts這個網站的內 ...
把图片压缩到1MB以内再上传试试。 qiufeng 发表于 2017-11-19 20:31
把图片压缩到1MB以内再上传试试。
OK 可以上傳了
页:
[1]