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, Juli
Anonim
I2C sabirnica za ATtiny i ATmega
I2C sabirnica za ATtiny i ATmega

Obožavam mikrokontrolere Atmel AVR! Od izgradnje razvojnog sistema geta opisanog u ovom uputstvu, nije mi bilo kraja zabavno eksperimentisati sa AVR ATtiny2313 i posebno sa ATmega168. Čak sam otišao toliko daleko da sam napisao Instructable o korištenju prekidača kao ulaza i proširio koncept sistema razvoja geta na CPLD -e. Tokom 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žen sistem unosa sa tastaturom i ekranom, ali ATtiny2313 bi ostao bez resursa. Srećom, Atmel je omogućio zaobilaženje ovog problema uključivanjem interfejsa koji se može povezati sa dodatnim čipovima (poput memorije ili I/O portova) sa jednostavnim dvožičnim interfejsom. Tako je, koristeći samo dva I/O pina na AVR -u možemo pristupiti mnogim dodatnim I/O pinovima, ali i drugim resursima. Ovaj dvožilni interfejs formalno je poznat kao Inter-Integrated Circuit Bus, ili samo I2C bus, 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 napomene o aplikacijama (pogledajte resurse kasnije u ovom uputstvu), ali one su nepotpune i ne prikazuju primjere osim komunikacije s drugim AVR uređajem. Nije svrha ovog uputstva nikoga naučiti kako stvoriti I2C upravljačke programe za AVR. Umjesto toga, pružit ću proširene verzije upravljačkih programa Atmel za ATtiny2313 i ATmega168 uređaje, objasnit ću zahtjeve i ograničenja koja se primjenjuju pri njihovoj upotrebi, te ću vam pokazati primjere radnih I2C uređaja. Nakon što prođete kroz ovaj Instructable, moći ćete uspješno koristiti I2C sabirnicu u svojim AVR projektima. Očigledno, možete zanemariti upravljačke programe za male ili MEGA 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: Šta su sve ove I2C stvari?

Šta je sve ovo I2C stvari?
Šta je sve ovo I2C stvari?
Šta je sve ovo I2C stvari?
Šta je sve ovo I2C stvari?
Šta je sve ovo I2C stvari?
Šta je sve ovo I2C stvari?
Šta je sve ovo I2C stvari?
Šta je sve 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 uređaji su spojeni paralelno na dvije žice sabirnice I2C. Dvije žice su poznate kao SCL i SDA. SCL je linija sata i njime upravlja glavni uređaj. SDA je dvosmjerna linija podataka. Za prijenos podataka, master šalje slave adresu u kombinaciji s jednobitnom zastavicom za čitanje/pisanje. Ako se želi upis, master će nastaviti slati podatke adresiranom slave -u. Ako se zatraži čitanje, rob će odgovoriti podacima. Za koordinaciju transakcija, SCL i SDA linijama upravljaju master i slave da signaliziraju nekoliko uslova. 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 vezama na kraju ovog uputstva. Električni zahtjevi su prilično jednostavni. Nadređeni i podređeni uređaji moraju koristiti isti nivo za Vcc, uzemljenje mora biti povezano, a SCL i SDA linije moraju biti povučene do Vcc. Vrijednost pull-up otpornika precizno je određena proračunom na osnovu ukupnog kapaciteta na sabirnici, ali praktično 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. Ovo obično nije problem osim ako nemate mnogo uređaja ili dugu žicu 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 dalje, ali ne podržavaju upravljački programi u ovom uputstvu. Svi I2C uređaji radit će pri 100Kbit/s. 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žilno sučelje (TWI). Nakon što su upravljački programi napisani, te razlike su za korisnika uglavnom transparentne. 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 čekati prije pokretanja drugog prijenosa ili dok podaci ne stignu iz operacije čitanja. Primjeri i rasprava koje treba slijediti trebaju ovo pojasniti. I2C adrese dugačke su 7 bita, tako da do 127 uređaja može biti na 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 je djelomično 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. List sa podacima 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 lista podataka PCA8574. Dakle, promjenom postavki adresnog bita, do 8 PCA8574A može biti istovremeno na I2C sabirnici. 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čunara PCA8574 20 do 27 heksadecimalnih. Određivanje adrese datog uređaja može biti zbunjujuće jer neki listovi s podacima smatraju bit za čitanje/pisanje dijelom adresa. Pažljivo pročitajte tehnički list i imajte na umu da će pomoćna adresa biti dugačka 7 bita. Bit za čitanje/pisanje treba tretirati odvojeno. Ponovo će vam pomoći jedan primjer. List sa 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 adresnih bitova 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 od 50 do 57 heksadecimalnih. Raspon adresa slave će zapravo adresirati različite sekcije unutar 24C16. Prvih 256 bajtova nalazi se na adresi 50h, sljedećih 256 u 51h i tako dalje 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/ I O Proširivač interfejsa (moj omiljeni), statički Ram i EEPROM. Ima još mnogo toga, ali ovo je odličan 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 Geto razvojni sistem. 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 SERIJALNI 16K CAT24C16LI-G-ND

