Lite smällar och booleska matematik utan matten (9 / 9 steg)
Steg 9: Lite banka exempel
Med hjälp av I2C innebär binära data skickas till en adress till en enhet som lyssnar på önskemål från mikrokontroller, (master enheten) när en begäran tas emot av enheten, (slav), enheten skickar en eller flera byte data tillbaka till mikrokontroller.
Lära sig att programmera kommunikation till I2C enheter eller försöka vända ingenjör uppgifter från I2C enheter du har att titta på data som är binär form.
Jag kommer att ge dig ett enkelt exempel på hur man gör detta med hjälp av metoder som du just har lärt dig.
Lära sig I2C är det ofta klokt att studera andra program programmerare har skrivit så du kan luta hur data överförs mellan mikrokontroller och enheter.
Så i vårt exempel ska vi titta på ett program kodsträng vissa satellitpositioneringssystem skrivet att lite bang en I2C-enhet.
Jag har tagit prov bit slog C program skrivet i satellitpositioneringssystem av Xander som upprätthåller en Robot blogg heter:
http://botbench.com/blog/2011/02/20/bit-Banged-I2C-Master-on-robotc-for-Arduino/#comment-2674
I denna Bloggartikel är han lite banka en I2C program kan kommunicera med en lysdioder att blinka LED-lampor i en sekvens.
Vi kommer att dekonstruera den ögla för han använder för att skicka en serie bitar till arrayen LED.
Om du har aldrig programmerat innan, vänligen Google variabler, for-loop, funktioner och samtidigt loopar.
Här är det kodstycke som vi kommer att titta på:
medan (sant) {
för (int jag = 0; jag < 8; i ++) {
PCF8574write (~ (1 << i));
wait1Msec(50);
}
}
Normalt skulle jag skriva en liten Python program att skriva ut värdena i en for-loop. Men eftersom jag antar att alla är nya programmering och boolesk logik jag manuellt skriver ut varje iteration av den for-loop.
Särskild anmärkning: Python stöder inte datatypen byte, så i vår lite banka exemplet ska vi använda den modulooperatorn att visa ett heltal som en osignerad byte. Vänligen Google inf du behöver hjälp,
Till exempel: om vi utför den i följande exempel: >>> ~ (1 << 0), i Python får vi -2, om vi sedan använder >>> bin(-2), vi får "-0b10". Att rätta till problemet och Visa en full 8 bitar typ i följande:
>>> bin (-2% 256)
"0b11111110"
För att riktigt se vad som händer med bitar måste vi se full 8 bitar.
While looping forever, ignorera detta för nu.
Den för loop loopar där variabeln är jag lika från 0 till 7.
PCF8574write() är en anpassad funktion som vi inte kommer att diskutera som en del av denna artikel. Du kan referera till koden för att se vad den här funktionen gör på egen hand.
Vad vi är intresserade av är värdet av i och vad binärt tal vi passerar till funktionen PCF8574write().
Låter översätta varje iteration av den for-loop:
Låter typ ut varje iteration av loopen i Python:
Variabeln jag börjar som 0 och slutar på en värdera av 7:
>>> ~ (1 << 0)
-2
Kan dra detta uttryck isär. Vi utför en bitvis inte på följande värde. Vi flytta lämnade värdet 1, jag tider.
Det är vi inte 1 << 0. Vi driver bitar från höger till vänster. Vi är vänster flytta 1, 0 gånger eller vi inte den mest signifikanta biten i den första öglan.
Så om vi tittar på det binära värdet av -2 får vi:
>>> bin (~ (1 << 0))
"0b10"
Låt oss fortsätta, du kommer snart se mönstret.
>>> ~ (1 << 0)
-2
>>> bin (-2% 256)
'-0b11111110'
>>> ~ (1 << 1)
-3
>>> bin (-3% 256)
'-0b11111101'
>>> ~ (1 << 2).
-5
>>> bin (-5% 256)
'-0b11111011'
>>> ~ (1 << 3)
-9
>>> bin (-9% 256)
'-0b11110111'
>>> ~ (1 << 4)
-17
>>> bin (-17% 256)
'-0b11101111'
>>> ~ (1 << 5)
-33
>>> bin (-33% 256)
'-0b11011111'
>>> ~ (1 << 6)
-65
>>> bin (-65% 256)
"0b10111111"
>>> ~ (1 << 7)
-129
>>> bin (-129% 256)
'-0b1111111'
Den ledande 0 utelämnas i detta fall.
Den skulle läsa "-0b01111111"
Nu om du redan inte har gjort det, gå till webbsidan och titta på video:
http://botbench.com/blog/2011/02/20/bit-Banged-I2C-Master-on-robotc-for-Arduino/#comment-2674
Nu titta på lite mönster mycket noga.
Observera att som den för loop ökar som den 0 lite håller på flytta till vänster.
Jag kommer försöka att inte förvirra dig alltför mycket just nu, (det finns en annan bitvis AND med en vänster SKIFT i funktionen i2c_write()), prioriteringen är att förstå booleska operationer och hur du använder Python för att hjälpa dig att förstå dessa booleska operationer. Om du känner dig till det, bakåtkompilera funktionen i2c_write() för att se hur lite mönstren är ytterligare bearbetas innan de skickas till arrayen LED.
Arbeta med microcontrollers när lite är hög, har en 1 värde, är normalt en enhet påslagen. Om lite är låg, är med ett 0 värde en enhet avstängd.
Märker att vi arbetar med 8 bitar och våra LED array har 8 lysdioder. Ja, det är korrekt. Varje gång vi satt lite på, slår att ha värdet 1, vi på lampan. När vi satt bitvärdet till 0 eller iväg lite, stänga vi av lampan.
Nu titta på videon igen. Nu bild som både för slingor, en i den huvudsakliga funktionen och den for-slinga i i2c_write funktionen kör lika snabb eller snabbare än lysdioder blinkar.
Logiken i i2c_write() presterar lite mer komplex logik, använda python att visualisera hur hög eller låg lite stater förändras när de 8 bitarna är att vara klev igenom den for-loop.
Vänligen hålla å lära sig om mikrokontroller och booleska operationer, eftersom dessa byggstenar att programmera mikrokontroller.