搜索
bottom↓
回复: 12

Arduino mini ATmega328-328P Timer1 導致整個reset

[复制链接]

出0入0汤圆

发表于 2017-11-16 11:11:05 | 显示全部楼层 |阅读模式
本帖最后由 陳聖文 于 2017-11-16 11:27 编辑

小弟公司使用arduino做開發,剛開始研究Timer1
慢慢研究datasheet兩天多始終找不出會導致整個AVR重啟的原因
預計計時為1秒印出一個'5'
不太肯定程式是否哪裡出錯
底下附上我現有的程式跟我所查到的註解
請各位大大幫我看看是否哪裡有程式錯誤或理解錯誤
感謝



  1. int test_A;//就是這個全域變數讓我知道每次都會reset

  2. ISR(TIMER1_CPMPA_vect)
  3. {Serial<<'5'<<endl;}

  4. void Set_Timer1()
  5. {   cli();  // 禁止中斷
  6.     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)
  7.     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)
  8.     /*  Compare Output Mode for Channel 引腳輸出模式
  9.      *  COM1[TCCR1A 7,6,5,4]=0,不做引腳輸出
  10.      *  
  11.      *  Waveform Generation Mode 波形輸出模式
  12.      *  WGM[TCCR1B 4,3 TCCR1A 1,0]=4, 當OCR1A上數後等於TCNT1則將OCR1A歸零且舉起中斷旗標
  13.      *  
  14.      *  Input Capture Noise Canceler 使用外部震盪時選擇是否使用輸入捕捉噪聲抑制器
  15.      *  ICNC1[TCCR1B 7]=0,使用內部震盪,這個沒用
  16.      *  
  17.      *  Input Capture Edge Select 使用外部震盪時選擇上緣觸發或下緣觸發
  18.      *  ICES1[TCCR1B 6]=0,使用內部震盪,這個沒用
  19.      *  
  20.      *  Clock Select 時鐘選擇
  21.      *  CS1[TCCR1B 2,1,0]=5,使用內部震盪除1024
  22.      */
  23.     TCCR1C = 0;//Timer1控制寄存器C  7:FOC1A(0) 6:FOC1B(0) 5:_(0) 4:_(0) 3:_(1) 2:_(1) 1:_(0) 0:_(1)
  24.     /*  Force Output Compare for Channel 强制输出比较通道
  25.      *  FOC1[TCCR1C 7,6]=0 ,以FOC1A來說 在非PWM的模式下,只要 TCNT1等於OCR1A 或 TCNT1等於OC1A 則這個位元旗標會被舉起 不觸發中斷
  26.      */
  27.     OCR1A = 15625;  //計數最大值 由ICR1H和ICR1L組成 幾秒*(內頻/除頻) = 1*16,000,000/1,024 = 15625
  28.    
  29.     TIMSK1=2;//Timer1中斷遮罩寄存器  7:_(0) 6:_(0) 5:ICIE(0) 4:_(0) 3:_(0) 2:OCIEB(0) 1:OCIEA(1) 0:TOIE(0)
  30.     /*  Timer/Counter 1 Interrupt Mask Register   Timer1中斷遮罩寄存器
  31.      *  
  32.      *  Input Capture Interrupt Enable
  33.      *  ICIE[TIMSK1 5]=0 輸入捕捉中斷使能
  34.      *  
  35.      *  Output Compare B Match Interrupt Enable
  36.      *  OCIEB[TIMSK1 2]=0 輸出比較B匹配中斷使能
  37.      *  
  38.      *  Output Compare A Match Interrupt Enable
  39.      *  OCIEB[TIMSK1 1]=1 輸出比較A匹配中斷使能
  40.      *  
  41.      *  Overflow Interrupt Enable
  42.      *  TOIE[TIMSK1 1]=0  溢出中斷使能
  43.      *
  44.      */
  45.     TCNT1=0;  // Timer1的計數計 由TCNT1H和TCNT1L組成
  46.     sei();  // 允許中斷
  47. }
  48. void setup()
  49. {   DDRD=0x32;
  50.     DDRB=0x00;
  51.     Serial.begin(9600);
  52.     BT_Serial.begin(9600);
  53.     pinMode(BT_TX,INPUT);
  54.     pinMode(BT_RX,OUTPUT);
  55.     pinMode(CD4051_A,OUTPUT);
  56.     pinMode(CD4051_B,OUTPUT);
  57.     pinMode(CD4051_C,OUTPUT);
  58.     pinMode(LED_R,OUTPUT);
  59.     pinMode(LED_G,OUTPUT);
  60.     pinMode(SW_X,INPUT);
  61.     pinMode(battery_V,INPUT);
  62.     Set_Timer1();
  63.     Serial<<"Setup OK"<<endl;
  64. }
  65. void loop()
  66. {   /*delay(999);*/
  67.     Serial<<"LOOP"<<test_A++<<endl;
  68.     if (Serial.available())
  69.     {   CMD=Serial.read();
  70.         while(Serial.available())//如果當下不只發送一筆資料則會把所有不該出現的資料抹去
  71.         {Serial.read();}
  72.         switch(CMD)
  73.         {   case '0':
  74.                 //SEC=0;
  75.                 Serial<<"計時器已經歸零"<<endl;
  76.                 break;
  77.             case 'B':
  78.                 Serial<<"電池電壓:"<<(analogRead(battery_V))<<","<<(analogRead(battery_V)*0.0049)<<"V"<<endl;
  79.                 break;
  80.             default:
  81.                 Serial<<"mini get : "<<CMD<<endl;
  82.         }
  83.         while(Serial.available())//如果當下不只發送一筆資料則會把所有不該出現的資料抹去
  84.         {Serial.read();}
  85.         Serial.flush();//等待所有串列阜的數值都傳送完畢
  86.         CMD=0x00;
  87.     }  
  88. }
复制代码

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出200入2554汤圆

发表于 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 没啥特别难写的代码

出0入0汤圆

 楼主| 发表于 2017-11-16 16:25:08 | 显示全部楼层
t3486784401 发表于 2017-11-16 14:36
Arduino 的编译器 IDE 好像主动管理了定时器,如果你再手动配置定时器的话,目测打架。

建议做如下尝试:

看來真跟你所說的一樣
arduino的編譯起自已就會用了
http://greatli69.pixnet.net/blog ... 7%E4%BD%BF%E7%94%A8
看來我需要找個新編譯器,有推薦的嗎?

出0入0汤圆

发表于 2017-11-17 11:02:29 来自手机 | 显示全部楼层
你应该用arduino的定时器组件,不要自己设置寄存器的形式。入乡随俗呢

出0入0汤圆

 楼主| 发表于 2017-11-17 11:58:14 | 显示全部楼层
daiqx 发表于 2017-11-17 11:02
你应该用arduino的定时器组件,不要自己设置寄存器的形式。入乡随俗呢

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

出0入89汤圆

发表于 2017-11-17 12:19:15 | 显示全部楼层
陳聖文 发表于 2017-11-16 16:25
看來真跟你所說的一樣
arduino的編譯起自已就會用了
http://greatli69.pixnet.net/blog/post/447813695-a ...

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

出0入0汤圆

发表于 2017-11-17 13:24:00 来自手机 | 显示全部楼层
Arduino给我的感觉就是玩具,是给非专业人员的玩具,mega328直接裸机编程就好了,不然会各种掉坑

出200入2554汤圆

发表于 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 是受不了这个的优化处理,经常莫名的把某些东西优化掉了,看着省几个空间实则浪费了感情。

出0入0汤圆

 楼主| 发表于 2017-11-18 16:47:45 | 显示全部楼层
本帖最后由 陳聖文 于 2017-11-18 16:51 编辑
youkebing 发表于 2017-11-17 12:19
你这是个什么网站,我怎么打不开呢?


某台灣網友將http://www.robotshop.com/letsmak ... mers-and-interrupts這個網站的內容擷取漢化
簡單來說就是arduino確實有用掉一些Timer,後續作工程開發結果我要使用這些timer會導致系統掛掉
不知怎地內容和文字不能複製


而且不知怎搞得5.5MB的螢幕截圖.png不給上傳

出0入0汤圆

 楼主| 发表于 2017-11-18 16:49:39 | 显示全部楼层
qiqirachel 发表于 2017-11-17 13:24
Arduino给我的感觉就是玩具,是给非专业人员的玩具,mega328直接裸机编程就好了,不然会各种掉坑 ...

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

出0入104汤圆

发表于 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

出0入8汤圆

发表于 2017-11-19 20:31:25 | 显示全部楼层
陳聖文 发表于 2017-11-18 16:47
某台灣網友將http://www.robotshop.com/letsmakerobots/arduino-101-timers-and-interrupts這個網站的內 ...

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

出0入0汤圆

 楼主| 发表于 2017-11-20 09:41:16 | 显示全部楼层
qiufeng 发表于 2017-11-19 20:31
把图片压缩到1MB以内再上传试试。

OK 可以上傳了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 21:01

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表