Sadržaj:

I2C sabirnica za ATtiny i ATmega: 8 koraka
I2C sabirnica za ATtiny i ATmega: 8 koraka

Video: I2C sabirnica za ATtiny i ATmega: 8 koraka

Video: I2C sabirnica za ATtiny i ATmega: 8 koraka
Video: Работа с программатором USBAsp в Arduino IDE 2024, Srpanj
Anonim
I2C sabirnica za ATtiny i ATmega
I2C sabirnica za ATtiny i ATmega

Obožavam mikrokontrolere Atmel AVR! Od izgradnje Sistema za razvoj geta opisanog u ovom Uputu, nije mi bilo kraja zabavno eksperimentirati s AVR ATtiny2313 i ATmega168 posebno. Čak sam išao toliko daleko da sam napisao Instructable o korištenju prekidača kao ulaza i proširio koncept sustava za razvoj geta na CPLD -e. Tijekom nedavnog projekta bilo mi je potrebno nekoliko prekidača za postavljanje kontrolnih vrijednosti. AVR -ovi nisu imali dovoljno I/O pinova pa sam morao smisliti nešto. Mogao sam isprobati složeni sustav unosa s tipkovnicom i zaslonom, ali ATtiny2313 bi ostao bez resursa. Srećom, Atmel je omogućio zaobilaženje ovog problema uključivanjem sučelja koje se može povezati s dodatnim čipovima (poput memorije ili I/O portova) s jednostavnim dvožičnim sučeljem. Tako je, koristeći samo dva I/O pina na AVR -u možemo pristupiti mnogim dodatnim I/O pinovima, ali i drugim resursima. Ovo dvožilno sučelje formalno je poznato kao Inter-Integrated Circuit Bus, ili samo I2C sabirnica, a izumio ga je NXP dok je još bio Philips Semiconductors. Ako čitate ovaj Instructable, vjerojatno ste čuli za I2C sabirnicu i možda ste ga čak koristili na PIC -u ili drugom mikrokontroleru. Iako su konceptualno vrlo jednostavni i podržani hardverskim resursima na AVR -ovima, upravljački programi softvera i dalje su potrebni za korištenje I2C sabirnice. Atmel pruža bilješke o aplikacijama (pogledajte Resurse kasnije u ovoj uputi), ali one su nepotpune i ne prikazuju nikakve primjere osim komunikacije s drugim AVR uređajem. Nije svrha ovog Instructablea nikoga naučiti kako stvoriti I2C upravljačke programe za AVR -ovi. Umjesto toga, pružit ću proširene verzije upravljačkih programa Atmel za uređaje ATtiny2313 i ATmega168, objasnit ću zahtjeve i ograničenja koja se primjenjuju pri njihovoj upotrebi, a ja ću vam pokazati primjere radnih I2C uređaja. Nakon što prođete kroz ovaj Instructable, moći ćete uspješno koristiti sabirnicu I2C u svojim AVR projektima. Očito možete zanemariti upravljačke programe za male ili MEGA -e ako vas zanima samo jedan od njih. Za one koji žele saznati više o I2C sabirnici, pružit ću veze do odgovarajućeg materijala.

Korak 1: Što su uopće ove I2C stvari?

Što je uopće ovo I2C stvari?
Što je uopće ovo I2C stvari?
Što je uopće ovo I2C stvari?
Što je uopće ovo I2C stvari?
Što je uopće ovo I2C stvari?
Što je uopće ovo I2C stvari?
Što je uopće ovo I2C stvari?
Što je uopće ovo I2C stvari?

