Përmbajtje:

Autobusi I2C për ATtiny dhe ATmega: 8 hapa
Autobusi I2C për ATtiny dhe ATmega: 8 hapa

Video: Autobusi I2C për ATtiny dhe ATmega: 8 hapa

Video: Autobusi I2C për ATtiny dhe ATmega: 8 hapa
Video: මිලියන 2.79 බලපු Amazing cunducter😅😅in privet bus වෝට ෆෝල්ස් කිව්වා නැග්ගා💪💪💪👍🏆🎵 #automobile #funny 2024, Korrik
Anonim
Autobusi I2C për ATtiny dhe ATmega
Autobusi I2C për ATtiny dhe ATmega

Unë i dua mikrokontrolluesit Atmel AVR! Që nga ndërtimi i Sistemit të Zhvillimit të Ghetos të përshkruar në këtë Udhëzues, nuk kam përfunduar argëtimin duke eksperimentuar me AVR ATtiny2313 dhe ATmega168 në veçanti. Unë madje shkova aq larg sa të shkruaja një Udhëzues për përdorimin e çelsave si hyrje dhe e shtriva konceptin e Sistemit të Zhvillimit të Ghetos në CPLD. Gjatë një projekti të fundit, më duheshin disa ndërprerës për vendosjen e vlerave të kontrollit. AVR -të nuk kishin mjaft kunja I/O, kështu që më duhej të mendoja për diçka. Mund të kisha provuar një sistem kompleks hyrës me tastierë dhe ekran, por ATtiny2313 do të kishte mbaruar burimet. Për fat të mirë, Atmel ka siguruar një mënyrë për të zgjidhur këtë problem duke përfshirë një ndërfaqe që mund të lidhet me patate të skuqura shtesë (të tilla si kujtesa ose portat I/O) me një ndërfaqe të thjeshtë me dy tela. That'sshtë e drejtë, duke përdorur vetëm dy kunja I/O në një AVR ne mund të hyjmë në shumë kunja shtesë I/O, dhe burime të tjera gjithashtu. Kjo ndërfaqe me dy tela njihet zyrtarisht si autobusi i Qarkut të Integruar, ose thjesht autobusi I2C dhe u shpik nga NXP kur ishte ende Gjysmëpërçuesit Philips. Nëse po e lexoni këtë Instructable atëherë me siguri keni dëgjuar për autobusin I2C dhe madje mund ta keni përdorur atë në një PIC ose mikrokontrollues tjetër. Ndërsa konceptualisht shumë e thjeshtë, dhe e mbështetur nga burimet e harduerit në AVR, drejtuesit e softuerit janë ende të nevojshëm për të përdorur autobusin I2C. Atmel siguron Shënime Aplikimi (shiko Burimet më vonë në këtë Udhëzues), por këto janë të paplota dhe nuk tregojnë asnjë shembull përtej komunikimit me një pajisje tjetër AVR. Nuk është qëllimi i këtij Udhëzuesi që të mësojë këdo se si të krijojë drejtues I2C për AVR. Përkundrazi, unë do të ofroj versione të zgjeruara të drejtuesve të Atmel për pajisjet ATtiny2313 dhe ATmega168, do të shpjegoj kërkesat dhe kufizimet që zbatohen gjatë përdorimit të tyre, dhe do t'ju tregoj shembuj pune të pajisjeve I2C. Pasi të punoni me këtë Instructable, do të jeni në gjendje të përdorni autobusin I2C me sukses në projektet tuaja AVR. Natyrisht, ju mund të injoroni drejtuesit ose të vegjël ose MEGA nëse jeni të interesuar vetëm për njërën prej tyre. Për ata që janë të interesuar të mësojnë më shumë rreth autobusit I2C, unë do të siguroj lidhje me materialin e duhur.

Hapi 1: Çfarë është e gjithë kjo gjë I2C Gjithsesi?

Çfarë është e gjithë kjo gjë I2C Gjithsesi?
Çfarë është e gjithë kjo gjë I2C Gjithsesi?
Çfarë është e gjithë kjo gjë I2C Gjithsesi?
Çfarë është e gjithë kjo gjë I2C Gjithsesi?
Çfarë është e gjithë kjo gjë I2C Gjithsesi?
Çfarë është e gjithë kjo gjë I2C Gjithsesi?
Çfarë është e gjithë kjo gjë I2C Gjithsesi?
Çfarë është e gjithë kjo gjë I2C Gjithsesi?

