個人資料
歸檔
正文

ATmega8A - C8051F41x

(2020-12-30 16:02:55) 下一個

1. ATMega8A

https://www.google.com/search?q=AVR+OS+DIY 輕量級多任務OS https://www.xpstem.com/tutorials/detail/10007 深入了解

TB價1元-QFP32。與別的成員相差在程序/RAM/EE的大小,本片是8K/1K/0.5K。5V,DIP28價約1刀,TQFP32稍便宜。6個10bit A/D(2個與I2C共線,32腳芯片有8個,另有2個模擬輸入可做比較器),時鍾200K變換需時125us,有內置2.56Vref也可外加,內置的穩定但總絕對誤差在-40~80C為1.75LSB,供電為AVcc。典型時鍾16M,因庫的兼容性不建議更換,內置RC震蕩器8M,25C時誤差2%,整個溫度範圍誤差可達14%。BootLoader不過1KB,也有512B的版本https://github.com/Optiboot/optiboot,均需與時鍾頻率相配,因其使用串口。串口可達1M,有2X模式。廠家的觸摸庫QTouch®可下載。以下28DIP即國內所稱M8為例。

ATmega8A:8K字節的係統內可編程閃存,具有讀-寫功能,寫入功能,512字節EEPROM,1K字節SRAM,23條通用I / O線,32條通用工作寄存器,三個具有比較模式的靈活定時器/計數器,內部和外部中斷,一個串行可編程USART,麵向字節的兩線串行接口,6通道ADC(TQFP和VQFN封裝8個),精度為10位,帶有內部振蕩器的可編程看門狗定時器,SPI串行端口和五個軟件可選的省電模式。空閑模式會在允許SRAM的同時停止CPU,定時器/計數器,SPI端口和中斷係統繼續運行。掉電模式保存寄存器內容,但凍結振蕩器,禁用所有其他芯片功能,直到下一次中斷或硬件複位為止。在省電模式下,異步計時器繼續運行,允許用戶在設備的其餘部分正在休眠。 ADC降噪模式可停止CPU和除異步以外的所有I / O模塊定時器和ADC,以最小化ADC轉換期間的開關噪聲。在待機模式下,晶體/諧振器振蕩器在器件的其餘部分處於睡眠狀態時運行。這樣可以非常快速地啟動低功耗。

XT1/2為時鍾腳,接22p到地,再並晶體或陶瓷片,不用的腳可做I/O。I/O腳均可選上拉電阻,作輸入時有下拉電阻。由上圖可見I2C與ADC4/5共用,速率率可達400K。SPI支持主從模式。有WDT。模擬比較器輸入OC1A/1B,輸出可驅動中斷或T/C1。T/C0和T/C2為8bit後者支持多個PWM模式-沒去細看,T/C1為16bit。中斷優先級不清楚,中斷源有內/外、T/Cx、A/D等沒啥限製。缺328P的debug硬件。

AVR係列比較:https://www.futurlec.com/ICAtmel_ATMega_Comparison.shtml

1.1 PWM

https://sites.google.com/site/qeewiki/books/avr-guide/pwm-atmega8

ATmega8具有3個PWM輸出,2個在T/C1上16bit,1個在T/C2上8bit。

1.1.1 T/C2 8bit PWM

有快速PWM和相位校正PWM兩種模式,輸出OC2可以是同相或反相。

快速PWM模式:與普通計數器相同。控製邏輯接收信號並遞增TCNT2寄存器。當檢測到匹配時,將設置OCF0x標誌,並將信號發送到波形發生器。波形發生器隨即更改OC0x引腳的狀態(該狀態由所選模式確定)。當TCNT2寄存器超過TOP值(0xFF或255)時,它隻是溢出回到0,同時設置OCF2標誌。可以軟件清除OCF2標誌,或將其用於觸發中斷。一但觸發中斷請求,該標誌將自動清除。同相模式下,若TCNT2小於OCR2,則OC2引腳為HIGH(VCC),否則OC2引腳為LOW(GND)。反向模式下,若TCNT2小於OCR2,則OC2引腳為LOW(GND),否則OC2引腳為HIGH(VCC)。由於此模式的頻率很高,因此最適合用於DAC,LED衰落,整流和功率調節。頻率可以通過以下公式計算:PWM_fequency =時鍾速度/(預分頻器值* 256)