Korak 3: I2C upravljački programi

Ovdje su opisi upravljačkih funkcija za I2C sabirnicu. 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 nisam u mogućnosti testirati 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 detalja i da vidite funkcije koje se koriste u potpunim programima. Za ATtiny2313: Sat zahtjev: Upravljački programi su dizajnirani za taktu od 1MHz (zadana brzina) za ATtiny2313. Ako želite trčati drugim tempom, morat ćete prilagoditi konstante u upravljačkim programima. Pošaljite mi e -poruku ako vam je potrebna pomoć pri ovome. Također možete dobiti neke savjete iz bilješki Atmel aplikacija na 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 informacije o grešci I2C i koristi se ako je došlo do greške tokom I2C transakcije. Budući da ova funkcija vraća samo kôd greške, koristim funkciju TWI_Act_On_Failure_In_Last_Transmission (TWIerrorMsg) za treptanje LED -a za grešku. Kodovi grešaka su definirani 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 funkcija se koristi za čitanje i pisanje jednobajtnih podataka na I2C uređajima. Također se koristi za pisanje više bajtova. Postoji 6 koraka za korištenje ove funkcije.1) Deklarirajte međuspremnik za poruke 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 baferu. Pomaknite ga za jedan bit ulijevo i ILI u bitu 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) | (TAČNO << TWI_READ_BIT); 3) Prilikom pisanja stavite bajt za upis na sljedeću lokaciju u međuspremniku. 4) Pozovite funkciju USI_TWI_Start_Read_Write sa 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 greš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 će se nalaziti na drugoj lokaciji u međuspremniku. Ako je potrebno upisati više bajtova (na primjer na memorijski uređaj), može se koristiti ista rutina. Postavljanje međuspremnika i pozivanje rutine su malo 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 funkcija se koristi za čitanje više bajtova s I2C uređaja, obično je značajna samo za neka vrsta sećanja. Korištenje ove rutine vrlo je slično prethodnoj rutini, s dva izuzetka. 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 grešaka, podaci će biti u međuspremniku koji počinje na drugoj lokaciji. 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 tempom, 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 I2C načinu rada. 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 grešci I2C i koristi se ako je došlo do greške tokom I2C transakcije. Budući da ova funkcija vraća samo kôd greške, koristim funkciju TWI_Act_On_Failure_In_Last_Transmission (TWIerrorMsg) za treperenje LED -a za grešku. Kodovi grešaka su definirani u TWI_Master.h, ali su modificirani za signalizaciju na LED grešci. 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 greške vrši tako da se provjeri je li I2C transakcija dovršena (funkcija opisana u nastavku), a zatim se malo testira u globalnoj statusnoj riječi. dvije funkcije rade isto kao i gore opisane funkcije, ali uz nekoliko iznimaka. Ne vraćaju nikakve vrijednosti greške. Očitani podaci se ne prenose u međuspremnik. Ovo ć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. I2C upravljački program za ATmega168 pokreće prekid. To jest, I2C transakcije se pokreću, a zatim izvršavaju nezavisno, dok se glavna rutina nastavlja izvršavati. Kada glavna rutina želi podatke iz I2C transakcije koju je započela, mora provjeriti jesu li podaci dostupni. Ista je situacija i s provjerom grešaka. Glavna rutina mora biti sigurna da je I2C transakcija dovršena prije provjere grešaka. Sljedeće dvije funkcije se koriste u ove svrhe. TWI_Transceiver_Busy () Pozovite ovu funkciju da provjerite je li I2C transakcija dovršena prije provjere greš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 funkcija će provjeriti je li I2C transakcija dovršena prije prijenosa podataka. Dok ova funkcija vraća vrijednost, smatram da je provjeravanje bita greške izravno pouzdanije. Evo kako to nazvati. Veličina poruke bi trebala biti za jedan veća od željenog bita podataka. Podaci će biti u messageBuf -u počevši od druge lokacije.temp = TWI_Read_Data_From_Buffer (messageBuf, messageSize);