Autobusi I2C është një lidhje e thjeshtë me dy tela që mund të lidhë pajisje të shumta së bashku dhe t'i lejojë ata të shkëmbejnë të dhëna. Në formën e tij më të thjeshtë ekziston një pajisje kryesore që komunikon me pajisje të shumta skllevër. Të gjitha pajisjet janë të lidhura paralelisht me dy telat e autobusit I2C. Të dy telat njihen si SCL dhe SDA. SCL është linja e orës dhe kontrollohet nga pajisja kryesore. SDA është linja e të dhënave me dy drejtime. Për të transferuar të dhënat, masteri dërgon një adresë skllave të kombinuar me një flamur leximi/shkrimi një bit. Nëse dëshironi të shkruani, masteri do të vazhdojë t'i dërgojë të dhëna skllavit të adresuar. Nëse kërkohet një lexim, skllavi do të përgjigjet me të dhëna. Për të koordinuar transaksionet, linjat SCL dhe SDA manipulohen nga masteri dhe skllavi për të sinjalizuar disa kushte. Këto përfshijnë START, STOP, ACK (njohje) dhe NAK (pa njohje). Detajet e këtyre kushteve merren nga drejtuesit. Adhuruesit e vërtetë mes jush mund të mësojnë të gjitha detajet në lidhjet e dhëna në fund të këtij Udhëzuesi. Kërkesat elektrike janë goxha të thjeshta. Mjeshtri dhe skllevërit duhet të përdorin të njëjtin nivel për Vcc, bazat duhet të jenë të lidhura dhe linjat SCL dhe SDA duhet të tërhiqen deri në Vcc. Vlera e rezistencave tërheqëse përcaktohet saktësisht nga një llogaritje e bazuar në kapacitetin e përgjithshëm në autobus, por praktikisht mund të jetë pothuajse çdo vlerë midis 1.8K dhe 10K. Filloj me 5.1K dhe përdor vlera më të ulëta derisa të funksionojë. Kjo zakonisht nuk është një çështje nëse nuk keni shumë pajisje ose gjatësi të gjatë tela midis pajisjeve. Shkalla nominale e të dhënave në autobusin I2C është 100Kbits/sekondë. Tarifat prej 400Kbit/sekondë, 1Mbit/sekondë dhe më gjerë janë gjithashtu të mundshme, por nuk mbështeten nga drejtuesit në këtë Udhëzues. Të gjitha pajisjet I2C do të punojnë me 100Kbits/sekondë. ATtiny2313 dhe ATmega168 secili zbatojnë autobusin I2C ndryshe. ATtiny2313 përdor harduerin e Ndërfaqes Seriale Universale (USI) - i cili gjithashtu mund të përdoret për autobusin SPI. ATmega168 ka kushtuar pajisje për autobusin I2C të njohur si Ndërfaqja me Dy Tela (TWI). Pasi të shkruhen drejtuesit, këto dallime janë kryesisht transparente për përdoruesit. Një ndryshim domethënës është në softuer: Shoferi ATmega168 I2C është ndërprerë, ndërsa ai për ATtiny2313 nuk është. Kjo do të thotë që një program ATmega168 nuk duhet të presë që të ndodhin transferimet e të dhënave I2C, por vetëm duhet të presë para se të fillojë një transferim tjetër, ose derisa të mbërrijnë të dhënat nga një operacion leximi. Shembujt dhe diskutimet që duhen ndjekur duhet ta bëjnë këtë të qartë. Adresat I2C janë 7 bit të gjata, kështu që deri në 127 pajisje mund të jenë në autobus nëse secila ka një adresë unike. Siç tregohet në figurë, kjo adresë 7 bitësh zhvendoset majtas një bit dhe biti më pak i rëndësishëm përdoret për të shënuar leximin ose shkrimin e pajisjes në adresë. Kështu adresa e plotë e skllavit është një bajt 8 bit. Adresa aktuale përcaktohet pjesërisht brenda pajisjes dhe nuk mund të ndryshohet (4 bitët më domethënës), dhe pjesërisht përcaktohet nga bitët që mund të lidhen me kunjat e pajisjes (3 bite më pak të rëndësishme) që mund të lidhen lartë ose ulët për tu vendosur një adresë të veçantë. Tingëllon konfuze, por një shembull do ta bëjë të qartë këtë. Fleta e të dhënave PCA8574A tregon se katër pjesët më domethënëse të adresës I2C do të jenë gjithmonë 0111. Tre bitët e ardhshëm përcaktohen nga cilësimet në kunjat AD0, AD1 dhe AD2. Këto kunja mund të lidhen me tokën ose me furnizimin me tension pozitiv (5 volt) për të përfaqësuar përkatësisht 0 ose 1. Pra, diapazoni i adresave të mundshme është 38 deri në 3F heksadecimal, siç tregohet në figurën tjetër nga fleta e të dhënave PCA8574. Pra, duke ndryshuar cilësimet e bitit të adresës, deri në 8 PCA8574A mund të jenë në autobusin I2C në të njëjtën kohë. Secili do t'i përgjigjet vetëm adresës së tij specifike të skllavit. Nëse nevojiten edhe më shumë porte I/O, PCA8574 mund të përdoret. Dallimi i vetëm midis PCA8574 dhe PCA8574A është se diapazoni i adresave të skllevërve I2C të PCA8574 është 20 deri në 27 heksadecimal. Përcaktimi i adresës së një pajisjeje të caktuar mund të jetë konfuze pasi disa fletë të dhënash e konsiderojnë bitin e leximit/shkrimit si pjesë të adresë. Lexoni me kujdes fletën e të dhënave dhe mbani në mend se adresa e skllavit do të jetë e gjatë 7 bit. Bit -i i leximit/shkrimit duhet të trajtohet veçmas. Përsëri, një shembull do të ndihmojë. Fleta e të dhënave për 24C16 EEPROM me të cilën do të eksperimentojmë thotë se katër bitët e parë (më domethënës) të adresës së skllavit janë 1010. Tre bitët e ardhshëm mund të përcaktohen nga A0, A1 dhe A2; por vini re se fleta e të dhënave mbulon gjithashtu 24C01 deri në 24C08 të cilat janë EEPROM të madhësisë më të vogël. Figura nga fleta e të dhënave tregon se cilësimet e këtyre biteve të adresës injorohen me rritjen e madhësisë dhe injorohen plotësisht për 24C16. Kjo do të thotë, tre bitët e fundit nuk kanë rëndësi dhe 24C16 me të vërtetë përdor të gjitha adresat e skllevërve I2C 50 deri në 57 heksadecimal. Gama e adresave të skllevërve në të vërtetë do të adresojë seksione të ndryshme brenda 24C16. 256 bajtët e parë janë në adresën 50h, 256 të tjera në 51h, dhe kështu me radhë deri në 256 të fundit në 57h - për një total prej 2K bajtësh. Meqenëse adresa e RAM -it PCF8570 me të cilën ne gjithashtu eksperimentojmë është në këtë gamë, 24C16 dhe PCF8570 nuk mund të përdoren së bashku.

Hapi 2: Porositni disa pajisje I2C

Tani që dini pak për Autobusin I2C dhe doni ta përdorni, pse të mos porositni disa pajisje I2C për të eksperimentuar tani, në mënyrë që ato të jenë në rrugën tuaj te ju ndërsa jeni duke e përgatitur softuerin? Pajisjet e përshtatshme përfshijnë një I/ O Zgjeruesi i Ndërfaqes (i preferuari im), një Ram Static dhe një EEPROM. Ka shumë më tepër, por këto janë një fillim i shkëlqyeshëm. Procesorët AVR që do të përdorim janë ATtiny2313 dhe Atmega168 (të përdorur në Arduino). Nëse jeni i ri në këto, atëherë hidhini një sy këtij Udhëzuesi të mrekullueshëm për të mësuar rreth tyre dhe për të ndërtuar Sistemin tuaj të Zhvillimit të Ghetos. Skema e ATmega168 në Instructable aktuale tregon se si të zbatohet Sistemi i Zhvillimit Ghetto për këtë procesor. Kablloja e portit paralel është e njëjtë me atë për ATtiny2313. (Unë nuk e kam provuar versionin USB të Sistemit të Zhvillimit Ghetto, kështu që nuk jam i sigurt se si arrihet autobusi I2C në të. E njëjta gjë për Arduino.) Këtu janë numrat e pjesëve të Digikey. Port Expander: 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

Hapi 3: Drejtuesit e I2C

Këtu janë përshkrimet e funksioneve të drejtuesit për autobusin I2C. Këto u zhvilluan duke përdorur Shënimet e Aplikacioneve Atmel për fillestarët. Unë nuk mund ta kisha bërë këtë pa to si një bazë për të ndërtuar. Zhvillimi u bë duke përdorur WinAVR dhe përpiluesin gcc C. Kufizimet e normës së orës përshkruhen më poshtë për secilin procesor. Meqenëse nuk jam në gjendje të testoj të gjitha kombinimet e mundshme të shijes së procesorit / orës, unë thjesht do t'i përmbahem asaj që në të vërtetë mund të testoj dhe të përpiqem të tregoj kufizimet dhe kufizimet. Këtu janë funksionet e drejtuesit dhe si t'i përdorni ato. Ju lutemi shikoni shembujt për më shumë detaje dhe për të parë funksionet në përdorim në programet e plota. Për ATtiny2313: Kërkesa për Orë: Drejtuesit janë krijuar për një ritëm të orës 1MHz (norma e paracaktuar) për ATtiny2313. Nëse dëshironi të punoni me ritme të tjera, atëherë do t'ju duhet të rregulloni konstantet në drejtuesit. Më dërgoni me email nëse keni nevojë për ndihmë për ta bërë këtë. Ju gjithashtu mund të merrni disa sugjerime nga shënimet e aplikacioneve Atmel në lidhjet në Burimet Step. USI_TWI_Master_Initialise () Ky funksion inicializon harduerin USI për funksionimin e modalitetit I2C. Thirrni atë një herë në fillim të programit tuaj. Kthehet i pavlefshëm dhe nuk ka argumente. USI_TWI_Get_State_Info () Ky funksion kthen informacionin e gabimit I2C dhe përdoret nëse ndodh një gabim gjatë një transaksioni I2C. Meqenëse ky funksion kthen vetëm një kod gabimi, unë përdor funksionin TWI_Act_On_Failure_In_Last_Transmission (TWIerrorMsg) për të ndezur një LED gabimi. Kodet e gabimit përcaktohen në USI_TWI_Master.h. Ja si ta quani: TWI_Act_On_Failure_In_Last_Transmission (USI_TWI_Get_State_Info ()) USI_TWI_Start_Read_Write () Ky funksion përdoret për të lexuar dhe shkruar një bajt të vetëm në pajisjet I2C. Përdoret gjithashtu për të shkruar shumë byte. Ka 6 hapa për të përdorur këtë funksion.1) Shpallni një tampon mesazhi në programin tuaj për të mbajtur adresën e skllavit dhe bajtin e të dhënave që do të dërgohen ose merren. mesazh char pa shenjëBuf (MESSAGEBUF_SIZE); 2) Vendosni adresën e skllavit si bajti i parë në tampon. Zhvendoseni atë një bit majtas dhe OR në bitin Lexo/Shkruaj. Vini re se biti Lexo/Shkruaj do të jetë 1 për një Lexim dhe 0 për një Shkrim. Ky shembull është për një Lexo. mesazhBuf (0) = (TWI_targetSlaveAdresa << TWI_ADR_BITS) | (E VUERTET << << TWI_READ_BIT); 3) Kur bëni një Shkruani, vendosni bajtin që do të shkruhet në vendndodhjen tjetër në tampon. 4) Thirrni funksionin USI_TWI_Start_Read_Write me tamponin e mesazhit dhe madhësinë e mesazhit si argumente.temp = USI_TWI_Start_Read_Write (messageBuf, 2); 5) vlera e kthyer (temp në këtë rast) mund të testohet për të parë nëse ka ndodhur një gabim. Nëse është kështu, trajtohet siç u diskutua më lart. Shih shembujt në programet. 6) Nëse kërkohet një Leximi, leximi i bajtit do të jetë në vendin e dytë në tampon. Nëse do të shkruhen shumë bajtë (të tilla si në një pajisje kujtese), e njëjta rutinë mund të përdoret. Vendosja e tamponit dhe thirrja e rutinës janë paksa të ndryshme. Bajti i dytë në tampon do të jetë adresa fillestare e kujtesës për të shkruar. Të dhënat që do të shkruhen do të jenë në byte të mëvonshme. Madhësia e mesazhit do të jetë madhësia duke përfshirë të gjitha të dhënat e vlefshme. Pra, nëse duhen shkruar 6 bajtë, atëherë madhësia e mesazhit do të jetë 8 (adresa e skllavit + adresa e kujtesës + 6 bajt të dhënash). USI_TWI_Start_Random_Read () Ky funksion përdoret për të lexuar shumë byte nga një pajisje I2C, zakonisht është domethënës vetëm për një kujtim i një lloji. Përdorimi i kësaj rutine është shumë i ngjashëm me rutinën e mëparshme, me dy përjashtime. Vendosja e bitit Lexo/Shkruaj nuk ka rëndësi. Thirrja e kësaj rutine gjithmonë do të shkaktojë një operacion Lexo. Mesazhi Madhësia duhet të jetë 2 plus numrin e bajtëve që do të lexohen. Nëse nuk ndodhin gabime, të dhënat do të jenë në tampon duke filluar në vendndodhjen e dytë. Për ATmega168: Kërkesa e orës: drejtuesit janë krijuar për një ritëm të orës 4MHz për ATmega168. Kodi shembull tregon se si të vendosni këtë normë të orës. Nëse dëshironi të punoni me ritme të tjera, atëherë do t'ju duhet të rregulloni konstantet në drejtuesit. Më dërgoni me email nëse keni nevojë ta bëni këtë. TWI_Master_Initialise () Ky funksion inicializon harduerin TWI për funksionimin e modalitetit I2C. Thirrni atë një herë në fillim të programit tuaj. Kthehet i pavlefshëm dhe nuk ka argumente. Sigurohuni që të aktivizoni ndërprerjet duke thirrur swi () pas fillimit. TWI_Get_State_Info () Ky funksion kthen informacionin e gabimit I2C dhe përdoret nëse ndodh një gabim gjatë një transaksioni I2C. Meqenëse ky funksion kthen vetëm një kod gabimi, unë përdor funksionin TWI_Act_On_Failure_In_Last_Transmission (TWIerrorMsg) për të ndezur një LED gabimi. Kodet e gabimit janë përcaktuar në TWI_Master.h, por janë modifikuar për sinjalizim në një LED gabimi. Shikoni kodin shembull për detaje. Ja si ta quani: TWI_Act_On_Failure_In_Last_Transmission (TWI_Get_State_Info ()) Vini re se kontrollimi i gabimit bëhet duke u siguruar që transaksioni I2C është i plotë (funksioni i përshkruar më poshtë) dhe pastaj duke testuar pak në fjalën e statusit global. TWI_Start_Read_Write () dy funksione funksionojnë njësoj si funksionet përkatëse të përshkruara më sipër, por me disa përjashtime. Ata nuk kthejnë asnjë vlerë gabimi. Leximi i të dhënave nuk transferohet në tampon. Të bësh këtë do të bëhet me funksionin e përshkruar më poshtë. Kur telefononi TWI_Start_Random_Read, mesazhiSize duhet të jetë numri i bajtëve të të dhënave të kërkuara plus një, jo dy. Shoferi I2C për ATmega168 drejtohet nga ndërprerja. Kjo do të thotë, transaksionet I2C fillojnë dhe pastaj ekzekutohen në mënyrë të pavarur ndërsa rutina kryesore vazhdon të funksionojë. Kur rutina kryesore dëshiron të dhëna nga një transaksion I2C që filloi, duhet të kontrollojë nëse të dhënat janë në dispozicion. Situata është e njëjtë me kontrollimin e gabimeve. Rutina kryesore duhet të jetë e sigurt që transaksioni I2C është i plotë para se të kontrolloni për gabime. Dy funksionet e ardhshëm përdoren për këto qëllime. TWI_Transceiver_Busy () Thirrni këtë funksion për të parë nëse një transaksion I2C është i plotë para se të kontrolloni për gabime. Programet shembull tregojnë se si ta përdorni këtë. TWI_Read_Data_From_Buffer () Thirrni këtë funksion për të transferuar të dhëna nga tamponi i marrjes së shoferit I2C në tamponin e mesazheve. Ky funksion do të sigurohet që transaksioni I2C është i plotë para se të transferoni të dhënat. Ndërsa një vlerë kthehet nga ky funksion, unë mendoj se kontrollimi i bitit të gabimit drejtpërdrejt është më i besueshëm. Ja si ta quani. Madhësia e mesazhit duhet të jetë një më e madhe se numri i biteve të të dhënave të dëshiruara. Të dhënat do të jenë në messageBuf duke filluar në vendndodhjen e dytë.temp = TWI_Read_Data_From_Buffer (messageBuf, messageSize);

Hapi 4: Le të Ndërtojmë

Le të Ndërtojmë!
Le të Ndërtojmë!
Le të Ndërtojmë!
Le të Ndërtojmë!
Le të Ndërtojmë!
Le të Ndërtojmë!
Le të Ndërtojmë!
Le të Ndërtojmë!

Filloni duke shkarkuar skedarin I2C Schematics.zip. Ju mund të dëshironi të krijoni një dosje I2C në zonën tuaj të punës për të mbajtur skemat dhe skedarët e programit shembull. Zbërtheni skemat në këtë drejtori. Do të gjeni një dosje të quajtur Skemat I2C. Hapni skedarin me emrin I2C.pdf të vogël. Kjo skemë tregon Sistemin e Zhvillimit të Ghetos ATtiny2313, dhe Zgjeruesin e Portave I/O të PCA8574A (ka kutinë e madhe të thyer rreth tij). Qarku Port Expander është ndërtuar në një dërrasë buke. Hidhini një sy fotove për të parë se si duken këto qarqe. Ato janë vërtet shumë të thjeshta. Pjesa ATtiny2313 e skemës është vetëm Sistemi i Zhvillimit të Ghetos me tre drita ndriçimi (LED1, 2 dhe 3, plus R4, 5 dhe 6) dhe një buton (S1) të lidhur me të, plus një detaje shtesë. Ky detaj është shtimi i kërcyesve (JP4, 5 dhe 6) të cilët mund të hiqen për të lejuar lidhjen e linjave SCL dhe SDA të autobusit I2C. Kërcyesit duhet të jenë në vend për programim, pastaj të hiqen në mënyrë që SCL dhe SDA të mund të lidhen. Fotografitë tregojnë kërcyesit në vend dhe të hequr. Vendosja e këtyre kërcyesve varet nga ju, ju vetëm duhet t'i vendosni ato në Sistemin tuaj të Zhvillimit të Ghetos nëse doni të përdorni autobusin I2C. Autobusi I2C duhet të shkyçet dhe kërcyesit të vendosen për programim. Vini re se ju me të vërtetë duhet të shqetësoheni për JP4 dhe JP6 për autobusin I2C. Vendoseni në JP5 nëse mendoni se ndonjëherë do të dëshironi të përdorni autobusin SPI. Breadboarding PCA8574A I/O Port Expander është shumë e thjeshtë. Siguroni lidhje Vcc (+5 volt) dhe Gnd (tokë) dhe lidhni AD0, 1 dhe 2 me tokën (e bën adresën e skllavit I2C 38 gjashtëkëndësh). Pastaj lidhni 4 drita mbyllëse dhe 4 çelsin DIP. (Nëse nuk keni ndërprerës DIP thjesht mund të përdorni tela. Lidheni me tokën ose lërini të lundrojnë për të sinjalizuar ndezur ose fikur respektivisht.) Së fundi, lidhni rezistorët tërheqës (R11 dhe 12) nga SDA dhe SCL në Vcc. Këto tregohen si 3.3K, por çdo vlerë nga 1.8K në 5.1K duhet të funksionojë (ndoshta deri në 10K, por nuk e kam provuar). Pasi të keni programuar ATtiny2313 mund të hiqni kërcyesit dhe të lidhni SDA dhe SCL për testim. Tani për ATmega168. Rrudha e vetme këtu është se ju mund të mos keni ndërtuar një Sistem Zhvillimi Ghetto për këtë procesor. Nëse është kështu, atëherë skema që unë ofroj (MEGA I2C.pdf) do t'ju tregojë se si. Ky është vetëm një zëvendësim i versionit ATtiny2313. Nëse planifikoni paraprakisht, mund të siguroheni që kablloja juaj e programimit të përshtatet me të dy sistemet. Dallimi kryesor është shtimi i C2 dhe C3. Shikoni fotografitë për vendosjen e këtyre, ato duhet të jenë shumë afër çipit; njëra prej tyre është në fakt nën çip. Këto ndihmojnë në mbajtjen e zhurmës jashtë konvertuesit analog në dixhital në veçanti. Ju nuk keni nevojë të vendosni kërcyesit nëse nuk planifikoni të përdorni autobusin SPI pasi ato nuk janë të nevojshme për autobusin I2C në këtë çip. Vini re se panoja e PCA8754A do të jetë e pandryshuar. Thjesht do të lidhni SDA dhe SCL dhe do të largoheni! Lehtë, a?

Hapi 5: Le të Kodojmë dhe Provojmë

Le të Kodojmë dhe Provojmë!
Le të Kodojmë dhe Provojmë!
Le të Kodojmë dhe Provojmë!
Le të Kodojmë dhe Provojmë!
Le të Kodojmë dhe Provojmë!
Le të Kodojmë dhe Provojmë!

Timeshtë koha për të ndërtuar drejtuesit dhe programet shembull. Ne do të fillojmë me tabelën e bukës ATtiny2313 dhe PCA8574A që sapo kemi ndërtuar. Shkarkoni skedarin I2C.zip në drejtorinë tuaj të punës I2C dhe hapeni atë. Do të keni një dosje të re të quajtur I2C. Në të do të gjeni USI I2C (për ATtiny2313) dhe TWI I2C (për ATmega168). Në USI I2C, do të gjeni dosjen I_O Port. Ajo dosje përmban kodin për programin tonë të parë shembull dhe drejtuesit USI I2C. Duke përdorur WinAVR, përpiloni dhe ngarkoni kodin në ATtiny2313. Merrni frymë thellë dhe ndizni energjinë. Ja çfarë të prisni: Me ndezjen, LED 1 në portën PD6 të ATtiny2313 pulson dy herë. Asgjë tjetër nuk do të ndodhë derisa të shtypni butonin (S1). Sa herë që shtypet butoni, çelsat lexohen dhe cilësimi i tyre do të shfaqet në LED -të e lidhur me PCA8574A. Ndryshoni vlerën e çelsave, shtypni butonin dhe LED -të duhet të ndryshojnë. Vazhdoni ta bëni këtë derisa të kapërceni emocionin e të parit që funksionon. Nëse (Zoti na ruajt!) Gjërat nuk funksionojnë siç pritej, kontrolloni me kujdes instalimet elektrike. Gabimet I2C do të sinjalizohen me ndezje në LED3 (PD4) dhe ndoshta do të thotë që ju duhet të kontrolloni që SDA dhe SCL janë të lidhura me kunjat e duhur dhe janë tërhequr lart. Nëse gjërat ende nuk funksionojnë, lexoni pjesën tjetër të këtij seksioni për të mësuar rreth korrigjimit. Tani kthehuni dhe le të hedhim një vështrim në kodin. Hapni skedarin USI_I2C_Port.c. Ky është kodi për programin shembull. (USI_TWI_Master.c dhe USI_TWI_Master.h përmbajnë drejtuesit - ju mund t'i injoroni ato nëse nuk jeni kurioz.) Përdorni shembullin për të drejtuar aplikacionet tuaja I2C. Kryesisht, programi ju tregon se si të inicializoni dhe përdorni drejtuesit e I2C, duke përfshirë cilësimin lart adresa e skllavit dhe pjesa tjetër e tamponit të mesazheve, dhe nxjerrja e të dhënave nga ajo. Ju gjithashtu do të shihni se si e zhbëj butonin dhe vendos lakun while. Ka disa detaje të programit që ia vlen të përmenden. Vini re se të dhënat nga çelsat përmbysen para se të shkruhen në LED në Port Expander. Gjithashtu vini re se portet hyrëse në Port Expander duhet të shkruhen si High për t'i bërë ato të funksionojnë siç duhet. Ato detaje përshkruhen në fletën e të dhënave PCA8574A. Gjithmonë lexoni me kujdes fletët e të dhënave! Me më shumë interes është përdorimi i korrigjimit të kushtëzuar. Pranë fillimit të skedarit të programit është deklarata // #define DEBUG dhe të spërkatur në të gjithë kodin janë deklaratat #ifdef DEBUG. Përderisa DEBUG nuk është i përcaktuar (dy pjerrësitë e bëjnë vijën një koment dhe e mbajnë atë të mos përcaktohet), kodi brenda deklaratave #ifdef to #endif nuk do të përpilohet. Por nëse gjërat nuk funksionojnë ashtu siç prisni, rikompiloni dhe rimbushni kodin me #define DEBUG pa koment. Ju do të merrni shumë më shumë ndezje të dritave LED të cilat mund t'i deshifroni për të ndjekur ekzekutimin e programit tuaj dhe t'ju ndihmojnë të gjeni saktësisht se ku gjërat shkojnë keq. Në fakt, unë ju rekomandoj ta provoni këtë vetëm për të parë se çfarë ndodh. Ajo që do të shihni është se LED 2 (në PD5) do të pulsojë me përparimin e ekzekutimit përmes programit. Vlera e lexuar nga çelsat do të pulsohet në LED 1 (PD6) para se të shfaqet në LED -et e zgjeruesit të portit. Ju duhet të jeni në gjendje të gjurmoni programin ndërsa funksionon duke përdorur këto LED. Ne do të punojmë me ATmega168 tjetër; kaloni këtë seksion nëse jeni të interesuar vetëm për ATtiny2313. Akoma me mua? Mirë Kaloni në dosjen TWI_I2C, ndryshoni drejtorinë tuaj të punës në IO_Port dhe përpiloni dhe ngarkoni TWI_I2C_Port.c në ATmega168. Shkëputni linjat SDA dhe SCL nga ATtiny2313 dhe lidheni ato me ATmega168. Lidhni fuqinë dhe tokën dhe ndizeni. Operacioni duhet të jetë i njëjtë! Luaj derisa emocionet të qetësohen, pastaj le të shikojmë kodin. Hap TWI_I2C_Port.c. Kodi është pothuajse identik me përjashtim të trajtimit të gabimeve dhe akomodimit të drejtuesve të ndërprerë. Këtu janë dallimet: Vini re se ora duhet të vendoset në 4MHz që autobusi I2C të funksionojë siç duhet. Sei (); deklarata ndez ndërprerjet pas fillimit të drejtuesve të I2C. Për të kontrolluar për gabimet, testohet një bit specifik i statusit. Gjatë një leximi, funksioni TWI_Read_Data_From_Buffer duhet të thirret për të transferuar të dhënat e lexuara në tamponin e mesazheve. Gjatë një shkrimi, ndërsa (TWI_Transceiver_Busy ()) duhet të përdoret për t'u siguruar që transferimi është i plotë para se të kontrolloni për gabime. Këto dy funksione të fundit janë përshkruar më sipër në përshkrimin e drejtuesve. Për më tepër, kodi është pothuajse i njëjtë si për ATtiny2313. DEBUG funksionon njësoj edhe nëse doni të eksperimentoni me këtë.

Hapi 6: Përdorimi i kujtesës I2C

Përdorimi i kujtesës I2C
Përdorimi i kujtesës I2C
Përdorimi i kujtesës I2C
Përdorimi i kujtesës I2C
Përdorimi i kujtesës I2C
Përdorimi i kujtesës I2C
Përdorimi i kujtesës I2C
Përdorimi i kujtesës I2C

Tani që kemi mësuar të përdorim autobusin I2C për të lexuar dhe shkruar një Zgjerues I/O Port, le të kalojmë në përdorimin e kujtimeve I2C, si RAM ashtu edhe EEPROM. Dallimi kryesor është se shumë byte mund të lexohen ose të shkruhen nga kujtimet me një komandë të vetme I2C. Për t'u bërë gati për këto eksperimente, ne duhet të modifikojmë pak harduerin dhe të ndërtojmë disa qarqe të reja në tabelën e bukës. Mbani qarkun Port Expander pasi ne do ta përdorim atë për të shfaqur disa vlera të kujtesës. Hiqni çelsat DIP nga PCA8574A dhe vendosni dritat e blinking në ato kunja. Nëse nuk keni mjaft drita ndriçimi, lëvizni ato në P4 deri P7 në P0 në P3. (Vlerat që do të shfaqen janë mjaft të vogla.) Tani shikoni skematikën I2C Ram.pdf dhe lidhni PCF8570 në tabelën e bukës. Hidhini një sy edhe fotografisë. Sigurohuni që të lidhni pin 7 me Vcc. Drejtoni telat për SDA dhe SCL nga PCA8574A. Asnjë rezistencë shtesë tërheqëse nuk kërkohet. Nëse jeni të interesuar edhe për EEPROM, ndërtoni atë qark duke përdorur I2C EEPROM.pdf për 24C16, por paralajmëroni se shembulli përdor ATmega168. Ky qark është vërtet i thjeshtë. Siç u diskutua më lart, bitet e adresës duhet të injorohen. Thjesht lidhni fuqinë dhe tokën. Mos i lidhni SDA dhe SCL vetëm pasi nuk kemi përfunduar eksperimentimin me Ram. Ne do të fillojmë eksperimentet tona të kujtesës me ATtiny2313 të lidhur me PCA8574A Port Expander dhe me PCF8570 Ram. Programi do të shkruajë disa numra në Ram, pastaj do t'i lexojë dhe do t'i shfaqë në Port Expander. Ndryshoni drejtorinë tuaj të punës në RAM nën USI I2C. Përdorni skedarin make për të përpiluar dhe shkarkuar USI_I2C_RAM.c. Vini re se skedarët e shoferit I2C janë identikë me ato që kemi përdorur më herët. Lidheni fuqinë dhe duhet të shihni një ndezje të vetme në LED 1 (PD6). Të dhënat do të shkruhen në 4 bajtët e parë të kujtesës. Shtypni butonin dhe dy bajt do të lexohen dhe shfaqen. Ju duhet të shihni një dritë LED në Port Expander (P0), një pauzë dy sekondëshe, pastaj dy drita LED (P0 dhe P1). Një pauzë tjetër dy sekondare dhe LED -të duhet të fiken. Shtypni përsëri butonin për të filluar sekuencën nga e para. Debugging është i ngjashëm me metodën e përshkruar më sipër. Le të hedhim një vështrim në kodin. Hapni USI_I2C_RAM.c. Duhet të duket shumë e ngjashme me kodin e mëparshëm. Dallimet kryesore janë detajet e leximit dhe shkrimit të kujtesës. Shikoni mënyrën se si ngarkohet tamponi i mesazheve para thirrjes që në të vërtetë shkruan. Bajti i parë është adresa e skllavit me bitin e leximit/shkrimit të vendosur në mënyrë të përshtatshme. Por bajti tjetër është adresa e kujtesës në të cilën duhet të filloni të shkruani të dhëna. Pastaj vijnë bajtët e të dhënave aktuale të cilat do të ngarkohen në mënyrë sekuenciale në memorie duke filluar në adresën që kemi specifikuar. Ne e specifikojmë madhësinë e mesazhit si 6. Pra fillojmë të shkruajmë në adresën 00 dhe shkruajmë vlerat 01, 03, 02 dhe 06 në vendet e kujtesës 00 deri 03. Për të lexuar të dhënat nga kujtesa duhet të përdorim funksionin USI_TWI_Start_Random_Read. Tamponi i mesazhit merr adresën e skllavit në bajtin e parë dhe adresën fillestare në bajtin e dytë. Pastaj thirrni funksionin me madhësinë e mesazhit të caktuar në numrin e bajtëve për të lexuar plus 2. Vini re se biti i leximit/shkrimit nuk ka rëndësi pasi leximi do të bëhet pavarësisht. Të dhënat e kthyera do të fillojnë në vendndodhjen e dytë në tamponin e mesazheve. Pasi të dhënat lexohen, ato përmbysen për t'u shfaqur në Port Expander dhe shkruhen një bajt në të njëjtën kohë me një pauzë midis vlerave. Më në fund, LED -et e Port Expander janë fikur. Shkrimet për Port Expander janë identike me ato që u bënë në shembujt e mëparshëm. Për argëtim, mund të komentoni deklaratën #define DEBUG si më sipër dhe të shihni shumë LED që vezullojnë. I skuqur nga eksitimi pas një eksperimenti tjetër të suksesshëm, le të kalojmë në ATmega168 dhe një EEPROM. Ndryshoni drejtorinë tuaj të punës në EEPROM nën TWI I2C. Përdorni skedarin make për të përpiluar dhe shkarkuar TWI_I2C_EEPROM.c. Vini re se skedarët e shoferit I2C janë identikë me ato që kemi përdorur më parë për PCA8574A. Për të testuar programin, shkëputeni ATtiny2313 dhe lidhni ATmega168. Lëreni autobusin I2C të fiksuar në Ram dhe ndizeni. Rezultatet janë të ndryshme pasi tani po shkruajmë dhe lexojmë më shumë të dhëna. LED 1 në PD7 duhet të pulsojë me fillimin. Shtypni butonin dhe të dhënat do të lexohen nga kujtesa dhe do të shfaqen. LED -të në PCA8574 duhet të pulsojnë me sekuencën e mëposhtme: P1, P0 & P2, (të gjitha të fikura), P0 & P1, P1 & P2. Më në fund LED -et e Portit duhet të fiken. Shtypni përsëri butonin për ta përsëritur këtë. Oh, por prisni, thoni ju. A nuk është ky program për EEPROM? Meqenëse po hyjmë në një pajisje kujtese në të njëjtën adresë I2C, i njëjti program funksionon si për Ram ashtu edhe për EEPROM. Fikni dhe zhvendosni SDA dhe SCL nga Ram në EEPROM dhe ekzekutoni programin përsëri. Duhet të punojë saktësisht njësoj. Vini re se EEPROM dhe Ram nuk mund të lidhen me autobusin I2C në të njëjtën kohë pasi ato ndajnë të njëjtën adresë. (Të zgjuarit mes jush mund të konsiderojnë ndryshimin e biteve të adresave të programueshme në Ram, por kjo ende nuk do të funksionojë. 24C16 përdor të gjithë bllokun e adresave që mund të programohen për Ram.) Mirë, le të shikojmë këtë program të fundit Me Hap TWI_I2C_EEPROM.c. Gjëja e parë që duhet vënë re është se unë kam treguar se si të adresoj tërësinë 24C16 EEPROM. Mund të arrihet në 256 copë bajt në 8 adresa të ndryshme skllevash I2C. Shihni se si MEMORY_ADDR është përcaktuar si adresa fillestare në 50 heksadecimal; prandaj Rami punoi. Nëse doni të hyni në blloqe të tjera të 24C16, atëherë përdorni adresat e tjera siç kam treguar. Hidhni një sy se si u krijova për të shkruar në kujtesë. Së pari adresa e skllavit me grupin e leximit/shkrimit të bitit vendoset në tampon, pastaj adresa fillestare e 00, pastaj 16 bajt të dhënash. Funksioni TWI_Start_Read_Write thirret për të shkruar të dhënat (si më parë) me madhësinë e mesazhit të vendosur në 18. Kur shtypet butoni, ne përdorim TWI_Start_Random_Read dhe TWI_Read_Data_From_Buffer për të lexuar të dhënat mbrapa. Çdo bajt i tretë shfaqet në LED -të e zgjeruesit të portit. Së fundi, LED -të janë fikur për të pritur shtypjen e butonit tjetër. Ju mund të pyesni veten pse zgjodha të shkruaj 16 bajt. Nëse e lexoni fletën e të dhënave me kujdes, do të shihni që 24C16 bën një cikël shkrimi sa herë që merr 16 bajtë edhe nëse po dërgohen më shumë bajtë. Kështu që dukej si një numër i mirë për t'u përdorur. Nëse zgjidhni ta rrisni këtë, do t'ju duhet të ndryshoni madhësinë e MESSAGEBUF_SIZE. Ju gjithashtu do të duhet të ndryshoni vlerën TWI_BUFFER_SIZE në TWI_Master.h. Kjo ndodh sepse drejtuesi kopjon të dhënat nga tamponi i mesazheve për përdorim nga rutina e shërbimit të ndërprerjes. Urime! Tani jeni gati të përdorni autobusin I2C në projektet tuaja!

Hapi 7: Burimet në internet

Këtu janë lidhjet me fletët e të dhënave për pjesët e përdorura për eksperimentet. Ju patjetër që duhet t'i merrni këto nëse nuk merrni asgjë tjetër. Port ExpanderRamEEPROM Duke qenë krijues i I2C, NXP (Philips) ka një ton gjëra të mrekullueshme. (Atyre u pëlqen të përdorin kllapa katrore në URL -të e tyre, kështu që unë nuk mund t'i përfshij siç duhet këtu. Na vjen keq.] Për të arritur në zonën I2C, zgjidhni Ndërfaqja nga lista e Produkteve. Ju do të jeni në gjendje të shkoni në faqen e tyre të I2C dhe qasje në të gjitha fletët e të dhënave dhe shënimet e aplikacioneve që ato ofrojnë. Përshkrimi i autobusit I2C dhe detajet teknike në veçanti janë këtu. Merrni fletët e të dhënave ATtiny2313 dhe ATmega168 (libra të të dhënave?) nga Atmel. Shënimet e aplikacionit Atmel janë këtu. Shikoni AVR310 dhe AVR315. Merrni kodin gjithashtu. Hidhini një sy këtu për shumë më tepër gjëra I2C.

Hapi 8: Shënime për Geeks

Për personazhin e vërtetë që dëshiron të dijë detajet, këtu janë disa gjëra që duhet të keni parasysh nëse shikoni Shënimet e Aplikacioneve Atmel dhe kodin e drejtuesit:- Metoda e adresimit dhe komandimit të një pajisjeje I2C nuk është pjesë e specifikimit! Përveç adresës së skllavit dhe bitit të leximit/shkrimit, komandat, mënyrat, etj. Nuk janë specifikuar dhe janë specifike për një pajisje të caktuar. Për ta bërë këtë shumë të qartë, vini re se skema e përdorur në shembullin Atmel vlen vetëm për atë shembull dhe është shumë jo standarde.- Zbatimi USI ndryshon nga zbatimi TWI në disa mënyra të rëndësishme. + Me USI, kohëzgjatja sigurohet nga softueri; me TWI sigurohet nga një gjenerues i shpejtësisë së bitit. + Metoda USI nuk përdor ndërprerje; TWI po. Kjo ka një kuptim të caktuar pasi familja Mega (duke përdorur TWI) mund të jetë duke bërë shumë gjëra të tjera dhe nuk duhet të pengohet nga transferimet I2C. Një version i ndërprerë për USI është sigurisht i mundur, thjesht nuk zbatohet në këtë Instructable. + Pajisja USI nuk është e optimizuar për I2C dhe mund të trajtojë vetëm transferime 8 bit. Kjo do të thotë që kërkohen dy transferime për të dërguar bitin e nëntë (ose NACK ose ACK). Pajisja TWI e trajton këtë automatikisht. Kjo e bën zbatimin e shoferit USI pak më të komplikuar. + Zbulimi i gabimeve për TWI trajtohet në pajisje. USI kërkon trajtimin e softuerit i cili i ndërlikon disi gjërat. + Pajisja TWI kontrollon drejtpërdrejt konfigurimin e portit. Pajisja USI kërkon që bitët e portit të konfigurohen para se porti të mund të përdoret. Ju do ta shihni këtë në rutinën Master_Initialize për USI.- Atmel pretendon se është e mundur të përdorni tërheqje të portave AVR për tërheqjet e autobusëve I2C. Unë nuk kam gjetur një mënyrë për ta bërë atë qasje të funksionojë. Përdorimi i dy rezistorëve të jashtëm duket si një skemë mjaft e thjeshtë, kështu që nuk kam shpenzuar shumë kohë në këtë.

Recommended: