Stap 4: Is het sneller?
De eerste foto toont een weerstand op een LED gesoldeerd.
Dit is optioneel, maar ik vond dat het hebben van een bos van deze samengesteld breadboarding een stuk makkelijker maakt.
Soldeer een weerstand naar de kathode voorsprong voor sommige LEDs.
De leiding van de kathode is de kortere negatief (grond) leiding. 270 - 560 Ohm werkt goed voor op de RaspberryPi, voor een Arduino gebruiken 330-680 ohm weerstanden.
Meestal maak ik ze met 470-560 ohm weerstanden dus ze met beide werken zal.
.
In de inleiding gezegd dat "het is mogelijk gebruik van lager niveau opdrachten te sterk versnellen de input/output."
Controle van de registers direct elimineert een heleboel extra code, en u kunt lezen of schrijven van alle de pinnen op een bank met een commando.
Dus nu het leuke deel, een test die zal je laten zien sommige echte snelheid.
Bouwen van het circuit volgens de bovenstaande afbeelding, zult u moeten:
- Arduino
- Breadboard
- 6 LEDs
- 6 weerstanden 330-560 ohm
- jumper draden
Kopieer dit programma naar de Arduino IDE en uploaden naar je Arduino, dit is de snelle programma:
/*************************************************** * Fast-counter.ino * * A fast binary counter works by controling the * registers rather than using digitalWrite(). ***************************************************/ /************************************************** * setup() Function **************************************************/ void setup() { DDRB = B00111111; // Pins 8-13 set to output. } /************************************************** * loop() Function **************************************************/ void loop() { for(int i=0;i<64;i++) { PORTB = i; delay(500); } }
Laat het programma uit te voeren voor een tijdje en u zult opmerken het de snelheid verandert niet. Merk ook op dat wanneer alle LEDs verlicht zijn en ze gaan allemaal uit het is instant, ze gaan allemaal uit op hetzelfde moment.
Nu de Slow-counter.ino naar de Arduino IDE kopieert en deze uploaden naar je Arduino.
/********************************************************* * Slow-counter.ino * * Another binary counter, but this one uses digitalWrite() * in a for loop, The longer it runs the slower it gets. *********************************************************/ unsigned long time[6]; //Holds time for each LED. int pin[6] = {8,9,10,11,12,13}; //Pin numbers for LEDs. int toggle[6] = {0,0,0,0,0,0}; //Toggles for LEDs. (0 or 1) /********************************************** * setup() function **********************************************/ void setup() { for(int i=0;i<6;i++) { pinMode(pin[i], OUTPUT); //Set LED pins as output. digitalWrite(pin[i], LOW); //All LEDs are off at start. time[i] = millis(); //Start timers for all LEDs. } } /********************************************** * loop() function **********************************************/ void loop() { int interval[6]={500,1000,2000,4000,8000,16000}; for(int i=0;i<6;i++) //For each LED in turn. { if((millis()-time[i]) > interval[i]) //Has time passed interval? { toggle[i] = !toggle[i]; //If so not toggle, time[i] = millis(); //reset time, digitalWrite(pin[i], toggle[i]); //and toggle LED, } } }
De eerste keer al de LEDs afgaan u opmerken zult dat er een lichte vertraging en kunt u afgaan ze in volgorde. Hoe langer draait het langzamer het krijgt.
.
Als u wilt werken met Attiny chips:
Probeer deze programma's uit te voeren op een ATtiny84 bij één MHz. U ziet een groot verschil.
Hebt u een digitale multimeter die frequentie meet een programma te knipperen één LED met delay(1) schrijven. En vergelijk de frequentie bij gebruik van digitalWrite(), als het PORTB rechtstreeks te wijzigen.