Elektroteknik MF1016 föreläsning 9 MF1017 föreläsning 7 - Inbyggda system - Analog till digital signal - Utvecklingssystem, målsystem - Labutrustningen - Uppbyggnad av mikrokontroller - Masinkod, assemblerkod - Högnivåkod Datorer och programvara i produkter som inte i sig är datorer kallas inbyggda system (embedded systems). Internet of things alla inbyggda system skall även vara uppkopplade. Inbyggda system måste ibland vara säkerhetskritiska. Man talar om säkerhetskritiska system. http://news.bbc.co.uk/2/hi/programmes/click_online/9755210.stm
MMK, KTH Elektroteknik Föreläsning 7 - Analog till digital signal Exempel på olika koder 1 byte = 8 bitar. 1 byte kan ha olika betydelse i olika sammanhang, Vi använder olika koder. Binärt Hexadecimalt Decimal 2-komplement Ascii 1111 1111 F F 255-001 ÿ 1000 0000 8 0 128-128 0111 1111 E F 127 127 Delete 0000 0000 0 0 000 000 NUL
Elektroteknik MF1016 föreläsning 9 MF1017 föreläsning 7 - Utvecklingssystem, målsystem Ofta ingår även editorn i utvecklingsystemet. På labben är det så.
MMK, KTH Elektroteknik Föreläsning 7 - Labutrustningen mbed-modulen som används i laborationen. Nedan ses MCU-lådan med mbed-modulen monterad i mitten. Diverse signaler till/från mbed-modulen är utdragna till 2mm-hylsor. De som är tillgängliga i denna laboration är indikerade nedan.
Elektroteknik MF1016 föreläsning 9 MF1017 föreläsning 7 Högnivåprogrammet skrivs som vanlig text i en editor. Högnivåprogrammet som även kallas källkod. Kompilatorn översätter, genom så kallad kompilering, högnivåprogrammet till maskinkod som innehåller den sekvens av ettor och nollor som ska skrivas in i mikrokontrollerns minne, med början på minnesadress noll. Högnivåprogrammet är relativt oberoende av den aktuella processorn. Högnivåprogrammeringsspråket är ofta C då det gäller inbyggda system. En vits med att använda ett högnivåprogram är att programmeringen är relativt oberoende av vilken processor som används. Även så kallad assemblerprogrammering kan användas, men varje processortillverkare har sitt eget assemblerspråk. Assemblern är egentligen en läsbar variant av den maskinkod (ettor och nollor) som ska ligga i processorns minne. Nedan visas hur kompilering gör av programmeraren. Resultatet blir en maskinkodsfil.h som med drag and drop kan flyttas till den USB-anslutna mbed-modulen som om den vore ett USB-minne. För att starta programmet trycks på reset och programräknaren nollställs och exekveringen startar.
MMK, KTH Elektroteknik Föreläsning 7 - Uppbyggnad av mikrokontroller http://courses.cs.vt.edu/~csonline/machinearchitecture/lessons/cpu/lesson.html RAM: Minnet som innehåller både instruktioner och data. Detta är något som kännetecknar den så kallade von Neumann arkitekturen. Register: En speciell typ av minnen, I detta fall tre stycken instruktionsregistret (IR), programräknaren (PC) och Accumulatorn (Acc). Bussar: Det finns tre bussar, databussen, adressbussen och kontrollbussen. De kan även tillsammans kallas systembussen. Vardera buss består av ett antal ledare. ALU: Aritmetisk logisk enhet. Kan utföra ett antal operationer, t ex addition. Vilken typ av operation kan väljas med kontrollbussen. Kontrollenheten eller styrenhet: I vårt exempel består den av två delar, en instruktionstolk (decoder) och en multiplexer dvs en vägväljare eller omkopplare Instruktionsavkodaren avkodar den instruktion som för tillfället ligger i instruktionsregistret och påverkar via kontrollbussen bla vilken operation ALU skall göra och om läsning från minnet eller skrivning till minnet skall ske.
Elektroteknik MF1016 föreläsning 9 MF1017 föreläsning 7 Varje arbetscykel består av två faser, hämtfasen och utförandefasen. I hämtfasen hämtas en instruktion från minnet och läggs i instruktionsregistret. Detta följs av utförandefasen där instruktionen som nyligen placerades i instruktionsregistret avkodas och utförs. Typiskt kan en instruktion innebära att data hämtas från minnet till accumulatorn. Varje instruktion består av en operationskod och en operand och en bit som talar om om operanden ska tolkas som data eller adress. Vid reset nollställs programräknaren och innehållet i programräknarregistret läggs ut på adressbussen (i detta fall adress noll). Via kontrollbussen beordras läsning från minnet (read) och strax därefter skivning till instruktionsregistret.
MMK, KTH Elektroteknik Föreläsning 7 - Masinkod, assemblerkod Maskinkoden är de ettor och nollor som ligger i Flashminnet ovan (ROM Read Only Memory innehållet ändras ej under program körning = exekvering) Uppgift: Skriv ett program som läser från ingång 14, adderar 2 till detta värde och skriver till utgång 12. (Se instruktionslista på webblänken ovan). Lösning: # Machine code Assembly code Description Kopiera heltalet i 14 till accumulatorn. (Heltalet är till exempel 0 LOAD 14 proportionellt mot en insignal) 1 ADD #2 Addera 2 till innehållet i accumulatorn och lägg i accumulatorn 2 STORE 12 Kopiera heltalet i accumulatorn till 12 som är en utgång. - Högnivåkod Här kan du köra ett C program för att testa: http://codepad.org Du kan till exempel klippa ut nedanstående C-program och exekvera det. #include <stdio.h> //deklarationer och initieringar int a=1, b=1, c, t=20; int main(void) //Här börja tidsnedräkningen while (t>0) if ((a==1)&&(b==1))c=1; else c=0; // Beräkning av utsignal //i detta fall AND-funktion printf("tid kvar=%i c=%i \n",t,c); //skriv utsignal //tiden som är kvar minskas t=t-1; }//while slutar här } //main slutar här Ovanstående prog finns redan skrivet på: http://codepad.org/pfehgt8o
Ett annat exempel: Elektroteknik MF1016 föreläsning 9 MF1017 föreläsning 7 När man arbetar med inbyggda system eller med styrsystem brukar begreppet tillstånd användas. Detta begrepp passar bra ihop med switch case i programmering För att träna på att skriva sådana program kan vi först titta på nedanstående program. #include <stdio.h> //deklarationer och initieringar int tillstand=1, t=7; int main(void) while (t>0) switch (tillstand) case 1: printf("måndag\n"); break; case 2: printf("tisdag\n"); break; } //switch slutar här t=t-1; } //while slutar här } //main slutar här 1. Kör programmet och se vad det skriver ut. Använd följande länk: http:// http://codepad.org/iecqwxqs 2. Ändra i programmet så att det skriver ut tisdag istället (går att göra i codepad genom att använda länken ovan och ändra i programmet). 3. Ändra i programmet så att godtycklig veckodag kan skrivas ut.
MMK, KTH Elektroteknik Föreläsning 7 #include <stdio.h> //deklarationer och initieringar int tillstand=1, t=7; int main(void) while (t>0) switch (tillstand) case 1: if (t>6) tillstand=2; } printf("måndag\n"); break; } case 2: if (t>5) tillstand=3; printf("tisdag\n"); break; } //switch slutar här t=t-1; } //while slutar här return 0; } //main slutar här Ovanstående finns på http://codepad.org/bpdw8qki
Elektroteknik MF1016 föreläsning 9 MF1017 föreläsning 7 Nedanstående program kan inte köras i codepad. Det kan däremot fyllas med lämpligt innehåll och köras på vår mikrokontroller. Programskalet nedan innehåller det som alltid skall vara med och som inte ändras från program till program (endast variabeln ver ska ökas med ett efter varje ändring i programmet ver är versionsnummer). // Långlab Mikro, Kurs Elektroteknik #include "mik.h" char prog[] = "Mikro-lab"; // Textsträng med programmets namn int ver = 1; // *** ÖKA gärna numret för varje version ni testkör! *** int main(void) init_mik(); // Själva programslingan // Initiera hårdvaran move_cursor( 1, 5 ); // Displaymarkören till rad 1, kolumn 5 dprintf( "%s v.%i", prog, ver ); // Skriv ut programmets namn och version /******************************************************************** ** ** ** Deklarera variabler här nedanför vartefter som ni behöver dem ** ** ** ********************************************************************/ int state = 0; /******************************************************************** ** ** ** Konfigurera GPIO som in- och utgångar här nedanför med init_pin ** ** ** ********************************************************************/ while( 1 ) // Evighetsloop } } // Programslingans slut
MMK, KTH Elektroteknik Föreläsning 7 // grind.c, ett program för MET-kontrollern // Långlab Mikro, Kurs Elektroteknik // MG & TL 2002 // Modifierad för ATmega128 PK 2009 och 2012 HJ #include "mik.h" // Infogar bibliotek medfunktioner char * prog = "Grind"; // Textsträng med programmets namn int ver = 0; // ÖKA numret för varje version ni // flashar! *** int a, b, c; int main(void) init_met(); // Deklaration av variablerna // Själva programslingan // Initierar MET-kontrollern move_cursor(1,1); // Displaymarkören till rad 1, //kolumn 1 dprintf("%s v.%i", prog, ver); // Skriv ut programmets //namn/version init_pe(0,"in"); init_pe(1,"in"); init_pe(2,"out"); while(1) a = GET_BIT(pe,0); b = GET_BIT(pe,1); if ((a==1)&&(b==1))c=1; else c=0; // Initierar pe.0 som inpinne // Initierar pe.1 som inpinne // Initierar pe.2 som utpinne // Evighetsloop! // Läser av pe.0 // Läser av pe.1 // Beräkning av utsignal //i detta fall AND-funktion if(c == 1) SET_BIT(pe,2); // Utsignal beroende på c else CLR_BIT(pe,2); } } // Programslingans slut
2015-10-03/HJ Elektroteknik MF1016 föreläsning 9 MF1017 föreläsning 7