I2C sabirnica je jednostavna, dvožična veza koja može povezati više uređaja zajedno i omogućiti im razmjenu podataka. U svom najjednostavnijem obliku postoji jedan glavni uređaj koji komunicira s više slave uređaja. Svi su uređaji paralelno spojeni na dvije žice sabirnice I2C. Dvije žice poznate su kao SCL i SDA. SCL je linija sata i njime upravlja glavni uređaj. SDA je dvosmjerna podatkovna linija. Za prijenos podataka, master šalje slave adresu u kombinaciji s jednom bitnom zastavicom za čitanje/pisanje. Ako se želi upis, master će nastaviti slati podatke adresiranom podređenom uređaju. Ako se traži čitanje, rob će odgovoriti podacima. Za koordinaciju transakcija, SCL i SDA linijama upravljaju master i slave kako bi signalizirali nekoliko uvjeta. To uključuje START, STOP, ACK (potvrda) i NAK (bez potvrde). Pojedinosti o ovim uvjetima rješavaju vozači. Pravi štreberi među vama mogu naučiti sve detalje na poveznicama na kraju ovog uputstva. Električni zahtjevi su prilično jednostavni. Nadređeni i podređeni uređaji moraju koristiti istu razinu za Vcc, uzemljenje mora biti spojeno, a SCL i SDA vodovi moraju biti povučeni do Vcc. Vrijednost pull-up otpornika točno je određena proračunom na temelju ukupnog kapaciteta na sabirnici, ali praktički može biti gotovo bilo koja vrijednost između 1,8K i 10K. Počinjem s 5.1K i koristim niže vrijednosti dok ne uspije. To obično nije problem osim ako nemate puno uređaja ili dugačke žice između uređaja. Nominalna brzina prijenosa podataka na I2C sabirnici je 100Kbita/sekundi. Moguće su i brzine od 400Kbits/sekundi, 1Mbits/sekundi i više, ali ne podržavaju upravljački programi u ovom Instructable. Svi I2C uređaji radit će pri 100Kbit/s. Svaki ATtiny2313 i ATmega168 različito implementiraju I2C sabirnicu. ATtiny2313 koristi hardver Univerzalnog serijskog sučelja (USI) - koji se također može koristiti za SPI sabirnicu. ATmega168 ima namjenski hardver za I2C sabirnicu poznat kao dvožično sučelje (TWI). Nakon što su upravljački programi napisani, te su razlike uglavnom transparentne za korisnika. Jedna značajna razlika je u softveru: upravljački program ATmega168 I2C pokreće se prekidom, dok za ATtiny2313 nije. To znači da program ATmega168 ne mora čekati na prijenos I2C podataka, već samo treba pričekati prije nego započne drugi prijenos ili dok podaci ne stignu iz operacije čitanja. Primjeri i rasprava koje treba slijediti trebaju ovo pojasniti. I2C adrese dugačke su 7 bitova, pa do 127 uređaja može biti u sabirnici ako svaki ima jedinstvenu adresu. Kao što je prikazano na slici, ova 7 -bitna adresa pomaknuta je ulijevo za jedan bit, a najmanji bit se koristi za označavanje čitanja ili pisanja uređaja na adresu. Dakle, potpuna adresa slave je 8 -bitni bajt. Stvarna adresa djelomično je interno određena uređaju i ne može se promijeniti (4 najznačajnija bita), a djelomično je određena bitovima koji se mogu spojiti na pinove uređaja (3 najmanje bitna bita) koji se mogu vezati visoko ili nisko za postavljanje određenu adresu. Zvuči zbunjujuće, ali primjer će to razjasniti. Tehnički list PCA8574A pokazuje da će četiri najznačajnija bita I2C adrese uvijek biti 0111. Sljedeća tri bita određena su postavkama na pinovima AD0, AD1 i AD2. Ovi pinovi mogu biti vezani za masu ili za napajanje pozitivnim naponom (5 volti) kako bi predstavljali 0 odnosno 1. Dakle, raspon mogućih adresa je 38 do 3F heksadecimalni, kao što je prikazano na drugoj slici iz podatkovne tablice PCA8574. Dakle, promjenom postavki adresnog bita, do 8 PCA8574A može biti u isto vrijeme na sabirnici I2C. Svaki će odgovoriti samo na svoju specifičnu adresu slave. Ako je potrebno još više I/O portova, može se koristiti PCA8574. Jedina razlika između PCA8574 i PCA8574A je u tome što je raspon adresa I2C slave računala PCA8574 20 do 27 heksadecimalnih. Određivanje adrese danog uređaja može biti zbunjujuće jer neki listovi s podacima smatraju da je bit za čitanje/pisanje dio adresa. Pažljivo pročitajte tehnički list i imajte na umu da će pomoćna adresa imati 7 bita. Bit za čitanje/pisanje treba tretirati zasebno. Ponovo će vam pomoći primjer. List s podacima za 24C16 EEPROM s kojim ćemo eksperimentirati kaže da su prva (najznačajnija) četiri bita slave adrese 1010. Sljedeća tri bita mogu se odrediti pomoću A0, A1 i A2; ali imajte na umu da podatkovni list također pokriva 24C01 do 24C08 koji su manji EEPROM -ovi. Slika iz podatkovnog lista pokazuje da se postavke ovih bitova adrese zanemaruju kako se veličina povećava i potpuno se zanemaruju za 24C16. Odnosno, posljednja tri bita nisu bitna i 24C16 zaista koristi sve I2C slave adrese 50 do 57 heksadecimalnih. Raspon adresa slave će zapravo adresirati različite odjeljke unutar 24C16. Prvih 256 bajtova nalazi se na adresi 50h, sljedećih 256 u 51h, i tako do posljednjih 256 u 57h - za ukupno 2K bajta. Budući da je adresa PCF8570 RAM -a s kojim također eksperimentiramo u ovom rasponu, 24C16 i PCF8570 ne mogu se koristiti zajedno.

Korak 2: Naručite neke I2C uređaje

