Förvandla din Arduino till en magnetisk kortläsare! (4 / 9 steg)
Steg 4: Upptäcka när en kort är Swiped
Formellt, vill man kontrollera /CARD_PRESENT stiftet för att se om det är sjönk lågt. Lyckligtvis är detta inte nödvändigt. Vi ska kolla för giltigt kort senare. Omväxlande, du kan läsa din strobe pin se när utlöses har lagts på PIN-koden, men detta kommer net du massor av klockning Zeros. Läsaren kommer att skicka om 60-70 ledande noll är för att låta dig veta att data är på väg att läggas fram. Vi ska dock använda arten av binära data för att avgöra när du ska börja spela in bitar. Start sentinel (SS) för spår en är skylten andel (%). Är det binära värdet är 0010 0101 vilket innebär att det kommer att vara lagras (och läst) som 1010 001 (det är 7-bits så den 8: e lite inte är överförs). Nu, den skarpsinniga läsaren kommer att märka att även om uppgifterna är bakåt det inte stämmer med det binära ASCII-värdet. Det beror på att det är 0x20 bort av hex. % Symbolen är 0x25 och 0100 0101 är 0x05. Kortdata har 0x20 subtraheras från värdet. Att en hängande ute i den höga nibble är den udda paritetsbiten. Den sätts det så att det finns ett udda numrerar av "1" s i värdet. Så eftersom vi vet att ett giltigt kort startar alltid med denna start sentinel, och eftersom paritetsbiten är en 1, sedan när vi upptäcker den första hög till låg övergång på data stift, då vi vet att vi har precis börjat ta emot start sentinel från ett kort. Nu, detta kommer inte alltid att vara sant, och en idiotsäker plan skulle vara att kontrollera /CARD_PRESENT kortet för att se om det har gått låg dessutom. Det enklaste sättet att upptäcka i början av SS, är att skapa ett yttre avbrott utlöses i fallande utkanten av /STROBE. Data är giltiga 1.0 oss innan den fallande kant, så när du har provtagits fallande kanten, då du vet kan du läsa /DATA1 PIN-koden och få ett giltigt värde. Här är koden för att skapa din externa avbrott utlöses på en fallande kant.
voidInitInterrupt(void) {/ / Setup avbryta BSET(EIMSK,INT0); / / yttre mellanjobb maskera BSET(EICRA,ISC01); / / falling edge BCLR(EICRA,ISC00); / / falling edge BSET(SREG,7); / / jag-bit i SREG}
I min common.h som jag har i alla mina program, finns definitionerna av AVSKILJS och BCLR. Se filen om du har frågor om hur du anger bitar. Nu, när avbrottet utlöses, vi vill prova /DATA1 (i min kod definieras som CARD_DATA) och lite i en generell IO register. Om vi är på den 7: e lite, besparing av registret som en karaktär i vår globala buffert. Jag använder ett GPIOR0 register eftersom det är spiffy snabb åtkomst. Pseudo koden är ungefär så här:
Stop 16-bitars timer klart timer om DATA är låg ange BIT = 1 i registret dekrement BIT inställda flaggan så vi inte hoppa över något mer 0's annat DATA är hög ställa BITHASTIGHET = 0 i registret dekrement BIT om BIT är 0 Lägg till byte till buffert Increment index Reset-BITEN
Om du frågar dig själv varför stegvis minskning i stället för tillväxten, kom ihåg att data är bakåt, så istället för att spela in bitarna som vi får dem från LSB MSB, vi rädda dem från MSB att LSB så vi slipper vända bitarna senare vid behandling av uppgifterna. Om du verkligen ville, kan du också lägga till 0x20 hex här, men eftersom det handlar om 5us på dessa utlöses, jag håller behandling i denna avbrottstjänstens rutin till ett minimum.
ISR(INT0_vect) {StopTimer(); ClearTimer(); IF (!. BCHK(PIND,CARD_DATA1)) / / inverse låg = 1 {BSET(GPIOR0,bit);--bit; bDataPresent = 1;} else om (bDataPresent) {BCLR(GPIOR0,bit);--bit;} om (lite
Om du undrar vad timing verksamheten handlar om, som är täckt av steg för att fastställa när kortet har lämnat läsaren.