arduino不配置pinMode直接digitalWrite会有什么现象-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 8852|回复: 10

[已解决] arduino不配置pinMode直接digitalWrite会有什么现象

[复制链接]
发表于 2020-9-27 02:10 | 显示全部楼层 |阅读模式
本帖最后由 wanglanshu 于 2020-9-27 12:13 编辑

如题不配置任何pinMode引脚,上来直接digitalWrite会怎么样?调用了一下引脚的上下拉电阻?编译报错?随机输出高低电平?还是保持默认高阻态根本没反应?
发表于 2020-9-27 06:51 | 显示全部楼层
這個問題,老實講真的是自己去試試比較快耶

I/O 不宣告的話內定是 INPUT 用,寫入 HIGH
就等於 PULL HIGH,寫入 LOW 就是 PULL LOW,
編譯不會報錯,找一下 DATASHEET 有說明:

If PORTxn is written to '1' when the pin is
configured as an input pin, the pull-up
resistor is activated. To switch the pull-up
resistor off, PORTxn has to be written to
'0' or the pin has to be configured as an
output pin.
发表于 2020-9-27 12:00 | 显示全部楼层
编程有个说法,就是从不对未配置,未赋值的数进行预估,所在,不要往不配置的情况会怎样这方面去想。因为编译器的原因,未配置就是未知和不确定,即使试验出了一个结果,也不代表移植后会与现在一致。
 楼主| 发表于 2020-9-27 12:11 | 显示全部楼层
qqkkdok 发表于 2020-9-27 12:00
编程有个说法,就是从不对未配置,未赋值的数进行预估,所在,不要往不配置的情况会怎样这方面去想。因为编 ...

我现在有一个功能客户不想要了,但你不敢保证这些家伙什么时候又让你把这功能加回来所以要尽量少改动代码,我就在想主程序里这个引脚随便写高低,只要我不设置它为输出模式他就无法改变电平,对主程序无影响
 楼主| 发表于 2020-9-27 12:12 | 显示全部楼层
shouzama 发表于 2020-9-27 06:51
這個問題,老實講真的是自己去試試比較快耶

I/O 不宣告的話內定是 INPUT 用,寫入 HIGH

谢谢                  
发表于 2020-9-27 13:07 | 显示全部楼层
wanglanshu 发表于 2020-9-27 12:11
我现在有一个功能客户不想要了,但你不敢保证这些家伙什么时候又让你把这功能加回来所以要尽量少改动代码 ...

這個想法不對

你將一個 INPUT PORT PULL HIGH 的話,
會影響到它的電壓準位(不是毫無影響),
雖然它不像 OUTPUT PORT 會輸出能推動
負載的 HIGH 準位電壓(20~40mA的能力),
但一旦電壓準位變動,可能會影響到相關電路
的運作(視硬體電路而言),這點要留意

編譯器有一個選擇性指令可以利用,當不想要
部份功能時,,可以經由參數更動來選擇要不要
將某一段程式碼進行編譯,如果不編譯就算 INPUT
被觸發 ARDUINO 也不知道要作何回應=無作用

以下是我自己做的一個溫控檢測程式片段,當我在做
程式測試時,我會給它一個模擬值來看它的運作反應,
但實際運用時它要去讀感溫器的值來作動,所以測試
時跟實際運作時只要改一個定義參數就可以做到:
#define DEBUG 0 //模式選擇,0:電壓/溫度模擬值不編譯(正常),1:電壓/溫度模擬值要編譯(除錯)

  VOL = analogRead( BAT_VOL );            //讀取電池分壓ADC讀值(0~1023整數)
  VOLTAGE = VOL*0.004887+VOL_ADJ;         //將ADC讀值(0~1023)→電壓值(0~5V),加上補正值 VOL_ADJ
  #if ( DEBUG == 1 )                      //選擇是否編譯此部份程式,DEBUG = 1 時才編譯
    VOLTAGE = RES_VOL[3];                 //模擬目前電池分壓測定值
  #endif

  TEMP = analogRead( LM35 );              //讀取溫度感測ADC讀值(0~1023整數)
  TEMPERATURE = TEMP*0.4887+TEMP_ADJ;     //將溫度ADC讀值(0~1023)轉換為溫度值(℃),加上補正值 TEMP_ADJ

  #if ( DEBUG == 1 )                      //選擇是否編譯此部份程式,DEBUG = 1 時才編譯
    TEMPERATURE = 80;                     //模擬目前溫度感測值
  #endif
发表于 2020-9-27 22:36 | 显示全部楼层
虽然我接触arduino时间也较短,但按照我开发其他单片机的经验来说,IO默认复位为输入高阻态,IO电平是不确定的,由你接入的负载引脚决定,当然,你没有设置输出,不管你对他写HIGH,还是写LOW,都是没作用的
 楼主| 发表于 2020-9-28 01:02 | 显示全部楼层
shouzama 发表于 2020-9-27 13:07
這個想法不對

你將一個 INPUT PORT PULL HIGH 的話,

我是本来用8号口高电平输出控制三极管导通带一个相当耗电的模块,8号口第电平关模块待机省电,9号口输出接一个led。现在顾客不要省电了8号口就悬空了不过代码还在依旧输出高电平,此时绝活来了脑残代工焊贴片时特别寸就正好把挨着的89号引脚不小心焊短路了,结果让led关闭时8号高电平流入9号低电平和流过led,导致led始终有1.8v微弱电压亮一点,而且高低电平io口直连导致芯片发热严重不过幸好没爆炸。所以为了避免这么寸的事再发生干脆取消8号口的输出模式
发表于 2020-9-28 06:33 | 显示全部楼层
wanglanshu 发表于 2020-9-28 01:02
我是本来用8号口高电平输出控制三极管导通带一个相当耗电的模块,8号口第电平关模块待机省电,9号口输出 ...

這個...製程沒弄好不是取消 #8 I/O 的理由吧? ^^"

不論是否要用到 #8 ,焊接短路都是不應該發生的,
製程需改善;至於不再使用 #8 的話,就讓它內定
為 INPUT + PULL LOW 模式就好(或者在 setup()
中明確設定也可以),相關控制程式碼直接以編譯
指令跳過,這樣也可以省程式空間
发表于 2020-9-28 09:20 | 显示全部楼层
shouzama 发表于 2020-9-27 13:07
這個想法不對

你將一個 INPUT PORT PULL HIGH 的話,

shouzama 看着好专业的,让我这个小白看到了您严谨的技术态度。虽不能至,心向往之
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-30 01:25 , Processed in 0.112362 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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