Sada kada znate malo o I2C sabirnici i želite je koristiti, zašto ne biste sada naručili neke I2C uređaje da eksperimentiraju kako bi mogli biti na putu dok pripremate softver? Odgovarajući uređaji uključuju I/ O Interface Expander (moj omiljeni), statički Ram i EEPROM. Ima ih još mnogo, ali ovo je sjajan početak. AVR procesori koje ćemo koristiti su ATtiny2313 i Atmega168 (koriste se u Arduinu). Ako ste tek počeli s ovim, pogledajte ovaj sjajni Instructable kako biste saznali više o njima i izgradili svoj Sustav za razvoj geta. Shema ATmega168 u ovom Instructable pokazuje kako implementirati Ghetto Development System za ovaj procesor. Kabel za paralelni priključak isti je kao i za ATtiny2313. (Nisam isprobao USB verziju Ghetto Development System -a, pa nisam siguran kako se na njoj pristupa I2C sabirnici. Isto za Arduino.) Ovdje su Digikey brojevi dijelova. Proširivač porta: IC I2C I/O PROŠIRIVAČ 568-4236-5-NDRam: IC SRAM 256X8 W/I2C 568-1071-5-NDEEPROM: IC EEPROM SERIJSKI 16K CAT24C16LI-G-ND

Korak 3: I2C upravljački programi

Ovdje su opisi funkcija upravljačkog programa za sabirnicu I2C. Oni su razvijeni pomoću Atmel Apps Notes za početak. Ne bih ovo mogao učiniti bez njih kao osnove za nadogradnju. Razvoj je obavljen pomoću WinAVR -a i gcc C kompajlera. Ograničenja brzine takta opisana su u nastavku za svaki procesor. Budući da ne mogu isprobati sve moguće kombinacije okusa procesora / brzine takta, samo ću se držati onoga što zapravo mogu testirati i pokušati naznačiti ograničenja i ograničenja. Evo funkcija upravljačkog programa i kako ih koristiti. Molimo pogledajte primjere za više pojedinosti i za prikaz funkcija koje se koriste u cjelovitim programima. Za ATtiny2313: Sat zahtjev: Upravljački programi dizajnirani su za taktu od 1MHz (zadana brzina) za ATtiny2313. Ako želite trčati drugim stopama, morat ćete prilagoditi konstante u upravljačkim programima. Pošaljite mi poruku e -poštom ako vam je potrebna pomoć za ovo. Također možete dobiti neke savjete iz bilješki Atmel aplikacija u vezama u koraku Resources. USI_TWI_Master_Initialise () Ova funkcija pokreće USI hardver za rad u I2C načinu rada. Nazovite to jednom na početku programa. Vraća void i nema argumenata. USI_TWI_Get_State_Info () Ova funkcija vraća podatke o pogrešci I2C i koristi se ako je došlo do pogreške tijekom I2C transakcije. Budući da ova funkcija vraća samo kôd pogreške, koristim funkciju TWI_Act_On_Failure_In_Last_Transmission (TWIerrorMsg) za bljeskanje LED -a za pogrešku. Kodovi pogrešaka definirani su u USI_TWI_Master.h. Evo kako to nazvati: TWI_Act_On_Failure_In_Last_Transmission (USI_TWI_Get_State_Info ()) USI_TWI_Start_Read_Write () Ova se funkcija koristi za čitanje i pisanje jednobajtnih podataka na I2C uređaje. Također se koristi za pisanje više bajtova. Postoji 6 koraka za korištenje ove funkcije.1) Deklarirajte međuspremnik poruka u svom programu za držanje slave adrese i bajt podataka za slanje ili primanje. unsigned char messageBuf (MESSAGEBUF_SIZE); 2) Stavite slave adresu kao prvi bajt u međuspremniku. Pomaknite ga za jedan bit ulijevo i ILI u bit za čitanje/pisanje. Imajte na umu da će bit za čitanje/pisanje biti 1 za čitanje i 0 za pisanje. Ovaj primjer služi za čitanje. messageBuf (0) = (TWI_targetSlaveAddress << TWI_ADR_BITS) | (ISTINITO << TWI_READ_BIT); 3) Prilikom pisanja stavite bajt za upis na sljedeće mjesto u međuspremniku. 4) Pozovite funkciju USI_TWI_Start_Read_Write s međuspremnikom za poruke i veličinom poruke kao argumente.temp = USI_TWI_Start_Read_Write (messageBuf, 2); 5) vraćena vrijednost (u ovom slučaju temp.) može se testirati da se vidi je li došlo do pogreške. Ako je tako, postupit će se kako je gore objašnjeno. Pogledajte primjere u programima.6) Ako je zatraženo čitanje, očitavanje bajta bit će na drugom mjestu u međuspremniku. Ako se želi zapisati više bajtova (na primjer na memorijski uređaj), može se koristiti ista rutina. Postavljanje međuspremnika i pozivanje rutine su nešto drugačiji. Drugi bajt u međuspremniku bit će početna memorijska adresa na koju se može pisati. Podaci koji se upisuju bit će u sljedećim bajtovima. Veličina poruke bit će veličina uključujući sve važeće podatke. Dakle, ako treba zapisati 6 bajtova, tada će veličina poruke biti 8 (adresa slave + memorijska adresa + 6 bajtova podataka). USI_TWI_Start_Random_Read () Ova se funkcija koristi za čitanje više bajtova s I2C uređaja, obično ima smisla samo za nekakvo sjećanje. Korištenje ove rutine vrlo je slično prethodnoj rutini, s dvije iznimke. Postavka bita Read/Write nije bitna. Pozivanje ove rutine uvijek će uzrokovati operaciju čitanja. Poruka veličine bi trebala biti 2 plus broj bajtova za čitanje. Ako nije došlo do pogrešaka, podaci će biti u međuspremniku koji počinje na drugom mjestu. Za ATmega168: Sat Zahtjevi: upravljački programi dizajnirani su za taktu od 4MHz za ATmega168. Primjer koda pokazuje kako postaviti ovu brzinu takta. Ako želite trčati drugim stopama, morat ćete prilagoditi konstante u upravljačkim programima. Pošaljite mi e -poruku ako trebate to učiniti. TWI_Master_Initialise () Ova funkcija inicijalizira TWI hardver za rad u načinu rada I2C. Nazovite to jednom na početku programa. Vraća ništa i nema argumenata. Omogućite prekide pozivanjem swi () nakon inicijalizacije. TWI_Get_State_Info () Ova funkcija vraća informacije o pogrešci I2C i koristi se ako je došlo do pogreške tijekom I2C transakcije. Budući da ova funkcija vraća samo kôd pogreške, koristim funkciju TWI_Act_On_Failure_In_Last_Transmission (TWIerrorMsg) za bljeskanje LED -a za pogrešku. Kodovi pogrešaka definirani su u TWI_Master.h, ali su modificirani za signalizaciju na LED -u za pogrešku. Za detalje pogledajte primjer koda. Evo kako to nazvati: TWI_Act_On_Failure_In_Last_Transmission (TWI_Get_State_Info ()) Imajte na umu da se provjera pogreške vrši tako da provjerite je li I2C transakcija dovršena (dolje opisana funkcija), a zatim malo isprobajte u globalnoj riječi statusa. dvije funkcije rade isto kao i gore opisane funkcije, ali uz nekoliko iznimki. Ne vraćaju nikakve vrijednosti pogrešaka. Očitavanje podataka se ne prenosi u međuspremnik. To će biti učinjeno sa sljedećom funkcijom. Prilikom pozivanja TWI_Start_Random_Read, messageSize bi trebao biti broj zatraženih bajtova podataka plus jedan, a ne dva. Upravljački program I2C za ATmega168 upravlja se prekidom. Odnosno, I2C transakcije se pokreću, a zatim izvode neovisno dok se glavna rutina nastavlja izvršavati. Kad glavna rutina želi podatke iz I2C transakcije koju je započela, mora provjeriti jesu li podaci dostupni. Ista je situacija i s provjerom pogrešaka. Glavna rutina mora biti sigurna da je I2C transakcija dovršena prije provjere ima li pogrešaka. Sljedeće dvije funkcije koriste se u ove svrhe. TWI_Transceiver_Busy () Pozovite ovu funkciju da provjerite je li I2C transakcija dovršena prije provjere pogrešaka. Primjeri programa pokazuju kako se to koristi. TWI_Read_Data_From_Buffer () Pozovite ovu funkciju za prijenos podataka iz međuspremnika za primanje upravljačkog programa I2C u međuspremnik za poruke. Ova će se funkcija prije prijenosa podataka pobrinuti da je I2C transakcija dovršena. Dok ova funkcija vraća vrijednost, smatram da je provjera izravnog bita pogreške pouzdanija. Evo kako to nazvati. Veličina poruke treba biti za jedan veća od željenog bita podataka. Podaci će biti u messageBuf -u počevši od drugog mjesta.temp = TWI_Read_Data_From_Buffer (messageBuf, messageSize);

