Systemkonstruktion LABORATION REALTIDSPROGRAMMERING Laborationsansvariga: Anders Arvidsson, Björn Lundblad Utskriftsdatum: 2002-10-31 Laboranter:
1 Syfte Denna laboration syftar till att öva användningen av ANSI-C som ett verktyg för att programmera mikroprocessorer. Viss realtidsprogrammering kommer också att studeras. 2 Genomförande Huvuddelen av laborationen utförs i grupper om 2-3 studenter. Vissa delar av laborationen underlättas om föreläsningsanteckningarna finns tillgängliga. Redovisning sker genom att laboranten vid markerade ställen visar upp resultatet för laborationsansvarig. 2
3 Laborationsuppgifter De första uppgifterna nedan kommer att byggas på till en fil. Skapa ett projekt med tom C-fil, t ex pwm.c. Det kan vara smidigt att utgå från ett tidigare program vid kodningen. 3.1 Header-fil Funktioner som ofta används i oförändrat skick kan vara smidigt att lägga i en separat header-fil, som kan användas till många program. Normalt läggs funktionerna i c-filer som deklareras i en header-fil, men vi hoppar över ett steg. Hämta filen piclab.h och lägg denna i samma katalog som projektet. Filen innehåller en funktion som omvandlar ett binärt tal, 0-99, till decimala tal. Funktionen tar typen char som argument och returnerar en char innehållande två decimala tal. Bit 0:3 representerar entalssiffran och bit 4:7 tiotalssiffran. Funktionen anropas enligt exemplet nedan. dec_tal = BinBCD(bintal); Inkludera header-filen i ditt program. Då filen ligger i samma katalog som projektet, ska inkluderingen göras med citattecken enligt nedan. #include "piclab.h" Verifiera omvandlingen genom att skriva ett litet program och simulera med olika indata. Undersök hur lång tid omvandlingen tar. Omvandlingstid: 3.2 PWM-regulator med non-preemtive schemaläggning Nedan övas schemaläggning där avbrott inte tillåts, samt en teknik för att verifiera att tidskraven uppnås. Uppgiften visar också ett sätt att specificera ett program genom att skriva och beskriva huvudprogrammet och på så vis arbeta på en högre abstraktionsnivå. Ljusstyrkan på en 12 V miniatyrlampa, driven av en PIC via en transistor, ska regleras enligt följande: Vid tryckning på knapp up ska ljusstyrkan öka i steg om 1%. Vid tryckning på knapp down ska ljusstyrkan minska i steg om 1%. När en knapp hålls intryckt justeras värdet 10 ggr/s. En display (på S-24 däcket) ska visa ljusstyrkan i %. Lampan ska pulsas med frekvensen 33,3 Hz vid 4 MHz klockfrekvens. Restriktioner för och krav på programmet: Inga interrupt får användas. Inga globala variabler får användas. main() ska se ut exakt enligt nedan. 3
main() { char PWM; init(); while(1) { } } LABORATION Realtidsprogrammering // Initiera portar mm timer_start(prgtid); // Starta timern PWM = knapptest(); // Kontrollera knapparna PORTB = BinBCD(PWM); // Lägg ut % på display RA2 = PWM_styr(PWM); // Lägg ut eller släck puls idle(); // Vänta på att timern räknat ut Beskrivning av funktionerna: init(); Innehåller alla initieringar som endast utförs en gång. timer_start() Starta timern med ett värde (deklarerat med #define) så att cykeltiden för programmet ger en pulsfrekvens på 33,3 Hz. (Programmet utför 100 cykler under 1 puls.) knapptest() Testa knapparna och öka eller minska pulsbreddsvariabeln efter specifikation. Funktionen returnerar en char innehållande pulsbredd 0-99%. Initialt ska pulsbredden vara 50%. BinBCD() Argumentet till funktionen består av ett heltal mellan 0 och 99. Funktionen returnerar talet på BCDkod enligt beskrivning i piclab.h. PWM_styr() Argumentet till funktionen består av ett heltal mellan 0 och 99. Funktionen returnerar en bit där 1 = PWM-puls hög och 0 = PWM-puls låg. Utsignalen är en funktion av insignalen och antalet gånger funktionen anropats. Efter 100 anrop upprepar sig förloppet. Antalet 1 or under den tiden motsvarar argumentet (= pulsbredden). idle() Funktionen väntar på att Timer0 Interrupt Flag blir satt. Under den tiden är Port A, bit 2, hög. Detta för att visa hur mycket tidsmarginal som finns i hela cykeln. Komplettera specifikationen ovan med nödvändiga uppgifter, t ex vilka pinnar de två knapparna ansluts till. 4
Skriv färdigt programmet och simulera funktionerna för att verifiera att de fungerar. Eventuellt kan ett tillfälligt huvudprogram skrivas för att enklare testa funktionerna med olika indata. Bygg upp konstruktionen på ett S-24 däck och besvara nedanstående frågor. Vilken är den minsta tid som bit RA2 kan vara hög? (Kommentera bort raden som nollställer T0IF, så att idle() exekverar under kortast möjliga tid. PWM-frekvensen varierar nu beroende på programmets exekveringstid. Mät tiden med oscilloskop. Återställ sedan programmet.) Vilken är största och minsta tidsmarginal i programcykeln vid olika händelser? (Återställ programmet så T0IF inväntas. Kontrollera att frekvensen är stabil. Testa med olika pulsbredder. Ställ in oscilloskopet för efterlystid genom att under [Display], justera [Persist] till 5 sekunder, så syns gränserna tydligt. Räkna bort tiden som uppmättes ovan, som inte var väntetid, utan minsta tid för att hantera RA2.) Ok, så långt: 3.3 PWM-regulator med preemtive schemaläggning I föregående uppgift kunde lampan tyckas flimra vid vissa pulsbredder. Detta problem ska minskas genom att pulsfrekvensen ökas till 50 Hz. Modifiera programmet så att denna frekvens klaras. Börja med att schemalägga rutinerna (på papper) så att pulsfrekvensen garanteras. Detta sker med hjälp av avbrott. Vissa rutiner utgår. För kommunikation med avbrottsrutin tillåts upp till två globala variabler. Kom ihåg att nedtryckt knapp ska innebära förändring av pulsbredd 10 ggr/s. Tips: En rutin har mycket mjuka realtidskrav. Testa programmet på däcket och verifiera att pulsfrekvens mm stämmer. Lab ok: 5