Orodha ya maudhui:

Basi la I2C la ATTiny na ATmega: Hatua 8
Basi la I2C la ATTiny na ATmega: Hatua 8

Video: Basi la I2C la ATTiny na ATmega: Hatua 8

Video: Basi la I2C la ATTiny na ATmega: Hatua 8
Video: Использование плат Digispark Attiny85 Mini Arduino: Урок 108 2024, Julai
Anonim
Basi la I2C la ATTiny na ATmega
Basi la I2C la ATTiny na ATmega

Ninapenda watawala wadogo wa Atmel AVR! Tangu kujenga Mfumo wa Ukuzaji wa Ghetto ulioelezewa katika hii inayoweza kufundishwa, sijawahi kumaliza majaribio ya kufurahisha na AVR ATtiny2313 na ATmega168 haswa. Hata nilikwenda hata kuandika Inayoweza kufundishwa kwa kutumia swichi kama pembejeo, na nikapanua dhana ya Mfumo wa Maendeleo wa Ghetto kwa CPLDs. Wakati wa mradi wa hivi karibuni, nilihitaji swichi kadhaa za kuweka maadili ya kudhibiti. AVR hazikuwa na pini za kutosha za I / O, kwa hivyo ilibidi nifikirie kitu. Ningeweza kujaribu mfumo tata wa kuingiza na kibodi na onyesho, lakini ATtiny2313 ingeishiwa na rasilimali. Kwa bahati nzuri, Atmel ametoa njia kuzunguka shida hii kwa kujumuisha kiolesura ambacho kinaweza kuunganishwa na vidonge vya ziada (kama kumbukumbu au bandari za I / O) na kiolesura rahisi cha waya mbili. Hiyo ni kweli, kwa kutumia pini mbili tu za I / O kwenye AVR tunaweza kupata pini nyingi za ziada za I / O, na rasilimali zingine pia. Muunganisho huu wa waya mbili unajulikana rasmi kama basi ya Mzunguko Iliyounganishwa, au basi tu ya I2C na ilibuniwa na NXP wakati bado ilikuwa Philips Semiconductors. Ikiwa unasoma Maagizo haya basi labda umesikia juu ya basi ya I2C na labda unaweza kuitumia kwenye PIC au mdhibiti mwingine mdogo. Ingawa dhana ni rahisi sana, na inasaidiwa na rasilimali ya vifaa kwenye AVRs, madereva ya programu bado ni muhimu kutumia basi ya I2C. Atmel hutoa Vidokezo vya Maombi (angalia Rasilimali baadaye katika hii inayoweza kufundishwa), lakini hizi hazijakamilika na hazionyeshi mifano yoyote zaidi ya kuwasiliana na kifaa kingine cha AVR. Sio kusudi la Agizo hili kufundisha mtu yeyote jinsi ya kuunda madereva ya I2C kwa AVRs. Badala yake, nitatoa matoleo yaliyopanuliwa ya madereva ya Atmel kwa vifaa vya ATtiny2313 na ATmega168, nitaelezea mahitaji na vizuizi vinavyotumika wakati wa kutumia hizi, na nitakuonyesha mifano ya kazi ya vifaa vya I2C. Baada ya kufanya kazi kupitia Agizo hili utaweza kutumia basi ya I2C kwa mafanikio katika miradi yako ya AVR. Kwa wazi, unaweza kupuuza madereva kwa vidogo au MEGA ikiwa unavutiwa na mmoja wao. Kwa wale wanaopenda kujifunza zaidi juu ya basi ya I2C, nitatoa viungo kwa nyenzo zinazofaa.

Hatua ya 1: Je! Ni Vitu Vipi vyote vya I2C?

Je! Ni nini hiki cha vitu vya I2C?
Je! Ni nini hiki cha vitu vya I2C?
Je! Ni nini hiki cha vitu vya I2C?
Je! Ni nini hiki cha vitu vya I2C?
Je! Ni nini hiki cha vitu vya I2C?
Je! Ni nini hiki cha vitu vya I2C?
Je! Ni nini hiki cha vitu vya I2C?
Je! Ni nini hiki cha vitu vya I2C?

