Zygmunt Kubiak Instytut Informatyki Politechnika Poznańska
Na podstawie: Monk S., Arduino dla początkujących . Kolejny krok, Helion 2015
Arduino Uno (ATmega328P) – zegar 16 MHz ; 16 MIPS
// Test1
int Pin = 8;
int stan = 0;
void setup()
{
pinMode(Pin, OUTPUT);
}
void loop()
{
digitalWrite(Pin, stan);
stan = ! stan;
}
11-2014 2 Zygmunt Kubiak
Test1 – częstotliwość na wyj. #10: 73,23 kHz
Test2 – zmiana typu zmiennych z int na byte
Częstotliwość: 77,17 kHz
Test3 – zmiana zmiennej Pin na stałą, przez dodanie słowa const
Częstotliwość: 77,92 kHz
Test4 – przeniesienie kodu z funkcji loop() do setup() Częstotliwość: 86,39 kHz
W loop() są dodatkowe testy związane z transmisją szeregową
11-2014 3 Zygmunt Kubiak
Test4 - częstotliwość: 86,39 kHz
11-2014 4 Zygmunt Kubiak
const byte Pin = 10; byte state = 0; void setup() { pinMode(Pin, OUTPUT); while (true) { digitalWrite(Pin, stan); stan = ! stan; } }
void loop() { }
Obsługa portów
W Arduino Uno dla użytkownika dostępne są trzy porty:
Port B: PB0 – PB5
Port C: PC0 – PC6
Port D: PD0 – PD7
11-2014 6 Zygmunt Kubiak
Obsługa portów
Rejestr kierunku danych, np. portu D (DDRD)
Określa czy pin jest wejściem czy wyjściem
Rejestr wejścia, np. portu D (PIND)
Rejestr do odczytu stanu wejść (pinów)
Rejestr, np. portu D (Port D)
Rejestr do zapisu stanu wyjść (pinów)
11-2014 7 Zygmunt Kubiak
Obsługa portów Test 5 - szybkie wyjścia cyfrowe (zamiast pinMode i digitalWrite)
Dodatkowo metoda umożliwia jednoczesną obsługę całego portu (8 bitów) Kod generuje sygnał o częstotliwości 3,97 MHz, tzn. działa 46 razy szybciej niż z instrukcją digitalWrite
11-2014 8 Zygmunt Kubiak
byte state = 0; void setup() { DDRB = B00000100; while (true) { PORTB = B00000100; PORTB = B00000000; } }
void loop() { }
Obsługa portów
Test 6 - szybkie wejścia cyfrowe (zamiast pinMode i digitalRead)
Rezygnując z digitalRead można jednocześnie odczytywać cały port
11-2014 9 Zygmunt Kubiak
byte state = 0; void setup() { DDRB = B00000000; // wszystkie wejścia Serial.begin(9600); } void loop() { Serial.println(PINB, 2); // argument 2 oznacza zapis binarny delay(1000); }
Obsługa portów
Test 7 - przyspieszanie wejść analogowych
Test wykorzystuje podstawową funkcję analogRead
11-2014 10 Zygmunt Kubiak
void setup() { Serial.begin(9600); while (! Serial) {}; Serial.println("Rozpoczynam test"); long startTime = millis(); // początek kodu testującego long i = 0; for (i = 0; i < 1000000; i ++) analogRead(A0); // koniec kodu testującego long endTime = millis();
Obsługa portów
dc Test 7 - przyspieszanie wejść analogowych
Test wykorzystuje podstawową funkcję analogRead
Test zajmuje 112s, tzn. ok. 9000 odczytów na sekundę
11-2014 11 Zygmunt Kubiak
●●● Serial.println("Koniec testu"); Serial.print("Czas (sekundy): "); Serial.println((endTime - startTime) / 1000l); }
void loop() { }
Obsługa portów
Test 8 - przyspieszanie wejść analogowych (zwiększenie zegara z 125 kHz (w. domyślna) do 1 MHz
Test wykorzystuje podstawową funkcję analogRead
11-2014 12 Zygmunt Kubiak
const byte PS_128 = (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); const byte PS_16 = (1 << ADPS2); void setup() { ADCSRA &= ~PS_128; // usuwa przelicznik wstępny 128 ADCSRA |= PS_16; // dodaje przelicznik wstępny 16 (1 MHz) Serial.begin(9600); while (! Serial) {}; Serial.println(PS_128, 2); Serial.println(PS_16, 2); Serial.println("Rozpoczynam test"); long startTime = millis();
Obsługa portów
dc Test 8 - przyspieszanie wejść analogowych
Test zajmuje około 17 s, tzn. mikrokontroler wykonuje ok. 58000 odczytów na sekundę ale mała pamięć (2kB)
11-2014 13 Zygmunt Kubiak
// początek kodu testującego long i = 0; for (i = 0; i < 1000000; i ++) analogRead(A0); // koniec kodu testującego long endTime = millis();
Serial.println("Koniec testu"); Serial.print("Czas (sekundy): "); Serial.println((endTime - startTime) / 1000l); } void loop() { }