Korak 4: Izgradimo

Gradimo!
Gradimo!
Gradimo!
Gradimo!
Gradimo!
Gradimo!
Gradimo!
Gradimo!

Počnite preuzimanjem datoteke I2C Schematics.zip. Možda ćete htjeti stvoriti mapu I2C u svom radnom području za držanje shema i primjera programskih datoteka. Raspakirajte sheme u ovaj direktorij. Naći ćete mapu pod nazivom I2C sheme. Otvorite datoteku s imenom tiny I2C.pdf. Ova shema prikazuje ATtiny2313 Ghetto Development System i PCA8574A I/O Port Expander (ima veliki isprekidani okvir oko sebe). Krug proširivača portova izgrađen je na ploči. Pogledajte fotografije kako biste vidjeli kako ova kola izgledaju. Zaista su prilično jednostavni. Dio sheme ATtiny2313 samo je Ghetto Development System sa tri blinkajuća svjetla (LED1, 2 i 3, plus R4, 5 i 6) i gumbom (S1) priključenim na njega, plus jedan dodatni detalj. Taj detalj je dodavanje skakača (JP4, 5 i 6) koji se mogu ukloniti kako bi se omogućilo povezivanje SCL i SDA vodova I2C sabirnice. Kratkospojnici moraju biti na mjestu za programiranje, zatim uklonjeni kako bi se mogli spojiti SCL i SDA. Fotografije prikazuju skakače na mjestu i uklonjene. Postavljanje ovih skakača ovisi o vama, samo ih morate staviti na svoj Ghetto Development System ako želite koristiti I2C sabirnicu. I2C sabirnica se mora odspojiti i postaviti kratkospojnike za programiranje. Imajte na umu da vas samo treba zabrinuti JP4 i JP6 za sabirnicu I2C. Umetnite JP5 ako mislite da ćete ikada htjeti koristiti SPI sabirnicu. Borderboarding PCA8574A I/O Port Expander je vrlo jednostavan. Omogućite Vcc (+5 volti) i Gnd (uzemljenje) veze i spojite AD0, 1 i 2 na masu (čini I2C slave adresu 38 heksa). Zatim spojite 4 trepćuća svjetla i 4 DIP prekidača. (Ako nemate DIP sklopke, možete samo koristiti žice. Vežite uzemljenje ili ostavite plutajući za uključivanje ili isključivanje signala.) Na kraju, spojite navlačne otpornike (R11 i 12) sa SDA i SCL na Vcc. Oni su prikazani kao 3.3K, ali bilo koja vrijednost od 1.8K do 5.1K bi trebala funkcionirati (možda i do 10K, ali to nisam probao). Nakon što ste programirali ATtiny2313, možete ukloniti kratkospojnike i spojiti SDA i SCL na testiranje. Sada za ATmega168. Jedina bora ovdje je što možda niste izgradili Ghetto Development System za ovaj procesor. Ako je to slučaj, shema koju dajem (MEGA I2C.pdf) pokazat će vam kako. Ovo je samo permutacija verzije ATtiny2313. Ako planirate unaprijed, možete biti sigurni da će vaš programski kabel odgovarati obama sustavima. Glavna razlika je dodavanje C2 i C3. Pogledajte slike za postavljanje ovih slika, one bi trebale biti vrlo blizu čipa; jedan od njih je zapravo ispod čipa. Oni posebno pomažu u sprječavanju buke iz analogno -digitalnog pretvarača. Ne morate stavljati kratkospojnike osim ako ne namjeravate koristiti SPI sabirnicu jer nisu potrebni za I2C sabirnicu na ovom čipu. Imajte na umu da će ploča PCA8754A ostati nepromijenjena. Samo ćete spojiti SDA i SCL i otići ćete! Lako, ha?