Basi la I2C ni unganisho rahisi, wa waya mbili ambao unaweza kuunganisha vifaa vingi pamoja na kuwaruhusu kubadilishana data. Katika hali yake rahisi kuna kifaa kimoja kikuu ambacho huwasiliana na vifaa vingi vya watumwa. Vifaa vyote vimeunganishwa sawa na waya mbili za basi ya I2C. Waya hizo mbili zinajulikana kama SCL na SDA. SCL ni laini ya saa na inadhibitiwa na kifaa kikuu. SDA ni mstari wa data wa pande mbili. Ili kuhamisha data, bwana hutuma anwani ya mtumwa pamoja na bendera moja ya kusoma / kuandika. Ikiwa maandishi yanatakiwa, bwana ataendelea kutuma data kwa mtumwa anayeshughulikiwa. Ikiwa kusoma kunaombwa, mtumwa atajibu na data. Ili kuratibu shughuli, mistari ya SCL na SDA hutumiwa na bwana na mtumwa kuashiria hali kadhaa. Hizi ni pamoja na ANZA, STOP, ACK (kukiri) na NAK (hakuna kukubali). Maelezo ya masharti haya yanashughulikiwa na madereva. Geks za kweli kati yenu zinaweza kujifunza maelezo yote kwenye viungo vilivyotolewa mwishoni mwa hii inayoweza kufundishwa. Mahitaji ya umeme ni rahisi sana. Bwana na watumwa lazima watumie kiwango sawa kwa Vcc, viwanja lazima viunganishwe, na laini za SCL na SDA lazima zivutwa hadi Vcc. Thamani ya vizuizi vya kuvuta imeamua haswa kwa hesabu kulingana na uwezo wote kwenye basi, lakini kwa kweli inaweza kuwa na thamani yoyote kati ya 1.8K na 10K. Ninaanza na 5.1K na ninatumia maadili ya chini mpaka ifanye kazi. Kawaida hii sio suala isipokuwa una vifaa vingi au waya mrefu kati ya vifaa. Kiwango cha data ya kawaida kwenye basi ya I2C ni 100Kbits / sekunde. Viwango vya 400Kbits / sekunde, 1Mbits / sekunde, na zaidi vinawezekana pia, lakini haziungwa mkono na madereva katika hii inayoweza kufundishwa. Vifaa vyote vya I2C vitafanya kazi kwa 100Kbits / sekunde. ATtiny2313 na ATmega168 kila moja hutumia basi ya I2C tofauti. ATtiny2313 hutumia vifaa vya Universal Serial Interface (USI) - ambayo inaweza pia kutumika kwa basi ya SPI. ATmega168 ina vifaa vya kujitolea kwa basi ya I2C inayojulikana kama interface mbili za waya (TWI). Mara tu madereva yameandikwa, tofauti hizi huwa wazi kwa mtumiaji. Tofauti moja muhimu iko kwenye programu: Dereva wa ATmega168 I2C hukatizwa na gari wakati ile ya ATtiny2313 sio. Hii inamaanisha kuwa programu ya ATmega168 haifai kusubiri uhamishaji wa data wa I2C ufanyike, lakini inahitaji tu kusubiri kabla ya kuanzisha uhamishaji mwingine, au hadi data ifike kutoka kwa operesheni iliyosomwa. Mifano na majadiliano ya kufuata yanapaswa kuweka wazi hii. Anwani za I2C zina urefu wa bits 7, kwa hivyo hadi vifaa 127 vinaweza kuwa kwenye basi ikiwa kila moja ina anwani ya kipekee. Kama inavyoonyeshwa kwenye kielelezo, anwani hii ndogo kidogo imebadilishwa kushoto kidogo na kidogo muhimu hutumiwa kutia alama kusoma au kuandika kwa kifaa kwenye anwani. Kwa hivyo anwani kamili ya mtumwa ni baiti 8 kidogo. Anwani halisi imedhamiriwa kwa ndani kwa kifaa na haiwezi kubadilishwa (4 bits muhimu zaidi), na sehemu imedhamiriwa na bits ambazo zinaweza kushikamana na pini za kifaa (3 bits muhimu) ambazo zinaweza kufungwa juu au chini kuweka anwani maalum. Sauti ya kutatanisha, lakini mfano utaifanya hii iwe wazi. Karatasi ya data ya PCA8574A inaonyesha kuwa bits nne muhimu zaidi za anwani ya I2C zitakuwa 0111. Biti tatu zifuatazo zimedhamiriwa na mipangilio kwenye pini AD0, AD1 na AD2. Pini hizi zinaweza kufungwa chini au kwa usambazaji mzuri wa voltage (volts 5) kuwakilisha 0 au 1 mtawaliwa. Kwa hivyo anuwai ya anwani zinazowezekana ni 38 hadi 3F hexadecimal, kama inavyoonyeshwa kwenye takwimu nyingine kutoka kwa karatasi ya data ya PCA8574. Kwa hivyo kwa kubadilisha mipangilio kidogo ya anwani, hadi 8 PCA8574As zinaweza kuwa kwenye basi ya I2C wakati huo huo. Kila mmoja atajibu anwani yake maalum ya mtumwa tu. Ikiwa bandari hata zaidi za I / O zinahitajika, PCA8574 inaweza kutumika. Tofauti pekee kati ya PCA8574 na PCA8574A ni kwamba safu ya anwani ya mtumwa ya I2C ya PCA8574 ni hexadecimal 20 hadi 27. Kuamua anwani ya kifaa kilichopewa kunaweza kutatanisha kwani karatasi zingine za data huchukulia kuwa kusoma / kuandika kidogo kuwa sehemu ya anwani. Soma karatasi ya data kwa uangalifu na kumbuka kuwa anwani ya mtumwa itakuwa na urefu wa bits 7. Kidogo cha kusoma / kuandika kinapaswa kutibiwa kando. Tena, mfano utasaidia. Karatasi ya data ya 24C16 EEPROM tutafanya majaribio inasema kwanza (muhimu zaidi) bits nne za anwani ya mtumwa ni 1010. Biti tatu zifuatazo zinaweza kuamua na A0, A1 na A2; lakini kumbuka karatasi ya data pia inashughulikia 24C01 hadi 24C08 ambazo ni ndogo za EEPROM. Takwimu kutoka kwa karatasi ya data inaonyesha kuwa mipangilio ya bits hizi za anwani hupuuzwa kadri ukubwa unavyoongezeka na hupuuzwa kabisa kwa 24C16. Hiyo ni, bits tatu za mwisho hazijali na 24C16 hutumia anwani zote za watumwa za I2C 50 hadi 57 hexadecimal. Mbalimbali ya anwani za watumwa zitashughulikia sehemu tofauti ndani ya 24C16. Baiti 256 za kwanza ziko kwenye anwani 50h, 256 inayofuata saa 51h, na kadhalika hadi 256 ya mwisho saa 57h - kwa jumla ya ka 2K. Kwa kuwa anwani ya PCF8570 RAM pia tunajaribu iko katika anuwai hii, 24C16 na PCF8570 haziwezi kutumiwa pamoja.

Hatua ya 2: Agiza Baadhi ya Vifaa vya I2C

