Stap 6: De kaart die de lezer verlaten detecteren
Detecteren wanneer een kaart is gegaan
Formeel zou een het proeven van de pin van de /CARD_PRESENT om te zien of het weer hoog is gegaan, maar we niet geen steenkin hoeven ' / CARD_PRESENT toegang tot een andere I/O poort. Dit is waar deze timers in komen.
Telkens wanneer de interrupt wordt aangeroepen omdat we hebben ontdekt een dalende rand op /STROBE, we stoppen een timer, Wis de waarde van de timer en beginnen met lezen. Als we klaar bent met lezen start we de timer opnieuw. Herhaal advertentie nauseum, of totdat de teller op een bepaalde waarde. Dat betekent dat de laatste interrupt heeft geroepen en geen gegevens meer gekomen, dus wij gaan ervan uit dat het is begonnen met de verwerking van de gegevens die we hebben verzameld.
Voor timers gebruiken we TIMER1, dwz de 16-bits timer. Ik ben met behulp van een resonator 16 Mhz extern aan mijn AVR. Als u van een arduino gebruikmaakt, dan bent waarschijnlijk u, ook. Dus, heb ik gekozen voor een prescaler waarde van 1024, wat betekent dat elke (16,000,000 / 1024) keer de timer zal verhogen. Dat wil zeggen, zal het 'tik' 15,625 keer per seconde. De /CARD_PRESENT gaat hoge die de kaart de lezer over 150ms na het laatste stukje van de gegevens verlaten heeft aangeeft. Dit wetende, besloten ik heb om te controleren over elk 1/4 van een seconde. Dat zou als volgt uitzien:
( ((F_CPU) / PRESCALER) / 4 )
die blijkt te zijn van ongeveer 3900. Dus, wanneer de timer TCNT1 teller 3900, dan weet ik het is geweest ongeveer 300ms en kan ik vrij veilig concluderen dat de kaart de lezer heeft verlaten. Gemakkelijk.
#define PRESCALER 1024#define CHECK_TIME ( (F_CPU / PRESCALER) / 4 ) // 250 ms#define StartTimer() BSET(TCCR1B,CS10), BSET(TCCR1B,CS12) // 1024 prescaler#define StopTimer() BCLR(TCCR1B,CS10), BCLR(TCCR1B,CS12)#define ClearTimer() (TCNT1 = 0)
U hebt gezien in de ISR waar de timer is gestart, gestopt en uitgeschakeld op elke interrupt. Nu, in de hoofdlus we just check om te zien als de timer teller onze streefwaarde heeft bereikt, en zo ja, beginnen met de verwerking van gegevens.
for (;;){ if( TCNT1 >= CHECK_TIME) { StopTimer(); ClearTimer(); ProcessData(); ReadData(); idx = 0; bit = 6; bDataPresent = 0; memset(&buff,0,MAX_BUFF_SZ1); } }
Nu is het veilig om de gegevens te verwerken.