PROBLEMATYKA RUTOWANIA W BEZPRZEWODOWYCH...

14
Zygmunt Kubiak Instytut Informatyki Politechnika Poznańska Na podstawie: Monk S., Arduino dla początkujących . Kolejny krok, Helion 2015

Transcript of PROBLEMATYKA RUTOWANIA W BEZPRZEWODOWYCH...

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

11-2014 5 Zygmunt Kubiak

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() { }

Zygmunt Kubiak 14

09-

2006

Dziękuję