Sasa kwa kuwa unajua kidogo juu ya Basi ya I2C na unataka kuitumia, kwa nini usiamuru vifaa vingine vya I2C kujaribu hivi sasa ili iweze kuwa njiani kwako wakati unapata programu tayari? Vifaa vinavyofaa ni pamoja na I / O Interface Expander (kipenzi changu), Static Ram, na EEPROM. Kuna mengi zaidi, lakini huu ni mwanzo mzuri. Wasindikaji wa AVR tutakaotumia ni ATtiny2313 na Atmega168 (inayotumika Arduino). Ikiwa wewe ni mgeni kwa haya, basi angalia Maagizo haya mazuri ya kujifunza juu yao na ujenge Mfumo wako wa Maendeleo wa Ghetto. Mpangilio wa ATmega168 katika muundo wa sasa unaonyesha jinsi ya kutekeleza Mfumo wa Maendeleo wa Ghetto kwa processor hii. Cable ya bandari inayofanana ni sawa na ile ya ATtiny2313. (Sijajaribu toleo la USB la Mfumo wa Uendelezaji wa Ghetto, kwa hivyo sina hakika jinsi basi la I2C linavyopatikana juu yake. Vivyo hivyo kwa Arduino.) Hapa kuna nambari za sehemu ya Digikey. Expander Port: IC I2C I / O EXPANDER 568-4236-5-NDRam: IC SRAM 256X8 W / I2C 568-1071-5-NDEEPROM: IC EEPROM SERIAL 16K CAT24C16LI-G-ND

Hatua ya 3: Madereva ya I2C