5. korak: Kodirajmo i testirajmo

Kodirajmo i testirajmo!
Kodirajmo i testirajmo!
Kodirajmo i testirajmo!
Kodirajmo i testirajmo!
Kodirajmo i testirajmo!
Kodirajmo i testirajmo!

Vrijeme je za izradu upravljačkih programa i primjera programa. Počet ćemo s ATtiny2313 i PCA8574A ploču koju smo upravo izgradili. Preuzmite datoteku I2C.zip u svoj I2C radni direktorij i raspakirajte je. Imat ćete novu mapu pod nazivom I2C. U njemu ćete pronaći USI I2C (za ATtiny2313) i TWI I2C (za ATmega168). U USI I2C ćete pronaći mapu I_O Port. Ta mapa sadrži kôd za naš prvi primjer programa i USI I2C upravljačke programe. Pomoću WinAVR -a prevedite i učitajte kôd u ATtiny2313. Duboko udahnite i uključite napajanje. Evo što možete očekivati: Kad je napajanje uključeno, LED 1 na priključku PD6 ATtiny2313 trepće dvaput. Ništa se drugo neće dogoditi dok ne pritisnete gumb (S1). Svaki put kada se pritisne tipka, prekidači se čitaju i njihova će se postavka prikazati na LED diodama spojenim na PCA8574A. Promijenite vrijednost prekidača, pritisnite gumb i LED diode bi se trebale promijeniti. Nastavite to raditi sve dok ne prebolite uzbuđenje vidjevši kako djeluje. Ako (ne daj Bože!) Stvari ne rade kako se očekivalo, pažljivo provjerite ožičenje. I2C pogreške signalizirat će se treptanjem LED3 (PD4) i vjerojatno znače da morate provjeriti jesu li SDA i SCL spojene na ispravne pinove i jesu li ispravno izvučene. Ako stvari i dalje ne funkcioniraju, pročitajte ostatak ovog odjeljka kako biste saznali o otklanjanju pogrešaka. Sada se vratite i pogledajmo kod. Otvorite datoteku USI_I2C_Port.c. Ovo je kôd za primjer programa. (USI_TWI_Master.c i USI_TWI_Master.h sadrže upravljačke programe - možete ih zanemariti ako niste znatiželjni.) Koristite primjer za usmjeravanje vlastitih I2C aplikacija. Uglavnom, program vam pokazuje kako pokrenuti i koristiti upravljačke programe za I2C, uključujući postavke gore adresu slave i ostatak međuspremnika za poruke te izvlačenje podataka iz nje. Također ćete vidjeti kako odbacujem gumb i postavljam while petlju. Nekoliko je detalja programa vrijednih spomena. Imajte na umu da su podaci sa sklopki obrnuti prije nego što se upišu u LED diode na proširivaču portova. Također imajte na umu da ulazni priključci na proširivaču portova moraju biti napisani kao visoki kako bi ispravno radili. Ti su detalji opisani u podatkovnom listu PCA8574A. Uvijek pažljivo pročitajte podatkovne listove! Više je zanimljivo korištenje uvjetnog otklanjanja pogrešaka. Blizu početka programske datoteke nalazi se naredba // #define DEBUG, a po kodu su razasute #ifdef DEBUG naredbe. Sve dok DEBUG nije definiran (dvije kose crte čine redak komentarom i sprječavaju njegovo definiranje), kôd unutar naredbi #ifdef do #endif neće se sastaviti. Ali ako stvari ne funkcioniraju kako ste očekivali, ponovno kompajlirajte i ponovno učitajte kôd s #define DEBUG unmented. Dobit ćete puno više treptaja na LED -ovima koje možete dekodirati kako biste pratili izvršavanje vašeg programa i pomoći vam u pronalaženju gdje točno stvari idu po zlu. Zapravo, preporučujem da pokušate ovo samo da vidite što se događa. Ono što ćete vidjeti je da će LED 2 (na PD5) treptati kako napreduje izvršavanje programa. Vrijednost očitana sa sklopki trepćut će na LED 1 (PD6) prije nego što se prikaže na LED diodama za proširenje portova. Pomoću ovih LED dioda trebali biste moći pratiti program kako radi. Sljedeći ćemo rad s ATmega168; preskočite ovaj odjeljak ako vas zanima samo ATtiny2313. Još uvijek sa mnom? Dobro. Idite u mapu TWI_I2C, promijenite svoj radni direktorij u IO_Port te prevedite i učitajte TWI_I2C_Port.c u ATmega168. Odvojite SDA i SCL linije od ATtiny2313 i spojite ih na ATmega168. Priključite napajanje i uzemljite i uključite. Operacija bi trebala biti ista! Igrajte dok se uzbuđenje ne smiri, a zatim pogledajmo kod. Otvorite TWI_I2C_Port.c. Kôd je gotovo identičan, osim za rukovanje pogreškama i prilagođavanje upravljačkih programa s prekidima. Evo razlika: Imajte na umu da sat mora biti postavljen na 4MHz da bi I2C sabirnica radila ispravno. Sei (); naredba uključuje prekide nakon inicijalizacije upravljačkih programa I2C. Za provjeru pogrešaka testira se određeni statusni bit. Tijekom čitanja mora se pozvati funkcija TWI_Read_Data_From_Buffer radi prijenosa pročitanih podataka u međuspremnik za poruke. Tijekom pisanja mora se upotrijebiti while (TWI_Transceiver_Busy ()) kako biste bili sigurni da je prijenos dovršen prije provjere pogrešaka. Ove posljednje dvije funkcije opisane su gore u opisu upravljačkih programa. Osim toga, kod je prilično isti kao i za ATtiny2313. DEBUG radi isto i ako želite eksperimentirati s tim.