Korak 4: Izgradimo

Let's Build!
Let's Build!
Let's Build!
Let's Build!
Let's Build!
Let's Build!
Let's Build!
Let's Build!

Počnite preuzimanjem datoteke I2C Schematics.zip. Možda ćete htjeti stvoriti I2C fasciklu u svom radnom području za držanje shema i primjera programskih datoteka. Raspakirajte sheme u ovaj direktorij. Naći ćete fasciklu 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 osnovnoj ploči. Pogledajte fotografije kako biste vidjeli kako ova kola izgledaju. Zaista su prilično jednostavni. Dio sheme ATtiny2313 je samo Ghetto Development System sa tri trepćuća svjetla (LED1, 2 i 3, plus R4, 5 i 6) i gumbom (S1) koji je priključen na njega, plus jedan dodatni detalj. Taj detalj je dodavanje kratkospojnika (JP4, 5 i 6) koji se mogu ukloniti kako bi se omogućilo povezivanje SCL i SDA linija I2C sabirnice. Kratkospojnici moraju biti postavljeni za programiranje, zatim uklonjeni kako bi se mogli povezati SCL i SDA. Fotografije prikazuju kratkospojnike 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 I2C sabirnicu. 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 prekidače, možete samo koristiti žice. Priključite na masu 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. Jedini nedostatak 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 oba sistema. Glavna razlika je dodavanje C2 i C3. Pogledajte slike za postavljanje ovih slika, trebale bi 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 oni nisu potrebni za I2C sabirnicu na ovom čipu. Imajte na umu da će matična ploča PCA8754A biti nepromijenjena. Samo ćete spojiti SDA i SCL i odlazite! Lako, a?