Hapa kuna maelezo ya kazi za dereva kwa basi ya I2C. Hizi zilitengenezwa kwa kutumia Vidokezo vya Programu za Atmel kwa wanaoanza. Singeweza kufanya hii bila wao kama msingi wa kujenga juu. Maendeleo yalifanywa kwa kutumia WinAVR na mkusanyaji wa gcc C. Vizuizi vya kiwango cha saa ni ilivyoelezwa hapo chini kwa kila processor. Kwa kuwa siwezi kujaribu mchanganyiko wote wa processor / kiwango cha saa iwezekanavyo, nitashikilia tu kile ninaweza kujaribu na kujaribu kuonyesha vizuizi na mapungufu. Hapa kuna kazi za dereva na jinsi ya kuzitumia. Tafadhali angalia mifano kwa maelezo zaidi na uone kazi zinazotumika katika programu kamili. Ikiwa unataka kukimbia kwa viwango vingine, basi itabidi urekebishe viboreshaji katika madereva. Nitumie barua pepe ikiwa unahitaji msaada wa kufanya hivyo. Unaweza pia kupata vidokezo kutoka kwa maelezo ya programu za Atmel kwenye viungo kwenye Hatua ya Rasilimali. USI_TWI_Master_Initialise () Kazi hii inaanzisha vifaa vya USI kwa operesheni ya hali ya I2C. Piga simu mara moja mwanzoni mwa programu yako. Inarudi tupu na hakuna hoja. USI_TWI_Get_State_Info () Kazi hii inarudisha habari ya makosa ya I2C na hutumiwa ikiwa hitilafu ilitokea wakati wa shughuli ya I2C. Kwa kuwa kazi hii inarudi tu nambari ya makosa, ninatumia kazi TWI_Act_On_Failure_In_Last_Transmission (TWIerrorMsg) kuangazia hitilafu ya LED. Nambari za makosa zinafafanuliwa katika USI_TWI_Master.h. Hapa kuna jinsi ya kuiita: TWI_Act_On_Failure_In_Last_Transmission (USI_TWI_Get_State_Info ()) USI_TWI_Start_Read_Write () Kazi hii hutumiwa kusoma na kuandika ka moja kwa vifaa vya I2C. Inatumika pia kuandika ka nyingi. Kuna hatua 6 za kutumia kazi hii. 1) Tangaza bafa ya ujumbe katika programu yako ili kushikilia anwani ya mtumwa na data ya kutumwa au kupokelewa. unsigned char messageBuf (MESSAGEBUF_SIZE); 2) Weka Anwani ya Mtumwa kama baiti ya kwanza kwenye bafa. Shift ni kushoto kidogo na AU kwenye Soma / Andika kidogo. Kumbuka soma / Andika kidogo itakuwa 1 ya kusoma na 0 kwa Andika. Mfano huu ni wa Soma. messageBuf (0) = (TWI_targetSlaveAddress << TWI_ADR_BITS) | (KWELI << TWI_READ_BIT); 3) Wakati wa kuandika, weka baiti iandikwe katika eneo linalofuata kwenye bafa. 4) Piga simu ya USI_TWI_Start_Read_Write kazi na bafa ya ujumbe na saizi ya ujumbe kama hoja.temp = USI_TWI_Start_Read_Write (messageBuf, 2); 5) The Thamani iliyorudishwa (muda katika kesi hii) inaweza kupimwa ili kuona ikiwa hitilafu ilitokea. Ikiwa ni hivyo, inashughulikiwa kama ilivyojadiliwa hapo juu. Tazama mifano katika programu. 6) Ikiwa Soma iliombwa, kusoma kwa baiti itakuwa katika eneo la pili kwenye bafa. Ikiwa baiti nyingi zitaandikwa (kama kifaa cha kumbukumbu), utaratibu huo unaweza kutumika. Kuweka bafa na kuita utaratibu ni tofauti kidogo. Baiti ya pili kwenye bafa itakuwa anwani ya kumbukumbu ya kuanzia ambayo uandike. Takwimu zitakazoandikwa zitakuwa katika baiti zinazofuata. Ukubwa wa ujumbe utakuwa saizi ikiwa ni pamoja na data zote halali. Kwa hivyo ikiwa kaiti 6 zitaandikwa, basi saizi ya ujumbe itakuwa 8 (anwani ya mtumwa + anwani ya kumbukumbu + ka 6 za data). USI_TWI_Start_Random_Read () Kazi hii hutumiwa kusoma ka nyingi kutoka kwa kifaa cha I2C, kawaida ni ya maana tu kumbukumbu ya aina fulani. Kutumia utaratibu huu ni sawa na utaratibu wa hapo awali, isipokuwa mbili. Mpangilio wa kisoma / Andika kidogo haijalishi. Kupigia simu utaratibu huu kila wakati kutasababisha operesheni ya Soma. UjumbeSize inapaswa kuwa 2 pamoja na idadi ya ka ambazo zitasomwa. Ikiwa hakuna makosa yaliyotokea, data itakuwa katika bafa inayoanzia eneo la pili. Kwa ATmega168: Mahitaji ya Saa: madereva yameundwa kwa kiwango cha saa cha 4MHz kwa ATmega168. Nambari ya mfano inaonyesha jinsi ya kuweka kiwango hiki cha saa. Ikiwa unataka kukimbia kwa viwango vingine, basi itabidi urekebishe viboreshaji katika madereva. Nitumie barua pepe ikiwa unahitaji kufanya hivi. Piga simu mara moja mwanzoni mwa programu yako. Inarudi tupu na hakuna hoja. Hakikisha kuwezesha usumbufu kwa kupiga simu swi () baada ya kuanza. TWI_Get_State_Info () Kazi hii inarudisha habari ya makosa ya I2C na inatumiwa ikiwa hitilafu ilitokea wakati wa shughuli ya I2C. Kwa kuwa kazi hii inarudi tu nambari ya makosa, ninatumia kazi TWI_Act_On_Failure_In_Last_Transmission (TWIerrorMsg) kuangazia hitilafu ya LED. Nambari za hitilafu zimefafanuliwa katika TWI_Master.h, lakini zimebadilishwa kwa kuashiria kwenye LED ya makosa. Tazama nambari ya mfano kwa maelezo. Hapa kuna jinsi ya kuiita: TWI_Act_On_Failure_In_Last_Transmission (TWI_Get_State_Info ()) Kumbuka kuwa ukaguzi wa makosa unafanywa kwa kuhakikisha kuwa shughuli ya I2C imekamilika (kazi iliyoelezwa hapo chini) na kisha kujaribu kidogo katika neno la hadhi ya ulimwengu. TWI_Start_Read_Write () kazi mbili hufanya kazi sawa na kazi zinazolingana zilizoelezewa hapo juu lakini isipokuwa chache. Hazirudishi maadili yoyote ya kosa. Soma ya data haihamishiwi kwenye bafa. Kufanya hivi kutafanywa na kazi iliyoelezewa hapo baadaye. Unapopigia simu TWI_Start_Random_Read, ujumbeSize unapaswa kuwa idadi ya kaiti za data zilizoombwa pamoja na moja, sio mbili. Dereva wa I2C wa ATmega168 anasumbuliwa. Hiyo ni, shughuli za I2C zinaanzishwa na kisha kutekeleza kwa uhuru wakati utaratibu kuu unaendelea kuendeshwa. Wakati utaratibu kuu unataka data kutoka kwa manunuzi ya I2C ambayo ilianza, lazima iangalie ikiwa data inapatikana. Hali ni hiyo hiyo kwa kuangalia makosa. Utaratibu kuu lazima uhakikishe kuwa shughuli ya I2C imekamilika kabla ya kuangalia makosa. Kazi mbili zifuatazo hutumiwa kwa madhumuni haya. TWI_Transceiver_Busy () Piga kazi hii kuona ikiwa shughuli ya I2C imekamilika kabla ya kuangalia makosa. Programu za mfano zinaonyesha jinsi ya kutumia hii. Kazi hii itahakikisha shughuli ya I2C imekamilika kabla ya kuhamisha data. Wakati dhamana inarejeshwa na kazi hii, naona kuangalia kosa moja kwa moja kuaminika zaidi. Hapa kuna jinsi ya kuiita. Ukubwa wa ujumbe unapaswa kuwa mkubwa zaidi kuliko idadi ya data zinazohitajika. Takwimu zitakuwa katika messageBuf kuanzia mahali pa pili.temp = TWI_Read_Data_From_Buffer (messageBuf, messageSize);

Hatua ya 4: Wacha tujenge

Tujenge!
Tujenge!
Tujenge!
Tujenge!
Tujenge!
Tujenge!
Tujenge!
Tujenge!

