ATTiny USI I2C introductie - een krachtige, snelle en gemakkelijke communicatie-interface voor uw ATTiny projecten! (7 / 8 stap)

Stap 7: ATTiny USI I2C Code uitvoering - USI I2C-Slave


In tegenstelling tot de master code, de code van de USI I2C-Slave (usi_i2c_slave.c/h) is geïmplementeerd bijna volledig met behulp van de USI interrupts.  Zoals eerder vermeld, heeft de USI-module twee interrupts, een gegenereerd na detectie van een START-voorwaarde en de andere op basis van de overloop van de teller 4-bits.  De teller is cruciaal voor de slaaf code om correct te werken, en was niet heel goed uitgelegd in de tutorials en code die ik heb gelezen.  Ik heb in het stroomdiagram beeld nummers voor elke staat in de logica.  Deze nummers (8 van 1's en 0's) zijn teller aantal waarden die aangeven hoeveel teken de teller rekenen moeten voordat de overgang naar het volgende frame.  Als de teller is geklokt moeten SCL klokken, met deze waarden vertellen hoeveel SCL klok pulsen plaatsvinden voordat het volgende frame.  In het algemeen, is iets dat wacht van 8 klok pulsen wachten op transmissie/ontvangst van een gegevensbyte terwijl iets dat 1 klok pulse wacht op verzending/ontvangst van een ACK/NACK wacht.  Een paar dingen wachten 0 klokken, wat betekent dat zij ogenblikkelijk doorgaan naar het volgende frame of een uitgebreide deel uitmaken van de vorige toestand (in het geval van schrijven of lezen?).

Dus, als een eindgebruiker, bent waarschijnlijk u meer geïnteresseerd in hoe interface van de bibliotheek aan uw eigen code!  Dit is eenvoudig, en hier is waarom.  Ik heb weg gedaan met de ontvangen/verzenden buffers die werden gebruikt in andere USI I2C-implementaties (vooral die op basis van AVR312 app-note) en geïmplementeerd in plaats daarvan het registreren van het protocol van de bank aan het begin van deze tutorial beschreven.  De bank is opgeslagen als een serie van wijzers, niet gegevenswaarden, zodat u lokale variabelen in uw code te koppelen aan de geheugenadressen in de I2C registreren bank moet door het instellen van de aanwijzers om te wijzen op uw variabelen.  Dit betekent dat uw hoofdlijn code hoeft ooit te poll I2C buffers of verwerken van gegevens aankomsten, de waarden worden bijgewerkt ogenblikkelijk wanneer ze aankomen.  Het maakt het ook mogelijk programma variabelen worden ondervraagden te allen tijde door de I2C-interface zonder de hoofdlijn code (dan de vertraging als gevolg van de interrupt).  Het is een knappe systeem.  Laten we weer eens een kort voorbeeld.

Bijvoorbeeld, laten we zeggen dat we hebben een zeer basissoftware PWM-generator die is het besturen van een LED.  Wij willen kunnen Uwijzigtdewaarde PWM (een 16-bits waarde, net omwille van het leren over pointers) zonder dat de hoofdlus ingewikkeld.  Met de magie van asynchrone I2C-slave, kunnen wij enkel dat doen!

#include "usi_i2c_slave.h"

Een verwijzing naar de I2C slaaf register bank aanwijzer matrix definiëren
extern char * USI_Slave_register_buffer [];

int main()
{
16-bits PWM waarde creëren
unsigned int pwm_val = 0;

De waarde van de lage byte van pwm toewijzen aan I2C interne adres 0x00
De waarde van de hoge byte van pwm toewijzen aan I2C interne adres 0x01
USI_Slave_register_buffer [0] = (unsigned char *) & pwm_val;
USI_Slave_register_buffer [1] = (unsigned char *)(&pwm_val) + 1;

I2C-slave slave apparaat adres 0x40 initialiseren
USI_I2C_Init(0x40);

Instellen van de pin A0 als uitvoer voor LED (we gaan ervan uit dat dat wat we op chip pin A0 beschikbaar heeft)
DDRA | = 0X01;

while(1)
{
PORTA | = 0X01; LED inschakelen
voor (unsigned int i = 0; ik < pwm_val; i ++)
{
PORTA & = ~ (0x01); LED uitschakelen
}
}
}

En daar heb je het!  De hoofdlus verwijst niet naar I2C helemaal, maar bij het verzenden van een PWM-waarde naar de locatie van de 16-bits interne adres van de I2C 0x00/0x01 en kunnen we volledig de controle van de PWM van de LED!  Voor extra stabiliteit (om ervoor te zorgen dat alleen de aanwijzer waarden u beschikbaar zijn en om te voorkomen dat strooilicht pointers) ik stel voor dat je veranderen de #define USI_SLAVE_REGISTER_COUNT als het aantal register verwijzingen die u nodig hebt, niet meer en niet minder.  Wanneer een toegang (lezen of schrijven) wordt geprobeerd op een register index buiten het bereik 0x00 USI_SLAVE_REGISTER_COUNT - 1, niets is geschreven en is het resultaat nul.

Gerelateerde Artikelen

Verscherpen van een mes, snel en gemakkelijk

Verscherpen van een mes, snel en gemakkelijk

als u een carbide getipt zag blade, heb je een uitstekend hulpmiddel voor het slijpen van een mes, snel en gemakkelijk.  Alleen klem aan een tafelblad of het lock op je zag de arbor, zodat het niet draaien.Stap 1: Teken het mes-rand tegen een tand ca
Hoe maak je een krachtige, snelle "USS Hornet"!

Hoe maak je een krachtige, snelle "USS Hornet"!

Dit is mijn eerste Instructable, dus alle opmerkingen zijn welkom (positief en negatief, zolang ik feedback te krijgen!).Anyway, ik zal u tonen hoe maak je een goede papieren "USS Hornet"! Ik zie een heleboel Instructables zeggen kun je alleen g
Hoe aan te scherpen een beitel snel en gemakkelijk

Hoe aan te scherpen een beitel snel en gemakkelijk

Dit instructable is gonna verlenen u een snel en relaible manier om een scherpe rand op uw beitels.U zult;Norton India cobination steen maat 8 "x 2". Dit heeft een grijze 'plat' kant en een orangey bruin "fine" kant. Deze methode werkt
Verscherpen van een mes met een schaar (snel en gemakkelijk)

Verscherpen van een mes met een schaar (snel en gemakkelijk)

zag je al die instrueren-ables waarvoor schuurpapier of sommige aardewerk? Mij persoonlijk niet hebben die tot rond alle de tijd (bijvoorbeeld op het werk, op school)Wilt u nog steeds een snelle en vuile manier om het slijpen van je mes.Dat is waar s
Hoe een gebruiker snel en gemakkelijk toe te voegen

Hoe een gebruiker snel en gemakkelijk toe te voegen

Dit is mijn allereerste instructable okook is het gewoon om toe te voegen gebruikers verwijderen gebruikers enzovoort thxStap 1: Stap 1 of ietsZorg ervoor dat u opdrachtprompt oknu hebt u die openen als je op school bent dit gewoon werken, tenzij het
Snelle en gemakkelijke homestead gebruikt voor Plastic flessen (PET)

Snelle en gemakkelijke homestead gebruikt voor Plastic flessen (PET)

In de niet al te verre verleden, zou je melk, frisdrank, etc. in glazen flessen die u naar de winkel retourneren wilt te worden gesteriliseerd en opnieuw gebruikt. Nu, met onze wegwerp cultuur, plastic flessen hebben dit systeem vervangen en bijgevol
Goedkoop, snel en gemakkelijk LCD vervanging voor Samsung Galaxy S3

Goedkoop, snel en gemakkelijk LCD vervanging voor Samsung Galaxy S3

Had een incident en mijn telefoon geraakt op de perfecte hoek te breken van het LCD-scherm. Na veel zoekopdrachten besloten heb ik dat ik mezelf kon vervangen. Het inschakelen, de onderste rij verlicht en de LED-licht nog werkte. Ik heb niet alles op
Snel en gemakkelijk toetsenblok correctie (voor de meeste mobiele telefoons)

Snel en gemakkelijk toetsenblok correctie (voor de meeste mobiele telefoons)

de meesten van ons hebben mobiele telefoons en van tijd tot tijd hebben we de neiging te laten vallen of ze misschien te behandelen met een minder-dan-delicate manier. Op zijn beurt zal de celtelefoon rebelleren en stoppen met functioneren.Hedendaags
Snelle en gemakkelijke bluetooth-handset voor skype

Snelle en gemakkelijke bluetooth-handset voor skype

gekocht voor de Motorola HS820 headsets zoals voorgesteld in een andere instructable en het geplant in een traditionele telefoontoestelDit is echt een prototype tot ik vind een mooie 'klassieke' toestel. Slechts enkele vrijdagmiddag onzin in het kant
Make A snel en gemakkelijk fiets rek voor reparaties

Make A snel en gemakkelijk fiets rek voor reparaties

iedereen met een fiets vroeg of laat zult moeten doen sommige reparaties/onderhoud aan de fiets.  Het is echt lastig om te werken op hen, zelfs als ze een kick stand hebben.  U moet zitten kundig voor het uitstappen van de grond en beide handen gebru
Snel en gemakkelijk Taggy Buddy voor uw kleine één

Snel en gemakkelijk Taggy Buddy voor uw kleine één

deze zijn super makkelijk en leuk om te maken. :)Hebt u nodig:Papier (voor patroon)2 stuks van fleece3 of 4 verschillende soorten lint in 3" gesneden stukkenschaarNaaimachineStap 1: Maak een patroon Beslissen wat voor soort buddy u zou willen maken (
Snelle en gemakkelijke tazer, maken te laten uitzien als een USB-dongle

Snelle en gemakkelijke tazer, maken te laten uitzien als een USB-dongle

dit is een eenvoudige, snelle en gemakkelijke manier een te maken een die is bedoeld om te lijken op een USB-dongle. Zijn echt gemakkelijk te maken.Vereisten:AanstekerUSB-Dongle (ieder zal doen, ik gebruikte een gebroken)3 x schroevenEen hamerEen sch
SNEL en gemakkelijk NOTEBOOK PENNENHOUDER

SNEL en gemakkelijk NOTEBOOK PENNENHOUDER

dit is mijn eerste Instructable, dus ik ben benieuwd naar feedback...Ik wilde altijd een snelle en gemakkelijke pennenhouder vinden voor mijn zak notebooks en diaries (degene met een zakje de achtercover - zoals Moleskine, Leuchtturm 1917, of een van
Snelle en gemakkelijke knuppel decoraties

Snelle en gemakkelijke knuppel decoraties

HalloZijn die tijd van het jaar weer werden we uit de zwarte roos in bulk te breken!In dit instructable ga ik u tonen hoe te maken van een snelle en gemakkelijke Bat decoratie voor uw huis.Het is echt eenvoudig, dus kinderen kunnen doen, duurt ongeve