Korak 5: Hajde da kodiramo i testiramo

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 matičnom pločom 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 fasciklu I_O Port. Ta mapa sadrži kôd za naš prvi primjer programa i USI I2C upravljačke programe. Koristeći WinAVR, kompajlirajte i učitajte kôd u ATtiny2313. Duboko udahnite i uključite napajanje. Evo šta možete očekivati: Kada je napajanje uključeno, LED 1 na portu PD6 na ATtiny2313 trepće dva puta. Ništa se drugo neće dogoditi dok ne pritisnete dugme (S1). Svaki put kada se pritisne dugme, prekidači se čitaju i njihova postavka će biti prikazana na LED diodama spojenim na PCA8574A. Promijenite vrijednost prekidača, pritisnite dugme i LED diode bi se trebale promijeniti. Nastavite to raditi sve dok ne prebolite uzbuđenje kada vidite da radi. Ako (ne daj Bože!) Stvari ne rade kako se očekuje, pažljivo provjerite ožičenje. I2C greške će biti signalizirane treperenjem na LED3 (PD4) i vjerovatno znače da morate provjeriti jesu li SDA i SCL spojeni na ispravne pinove i ispravno izvučeni. 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 I2C upravljačke programe, uključujući postavke podignu podređenu adresu i ostatak međuspremnika za poruke i izvlače podatke iz nje. Vidjet ćete i kako otkazujem dugme i postavljam while petlju. Nekoliko je detalja programa vrijednih spomena. Imajte na umu da se podaci sa sklopki invertiraju prije nego što se upišu u LED diode na proširivaču portova. Također imajte na umu da ulazni portovi na proširivaču portova moraju biti napisani kao visoki kako bi ispravno radili. Ti detalji su opisani u tehničkom listu PCA8574A. Uvijek pažljivo pročitajte tehničke listove! Više je zanimljivo korištenje uvjetnog otklanjanja grešaka. Blizu početka programske datoteke nalazi se izraz // #define DEBUG, a po cijelom kodu su #ifdef DEBUG izrazi. 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 biti sastavljen. Ali ako stvari ne funkcioniraju kako ste očekivali, ponovno kompajlirajte i ponovo učitajte kôd s #define DEBUG unmented. Dobit ćete mnogo više treptaja na LED diodama koje možete dekodirati kako biste pratili izvršavanje vašeg programa i pomoći vam u pronalaženju gdje stvari tačno 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 treptat će na LED 1 (PD6) prije nego što se prikaže na LED ekspanderima portova. Trebali biste moći pratiti program kako radi pomoću ovih LED dioda. Zatim ćemo raditi s ATmega168; preskočite ovaj odjeljak ako vas zanima samo ATtiny2313. Još sa mnom? Dobro. Premjestite se 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 masu 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 greš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 grešaka testira se određeni statusni bit. Tokom čitanja, funkcija TWI_Read_Data_From_Buffer mora se pozvati za prijenos pročitanih podataka u međuspremnik za poruke. Tokom pisanja, while (TWI_Transceiver_Busy ()) se mora koristiti da biste bili sigurni da je prijenos završen prije provjere grešaka. Ove posljednje dvije funkcije su gore opisane u opisu upravljačkih programa. Osim toga, kod je približno isti kao i za ATtiny2313. DEBUG radi isto 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, i RAM -a i EEPROM -a. Glavna razlika je u tome što se više bajtova može čitati ili pisati iz memorije pomoću jedne I2C naredbe. Da bismo se pripremili za ove eksperimente, moramo malo izmijeniti hardver i izgraditi nekoliko novih kola na matičnoj 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 iglice. Ako nemate dovoljno trepćućih svjetala, pomaknite one s P4 preko P7 na P0 kroz P3. (Vrijednosti za prikaz su dovoljno male.) Sada pogledajte shematski I2C Ram.pdf i spojite PCF8570 na matičnu ploču. Pogledajte i sliku. Priključite iglu 7 na Vcc. Vodite žice za SDA i SCL sa PCA8574A. Nisu potrebni dodatni pull-up otpornici. Ako ste i vi zainteresirani za EEPROM, izgradite to kolo također koristeći I2C EEPROM.pdf za 24C16, ali upozorite da primjer koristi ATmega168. Ovo kolo je zaista jednostavno. Kao što je gore rečeno, bitove adrese 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 eksperimente s ATtiny2313 spojenim na PCA8574A Port Expander i na PCF8570 Ram. Program će upisati neke brojeve u Ram, zatim ih pročitati i prikazati na Port Expanderu. Promijenite svoj radni direktorij u RAM pod USI I2C. Koristite make datoteku za kompajliranje 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 na LED 1 (PD6). Podaci će biti zapisani u prva 4 bajta memorije. Pritisnite dugme i dva bajta će se pročitati i prikazati. Trebali biste vidjeti jedno LED svjetlo na proširivaču portova (P0), pauzu od dvije sekunde, zatim dvije LED lampice (P0 i P1). Još dvije sekunde pauze i LED diode bi se trebale isključiti. Ponovo pritisnite dugme za početak sekvence iznova. Otklanjanje grešaka je slično 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 memorije za pisanje. Pogledajte način učitavanja međuspremnika prije poziva koji zapravo vrši pisanje. Prvi bajt je adresa slave sa bitom za čitanje/pisanje koji je pravilno postavljen. Sljedeći bajt je memorijska adresa na kojoj možete početi pisati podatke. Zatim dolaze stvarni bajtovi podataka koji će se sekvencijalno učitavati u memoriju počevši od adrese koju smo naveli. Određujemo veličinu poruke kao 6. Dakle, počinjemo pisati na adresi 00 i upisujemo vrijednosti 01, 03, 02 i 06 u memorijske lokacije od 00 do 03. Za čitanje podataka iz memorije moramo koristiti funkciju USI_TWI_Start_Random_Read. Međuspremnik poruka prima slave adresu u prvom bajtu i 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 drugoj lokaciji u međuspremniku za poruke. Nakon što se podaci pročitaju, oni se obrću za prikaz na Port Expander -u i upisuju se jedan po jedan bajt s pauzom između vrijednosti. Konačno, LED diode za proširenje portova su isključene. Zapisivanje u Port Expander identično je 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 direktorij u EEPROM pod TWI I2C. Koristite make datoteku za kompajliranje 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 magistralu I2C spojenu na Ram i uključite. Rezultati su drugačiji jer sada pišemo i čitamo više podataka. LED 1 na PD7 bi trebao treptati pri inicijalizaciji. Pritisnite dugme 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, sve LED diode porta bi se trebale ugasiti. Pritisnite ovo dugme ponovo da ponovite ovo. 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 ponovo pokrenite program. Trebalo bi raditi potpuno isto. Imajte na umu da se EEPROM i Ram ne mogu istovremeno povezati na I2C sabirnicu jer dijele istu adresu. (Pametniji među vama mogu razmisliti o promjeni programabilnih bitova adrese na Ram -u, ali to i dalje neće raditi. 24C16 koristi cijeli blok adresa koje se mogu programirati za Ram.) U redu, pogledajmo ovaj posljednji 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 komadima od 256 bajtova na 8 različitih I2C slave adresa. Pogledajte kako se MEMORY_ADDR definira kao početna adresa na 50 heksadecimalnih; zato je Ram radio. Ako želite pristupiti drugim blokovima 24C16, upotrijebite druge adrese kako sam naveo. Pogledajte kako sam postavio za pisanje u memoriju. Prvo se u međuspremnik stavlja adresa slave s kompletom bitova 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. 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 na dugme. 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. To se č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 resursi