相位校正PWM:它有點奇怪,遞增計數直到達到TOP值(0xFF或255),然後開始遞減計數直到達到下限0。控製邏輯接收信號並遞增TCNT2寄存器。檢測到匹配時將設置OCF2標誌,並將信號發送到波形發生器。波形發生器隨即更改OC2引腳的狀態(該狀態由所選模式確定)。當TCNT2寄存器達到TOP值(0xFF)時,將設置OCF2標誌,用法與前相同。同相模式下,向上計數時,TCNT2和OCR2之間的比較匹配時,OC2引腳為LOW(GND);向下計數時,比較匹配中的OC2引腳為HIGH(VCC)。反相模式下,向上計數時,TCNT2和OCR2之間的比較匹配時,OC2引腳為HIGH(VCC);向下計數時,比較匹配中的OC2引腳為LOW(GND)。

1.1.2 T/C1 16bit PWM

有兩個輸出OC1A和OC1B。由於這兩個輸出都在同一個計時器上運行,並且OC1A和OC1B都同步了波形發生器,因此這使得該計時器非常適合製造坦克機器人。

T/C1的工作方式與T/C2相同。將OCR1A / OCR1B與TCNT1寄存器進行比較,當檢測到匹配時,將設置OCF1A / OCF1B標誌並將信號發送到波形發生器。波形發生器隨即更改OC1A / OC1B引腳的狀態(該狀態由所選模式確定)。OCF1A / OCF1B標誌可以由軟件清除,也可將其配置為觸發中斷。後者在觸發中斷請求時會自動清除,A和B具有單獨的向量,其中A優先。

T/C1能夠在3種模式下運行:快速PWM模式,相位校正PWM模式以及相位和頻率校正模式。輸出均可反轉或不反轉。與T/ C2不同的是它有幾個選項可用於控製PWM的最大值。有的模式例如模式1,TOP固定為0x00FF;其它的如模式8至15則用存儲在ICR1或OCR1A寄存器中的TOP值。

快速PWM模式:T/C1上的快速PWM的工作方式與T/C2上的一樣。它一直計數到到達頂部,然後溢出回到0。最大的不同是,我們有幾種具有不同TOP值的Fast PWM模式。需要注意的是,如果將ICR1或OCR1A用作TOP值,則MINIMUM有效值為3(0x0003)。由於此模式的頻率很高,因此最適合用於DAC,LED衰落,整流和功率調節。快速PWM的頻率可以通過以下公式計算:PWM_fequency =時鍾速度/ [Prescaller_value *(1 + TOP_Value)]

相位校正PWM模式:T/C1上的相位校正模式與定時器/計數器2上的相位校正模式一樣工作(有關詳細信息,請參見上文)。不同的是我們可以將ICR1或OCR1A的值用作TOP值。輸出可以反轉或不反轉。在同相模式下,向上計數時,TCNT1和OCR1A / OCR1B之間的比較匹配時,OC1引腳為LOW(GND);向下計數時,比較匹配中的OC1引腳為HIGH(VCC)。在反相模式下,向上計數時,在TCNT1和OCR1A / OCR1B之間的比較匹配時,OC2引腳為HIGH(VCC);在向下計數時,在比較匹配中,OC2引腳為LOW(GND)。建議將此模式用於電動機控製。相位校正PWM的頻率可以通過以下公式計算:PWM_frequency =時鍾速度/(2 *預分頻器值* TOP_value)

相位和頻率校正PWM模式:如果我們不打算在PWM模式啟動後改變TOP值,則相位校正和相位和頻率校正PWM模式的功能相同。我可以在數據表上看到的唯一區別是,相位和頻率校正模式在擊中底部時會更新其TOP值,而相位校正模式在擊中TOP時會更新其TOP值。建議將此模式用於電動機控製。相位和頻率校正PWM的頻率可以通過以下公式計算。

ATmeg8A可用16M驅動PWM,12bit時頻率3.9故K需多階濾波。外加DAC122S085是廉價2CH 12bit DAC,內部非線性+-8bit;DAC7562的非線性可忽略。

編程一例:https://www.electronicsblog.net/atmega8-pwm-controlfrequencypolarityduty-cycle-example-tutorial-with-program/

QFP32有24端口:晶振2/串口2/DA2/AD3/旋轉3/觸摸4/LCD4+6,共23;隻好用串口LCD,餘下線可做鍵盤/蜂鳴/風扇。複用的方法見下節。

2.C8051F412-GQ

引出腳在44頁,SFR 115頁。係列:https://en.wikipedia.org/wiki/C8051  https://www.silabs.com/development-tools/mcu/8-bit/8-bit-usb-debug-adapter  Keil: https://www.keil.com/dd/chip/4111.htm KEIL5注冊機2032.平民鏈接:https://pan.baidu.com/s/1FyWCAWoRQ4ZEtFOCchABKA 提取碼:bqlg 官網免費開發包無debug:https://www.silabs.com/community/mcu/8-bit/forum.topic.html/free_unlimited_keil-27dh

8051 multi task core 利用了KEIL編譯器的智能,不保留寄存器。通常不能超過7個任務。https://www.amobbs.com/thread-1398508-1-1.html 這個需要用戶在多點插入task_switch()做手動調度,例如LCD更新函數執行時間長可插入多次。https://cloud.tencent.com/developer/article/1692862 這個定時調度。每個任務執行後重裝延時tick,task0有最高優先級。當然也可以用KEIL RTX51 Tiny,開源的在KEILC51RTXTINY2下。

TB價3.5元。LQFP32封裝,F410/2-GQ分別為32K/16KROM,均有2K+64BRT時鍾存貯器。2CH ADA,A/D為200K,D/A為電流輸出型0.25/0.5/1/2mA。內置基準2.2V精度不錯,內置穩壓REG0可輸出2.1/2.5V並為內核供電,VIO接相應外設的電壓3.3V或5V。內置溫度傳感(+-3C),開發有Silicon Lab的UDA使用JTAG。隻有一腳地線,手冊最小SNR為 66dB,有效位ENOB = (SNR-1.76)/6.02 = (66-1.76)/6.02 = 10.67bit。

* 高速、流水線結構的8051兼容的微控製器核(50M時鍾可達50MIPS)* 全速片內係統調試接口 * 真12位200 ksps的24通道ADC * 兩個12位電流輸出DAC * 2%精度可編程的24.5MHz內部振蕩器 * 16/32KB的片內FLASH存儲器* 2304字節片內RAM * 硬件實現的SMBus/ I2C、增強型UART和增強型SPI串行接口 * 4個通用的16位定時器 * 具有6個捕捉/比較模塊和看門狗定時器功能的可編程計數器/定時器陣列(PCA)* 硬件實時時鍾(smaRTClock),工作電壓可低至1V,帶64字節電池後備RAM和後備穩壓器 * 硬件CRC引擎 * 片內上電複位、VDD監視器和溫度傳感器 * 片內電壓比較器 * 多達24個端口I/O   

FLASH存儲器可現場按512B分片編程,用於數據存儲或固件更新。軟件可以關斷任一或所有外設以節省功耗。C2開發接口允許使用安裝在最終應用係統上的產品MCU進行全速在係統調試,不占用片內資源。調試邏輯支持觀察和修改存儲器和寄存器,支持斷點、單步、運行和停機命令。MCU暫停期間,所有外設(ADC和SMBus除外)均處於停止狀態
步進或在斷點處保持同步。兩個C2引腳可以與用戶功能共享,使在係統調試功能不占用封裝引腳。每種器件都可在工業溫度範圍(-40℃到+85℃)內用2.0V ~ 2.75V的電壓工作。C8051F41x-GQ為LQFP32封裝。

同於8051程序和數據地址配置:256B RAM,低128B可直接/間接尋址,其中LSB32是四套GPR通用寄存器,次16B可位尋址。高128 B地址為兩塊RAM共享,SFR特殊功能寄存器是直接訪問,128B RAM則間接尋址。 剩下的2KB XRAM用movx指令訪問。程序存儲器包含32/16kB Flash可以512B扇區重新編程,且不需要片外編程電壓。

用它的唯一理由是片內ADA。Vref可選內/外基準或Vdd,可選輸出(200uA)。A/D可由軟件,C/T2-3或外部觸發,通道包括Vdd/Gnd/片內溫度探頭。ADC的時鍾FCLK最大為25M,而變換時鍾SAR clock為3M,最大頻率為200K,每次變換前需等待的時間稱為Tracking,有3種模式,以post tracking後硬件定時較為方便。突發模式做1/4/8/16次轉換,前後都是低功耗。輸出12bit可選左或右對齊,突發>1時必須選右對齊,因為輸出的是和數。 轉換結束時AD0INT置1,可產生中斷或查詢它。窗口檢測可用於隻在需要時才介入調整,避免可控電源輸出振蕩的現象。ADC需偏置/滿度校準。D/A用內部基準源,允許無縫的滿量程更改並支持波形生成的無抖動更新; 更新在定時器溢出時或與外部信號同步;輸出分別由IDA?EN控製,IDAMRG置位可將IDA1合並到IDA0;內部非線性可達10bit。兩個帶有多路開關的電壓比較器,均可提供可編程的響應時間和遲滯(+-18mV),可選同步鎖存CP0/1或異步CP0/1A輸出;可用CNVSTR的上升/下降或雙沿中斷來更新,可喚醒處理器或將其複位(CP0),數據可選左右對齊,注意外接腳需配置為模擬輸入。CRC0支持CRC-16/32有硬件位反。REG0接受VREGIN引腳最高5.25V的輸入,輸出可選2.1/2.5V(Vref=1.5/2.2V也可以輸出)並驅動VDD引腳,電流最多50mA。smaRTClock的32 kHz振蕩器可選用晶體,警報和時鍾丟失會中斷CIP-51,可喚醒處理器或由其定時器或停振產生複位。備用電源VRTC-BACKUP需1V以上。

三個8bit端口,每bit均可配置為DIO/AIO,DIO可為推挽或漏極開路操,可配置全局的弱上拉,DO可輸出/吸收100mA或總共500mA。有一個矩陣開關Crossbar可將內部資源入C/T、串口、中斷源、PCA0等映射到端口I / O引腳。內部振蕩器校準為24.5 MHz±2%,外部可接時鍾源/晶體/陶瓷/電容或RC。係統時鍾SYSCLK最高50M,可由內外部或smaRTClock通過x4和除2^n(n=0~6)的倍頻器產生,見P175,內部振蕩最大頻率25M,外接不能超出此值。2.5V時核心耗電最大10/15mA(25/50M)。

堆棧指針SP初始化時指向RAM 0x07,壓棧時(++SP)將使第一個數據存在0x08,這也是寄存器組1的R0。因此需要初始化SP指向256B RAM中的空餘位置。 MOVC和MOVX可讀取閃存,使其用於數據存儲,也可在線更新程序;也可C2接口編程。閃存重新編程之前通常會被擦除(複原為0xFF),擦除和寫入操作由硬件自動定時,不需要查詢,但在此期間暫停代碼執行,且片上VDD監視器需設置為最高(VDMLVL=1),同時啟用VDD監視器並作為複位源。閃存的寫入和擦除受到鎖鑰的保護,必須按順序正確寫入密鑰寄存器FLKEY的關鍵代碼0xA5、0xF1。閃存的讀出按最大25M時鍾設計。詳見第16章。

2KB XRAM的訪問可用MOVX指令及@DPTR指針,此時高5位地址無關,故不用擔心地址溢出;或MOVX間接尋址模式例如@ R1,此時EMI0CN給出高八位地址。存儲器類型:

code-MOVC @A+DPTR 8~32KB Flash;data-直接訪問的128B;idata-間接訪問的256B; bdata-可按位訪問的16B;pdata-MOVX @Rn訪問的XRAM的低256B;xdata-MOVX @DPTR訪問的1~2KB; far-64KB地址外的外接存儲器。

端口電源電壓經VIO加入,P1/P2端口電壓不可超過VIO,P0可以超過但以5 V為限。 I/O配置有優先級的。

有4個C/T:2個標準8051 16bitC/T0-1,2個16bit 16位自動重載定時器T2-3。C/T0-1的模式0/1是13/16bit,2/3是雙8bit,但模式2有自動裝載,C/T1無模式3。T2-3是16bit或雙8bit自動裝載。C/T0-1可由係統時鍾除4/12/48或外部時鍾/8提供。C/T2-3可由係統時鍾除1/12或外部時鍾/8提供。C/T0-1用作計數器時在T0/T1的下降沿遞增,輸入可達SYSCLK/4,必須保持兩個SYSCLK周期。

可編程計數器陣列(PCA0)提供了增強的計時器功能,其中的16bitC/T可選7個時鍾源:係統時鍾或除以4/12、外部源或實時時鍾源除以8,定時器0溢出或ECI引腳。C/T內容與6個16位捕獲/比較器C/C作用後,經交叉開關Crossbar去I/O端口。C/C有6個模式:EdgeTrigger捕獲到PCA0CPxn中並設置CCFn;軟件定時器則是與PCA0CPxn比較並設置CCFn;高速輸出則是再上述比較匹配時將CEXn腳反轉;頻率輸出產生可編頻率的方波8位PWM或16位PWM,模塊5可做WDT。6個C/C各自的溢出位CF均可觸發PCAINT,但無論中斷與否需由軟件清除。

8bit PWM每個模塊均可獨立使用,占空比由PCA0CPHn改變。 當PCAPCA0L等於PCA0CPLn時, CEXn腳被置位;PCA0L溢出時將複位,PCA0CPLn會自動加載PCA0CPHn。PCA0CPMn寄存器中的ECOMn和PWMn位置1 使能8位脈衝寬度調製器模式。PCA0CPHn = 0時占空比為100%,0xFF時為 0.39%,ECOMn清零可為0%。

16bi PWM模式下,當PCA計數器匹配時C/C模塊內容時,CEXn輸出為高;當計數器溢出時為低。將PCA0CPMn中的ECOMn,PWMn和PWM16n位置1使能16位PWM模式。要改變占空比,應啟用匹配中斷(ECCFn = 1 AND MATn = 1),在中斷中寫入新值。PCA0CPn = 0占空比為100%,FFFF時為 0.0015%,將ECOMn位清零為0%。48M下12bit PWM約11.7K,濾波相對容易;此時串口可達115.2K:https://www.keil.com/products/c51/baudrate.asp 不過22.1184M更精確。

看門狗定時器在複位時啟用,將PCA0MD的WDTE清零可以禁止它。啟用時,某些PCA0H/L等寄存器不能寫入;當PCA0CPH5與PCA0H匹配時產生複位,當PCA0CPH5被更新時實際的寫入值是PCA0H+PCA0CPL5。

QFP32有24端口:晶振2/串口2/DA2/AD3+Vref/旋轉3/觸摸4/LCD4+6,共23-24;方案1用串口LCD,餘下線可做鍵盤/蜂鳴/風扇。方案2加用LC244片選輸入即/LCDCS=InDis後,8線為LCD8輸出與旋轉3i/觸摸2/按鍵3輸入,晶振2/串口2/DA2/AD3+Vref/LCD1+8(RD不用)/觸摸2=20-21,再加蜂鳴/風扇。可用A/D檢測多個輸入。

編程可借鑒帶LCD12864和旋轉編碼器的8051源碼:https://www.dianyuan.com/bbs/2445390.html

官網IDE:https://www.silabs.com/developers/8-bit-8051-microcontroller-software-studio 開發板50刀https://www.silabs.com/documents/public/user-guides/C8051F41x-DK.pdf,USB盒35刀,可用Keil:https://www.silabs.com/documents/public/application-notes/an104.pdf 及用官網燒寫軟件:https://www.silabs.com/developers/8-bit-8051-microcontroller-software-studio 另文說點擊μVision的"Debug -> Start/Stop Debug Session"即可。

Use Arduino 燒寫(隻限)AT89S51/2: https://www.instructables.com/How-to-Program-8051-Using-Arduino/ 將Uno的pin10-13接89C51/52的Rst/MOSI/MISO/SCK及電源,Uno插入USB即加電,其+5V接入805x的EA腳;啟動Arduino IDE,選Files|Examples|Arduino ISP,選Tools|Board|Arduino Uno,選好串口;下載本鏈接給的AVR8051.conf文件,在cmd窗口執行下述命令(89s52/1需取其一):"C:Program Files (x86)Arduinohardwaretoolsavrbinavrdude.exe" -C C:/AVR8051.conf -c stk500v1 -P COM5 -p 89s52/1 -b 19200 -U flash:w:"c:mycode.hex"。ISP倒有源碼:https://github.com/arduino/ArduinoISP

2.1 C8051F30x

QFN11/SOIC14, 8bit I/O,25M,8bit 帶增益可設運放A/D,C/T0-1,T2,PCA0,小板2刀。PCB正反印字指明接腳。

3. 外設

3.1 電阻觸摸屏

電阻觸摸屏4線是:xp/yp為A/D,xm/ym為DO。測X坐標時,xp-xm分別為Vcc-Gnd,yp三態,由ym A/D讀出X向的由筆點下導致的分壓Vx;測Y坐標時,yp-ym分別為Vcc-Gnd,xp三態,由xm A/D讀出X向的由筆點下導致的分壓Vy。測Z時,ym-xp為Vcc-Gnd,z=f(yp,xm,x) 算法詳見Arduino庫及https://www.ti.com/lit/ds/symlink/tsc2046.pdf的公式3。初次使用前需校準,先點擊讀出左上腳,再右下角,將相應Xmin/Xmax/Ymin/Ymax改變驅動程序中的值。例如10bit A/D得到的實際範圍值可能是110-910。

https://blog.csdn.net/Linux_ARM9/article/details/104830868 http://www.51touch.com/technology/multitouch/2012/0224/14091.html

3.2 顯示屏

3.2.1 LCD1602/2004

HD44780 https://www.arduino.cc/en/Tutorial/LibraryExamples/LiquidCrystalDisplay? 6線,R/W接地。https://create.arduino.cc/projecthub/electropeak/using-1602-lcd-keypad-shield-w-arduino-w-examples-e02d95 帶Sel,上下左右及Rst鍵。有I2C版或加PCF8574x即得。

3.2.2 LCD 196x64 LM6071/2

https://www.topwaydisplay.com/product/mono/LM6071CFW 100x60x10.8mm 4/12線接口。

2.3.2 2.4"TFT觸摸屏

常見兩種芯片:ILI9341和SPFD5408,可用4線串口或4+8線並口。
SPFD5408a: Ali上最便宜的,庫:https://www.instructables.com/How-to-use-24-inch-TFT-LCD-SPFD5408-with-Arduino-U/

ILI9341: https://create.arduino.cc/projecthub/calogerus/arduino-uno-2-4-tft-lcd-display-shield-touch-panel-ili9341-576b1b https://create.arduino.cc/projecthub/electropeak/arduino-2-4-touch-screen-lcd-shield-tutorial-fe6f05 D0-7 to Arduino Pin2-8, RST/CS/RS(D/C)/WR/RD to pin A4-A0. RST線可選。先寫命令(RS=0)再讀寫數據。觸摸屏用pin8/9/A2/A3(YM/XP/YP/XM),因此不能同時訪問。該片也支持3-4線串口SS/SDI/SDO/SCK:https://create.arduino.cc/projecthub/techarea98/graphics-test-ili9341-tft-lcd-spi-display-78e1c3 

2.4" touch: https://www.ebay.com/itm/2-4-TFT-LCD-Display-Shield-Touch-Panel-ILI9341-240X320-for-Arduino-UNO-R3-C/233591453475  軟件:https://create.arduino.cc/projecthub/electropeak/arduino-2-4-touch-screen-lcd-shield-tutorial-fe6f05  

3.4 旋轉編碼器

一排5腳的依次是Gn'd/Vcc/開關/ondutB/outA。國產EC11為A/G/B及開關,壽命8萬次;消抖不小於5ms,可上拉10K//10n;脈衝數有15/20兩種。順時鍾AB=01-00-10-11,逆時鍾是01-11-10-00。半譯碼可以用下沿中斷A,若B為1是順時鍾。全譯碼可再加下沿中斷B,若A為0是順時鍾;或上下沿中斷A,若A!=B為順時鍾;或四狀態機如下。

int counter;
bool prevA = 1, prevB = 1;
void loop() {
    bool A = digitalRead(pin_rotaryA), B = digitalRead(pin_rotaryB);
    if (B != prevB) 
        counter += (B - prevB) * (A ? +1 : -1);
    else if (A != prevA) 
        counter += (A - prevA) * (B ? -1 : +1);
    else 
        return; //nothing changed: exit
    prevA = A;
    prevB = B;
    Serial.println(counter);
}

3.5 數字電位器/模擬開關

MCP44* lib: https://github.com/sapher/MCP42xxx-Arduino-Library 注意42xx不支持菊花鏈但價格減半,42xxx不能直接用庫函數。每片數據+命令為16bit,因加電後初始化0,SO先輸出的16bit總是0。若菊花鏈有3片,需先寫入最遠一片的16bit,總計48bit後將/cs拉起。如果隻需要編程第2片,可以隻寫32bit並將第1片的C1C0寫0即命令無效。AD5204/6內封4/6個pot電流可達+-11mA,MCP僅1mA。I2C接口的多片不是問題,但在M8上要占用A/D線,暫且忽略。

https://category.alldatasheet.com/index.jsp?components=SINGLE-POLE,DOUBLE-THROW 不超過5V,低阻典型0.5ohm不大於1ohm。https://www.kynix.com/Detail/785281/74LVC1G3157DBVR.html 

4. 編程

Arduino創建項目:https://blog.csdn.net/u010918541/article/details/50496242

Arduino用於STM32:https://blog.csdn.net/qq_36338040/article/details/79201281

  The base source are in the Arduino installation, under cores/arduino/.
  Source for additional libraries included are in libraries/.

4.1 Arduino下的多任務

RTOS https://www.arduino.cc/reference/en/libraries/freertos/ 

4.1.1 使用millis():這是非堵塞的50天後才溢出的計數器,即1ms定時中斷來更新U32。程序讀出更新值並與舊存貯值比較來執行某功能:

unsigned long previousMillis1 = 0;  
void loop() {    
  unsigned long currentMillis = millis();    
  if(currentMillis - previousMillis1 >= OnTime1)  {      
    previousMillis1 = currentMillis;    
    //do sth
   }

可以用許多if{}來完成不同任務。也可用定時中斷擴展成不同時間片,時間片內既可完成開銷小的任務,也可設置標誌讓在主循環中檢測執行。

4.1.2 使用庫函數 Scheduler 

https://github.com/arduino-libraries/Scheduler 限於Arduino SAM Boards (32-bit ARM Cortex-M3) 或 SAMD

#include
int counter = 0;
int counter1 = 0;
void setup()
{
  Serial.begin(9600);
  Scheduler.startLoop(loop1);
}
void loop () {
  analogWrite(9, counter);
  counter++;
  if (counter > 255){
    counter = 0;
  }
  delay(33);
}
void loop1 () {
 if (Serial.available()) {
    char c = Serial.read();
    if (c=='0') {
      digitalWrite(2, LOW);
      Serial.println("Led turned off!");
    }
    if (c=='1') {
      digitalWrite(2, HIGH);
      Serial.println("Led turned on!");
    }
  }
 yield();
}

4.2 80x51 KEIL下的多任務

無需保護R0-7。TCB含任務入口、SP和(等待)狀態。main()初始化所有任務,然後跳轉到task0。 每個任務都是死循環,在結束時調用os_delay。os_delay更新任務狀態然後跳至os_idle。 os_idle檢查任務狀態以決定運行新任務與否。定時中斷更新各任務狀態。因80x52內存小,任務總數建議4~6個,用私有棧。

Michael J.Pond 2009: 書中有一個合作式的多任務核,堆棧是共享的。定時中斷更新任務等待時間,主循環中的調度器通過函數指針調用任務或休眠等待中斷。運行的任務不能被調度,需要自己讓步不至超時。

5. 擴展

I2C 16bit I/O:PI4IOE5V6416LEX

8CH12bit A/D:TLA2518(SPI 1M)/28(I2C 140K)

4CH12bit D/A: MCP4728線性差

6. DIY計算器

http://www.51hei.com/bbs/dpj-183859-1.html http://www.51hei.com/bbs/dpj-48762-1.html

7. 電子秤

最全含仿真:https://blog.csdn.net/weixin_39553705/article/details/110235062?  https://download.csdn.net/download/qq_45658684/15311497?spm=1001.2101.3001.5697 

https://item.taobao.com/item.htm?id=646522090761 仿真:https://blog.csdn.net/a_huan258147/article/details/113570283?  https://blog.csdn.net/weixin_39553705/article/details/110235062?  布線:https://blog.csdn.net/weixin_44830487/article/details/115792671?  https://blog.csdn.net/x1131230123/article/details/116357658 

[ 打印 ]
閱讀 ()評論 (0)
評論
目前還沒有任何評論
登錄後才可評論.