Anza kwa kupakua faili I2C Schematics.zip. Unaweza kutaka kuunda folda ya I2C katika eneo lako la kazi ili kushikilia skimu na faili za programu ya mfano. Fungua skimu kwenye saraka hii. Utapata folda inayoitwa I2C Schematics. Fungua faili iliyoitwa I2C.pdf ndogo. Mpangilio huu unaonyesha Mfumo wa Maendeleo wa Ghetto wa ATtiny2313, na PCA8574A I / O Port Expander (ina sanduku kubwa lililopigwa karibu nayo). Mzunguko wa Port Expander umejengwa kwenye ubao wa mkate. Angalia picha ili uone jinsi mizunguko hii inavyoonekana. Ni rahisi sana. Sehemu ya ATTiny2313 ya skimu ni Mfumo wa Ukuzaji wa Ghetto na taa tatu za taa (LED1, 2, na 3, pamoja na R4, 5, na 6) na kitufe cha kushinikiza (S1) kimeunganishwa nayo, pamoja na moja maelezo ya ziada. Maelezo hayo ni kuongezewa kwa wanarukaji (JP4, 5, na 6) ambazo zinaweza kuondolewa ili kuruhusu unganisho la I2C basi SCL na laini za SDA. Wanarukaji lazima wawe mahali pa programu, kisha waondolewe ili SCL na SDA ziunganishwe. Picha zinaonyesha wanarukaji mahali na kuondolewa. Uwekaji wa wanarukaji hawa ni juu yako, lazima uweke kwenye Mfumo wako wa Ukuzaji wa Ghetto ikiwa unataka kutumia basi ya I2C. Basi la I2C lazima litenganishwe na warukaji wawekewe programu. Kumbuka kuwa unahitaji tu kuwa na wasiwasi na JP4 na JP6 kwa basi ya I2C. Weka JP5 ikiwa unafikiria utataka kutumia basi ya SPI. Kuweka mkate kwenye PCA8574A I / O Port Expander ni rahisi sana. Toa unganisho la Vcc (+ 5 volts) na Gnd (ardhi) na unganisha AD0, 1, na 2 ardhini (inafanya anwani ya mtumwa ya I2C 38 hex). Kisha unganisha taa 4 za blinken, na swichi 4 za DIP. (Ikiwa huna swichi za DIP unaweza kutumia waya tu. Funga chini au uache kuelea kuashiria au kuzima mtawaliwa.) Mwishowe, unganisha vizuia-kuvuta (R11 na 12) kutoka SDA na SCL hadi Vcc. Hizi zinaonyeshwa kama 3.3K, lakini thamani yoyote kutoka 1.8K hadi 5.1K inapaswa kufanya kazi (labda hadi 10K lakini sijajaribu hiyo). Mara tu ukipanga ATtiny2313 unaweza kuondoa wanarukaji na unganisha SDA na SCL kwa upimaji. Sasa kwa ATmega168. Kasoro hapa ni kwamba labda haujaunda Mfumo wa Maendeleo wa Ghetto kwa processor hii. Ikiwa ndio kesi, basi skimu ambayo ninatoa (MEGA I2C.pdf) itakuonyesha jinsi. Hii ni ruhusa tu ya toleo la ATtiny2313. Ikiwa unapanga mapema unaweza kuhakikisha kuwa kebo ya programu itatoshea mifumo yote. Tofauti kuu ni nyongeza ya C2 na C3. Tazama picha za kuwekwa kwa hizi, zinapaswa kuwa karibu sana na chip; mmoja wao ni kweli chini ya chip. Hizi husaidia kuweka kelele nje ya analog na kibadilishaji cha dijiti haswa. Huna haja ya kuweka kuruka isipokuwa unapanga kutumia basi ya SPI kwani hazihitajiki kwa basi ya I2C kwenye chip hii. Kumbuka kuwa ubao wa mkate wa PCA8754A hautabadilika. Utaunganisha tu SDA na SCL na utaenda! Rahisi, huh?

Hatua ya 5: Wacha tuandike na Jaribu

Wacha tuandike na tujaribu!
Wacha tuandike na tujaribu!
Wacha tuandike na tujaribu!
Wacha tuandike na tujaribu!
Wacha tuandike na tujaribu!
Wacha tuandike na tujaribu!