Ovdje su veze do tablica s podacima za dijelove korištene za eksperimente. Ovo biste definitivno trebali nabaviti ako ne dobijete ništa drugo. Port ExpanderRamEEPROMBući kreator I2C -a, NXP (Philips) ima hrpu sjajnih stvari. (Oni vole koristiti uglate zagrade u svojim URL -ovima, pa ih ne mogu pravilno unijeti ovdje. Žao mi je.) Da biste došli do područja I2C, odaberite Interface sa popisa proizvoda. Moći ćete doći do njihove I2C stranice i pristup svim listovima podataka i bilješkama o aplikacijama koje nude. Opis I2C sabirnice i tehnički detalji su ovdje. Preuzmite tehničke listove ATtiny2313 i ATmega168 (knjige podataka?) 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 detalje, evo nekoliko stvari koje treba 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 slave adrese i bita za čitanje/pisanje, naredbe, načini rada itd. Nisu specificirani i specifični su za dati uređaj. Da bismo ovo učinili vrlo jasnim, 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, taktovanje omogućava softver; sa TWI -om ga obezbeđuje generator bitne brzine. + USI metoda ne koristi prekide; TWI radi. Ovo ima izvjesnog smisla jer bi Mega porodica (koja koristi TWI) mogla raditi mnoge druge stvari i ne bi trebala biti opterećena I2C transferima. Verzija za USI sa prekidima je svakako 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. Ovo čini implementaciju USI upravljačkog programa malo kompliciranijom. + Otkrivanje grešaka za TWI se vrši hardverski. USI zahtijeva rukovanje softverom koji donekle komplicira stvari. + TWI hardver direktno kontrolira konfiguraciju porta. 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 portova za izvlačenja sabirnice I2C. Nisam smislio način da taj pristup funkcionira. Korištenje dva vanjska otpornika izgleda kao prilično jednostavna shema, pa nisam na to trošio puno vremena.

Preporučuje se: