陳聖文 发表于 2017-11-16 11:11:05

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:36:23

本帖最后由 t3486784401 于 2017-11-16 14:37 编辑

Arduino 的编译器 IDE 好像主动管理了定时器,如果你再手动配置定时器的话,目测打架。

建议做如下尝试:

1)在 setup 当中不初始化定时器,在 loop 当中打印定时器控制寄存器 TCCRx,你就知道是不是编译器干了多余的事情了。

2)编译器的某些事件驱动系统(或功能)是用定时器的,所以你再配置就打架了,免不了出问题。
   我用 Leonardo 的时候就是,如果修改了定时器,虚拟的CDC串口就会消失,说明定时器在带动USB通信。

3)我到现在没看到 Arduino 直接操作底层定时器的资料,如果有的话 LZ 给分享下啊。

要真是 IDE 的问题,楼主直接换编译器吧,反正 m328p 没啥特别难写的代码

陳聖文 发表于 2017-11-16 16:25:08

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
看來我需要找個新編譯器,有推薦的嗎?

daiqx 发表于 2017-11-17 11:02:29

你应该用arduino的定时器组件,不要自己设置寄存器的形式。入乡随俗呢

陳聖文 发表于 2017-11-17 11:58:14

daiqx 发表于 2017-11-17 11:02
你应该用arduino的定时器组件,不要自己设置寄存器的形式。入乡随俗呢

可是感覺整個站存器的控制權不再我手上就覺得好奇怪@@

youkebing 发表于 2017-11-17 12:19:15

陳聖文 发表于 2017-11-16 16:25
看來真跟你所說的一樣
arduino的編譯起自已就會用了
http://greatli69.pixnet.net/blog/post/447813695-a ...

你这是个什么网站,我怎么打不开呢?

qiqirachel 发表于 2017-11-17 13:24:00

Arduino给我的感觉就是玩具,是给非专业人员的玩具,mega328直接裸机编程就好了,不然会各种掉坑

t3486784401 发表于 2017-11-18 15:05:48

陳聖文 发表于 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:47:45

本帖最后由 陳聖文 于 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不給上傳

陳聖文 发表于 2017-11-18 16:49:39

qiqirachel 发表于 2017-11-17 13:24
Arduino给我的感觉就是玩具,是给非专业人员的玩具,mega328直接裸机编程就好了,不然会各种掉坑 ...

話說用arduino mini可以直接當裸機使用嗎?
要bootloader嗎?燒錄時可以跟arduino mini 一樣嗎?

andy 发表于 2017-11-19 19:37:54

陳聖文 发表于 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

qiufeng 发表于 2017-11-19 20:31:25

陳聖文 发表于 2017-11-18 16:47
某台灣網友將http://www.robotshop.com/letsmakerobots/arduino-101-timers-and-interrupts這個網站的內 ...

把图片压缩到1MB以内再上传试试。

陳聖文 发表于 2017-11-20 09:41:16

qiufeng 发表于 2017-11-19 20:31
把图片压缩到1MB以内再上传试试。

OK 可以上傳了
页: [1]
查看完整版本: Arduino mini ATmega328-328P Timer1 導致整個reset