Zygmunt Kubiak Instytut Informatyki Politechnika Poznańska Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Zygmunt Kubiak Instytut Informatyki Politechnika Poznańska
Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Programowanie mikrokontrolerów dla systemów czasu rzeczywistego System czasu rzeczywistego to taki, w którym wynik przetwarzania nie zależy tylko i wyłącznie od jego logicznej poprawności, ale również od czasu, w jakim został osiągnięty (tu z reguły chodzi o tzw. Hard real-time systems) System działa mikrokomputerowy w czasie rzeczywistym, jeżeli czas reakcji systemu jest niezauważalny przez proces Programowanie firmware’u Aktualnie fimware oznacza program ściśle związany ze sprzętem Programowanie synchroniczne 11-2017 Zygmunt Kubiak
Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) W przykładach czujniki poziomu reprezentowane są przez przełączniki. W mikrokontrolerach przełączniki z reguły łączone są jak na rysunku obok. Oznacza to, że przełącznik włączony (naciśnięty) generuje sygnał logiczny „0”, a wyłączony (zwolniony) – sygnał „1”. W przykładzie założono, że przełącznik S włączony (naciśnięty) oznacza czujnik zanurzony („0”), a przełącznik wyłączony (zwolniony) oznacza czujnik wynurzony („1”) S 11-2017 Zygmunt Kubiak
Przykład – regulacja poziomu Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Przykład – regulacja poziomu 11-2017 Zygmunt Kubiak
Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Przykład – regulacja poziomu Regulacja poziomu cieczy S0, S1 - czujniki poziomu (0 – czujnik zanurzony, 1 - czujnik wynurzony) Z – zawór nie objęty sterowaniem D1 - zawór sterowany (dioda D1) Wyjście aktywne – sygnał log. „1” np. D1 = 1 – zawór załączony D1 = 0 – zawór wyłączony 11-2017 Zygmunt Kubiak
Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Przykład – regulacja poziomu Regulacja poziomu cieczy Faza F0 Faza F1 Logiczna sieć działań 11-2017 Zygmunt Kubiak
Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Przykład – regulacja poziomu Wersja synchroniczna algorytmu 11-2017 Zygmunt Kubiak
Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Przykład – regulacja poziomu Realizacja Arduino - połączenia 11-2017 Zygmunt Kubiak
Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Przykład – regulacja poziomu Realizacja Arduino – schemat ideowy 11-2017 Zygmunt Kubiak
Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Przykład – regulacja poziomu Realizacja Arduino – PCB nakładki 11-2017 Zygmunt Kubiak
Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Przykład – regulacja poziomu Realizacja Arduino – program /* Regulacja poziomu created 2017 by Zygmunt Kubiak */ const int S0 = 7; // S0 - czujnik poziomu min const int S1 = 6; // S1 - czujnik poziomu max const int D1 = 13; // D1 - zawór dopływu wody boolean F0, F1; // flagi faz procesu 11-2017 Zygmunt Kubiak
Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Przykład – regulacja poziomu Realizacja Arduino – program cd. void setup() { // zainicjowanie funkcji pinów: pinMode(S0, INPUT_PULLUP); // wejście z podciąganiem wew. pinMode(S1, INPUT_PULLUP); // wejście z podciąganiem wew. pinMode(D1, OUTPUT); // wyjście - LED Arduino // zainicjowanie stanu początkowego aplikacji RegPoz digitalWrite(D1,LOW); // zawór zamknięty F0 = true; // flaga fazy startowej F1 = false; // pozostałe flagi } 11-2017 Zygmunt Kubiak
Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Przykład – regulacja poziomu Realizacja Arduino – program cd. void loop() { if(F0) if(digitalRead(S0) && digitalRead(S1)) digitalWrite(D1,HIGH); // otwarcie zaworu F0 = false; // faza F0 wykonana F1 = true; // kolejna faza do wykonania } … 11-2017 Zygmunt Kubiak
Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Przykład – regulacja poziomu Realizacja Arduino – program cd. void loop() { … if(F1) if(!digitalRead(S0) && !digitalRead(S1)) digitalWrite(D1,LOW); // zamknięcie zaworu F1 = false; // faza F1 wykonana F0 = true; // kolejna faza do wykonania } 11-2017 Zygmunt Kubiak
Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Przykład – zależności czasowe Realizacja zależności czasowych Zależności czasowe są ważnym elementem w wielu aplikacjach Przedstawione zostaną dwie metody realizacji czasowych: Timery programowe na bazie przerwania czasowego Budowa timera 11-2017 Zygmunt Kubiak
Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Przykład – zależności czasowe Timery programowe na bazie przerwania czasowego W przykładzie założono przerwania czasowe o okresie 1ms Timer programowy składa się z dwóch elementów: Licznik LTx – dowolny typ całkowity, bez znaku (np. unsigned int) Flaga aktywności timera Tx, typ całkowity (np. bool, unsigned char, byte //Program obsługi przerwania 1ms w pseudokodzie C ISR_1ms () { if (T0==1) { if (LT0==0) T0=0; else LT0--; } if (T1==1) { if (LT1==0) T1=0; else LT1--; 11-2017 Zygmunt Kubiak
Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Przykład – zależności czasowe Timery programowe na bazie przerwania czasowego Przykład użycia timera programowego LT1 unsigned char T0,T1; unsigned int LT0,LT1; … { if ((PIND & (1<<3))==0) { PORTB &= ~(1<<2); // RST bit - włącz diodę LED1 LT1=1000; F2=1; F1=0; T1=1; // uruchomienie Timera T1 - 1s } … if (F2) { if (T1==0) { PORTB |= (1<<2); // SET bit - wyłącz diodę LED1 F2=0; F3=1; } 11-2017 Zygmunt Kubiak
Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Przykład – zależności czasowe Realizacja zależności czasowych Zależności czasowe są ważnym elementem w wielu aplikacjach Przedstawione zostaną dwie metody realizacji czasowych: Timer z przechwytywaniem bieżącej wartości 11-2017 Zygmunt Kubiak
Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Przykład – zależności czasowe Timer z przechwytywaniem bieżącej wartości W Arduino można użyć funkcji millis() lub micros() Obydwie funkcje są typu unsigned long, który w przypadku mikrokontrolerów oznacza liczbę 32 bitową – oznacza to zakres od 0 – 4 294 967 295 Przykład użycia: unsigned long time; … time = millis(); if ((millis() – time) > 999) { //upłynął czas 1s } !!! Należy zwrócić uwagę na przejście od 0 – 4 294 967 295 11-2017 Zygmunt Kubiak
Mruganie diody (bez delay) Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Przykład – zależności czasowe Mruganie diody (bez delay) Wykorzystanie przechwytywania bieżącej wartości timera 11-2017 Zygmunt Kubiak
Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Przykład – zależności czasowe Przykład realizacji zależności czasowych (np. Arduino) Faza F0 Faza F1 Logiczna sieć działań 11-2017 Zygmunt Kubiak
Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Przykład – zależności czasowe – sterowanie LED Wersja synchroniczna algorytmu 11-2017 Zygmunt Kubiak
Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Przykład – zależności czasowe – sterowanie LED Realizacja Arduino - połączenia 11-2017 Zygmunt Kubiak
Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Przykład – zależności czasowe – sterowanie LED Realizacja Arduino – schemat ideowy 11-2017 Zygmunt Kubiak
Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Przykład – zależności czasowe – sterowanie LED Realizacja Arduino – program /* Zależności czasowe Sterowanie diodą LED created 2017 by Zygmunt Kubiak */ const int D2 = 2; // D2 – dioda LED boolean F0, F1; // flagi faz procesu unsigned long T0, T1; // bieżąca wartość czasu stanu D2 unsigned long Tz = 500 // czas załączenia D2 unsigned long Tw = 300 // czas wyłączenia D2 11-2017 Zygmunt Kubiak
Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Przykład – zależności czasowe – sterowanie LED Realizacja Arduino – program cd. void setup() { // zainicjowanie funkcji pinów: pinMode(D2, OUTPUT); // wyjscie - LED // zainicjowanie stanu początkowego aplikacji SterLED digitalWrite(D2,LOW); // zawór zamknięty F0 = true; // flaga fazy startowej F1 = false; // pozostałe flagi } 11-2017 Zygmunt Kubiak
Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Przykład – zależności czasowe – sterowanie LED Realizacja Arduino – program cd. void loop() { if(F0) if(millis() – T0 >= Tw) digitalWrite(D2,HIGH); // włączenie D2 T1 = millis(); // pobranie bieżącego czasu dla zapalonej diody D2 F0 = false; // faza F0 wykonana F1 = true; // kolejna faza do wykonania } … 11-2017 Zygmunt Kubiak
Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Przykład – zależności czasowe – sterowanie LED Realizacja Arduino – program cd. void loop() { … if(F1) if(millis() – T1 >= Tz) digitalWrite(D2,LOW); // wyłączenie D2 T0 = millis(); // pobranie bieżącego czasu dla wyłączonej diody D2 F1 = false; // faza F1 wykonana F0 = true; // kolejna faza do wykonania } 11-2017 Zygmunt Kubiak
Przykład - Programowanie niezależnych aplikacji Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Przykład - Programowanie niezależnych aplikacji (połączenie poprzednich przykładów) 11-2017 Zygmunt Kubiak
Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Przykład – Współbieżna praca niezależnych aplikacji Jednoczesna regulacja poziomu cieczy i niezależne sterowanie dioda LED (poprzednie przykłady) Faza F2 Faza F3 11-2017 Zygmunt Kubiak Logiczna sieć działań
Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Przykład – Współbieżna praca niezależnych aplikacji Jednoczesna regulacja poziomu cieczy i niezależne sterowanie dioda LED – wersja synchroniczna algorytmu 11-2017 Zygmunt Kubiak
Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Przykład – Współbieżna praca niezależnych aplikacji Jednoczesna regulacja poziomu cieczy i niezależne sterowanie dioda LED – wersja synchroniczna algorytmu 11-2017 Zygmunt Kubiak
Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Przykład – łączenie niezależnych aplikacji Realizacja Arduino - połączenia 11-2017 Zygmunt Kubiak
Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Przykład – łączenie niezależnych aplikacji Realizacja Arduino – schemat ideowy 11-2017 Zygmunt Kubiak
Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Przykład – łączenie niezależnych aplikacji Realizacja Arduino – PCB nakładki 11-2017 Zygmunt Kubiak
Sygnalizacja świetlna Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Sygnalizacja świetlna 30 s 6 s 20 s 4 s DR DY DG 11-2017 Zygmunt Kubiak
Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Przykład – realizacja zależności czasowych Sygnalizacja świetlna 30 s 6 s 20 s 4 s DR DY DG T1, T2, T3, T4 – czasy poszczególnych faz DG, DY, DR – wyjścia (światła, odp. zielone, żółte, czerwone) Wyjście aktywne – sygnał log. „1” np. DG = 1 – załączone (zapalone) DG = 0 – wyłączone (zgaszone) 11-2017 Zygmunt Kubiak
Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Przykład – realizacja zależności czasowych Sygnalizacja świetlna Logiczna sieć działań Wykorzystanie timera programowego F2 F0 F3 F1 11-2017 Zygmunt Kubiak
Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Przykład – realizacja zależności czasowych Sygnalizacja świetlna – realizacja synchroniczna (z timerami programowymi) 11-2017 Zygmunt Kubiak
Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Przykład – realizacja zależności czasowych Sygnalizacja świetlna – realizacja synchroniczna (z timerami programowymi) 11-2017 Zygmunt Kubiak
Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Przykład – realizacja zależności czasowych Sygnalizacja świetlna 11-2017 Zygmunt Kubiak
Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Przykład – realizacja zależności czasowych Sygnalizacja świetlna 11-2017 Zygmunt Kubiak
Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Przykład – realizacja zależności czasowych Sygnalizacja świetlna 11-2017 Zygmunt Kubiak
Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Przykład - mieszalnik 11-2017 Zygmunt Kubiak
Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Przykład - mieszalnik Sterowanie pracą mieszalnika a, b, c - czujniki poziomu (0 – czujnik zanurzony, 1 - czujnik wynurzony) Y1, Y2, Y3 - zawory sterowane W - sterowanie mieszadła G - sterowanie grzejnika Wyjście aktywne – sygnał log. „1” np. Y1 = 1 – zawór załączony Y1 = 0 – zawór wyłączony 11-2017 Zygmunt Kubiak
Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Przykład - mieszalnik 1 2 Sterowanie pracą miesza 1 F2 1 F0 F3 1 F1 F4 1 1 2 Logiczna sieć działań 11-2017 Zygmunt Kubiak
Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Przykład - mieszalnik Wersja synchroniczna algorytmu 11-2017 Zygmunt Kubiak
Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Przykład - mieszalnik Wersja synchroniczna algorytmu 11-2017 Zygmunt Kubiak
Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Przykład – Zespół wagoników 11-2017 Zygmunt Kubiak
Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Przykład – Zespół wagoników Sterowanie zespołem wagoników L1, P1, L2, P2 - napęd wagoników (lewo, prawo) A, B, C, D - wyłączniki krańcowe 11-2017 Zygmunt Kubiak
Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Przykład – Zespół wagoników Sterowanie zespołem wagoników L1, P1, L2, P2 - napęd wagoników (lewo, prawo) A, B, C, D - wyłączniki krańcowe (załączony = 1) S - start procesu (załączony = 1) R1, R2 - wyjścia pomocnicze (flagi) 11-2017 Zygmunt Kubiak
Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Przykład – Zespół wagoników Sterowanie zespołem wagoników Logiczna sieć działań 1 2 R1, R2 – znaczniki wykonania operacji F0 .. F5 – fazy sterowania wagoników 2 1 11-2017 Zygmunt Kubiak
Sterowanie zespołem wagoników Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Przykład – Zespół wagoników 2 1 Sterowanie zespołem wagoników Wersja synchroniczna Sterowanie zespołem wagoników 11-2017 Zygmunt Kubiak
Sterowanie zespołem wagoników Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Przykład – Zespół wagoników 2 1 Sterowanie zespołem wagoników Sterowanie zespołem wagoników Wersja synchroniczna 11-2017 Zygmunt Kubiak
Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Przykład – Sterowanie diodami LED 11-2017 Zygmunt Kubiak
Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Przykład – Sterowanie diodami LED TLK - Test stanu klawisza LT0, T0 ; LT1, T1 - Timery programowe LC - Licznik 11-2017 Zygmunt Kubiak
Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Przykład – Sterowanie diodami LED Logiczna sieć działań 1 2 11-2017 Zygmunt Kubiak
Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Przykład – Sterowanie diodami LED Wersja synchroniczna algorytmu 1 11-2017 Zygmunt Kubiak
Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Przykład – Sterowanie diodami LED Wersja synchroniczna algorytmu 1 Opracowanie Z.Kubiak 11-2017 Zygmunt Kubiak
Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Przykład – Sterowanie diodami LED Wersja synchroniczna algorytmu Realizacja Timer’ów programowych 11-2017 Zygmunt Kubiak
Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Przykład – Sterowanie diodami LED // Przykład z obsługą Timerów programowych T1, T2 i klawisza // Naciśniecie klawisza powoduje zapalenie LED1 na 1s // Zwolnienie klawisza uruchamia 10cykli pulsowania LED2 (okres 1s) // Autor: Z.Kubiak IIPP, 2006 // Kontroler: ATmega8515 // Naciśnięty klawisz zwiera wejście do masy // Diody zapalane sygnalem zero #include <avr/io.h> #include <avr/interrupt.h> #include <avr/signal.h> unsigned char LC,T0,T1; unsigned char F0,F1=0,F2=0,F3=0,F4=0,F5=0,F6=0,F7=0; unsigned int LT0,LT1; 11-2017 Zygmunt Kubiak
Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Przykład – Sterowanie diodami LED cd. //Program obsługi przerwania 5ms (Tck = 11,0592MHz) SIGNAL (SIG_OVERFLOW0) { if (T0==1) { if (LT0==0) T0=0; else LT0--; } if (T1==1) { if (LT1==0) T1=0; else LT1--; TCNT0 = 202; // cykl 54 11-2017 Zygmunt Kubiak
Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Przykład – Sterowanie diodami LED cd. int main(void) { //MCUCR = 2; // przerwania zewnętrzne DDRD = 0xF0; // Bity PORTD 0..3 wej; 4..7 wyj PORTD = 15; // podciąganie wejść DDRB = 0xFF; // PORTB wyjścia TIMSK = 2; TCNT0 = 202; TCCR0 = 5; // podział przez 1024 F0=1; // faza programu T1=0; // znacznik aktywności timera programowego //F1=0; //F2=0; PORTB=255; // ustaw PORTB - zgaś diody sei(); // odblokowanie przerwań // diody LED - PORTB.2 i PORTB.3 11-2017 Zygmunt Kubiak
Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Przykład – Sterowanie diodami LED cd. while(1) { if (F0) { if ((PIND & (1<<3))==0) //test klawisza czy wcisnięty { LT0=2; // filtrowanie drgań styków F1=1; F0=0; T0=1; // uruchomienie Timera T1 - 10ms } 11-2017 Zygmunt Kubiak
Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Przykład – Sterowanie diodami LED cd. if (F1) { if (T0==0) { if ((PIND & (1<<3))==0) { PORTB &= ~(1<<2); // RST bit - zapal diodę LED1 LT1=199; F2=1; F1=0; T1=1; // uruchomienie Timera T2 - 1s } else { F1=0; F0=1; 11-2017 Zygmunt Kubiak
Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Przykład – Sterowanie diodami LED cd. if (F2) { if (T1==0) { PORTB |= (1<<2); // SET bit - wył diodę LED1 F2=0; F3=1; } if (F3) { if (PIND & (1<<3)) //test klawisza czy wycisnięty { LT0=2; // filtrowanie drgań styków F4=1; F3=0; T0=1; // uruchomienie Timera T1 - 10ms 11-2017 Zygmunt Kubiak
Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Przykład – Sterowanie diodami LED cd. if (F4) { if (T0==0) { if (PIND & (1<<3)) { LC=10; // 10 cykli pulsowania LED2 F5=1; F4=0; } else { F4=0; F3=1; } } if (F5) { PORTB &= ~(1<<3); // RST bit - zapal diodę LED2 LT1=99; F5=0; F6=1; T1=1; 11-2017 Zygmunt Kubiak
Programowanie mikrokontrolerów Programowanie systemów wbudowanych (firmware) Przykład – Sterowanie diodami LED cd. if (F6) { if (T1==0) { PORTB |= (1<<3); // SET bit - wył diodę LED2 LT0=99; LC--; F6=0; F7=1; T0=1; } } if (F7) { if (T0==0) { if (LC==0) // czy wszystkie cykle wykonane? { F7=0; F0=1; } else F5=1; } 11-2017 Zygmunt Kubiak
Dziękuję Zygmunt Kubiak 11-2017