tag:blogger.com,1999:blog-8516057646005806683.post2480675897796793185..comments2023-04-07T18:39:50.976+08:00Comments on Cooper Maa: 7) ADCCooper Maahttp://www.blogger.com/profile/14597993167511073460noreply@blogger.comBlogger8125tag:blogger.com,1999:blog-8516057646005806683.post-50661452028908437632012-07-25T16:49:46.439+08:002012-07-25T16:49:46.439+08:00Yes, you're right! ^o^Yes, you're right! ^o^Cooper Maahttps://www.blogger.com/profile/14597993167511073460noreply@blogger.comtag:blogger.com,1999:blog-8516057646005806683.post-52214751100563312412012-07-25T13:43:53.997+08:002012-07-25T13:43:53.997+08:00恩恩~~所以較長暫存器的設定都直接使用
暫存器名稱=數字
例如: ADMUX |= 5
這樣就簡單多...恩恩~~所以較長暫存器的設定都直接使用<br />暫存器名稱=數字<br />例如: ADMUX |= 5<br />這樣就簡單多了~~~~~ :))Sven Wanghttps://www.blogger.com/profile/15916872892211480651noreply@blogger.comtag:blogger.com,1999:blog-8516057646005806683.post-80683945860632700712012-07-24T21:58:53.586+08:002012-07-24T21:58:53.586+08:00假設你確定 pin 不會寫錯,是不需要用 0x07 做 bitmask,寫 ADMUX |= pin...假設你確定 pin 不會寫錯,是不需要用 0x07 做 bitmask,寫 ADMUX |= pin 這樣就好沒錯。可是,如果你是寫 library,就像 Arduino 開發者寫 Arduino API 一樣,雖然一般 Arduino 只有 6 個 analog input pins,可是難保使用者不會寫 analogRead(255) 這樣離譜的程式啊。<br /><br />除非程式去動 MUX3 這個位元,不然它不會是 1 啊。也就是說,MUX3:MUX0 不會預設是 1011,除非程式有去動過 MUX3 的設定才有可能。了解嗎?<br /><br />ADMUX 開機預設值一定八個位元都是 0,如果沒去動到 MUX3,不然 MUX3 不會是 1。所以那個假設是「在某個但書」下才會發生,比如說 programmer 不呼叫你寫的 API,而是自己去動 ADMUX 暫存器。<br /><br />ADMUX = _BV(MUX0);這樣的方式設定呢?<br />哈~ 因為簡單啊!<br /><br />analogRead(pinNumber), pinNumber = 0 - 5<br /><br />你想一下,設若 pinNumber 為 5,如果要一個 bit 一個 bit 設定 ADMUX 暫存器,那 analogRead() 該怎麼寫好呢?<br /><br />analogRead(int pin) {<br />...<br /> switch (pin) {<br /> case 5:<br /> ADMUX |= _BV(MUX2)| _BV(MUX0);<br /> ADMUX &= ~_BV(MUX1);<br /> ...<br /> }<br />}<br /><br />這樣的話,analogRead()程式碼會變得很長喔,如果是有 16 組 analog input pins 的 atmega2560,那開發者可能會寫到手痠。haha~Cooper Maahttps://www.blogger.com/profile/14597993167511073460noreply@blogger.comtag:blogger.com,1999:blog-8516057646005806683.post-78225777465635756812012-07-24T10:15:11.628+08:002012-07-24T10:15:11.628+08:00了解了~
但還是有以下問題
1. 假設我確定我的pin不會寫錯,0x07這樣的設定是否為必要?? ...了解了~<br />但還是有以下問題<br /><br />1. 假設我確定我的pin不會寫錯,0x07這樣的設定是否為必要?? 還是說ADMUX |= pin; 其實這樣也ok?<br /><br />2. 想請教簡單的問題<br />假設MUX3:MUX0本身裡面的資料在設定前原來是1011<br />當我們使用ADMUX |= (pin & 0x07);的設定時(pin=5)<br />那就會變成ADMUX = 1011 & 0101<br />ADMUX=1111;<br />這樣的設定就不會是我們原本想要的值(PIN=5)了<br />請問這樣的問題會出現嗎?<br /><br />因為先前在您的網誌看到的設定方法都是<br />TCCR2A = _BV(COM2A1) | _BV(COM2B1) | _BV(WGM20);<br />像這樣一個bit一個bit很謹慎的設定0或是1<br />但是這邊就比較不一樣, 請問這邊為什麼不使用<br />ADMUX = _BV(MUX0);這樣的方式設定呢?<br /><br />謝謝Cooper的解說~~~Sven Wanghttps://www.blogger.com/profile/15916872892211480651noreply@blogger.comtag:blogger.com,1999:blog-8516057646005806683.post-44826399484801221042012-07-24T08:51:00.153+08:002012-07-24T08:51:00.153+08:00ADMUX 暫存器的 MUX3:MUX0 是用來選擇 ADC channel 的,比如當 Ardui...ADMUX 暫存器的 MUX3:MUX0 是用來選擇 ADC channel 的,比如當 Arduino 下 analogRead(A5) 時,MUX3:MUX0 就要設為 0101,這樣 ADC 就會轉換 channel 5 (對應 Arduino 的 A5) 的類比訊號。<br /><br />所以,pin 就是 analog pin number,以 UNO 而言是 A0 至 A5 (即 0 至 5)<br />至於為什麼 pin 要和 0x07 做 AND 動作呢<br />原因是 UNO 只有 0 至 5 共 6 個 channel<br />只需用到 MUX2:MUX0 三個位元,為了不影響 ADMUX 暫存器的其它設定,所以就把 pin 跟 0x07 做 AND 動作,然後再 OR 放到 ADMUX 裏。Cooper Maahttps://www.blogger.com/profile/14597993167511073460noreply@blogger.comtag:blogger.com,1999:blog-8516057646005806683.post-21076142241684923182012-07-24T02:16:03.274+08:002012-07-24T02:16:03.274+08:00請問Cooper前輩
ADMUX |= (pin & 0x07);
這段的意思是什麼呢...請問Cooper前輩<br /><br />ADMUX |= (pin & 0x07); <br /><br />這段的意思是什麼呢?<br />為什麼會有0x07這個數字出現<br />另外pin腳腳位放在這邊的用意是什麼?<br />為什麼需要和0x07做&?<br /><br />謝謝~Sven Wanghttps://www.blogger.com/profile/15916872892211480651noreply@blogger.comtag:blogger.com,1999:blog-8516057646005806683.post-86123954888342345702012-04-09T19:03:32.579+08:002012-04-09T19:03:32.579+08:00ADCMUX = (pin & 0x07) | (1 << REFS0);
你...ADCMUX = (pin & 0x07) | (1 << REFS0);<br /><br />你這行跟底下這兩行相比,效果是一樣的喔:<br /><br />ADMUX |= _BV(REFS0);<br />ADMUX |= (pin & 0x07); <br /><br />"若欲讀取channel 0與channel 1, 可能因為OR運算導致MUX0被開啟後便無法清除" ??<br /><br />應該是不會,因為:<br /><br />當 pin = 0<br />pin & 0x07 會等於 0<br /><br />當 pin = 1<br />pin & 0x07 會等於 1<br /><br />所以跑到 pin = 1 的時候,channel 就會從 0 變成 1 了。<br /><br />謝謝你的鼓勵。<br /><br />"From Arduino to AVR" 這系列文章可能比較硬一點<br />沒有人帶的話,可能不容易進入,所以,這系列文章的回應比較少。<br />不過,只要對人有益,不管回應是多少,只要有回響我就覺得值得了。:)Cooper Maahttps://www.blogger.com/profile/14597993167511073460noreply@blogger.comtag:blogger.com,1999:blog-8516057646005806683.post-19417331158930322242012-04-08T16:14:39.245+08:002012-04-08T16:14:39.245+08:00您好, 我在此範例中發現一個可修正之處,
關於ADMUX暫存器選擇ADC Channel(Line...您好, 我在此範例中發現一個可修正之處,<br /><br />關於ADMUX暫存器選擇ADC Channel(Line34),<br /><br />此處若使用OR運算更新ADMUX,在切換channel時,<br /><br />是否可能會造成讀取錯誤:<br /><br />ex: 若欲讀取channel 0與channel 1,<br /><br />可能因為OR運算導致MUX0被開啟後便無法清除.<br /><br />若採用:<br /><br />ADCMUX = (pin & 0x07) | (1 << REFS0)<br /><br />似乎可以修正此問題.<br /><br />煩請版主釋疑解惑:)<br /><br />非常謝謝您的熱心分享關於Arduino -> AVR的實驗!<br /><br />祝 順心平安<br /><br />RickRick Chunghttps://www.blogger.com/profile/03784501861938388047noreply@blogger.com