Korak 6: Korištenje I2C memorije

Korištenje I2C memorije
Korištenje I2C memorije
Korištenje I2C memorije
Korištenje I2C memorije
Korištenje I2C memorije
Korištenje I2C memorije
Korištenje I2C memorije
Korištenje I2C memorije

Sada kada smo naučili koristiti I2C sabirnicu za čitanje i pisanje I/O Port Expander -a, prijeđimo na korištenje I2C memorije, RAM -a i EEPROM -a. Glavna razlika je u tome što se više bajtova može čitati ili pisati iz memorije s jednom I2C naredbom. Da bismo se pripremili za ove pokuse, moramo malo izmijeniti hardver i izgraditi nekoliko novih sklopova na ploči. Zadržite krug Port Expander jer ćemo ga koristiti za prikaz nekih memorijskih vrijednosti. Uklonite DIP prekidače s PCA8574A i stavite bljeskalicu na te igle. Ako nemate dovoljno trepćućih svjetala, pomaknite one na P4 preko P7 na P0 do P3. (Vrijednosti koje se prikazuju dovoljno su male.) Sada pogledajte shematski I2C Ram.pdf i spojite PCF8570 na matičnu ploču. Pogledajte i sliku. Priključite pin 7 na Vcc. Vodite žice za SDA i SCL s PCA8574A. Nisu potrebni dodatni pull-up otpornici. Ako ste i vi zainteresirani za EEPROM, izgradite taj krug također koristeći I2C EEPROM.pdf za 24C16, ali upozorite da primjer koristi ATmega168. Ovaj je krug doista jednostavan. Kao što je gore rečeno, adresne bitove treba zanemariti. Samo priključite napajanje i uzemljite. Nemojte još spajati SDA i SCL budući da nismo završili eksperimentiranje s Ramom. Započet ćemo naše memorijske pokuse s ATtiny2313 spojenim na PCA8574A Port Expander i na PCF8570 Ram. Program će zapisati neke brojeve u Ram, zatim ih pročitati natrag i prikazati na Port Expanderu. Promijenite svoj radni direktorij u RAM pod USI I2C. Upotrijebite make datoteku za sastavljanje i preuzimanje USI_I2C_RAM.c. Imajte na umu da su datoteke upravljačkog programa I2C identične onima koje smo ranije koristili. Priključite napajanje i trebali biste vidjeti jedan treptaj LED 1 (PD6). Podaci će se zapisati u prva 4 bajta memorije. Pritisnite gumb i dva će se bajta pročitati i prikazati. Trebali biste vidjeti jedno LED svjetlo na ekspanderu porta (P0), pauzu od dvije sekunde, zatim dvije LED diode (P0 i P1). Još dvije sekunde pauze i LED diode bi se trebale isključiti. Ponovno pritisnite gumb za početak niza. Otklanjanje pogrešaka slično je gore opisanoj metodi. Pogledajmo kod. Otvorite USI_I2C_RAM.c. Trebao bi izgledati prilično slično prethodnom kodu. Glavne razlike su detalji čitanja i pisanja memorije. Pogledajte način učitavanja međuspremnika za poruke prije poziva koji zapravo vrši pisanje. Prvi bajt je adresa slave s odgovarajućim bitom za čitanje/pisanje. Sljedeći bajt je memorijska adresa na kojoj možete početi pisati podatke. Zatim dolaze stvarni podatkovni bajtovi koji će se sekvencijalno učitavati u memoriju počevši od adrese koju smo naveli. Određujemo veličinu poruke kao 6. Pa počinjemo pisati na adresi 00 i upisujemo vrijednosti 01, 03, 02 i 06 u memorijske lokacije od 00 do 03. Da bismo podatke vratili iz memorije, moramo koristiti funkciju USI_TWI_Start_Random_Read. Međuspremnik poruka prima pomoćnu adresu u prvom bajtu, a početnu adresu u drugom bajtu. Zatim pozovite funkciju s veličinom poruke postavljenom na broj bajtova za čitanje plus 2. Imajte na umu da bit za čitanje/pisanje nije bitan jer će se čitanje obaviti bez obzira na to. Vraćeni podaci počet će na drugom mjestu u međuspremniku za poruke. Nakon što se podaci pročitaju, oni se obrću za prikaz na Port Expanderu i zapisuju im se jedan po jedan bajt s pauzom između vrijednosti. Konačno, LED diode za proširenje portova su isključene. Zapisi u Port Expander identični su onome što je učinjeno u prethodnim primjerima. Za zabavu, možete dekomentirati #define DEBUG izjavu kao gore i vidjeti mnogo treperećih LED dioda. Iscrpljeni od uzbuđenja nakon još jednog uspješnog eksperimenta, prijeđimo na ATmega168 i EEPROM. Promijenite svoj radni imenik u EEPROM pod TWI I2C. Upotrijebite make datoteku za sastavljanje i preuzimanje TWI_I2C_EEPROM.c. Imajte na umu da su datoteke upravljačkog programa I2C identične onima koje smo ranije koristili za PCA8574A. Da biste testirali program, odspojite ATtiny2313 i spojite ATmega168. Ostavite I2C autobus spojen na Ram i uključite ga. Rezultati su drugačiji jer sada pišemo i čitamo više podataka. LED 1 na PD7 trebao bi treptati pri inicijalizaciji. Pritisnite gumb i podaci će se pročitati iz memorije i prikazati. LED diode na PCA8574 trebale bi treptati u sljedećem slijedu: P1, P0 i P2, (sve isključeno), P0 i P1, P1 i P2. Konačno bi se sve LED diode portova trebale ugasiti. Ponovno pritisnite gumb da biste ovo ponovili. Oh, ali čekajte, kažete. Nije li ovaj program za EEPROM? Budući da pristupamo memorijskom uređaju na istoj I2C adresi, isti program radi i za Ram i za EEPROM. Isključite i premjestite SDA i SCL iz RAM -a u EEPROM i ponovno pokrenite program. To bi trebalo raditi potpuno isto. Imajte na umu da se EEPROM i Ram ne mogu istovremeno spojiti na I2C sabirnicu budući da dijele istu adresu. (Pametniji među vama mogu razmisliti o promjeni programabilnih bitova adrese na Ramu, ali to i dalje neće raditi. 24C16 koristi cijeli blok adresa koji se može programirati za Ram.) U redu, pogledajmo ovaj zadnji program. Otvorite TWI_I2C_EEPROM.c. Prvo što treba primijetiti je da sam naznačio kako adresirati kompletni 24C16 EEPROM. Može mu se pristupiti u dijelovima od 256 bajtova na 8 različitih I2C slave adresa. Pogledajte kako je MEMORY_ADDR definiran kao početna adresa na 50 heksadecimalnih; zato je Ram radio. Ako želite pristupiti drugim blokovima 24C16, upotrijebite ostale adrese kako sam naveo. Pogledajte kako sam postavio zapis u memoriju. Prvo se u međuspremnik stavlja adresa slave s postavljenim bitovima za čitanje/pisanje, zatim početna adresa od 00, zatim 16 bajtova podataka. Poziva se funkcija TWI_Start_Read_Write za pisanje podataka (kao i prije) s veličinom poruke postavljenom na 18. Kada se pritisne gumb, koristimo TWI_Start_Random_Read i TWI_Read_Data_From_Buffer za čitanje podataka natrag. Svaki treći bajt prikazan je na LED diodama za proširenje portova. Konačno, LED diode se isključuju kako bi sačekale sljedeći pritisak gumba. Možda se pitate zašto sam odlučio napisati 16 bajtova. Ako pažljivo pročitate podatkovnu tablicu, vidjet ćete da 24C16 radi ciklus pisanja kad god primi 16 bajtova, čak i ako se šalje više bajtova. Pa se to činilo kao lijep broj za korištenje. Ako odlučite povećati ovo, morat ćete promijeniti veličinu MESSAGEBUF_SIZE. Također ćete morati promijeniti vrijednost TWI_BUFFER_SIZE u TWI_Master.h. To je zato što upravljački program kopira podatke iz međuspremnika za poruke koje koristi rutina usluge prekida. Čestitamo! Sada ste spremni za korištenje I2C sabirnice u vlastitim projektima!

