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