Snabb digitalRead(), digitalWrite() för Arduino (4 / 5 steg)
Steg 4: Är det snabbare?
Första bilden visar en resistor lödda på en LED.
Detta är valfritt, men jag fann att ha ett gäng av dessa består gör breadboarding mycket enklare.
Löda ett motstånd till katod ledningen av några lysdioder.
Katod ledningen är den kortare negativ (mark) ledande. 270 - 560 ohm fungerar bra för på RaspberryPi, för en Arduino använder 330-680 ohm motstånd.
Jag göra brukar dem med 470-560 ohm motstånd så att de fungerar med båda.
.
I inledningen sade jag att "det är möjligt att använda lägre nivån kommandon att kraftigt påskynda input/output".
Kontrollera register direkt eliminerar mycket extra kod, och du kan läsa eller skriva alla stiften på en bank med ett enda kommando.
Så nu roligt del, ett test som visar dig några verkliga hastigheten.
Bygga banan enligt bilden ovan, behöver du:
- Arduinoen
- Skärbräda
- 6 lysdioder
- 6 motstånd 330-560 ohm
- hoppare ledningar
Kopiera detta program till Arduino IDE och ladda upp den till din Arduino, detta är det snabb programmet:
/***************************************************
* Fast-counter.ino
*
* En snabb binär räknare fungerar genom att styra den
* register snarare än att använda digitalWrite().
***************************************************/
/**************************************************
* setup() funktion
**************************************************/
void setup()
{
DDRB = B00111111; Stift 8-13 satt till utgång.
}
/**************************************************
* loop() funktion
**************************************************/
void loop()
{
för (int jag = 0; jag < 64; i ++)
{
PORTB = i.
Delay(500);
}
}
Låt programmet köra ett tag och du kommer att märka den hastigheten ändras inte. Observera också att när alla lampor lyser och alla går är det ögonblick, de går alla på samma gång.
Nu kopiera den Slow-counter.ino till Arduino IDE och ladda upp den till din Arduino.
/*********************************************************
* Slow-counter.ino
*
* En annan binär räknare, men här använder digitalWrite()
* i en for-loop, ju längre tid det går desto långsammare det blir.
*********************************************************/
osignerad lång tid [6]. Har tiden för varje LED.
int stift [6] = {8,9,10,11,12,13}. PIN-nummer för lysdioder.
int växla [6] = {0,0,0,0,0,0}. Växlar för lysdioder. (0 eller 1)
/**********************************************
* setup() funktion
**********************************************/
void setup()
{
för (int jag = 0; jag < 6; i ++)
{
pinMode (pin [i], utgång); Ange LED stift.
digitalWrite (stift [i], låg); Alla lampor släckta början.
tid [i] = millis(); Starta timers för alla lysdioder.
}
}
/**********************************************
* loop() funktion
**********************************************/
void loop()
{
int intervall [6] = {500,1000,2000,4000,8000,16000}.
för (int jag = 0; jag < 6; i ++) //For varje ledde i sin tur.
{
IF((Millis()-Time[i]) > interval[i]) //Has tid gått intervall?
{
Toggle [i] =! växla [i]; Om så inte växla,
tid [i] = millis(); återställa tiden,
digitalWrite (pin [i], toggle[i]); och växla mellan LED,
}
}
}
Första gången alla lamporna slocknar du kommer att märka att det finns en liten fördröjning och du kan se gå dem i sekvens. Ju längre tid går det desto långsammare det blir.
.
Om du gillar att arbeta med Attiny chips:
Prova att köra dessa program på en ATtiny84 på en MHz. Du kommer att se en stor skillnad.
Om du har en digital multimeter som mäter frekvensen skriva ett program för att blinka ett LED med delay(1). Och jämföra frekvensen när du använder digitalWrite(), att direkt ändra PORTB.