Korak 7: Web izvori

Ovdje su poveznice na podatkovne tablice za dijelove korištene za eksperimente. Svakako biste ih trebali nabaviti ako ne dobijete ništa drugo. Port ExpanderRamEEPROMBeći tvorac I2C -a, NXP (Philips) ima hrpu sjajnih stvari. (Oni vole koristiti uglate zagrade u svojim URL -ovima, pa ih ne mogu ispravno uključiti ovdje. Žao mi je.) Da biste došli do područja I2C, odaberite Sučelje s popisa Proizvodi. Moći ćete doći na njihovu I2C stranicu i pristup svim tablicama s podacima i aplikacijama koje nude. Opis I2C sabirnice i tehnički detalji su ovdje. Preuzmite podatkovne tablice ATtiny2313 i ATmega168 (knjige s podacima?) iz Atmela. Napomene o aplikaciji Atmel su ovdje. Pogledajte AVR310 i AVR315. Uzmite i kôd. Ovdje potražite još mnogo I2C stvari.

Korak 8: Bilješke za štrebere

Za pravog štrebera koji želi znati pojedinosti, evo nekoliko stvari koje bi trebali imati na umu ako pogledate Atmel Apps Notes i kod upravljačkog programa:- Način adresiranja i upravljanja I2C uređajem nije dio specifikacija! Osim adrese slave i bita za čitanje/pisanje, naredbe, načini rada itd. Nisu specificirani i specifični su za dati uređaj. Da bi to bilo vrlo jasno, imajte na umu da se shema korištena u primjeru Atmel primjenjuje samo na taj primjer i prilično je nestandardna.- Implementacija USI-a razlikuje se od implementacije TWI-a na nekoliko važnih načina. + Uz USI, taktanje omogućuje softver; s TWI -jem omogućuje Generator Bit Rate Generatora. + USI metoda ne koristi prekide; radi TWI. To ima izvjesnog smisla jer bi obitelj Mega (koja koristi TWI) mogla raditi mnoge druge stvari i ne bi je trebali zavarati I2C transferi. Verzija za USI s prekidima zasigurno je moguća, samo nije implementirana u ovaj Instructable. + USI hardver nije optimiziran za I2C i može podnijeti samo 8 bitne prijenose. To znači da su za prijenos devetog bita potrebna dva prijenosa (NACK ili ACK). TWI hardver to rješava automatski. To čini implementaciju USI upravljačkog programa malo kompliciranijom. + Otkrivanje pogrešaka za TWI obrađuje se hardverski. USI zahtijeva rukovanje softverom koji donekle komplicira stvari. + TWI hardver izravno kontrolira konfiguraciju priključka. USI hardver zahtijeva da se bitovi portova konfiguriraju prije nego što se port može koristiti. To ćete vidjeti u rutini Master_Initialize za USI.- Atmel tvrdi da je moguće koristiti povlačenja AVR priključaka za izvlačenja sabirnice I2C. Nisam smislio način da taj pristup funkcionira. Korištenje dva vanjska otpornika čini se prilično jednostavnom shemom, pa nisam na to trošio puno vremena.

Preporučeni: