Pobierz - Politechnika Poznańska, Wydział Informatyki
Transkrypt
Pobierz - Politechnika Poznańska, Wydział Informatyki
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 Zygmunt Kubiak 2 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 Zygmunt Kubiak 3 Test4 - częstotliwość: 86,39 kHz const byte Pin = 10; byte state = 0; void setup() { pinMode(Pin, OUTPUT); while (true) { digitalWrite(Pin, stan); stan = ! stan; } } void loop() { } 11-2014 Zygmunt Kubiak 4 Obsługa portów 11-2014 Zygmunt Kubiak 5 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 Zygmunt Kubiak 6 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 Zygmunt Kubiak 7 Obsługa portów Test 5 - szybkie wyjścia cyfrowe (zamiast pinMode i digitalWrite) byte state = 0; void setup() { DDRB = B00000100; while (true) { PORTB = B00000100; PORTB = B00000000; } } void loop() { } 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 Zygmunt Kubiak 8 Obsługa portów Test 6 - szybkie wejścia cyfrowe (zamiast pinMode i digitalRead) 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); } Rezygnując z digitalRead można jednocześnie odczytywać cały port 11-2014 Zygmunt Kubiak 9 Obsługa portów Test 7 - przyspieszanie wejść analogowych 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(); Test wykorzystuje podstawową funkcję analogRead 11-2014 Zygmunt Kubiak 10 Obsługa portów dc Test 7 - przyspieszanie wejść analogowych } ●●● Serial.println("Koniec testu"); Serial.print("Czas (sekundy): "); Serial.println((endTime - startTime) / 1000l); void loop() { } Test wykorzystuje podstawową funkcję analogRead Test zajmuje 112s, tzn. ok. 9000 odczytów na sekundę 11-2014 Zygmunt Kubiak 11 Obsługa portów Test 8 - przyspieszanie wejść analogowych (zwiększenie zegara z 125 kHz (w. domyślna) do 1 MHz 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(); Test wykorzystuje podstawową funkcję analogRead 11-2014 Zygmunt Kubiak 12 Obsługa portów dc Test 8 - przyspieszanie wejść analogowych // 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() { } Test zajmuje około 17 s, tzn. mikrokontroler wykonuje ok. 58000 odczytów na sekundę ale mała pamięć (2kB) 11-2014 Zygmunt Kubiak 13 Dziękuję Zygmunt Kubiak 14 092006