Lite Banging med Raspberry pi för I2C kontroll med perl
Första lite allmänna bakgrund
Att använda många av I2C till parallellporten IC med Raspberry pi du behöver för att kunna manipulera data lite klokt. Gör oftast du i en micro controller, men med pi finns det mycket mer makt att göra andra saker så när du behärskar lite kloka manipulation av data du kan bygga mycket kraftfulla verktyg. En mycket vanlig bit kloka uppgift är att växla lite. För exempel om vi har en bank av reläer 0010_0100b och vill växla den tredje stycke som för närvarande är en en till en nolla sättet att göra det är med en exklusiv eller operation lite kloka. I Perl detta sker med den "^" morot symbol, där varje bit är eller individuellt. När du gör denna operation finns det en nyckel värde som vi använder kallas en "mask" för att representera den bit eller bitar som vi vill driva på.
Den allmänna formeln kommer att vara följande
Current_status_byte ^ mask_byte = New_status_byte
--------------------------------------------------------------------------------------------
Här följer ett exempel på de binära värdena där vi vill växla den tredje stycke i status_byte
0010_0100 ^ 0000_0100 = 0010_0000
och om vi upprepa detta igen kan vi växla lite tillbaka på.
0010_0000 ^ 0000_0100 = 0010_0100
------------------------------------------------------------------------------------------------
En annan gemensam sak att göra är att rensa lite som vi kan göra på samma sätt med lite kloka och funktion. Detta ser allmänt liknande, men vi måste växla mask för denna operation
Current_status_byte & mask_byte_inverted = New_status_byte
För numeriska exempel
0010_0000 & 1111_1011 = 0010_0000
Nu emellertid om vi gör det igen, lite inte växla vistelser klart
0010_0000 & 1111_1011 = 0010_0000
------------------------------------------------------------------------------------------------
I en idealisk värld skulle du troligen vill ha en mask byte och komplettera den mask lite i formeln så att du kan växla eller rensa med samma mask lite. med lite kloka Invertera. Här är ett sätt att ändra klart så du kan använda samma mask för båda
0010_0000 & ~ 0000_0100 = 0010_0000