Ni wakati wa kujenga madereva na mipango ya mfano. Tutaanza na ATtiny2313 na bodi ya mkate ya PCA8574A ambayo tumejenga tu. Pakua faili I2C.zip kwenye saraka yako ya kazi ya I2C na uifungue. Utakuwa na folda mpya iitwayo I2C. Ndani yake utapata USI I2C (ya ATtiny2313) na TWI I2C (ya ATmega168). Katika USI I2C, utapata folda ya I_O Port. Folda hiyo ina nambari ya mpango wetu wa mfano wa kwanza, na madereva ya USI I2C Kutumia WinAVR, kukusanya na kupakia nambari hiyo kwenye ATtiny2313. Vuta pumzi ndefu na uwashe nguvu. Hapa kuna kile cha kutarajia: Wakati wa kuwasha, LED 1 kwenye bandari PD6 ya ATtiny2313 inaangaza mara mbili. Hakuna kitu kingine kitatokea mpaka ubonyeze kitufe (S1). Kila wakati kitufe kinapobanwa, swichi zinasomwa na mpangilio wao utaonyeshwa kwenye LED zilizounganishwa na PCA8574A. Badilisha thamani ya swichi, bonyeza kitufe, na LED zinapaswa kubadilika. Endelea kufanya hivyo mpaka utakapopata msisimko wa kuiona inafanya kazi. Ikiwa (Mungu apishe mbali!) Vitu havifanyi kazi kama inavyotarajiwa, angalia kwa uangalifu wiring yako. Makosa ya I2C yataonyeshwa na blinks kwenye LED3 (PD4) na labda inamaanisha unahitaji kuangalia kuwa SDA na SCL zimeunganishwa na pini sahihi na zimevutwa kwa usahihi. Ikiwa mambo bado hayafanyi kazi, soma sehemu hii yote ili ujifunze juu ya utatuzi. Sasa rudi nyuma na tuangalie nambari. Fungua faili USI_I2C_Port.c. Hii ndio nambari ya mpango wa mfano. (USI_TWI_Master.c na USI_TWI_Master.h zina madereva - unaweza kuwapuuza isipokuwa unataka kujua.) Tumia mfano kuongoza programu zako za I2C. Kwa kawaida, programu inakuonyesha jinsi ya kuanzisha na kutumia madereva ya I2C, pamoja na kuweka juu anwani ya mtumwa na sehemu nyingine ya bafa ya ujumbe, na kupata data nje yake. Pia utaona jinsi ninavyotoa kitufe na kuanzisha kitanzi cha wakati. Kuna maelezo machache ya programu hiyo inayofaa kutajwa. Kumbuka kuwa data kutoka kwa swichi imegeuzwa kabla ya kuandikiwa kwa LED kwenye Port Expander. Pia kumbuka kuwa bandari za kuingiza kwenye bandari ya Port lazima ziandikwe kama Juu ili kuzifanya zifanye kazi vizuri. Maelezo hayo yameelezewa kwenye karatasi ya data ya PCA8574A. Soma kila wakati karatasi za data kwa uangalifu! Ya kufurahisha zaidi ni utumiaji wa utatuzi wa masharti. Karibu na mwanzo wa faili ya programu ni taarifa // # fafanua DEBUG na iliyomwagika kote nambari ni taarifa za #ifdef DEBUG. Ilimradi DEBUG haijafafanuliwa (mipasuko hiyo miwili hufanya mstari kuwa maoni na kuizuia isifafanuliwe), nambari iliyo ndani ya #ifdef kwa taarifa za # endif haitajumuishwa. Lakini ikiwa mambo hayatafanya kazi kama unavyotarajia, pokea tena na upakie tena nambari hiyo na #fafanua DEBUG bila wasiwasi. Utapata blinks nyingi zaidi kwenye LEDs ambazo unaweza kuamua kufuata utekelezaji wa programu yako na kukusaidia kupata haswa mahali mambo yanakwenda sawa. Kwa kweli, ninapendekeza ujaribu hii tu ili uone kinachotokea. Kile utaona ni kwamba LED 2 (kwenye PD5) itaangaza kama maendeleo ya utekelezaji kupitia programu. Thamani iliyosomwa kutoka kwa swichi itaangazwa kwenye LED 1 (PD6) kabla haijaonyeshwa kwenye LED za Port Expander. Unapaswa kuwa na uwezo wa kufuatilia programu inavyoendelea kwa kutumia LED hizi. Tutafanya kazi na ATmega168 ijayo; ruka sehemu hii ikiwa unavutiwa tu na ATtiny2313. Bado na mimi? Nzuri. Nenda kwenye folda ya TWI_I2C, badilisha saraka yako ya kazi kuwa IO_Port, na ujumuishe na upakie TWI_I2C_Port.c kwenye ATmega168. Tenganisha laini za SDA na SCL kutoka ATtiny2313 na uziunganishe na ATmega168. Hook up nguvu na ardhi, na nguvu juu. Operesheni inapaswa kuwa sawa! Cheza hadi msisimko utakapopungua, kisha tuangalie nambari. Fungua TWI_I2C_Port.c. Nambari hiyo ni karibu sawa isipokuwa utunzaji wa makosa na upeanaji wa madereva yanayosumbuliwa. Hapa kuna tofauti: Kumbuka kuwa saa lazima iwekwe 4MHz ili basi ya I2C ifanye kazi vizuri. Jinsi (); taarifa inageuka kukatizwa baada ya kuanza kwa madereva ya I2C. Ili kuangalia makosa, hali maalum hujaribiwa. Wakati wa kusoma, kazi ya TWI_Read_Data_From_Buffer lazima iitwe ili kuhamisha data iliyosomwa kwenye bafa ya ujumbe. Wakati wa kuandika, wakati (TWI_Transceiver_Busy ()) lazima itumike kuhakikisha kuwa uhamisho umekamilika kabla ya kuangalia makosa. Kazi hizi mbili za mwisho zimeelezewa hapo juu katika maelezo ya madereva. Zaidi ya hayo, nambari hiyo ni sawa na ATtiny2313. DEBUG inafanya kazi sawa pia ikiwa unataka kujaribu hiyo.

Hatua ya 6: Kutumia Kumbukumbu ya I2C

Kutumia Kumbukumbu ya I2C
Kutumia Kumbukumbu ya I2C
Kutumia Kumbukumbu ya I2C
Kutumia Kumbukumbu ya I2C
Kutumia Kumbukumbu ya I2C
Kutumia Kumbukumbu ya I2C
Kutumia Kumbukumbu ya I2C
Kutumia Kumbukumbu ya I2C

Sasa kwa kuwa tumejifunza kutumia basi ya I2C kusoma na kuandika I / O Expander Port, wacha tuendelee kutumia kumbukumbu za I2C, RAM na EEPROM. Tofauti kuu ni kwamba ka nyingi zinaweza kusomwa au kuandikwa kutoka kwa kumbukumbu na amri moja ya I2C. Ili kujiandaa kwa majaribio haya, tunahitaji kurekebisha vifaa kidogo na kujenga mizunguko kadhaa mpya kwenye ubao wa mkate. Weka mzunguko wa Port Expander kwani tutatumia kuonyesha maadili kadhaa ya kumbukumbu. Ondoa swichi za DIP kutoka kwa PCA8574A na uweke taa za taa kwenye pini hizo. Ikiwa hauna taa za kuangaza za kutosha, songa zile zilizo kwenye P4 kupitia P7 juu hadi P0 kupitia P3. (Thamani zinazoonyeshwa ni ndogo za kutosha.) Sasa angalia I2C Ram.pdf ya skimu na unganisha PCF8570 kwenye ubao wa mkate. Angalia picha pia. Hakikisha kufunga pini 7 kwa Vcc. Run waya kwa SDA na SCL kutoka PCA8574A. Hakuna vizuizi vya ziada vya kuvuta vinahitajika. Ikiwa una nia ya EEPROM, jenga mzunguko huo pia ukitumia I2C EEPROM.pdf kwa 24C16, lakini onya kuwa mfano huo unatumia ATmega168. Mzunguko huu ni rahisi sana. Kama ilivyojadiliwa hapo juu, bits za anwani zinapaswa kupuuzwa. Tu kuunganisha nguvu na ardhi. Usiunganishe SDA na SCL bado kwani hatujamaliza kujaribu Ram. Tutaanza majaribio yetu ya kumbukumbu na ATtiny2313 iliyounganishwa na PCA8574A Port Expander na PCF8570 Ram. Programu itaandika nambari kadhaa kwa Ram, kisha isome tena na uionyeshe kwenye Port Expander. Badilisha saraka yako ya kufanya kazi kwa RAM chini ya USI I2C. Tumia faili ya kutengeneza kukusanya na kupakua USI_I2C_RAM.c. Kumbuka kuwa faili za dereva za I2C zinafanana na zile tulizozitumia hapo awali. Unganisha nguvu na unapaswa kuona kupepesa moja kwenye LED 1 (PD6). Takwimu zitaandikwa kwa ka 4 za kwanza za kumbukumbu. Bonyeza kitufe na ka mbili zitasomwa nyuma na kuonyeshwa. Unapaswa kuona taa moja ya LED kwenye Port Expander (P0), pause ya pili ya pili, halafu taa mbili za LED (P0 na P1). Pause nyingine mbili za pili na LED zinapaswa kuzima. Bonyeza kitufe tena ili kuanza mlolongo tena. Utatuzi ni sawa na njia iliyoelezwa hapo juu. Wacha tuangalie nambari. Fungua USI_I2C_RAM.c. Inapaswa kuonekana sawa sawa na nambari ya awali. Tofauti kuu ni maelezo ya kusoma na kuandika kumbukumbu. Angalia njia ambayo bafa ya ujumbe imepakiwa kabla ya simu ambayo inaandika. Baiti ya kwanza ni anwani ya mtumwa na kuweka kidogo kusoma / kuandika ipasavyo. Lakini baiti inayofuata ni anwani ya kumbukumbu ambayo unaweza kuanza kuandika data. Halafu inakuja kaiti halisi za data ambazo zitapakiwa mfululizo kwa kumbukumbu kuanzia kwenye anwani tuliyobainisha. Tunataja saizi ya ujumbe kama 6. Kwa hivyo tunaanza kuandika kwa anwani 00 na kuandika nambari 01, 03, 02 na 06 katika sehemu za kumbukumbu 00 hadi 03. Ili kusoma data nyuma kutoka kwa kumbukumbu lazima tutumie USI_TWI_Start_Random_Read kazi. Ujumbe wa bafa hupata anwani ya mtumwa katika baiti ya kwanza na anwani ya kuanzia katika ka ya pili. Kisha piga kazi hiyo na saizi ya ujumbe iliyowekwa kwa idadi ya ka ili usome pamoja na 2. Kumbuka kuwa kitufe cha kusoma / kuandika haijalishi kwani kusoma kutafanywa bila kujali. Takwimu zilizorejeshwa zitaanza katika eneo la pili kwenye bafa ya ujumbe. Mara tu data ikisomwa ndani, inabadilishwa ili kuonyeshwa kwenye Port Expander na kuandikwa ka moja kwa wakati na kupumzika kati ya maadili. Mwishowe, taa za Port Expander zimezimwa. Wanaandika kwa Expander Port ni sawa na kile kilichofanyika katika mifano ya awali. Kwa kujifurahisha, unaweza kutengua taarifa ya #fafanua DEBUG kama ilivyo hapo juu na uone mwangaza mwingi wa taa za LED. Pamoja na msisimko baada ya jaribio lingine la mafanikio, wacha tuende kwa ATmega168 na EEPROM. Badilisha saraka yako ya kazi kuwa EEPROM chini ya TWI I2C. Tumia faili ya kutengeneza kukusanya na kupakua TWI_I2C_EEPROM.c. Kumbuka kuwa faili za dereva za I2C zinafanana na zile tulizotumia mapema kwa PCA8574A. Ili kujaribu programu hiyo, katisha ATtiny2313 na unganisha ATmega168. Acha basi la I2C lililounganishwa na Ram na uongeze nguvu. Matokeo ni tofauti kwani sasa tunaandika na kusoma data zaidi. LED 1 kwenye PD7 inapaswa kupepesa wakati wa kuanzisha. Bonyeza kitufe na data itasomwa nyuma kutoka kwa kumbukumbu na kuonyeshwa. Taa zilizo kwenye PCA8574 zinapaswa kufululiza mlolongo ufuatao: P1, P0 & P2, (zote zimezimwa), P0 & P1, P1 & P2. Hatimaye LED za Bandari zinapaswa kuzima. Bonyeza kitufe tena kurudia hii. Oh, lakini subiri, unasema. Je! Mpango huu sio wa EEPROM? Kwa kuwa tunapata kifaa cha kumbukumbu kwenye anwani ile ile ya I2C, programu hiyo hiyo inafanya kazi kwa Ram na EEPROM. Weka nguvu na usonge SDA na SCL kutoka kwa Ram kwenda EEPROM na uendeshe programu tena. Inapaswa kufanya kazi sawa sawa. Kumbuka kuwa EEPROM na Ram hawawezi kushikamana na basi ya I2C kwa wakati mmoja kwani wanashiriki anwani moja. (Wajanja kati yenu wanaweza kufikiria kubadilisha vipande vya anwani vinavyoweza kupangwa kwenye Ram, lakini hiyo bado haitafanya kazi. 24C16 hutumia eneo lote la anwani ambazo zinaweza kupangiliwa kwa Ram.) Sawa, wacha tuangalie programu hii ya mwisho.. Fungua TWI_I2C_EEPROM.c. Jambo la kwanza kugundua ni kwamba nimeonyesha jinsi ya kushughulikia 24C16 EEPROM kamili. Inaweza kupatikana kwa vipande vya baiti 256 kwa anwani 8 tofauti za watumwa za I2C. Tazama jinsi MEMORY_ADDR inavyofafanuliwa kama anwani ya kuanzia 50 hexadecimal; ndio sababu Ram alifanya kazi. Ikiwa unataka kufikia vizuizi vingine vya 24C16, basi tumia anwani zingine kama nilivyoonyesha. Angalia jinsi nilivyoanzisha ili kuandika kumbukumbu. Kwanza anwani ya mtumwa na seti ya kusoma / kuandika imewekwa kwenye bafa, kisha anwani ya kuanzia 00, halafu ka 16 za data. Kazi TWI_Start_Read_Write inaitwa kuandika data (kama hapo awali) na saizi ya ujumbe imewekwa hadi 18. Wakati kitufe kinabanwa, tunatumia TWI_Start_Random_Read na TWI_Read_Data_From_Buffer kusoma data nyuma. Kila baiti ya tatu inaonyeshwa kwenye LED za Kupanua Port. Mwishowe, taa za LED zimezimwa ili kusubiri kitufe cha kifungo kinachofuata. Unaweza kujiuliza kwa nini nilichagua kuandika ka 16. Ukisoma karatasi ya data kwa uangalifu, utaona kuwa 24C16 hufanya mzunguko wa kuandika wakati wowote inapokea kaiti 16 hata kama ka zaidi zinatumwa. Kwa hivyo hiyo ilionekana kama nambari nzuri ya kutumia. Ikiwa unachagua kuongeza hii, itabidi ubadilishe saizi ya MESSAGEBUF_SIZE. Itabidi pia ubadilishe thamani TWI_BUFFER_SIZE katika TWI_Master.h. Hii ni kwa sababu dereva ananakili data kutoka kwa bafa ya ujumbe kwa matumizi ya utaratibu wa huduma wa kukatiza. Hongera! Sasa uko tayari kutumia basi ya I2C katika miradi yako mwenyewe!

Hatua ya 7: Rasilimali za Wavuti

Hapa kuna viungo vya hifadhidata za sehemu zinazotumiwa kwa majaribio. Kwa kweli unapaswa kupata hizi ikiwa haupati kitu kingine chochote. Port ExpanderRamEEPROM Kuwa muundaji wa I2C, NXP (Philips) ina tani ya vitu vizuri. (Wanapenda kutumia mabano ya mraba katika URL zao, kwa hivyo siwezi kuwajumuisha hapa vizuri. Samahani.] Ili kufika kwenye eneo la I2C, chagua Kiolesura kutoka kwenye orodha ya Bidhaa. Utaweza kufika kwenye wavuti yao ya I2C na ufikiaji wa lahajedwali zote na vidokezo vya programu wanazotoa. Maelezo ya basi ya I2C na maelezo ya kiufundi haswa hapa. Pata hati za data za ATtiny2313 na ATmega168 (vitabu vya data?) kutoka Atmel. Vidokezo vya maombi ya Atmel viko hapa. Angalia AVR310 na AVR315. Kunyakua nambari pia. Angalia hapa kwa vitu vingi zaidi vya I2C.

Hatua ya 8: Vidokezo vya Geeks

Kwa geek wa kweli ambaye anataka kujua maelezo, hapa kuna mambo ya kuzingatia ikiwa ukiangalia Vidokezo vya Programu za Atmel na nambari ya dereva: - Njia ya kushughulikia na kuagiza kifaa cha I2C sio sehemu ya maelezo! Nyingine zaidi ya anwani ya mtumwa na kusoma / kuandika kidogo, amri, njia, nk hazijainishwa na ni maalum kwa kifaa fulani. Ili kuweka wazi hii, kumbuka kuwa mpango uliotumiwa katika mfano wa Atmel unatumika tu kwa mfano huo, na ni mzuri sana sio wa kawaida. - Utekelezaji wa USI unatofautiana na utekelezaji wa TWI kwa njia kadhaa muhimu. + Pamoja na USI, saa hutolewa na programu; na TWI hutolewa na Jenereta ya Kiwango cha Bit. + Njia ya USI haitumii kuingiliwa; TWI hufanya. Hii inafanya akili fulani kwani familia ya Mega (inayotumia TWI) inaweza kuwa ikifanya vitu vingine vingi na haipaswi kuunganishwa na uhamishaji wa I2C. Toleo linaloendeshwa kwa usumbufu kwa USI hakika linawezekana, halijatekelezwa katika Agizo hili. + Vifaa vya USI havijaboreshwa kwa I2C na inaweza tu kushughulikia uhamishaji kidogo wa 8. Hii inamaanisha kuwa uhamishaji mbili unahitajika kutuma kidogo ya tisa (iwe NACK au ACK). Vifaa vya TWI hushughulikia hii moja kwa moja. Hii inafanya utekelezaji wa dereva wa USI kuwa ngumu zaidi. + Kugundua kosa kwa TWI kunashughulikiwa kwenye vifaa. USI inahitaji utunzaji katika programu ambayo inachanganya mambo kwa kiasi fulani. Vifaa vya TWI hudhibiti usanidi wa bandari moja kwa moja. Vifaa vya USI vinahitaji kwamba bits za bandari zisanidiwe kabla bandari itumike. Utaona hii katika utaratibu wa Master_Initialize kwa USI.- Atmel anadai inawezekana kutumia vivutio vya bandari ya AVR kwa vuta nikuzi za basi za I2C. Sijagundua njia ya kufanya njia hiyo ifanye kazi. Kutumia vipinzani viwili vya nje inaonekana kama mpango mzuri sana, kwa hivyo sikutumia muda mwingi juu ya hii.

Ilipendekeza: