Liftmaestro. Lunds Tekniska Högskola Elektro- och informationsteknik. Olle Gemfors, I13 Dayanand Sagar, I13 Mattias Wendler, I13

Relevanta dokument
Växtviskaren EITF11 Digitala projekt VT15, I12

Bilen som inte kan krocka

Rapport. Fyra i rad-spel. Rapport Digitala Projekt EITF11 Grupp 9 Emma Rasmusson & Louise Ragnarsson Handledare: Bertil Lindvall

Lunds Tekniska Högskola Elektro- och informationsteknik Digitala projekt (EITF11)

Digitala Projekt(EITF40) - Larm

Snake. Digitala Projekt (EITF11) Fredrik Jansson, I-12 Lunds Tekniska Högskola,

Temperaturmätare med lagringsfunktion DIGITALA PROJEKT EITF11 GRUPP 14, ERIK ENFORS, LUDWIG ROSENDAL, CARL MIKAEL WIDMAN

LARMANLÄGGNING. Digitala Projekt, EITF11. Oskar von Knorring Emin Karimov Henrik Akej Handledare: Bertil Lindvall

The Intelligent Timer

EITF11 - Digitala projekt. Hastighetsmätare. Hugo Backmyr Mattias Karlsson

DIGITALA PROJEKT (EITF40) Fartmätare

Rapport Digitala Projekt EITF11 Grupp 4 Axel Sundberg, Jakob Wennerström Gille Handledare: Bertil Lindvall

TEMPERATURMÄTARE MED GRAFRITARE

Larmcentral. Digitala Projekt. Cecilia Olsson & Erika Björck Handledare: Bertil Lindvall LUNDS TEKNISKA HÖGSKOLA

Projekt EITA15. Väckarklocka. LTH Ingenjörshögskolan vid Campus Helsingborg Datateknik

Projektrapport - Roterande digital LED-klocka

Innehållsförteckning. Figur- och tabellförteckning. Figure 1 Blockschema över hårdvaran...4 Figure 2 Blockschema över programet...

The Phenomenal Doorbell Bilaga 2. Källkod

1 Bakgrund 4. 2 Kravspecifikation Definitioner Grundläggande krav Användarfall 5

Thunder s Truck projektrapport

EITF11 Digitala Projekt TIC TAC TOE. Lukas Ljungblom & Johan Lyckenvik I-13 Handledare: Bertil Lindvall

Digitala Projekt VT13. PING-Pong

The Secure Light. Digitala Projekt EITF11. Hanna Tinglöf, I-12 Anna Horvath, I-12 Filippa Österlin, I-12. Handledare: Bertil Lindvall

Digitala Projekt(EITF40) - Larm

Digitala Projekt EITF11 Grupp 9 Projektarbete Hanna Bondesson Marcus Skog. Reaktionsspel EITF11

Pulsmätare med varningsindikatorer

Väderstation. Digitala Projekt EITF11 Institutionen för Elektro- och Informationsteknik Lunds Tekniska Högskola

Digitala Projekt (EITF11) Hemlarm

PlantPuppy Räddaren för den som inte kan hålla växterna vid liv

Effektpedal för elgitarr

Projektrapport Målgång

Digitala projekt Linjeföljande bil

Pulsmätare Digitala Projekt EITF11

Digitala Projekt (EITF11)

Lunds Tekniska Högskola EITF11 Digitala projekt. Bandspelaren

TETRIS. LTH, Campus Helsingborg EITA15 Digitala System

LARMANLÄGGNING. Digitala Projekt, EITF11. Oskar von Knorring Emin Karimov Henrik Akej Handledare: Bertil Lindvall

Projektrapport - Feststation

High Core Remote Car X8000 Cool

Rafiki Wa Kupanda. EITF11, Digitala projekt VT18. Linnea Håkansson, Anton Gunneberg, Ruben Schultz

PROJEKTTYP: Rapportsammanfattning STUDENTER: Larsson, J. ( ) och Oredsson, J. ( ) DATUM: 26 april, 2015

EITF11. WormFight. Axel Eriksson, Felix Geuken Handledare: Bertil Lindvall EITF11

JOFEN-Prototypes. Målsökande pansarvagn. Projektarbete i Kursen EITA15. Jonatan Claesson, Olle Jonasson, Felix Rödén, Edvin Rossi & Nils Olén

Digitala projekt, EDI021 Rapport Handledare: Bertil Lindvall

Digitala Projekt: Digitala Projekt, EITF11 - VT17 Oscar Ahlgren, Patrik Lorentsson och Sten Hellberg Handledare: Bertil Lindvall

DIGITALA PROJEKT Väderstation

#include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> unsigned char num;

EITF40 - RFID-terminal. Joakim Marculescu (dt08jm6), Eric Johansson (dt08ej6)

Digitalt Projekt: Radiostyrd Bil

Linjeföljare Digitala projekt Johan Engström e02je Henrik Persson e02hp

Helena Harrysson och Linnéa Wickberg

Feeding Daisy. EITF11 Lunds Tekniska Högskola. Grupp 12: Pontus Akervall Louise Landare Anton Schölin. En automatisk blomvattnare

EITF11: Bandkanon Grp 05

Digitala System Projekt - EITA15 VT *SUPER DUPER KLOCKAN*

TEMPERATUR OCH VINDMÄTARE MED HÖGTALARFUNKTION

Laboration 4: Knappstuds Drivrutiner för att eliminera störningar.

Projektrapport i Digitala System

ETSA01 Digitala Projekt (I) VT- 13. Projektarbete AC Handledare Bertil Lindvall

Digitala Projekt (EITF11) Larmanläggning

RemoteBud. Inlämnas: Patrik Johnsson, e01pjo Viktor Karlsson, e01vk

EIT. Digitala projekt EITF11. Larmanläggning. Handledare Bertil Lindvall Anna Lindberg I-11 Caroline Vitasp I-11 Eric Eliason I-10

DANCING ROBOT. EITF11, Grupp 10. Kajsa Salomonsson, Hugo Hedin och Petter Mårtensson

Rapportsammanfattning. Optima Sous Vide

Datorteknik 1 (AVR 1)

Källkod. #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #define green_diode PD5. #define RS PD4

EITF11 - Digitala Projekt

Pulsmätare. EITF11 Digitala Projekt VT15. Grupp 9: Emma Albertz, Mathilde Hagander & Alexandra Mansner Handledare: Andreas Johansson & Bertil Lindvall

Kla ggvisarskylt. -med en underton av rassel. av Jonathan So nnerup & Gabriel Jo nsson

LOOKY LUKE. Caroline Hellström och Ville Orlander Arvola Industriell ekonomi I10. - Att välja en lyckosam väg EITF11 Digitala projekt

General Purpose registers ALU I T H S V N Z C SREG. Antag att vi behöver skriva in talet 25 till register R18

SIMON SAYS Projekt i EITF11 Digitala Projekt

Digitala projekt Elektro- och informationsteknik

/* * dancing3.c * * Created: :53:20 * Author: digpi10 */ #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.

Department of Information Technology Digitala projekt. SuperKull. Daniel Öhman Alexander Persson

WALL E. WALL EVADER EDI021 DIGITALA PROJEKT

DIGITALA PROJEKT - EITF11

EDI021 Digitala projekt. Rapport LARMSYSTEM. Utförd av: Niklas Eklund E03 David Olsson E04. Inlämnad:

Rapport Digitala Projekt EITF Grupp 12 Elin Blomstergren, Victor Sundgren Handledare: Bertil Lindvall. Fyra i rad

Digitala projekt - Radiostyrd bil

Lunds Tekniska Högskola. I-10 Grupp 11: David Sundström Max Schulz Albert Lundberg Handledare: Bertil Lindvall

Innehåll. 1 Inledning 3

Projektrapport - RoboWalter

Gustaf Backman, Anton Nystedt, Nicholas Peebo Battleships. Lunds tekniska högskola. EITF11 Digitala projekt

Projekt Digitala system. Rörelsekänsligt Larmsystem

Whac A mole. Ett rektionstest i kursen Digitala Projekt EITF11 utfört av: Axel Spångberg I10 Marcus Witting I10. Handlett av: Bertil Lindvall

LUNDS TEKNISKA HÖGSKOLA. Väderstation. Digitala Projekt, EITF11. Martin Olofsson, I08 & Fredrik Oher, I08 Vt 2012

Digitalteknik: CoolRunner-II CPLD Starter Kit Med kommentarer för kursen ht 2012

Väderstation. EITF11, Digitala projekt RAPPORT. Isabella Bergvik, Emma Sandén & Hanna Åberg

Datorteknik 2 (AVR 2)

Kontrollskrivning Mikrodatorteknik CDT S2-704

Digitala projekt, EITF11 - Rapport Handledare: Bertil Lindvall. Fredrik Nylund (ine12fny) Johan Ekman (ine11jek) Olof Wikman (ine11owi)

Konstruktion av en radiostyrd legobil. Digitala projekt av Arbon Vata Leonardo Vukmanovic Amid Bhatia

Kevin Lane Kungliga Tekniska Högskolan Introduktionskurs i Datateknik (II1310) TIEDB0. [NXT Legorobot] [Programmering och felsökning]

Avståndsmätare. Digitala System EITA Grupp 7. Abdelsalem Yabrag, Abdulhadi kikar, Fredrik Peterson, Jesper Annefors

Projektrapport i Digitala projekt EITF11. Institutionen för Elektro- och informationsteknik, Lunds tekniska högskola

LTH Ingenjörhögskolan vid Campus Helsingborg. Mastermindspel

Guitar Tuner EITF11 Digitala Projekt, Projektrapport Elektro- och informationsteknik

AVR 3 - datorteknik. Avbrott. Digitala system 15 hp. Förberedelser

Laborationskort - ML4

Digitalteknik: CoolRunner-II CPLD Starter Kit

Transkript:

Lunds Tekniska Högskola Elektro- och informationsteknik Liftmaestro Olle Gemfors, I13 Dayanand Sagar, I13 Mattias Wendler, I13 Handledare: Andreas Johansson, Bertil Lindvall 2016-05-20 Projektarbete, EITF11 Digitala projekt Industriell ekonomi, Vårterminen 2016

Abstract This is a project report in the course Digitala Projekt, EITF11. The purpose of the course is to get an insight in how industrial development works. Our aim with the project was to connect and code a working model of a lift. The lift hardware was provided by the course instructor. The hardware was connected to a processor (AVR ATmega16) using five 74HC373 latches, two for the input signals and three for output signals. The processor was coded using a JTAG and Atmel Studio. This resulted in a working lift model where the lift can serve all five floors in a logical order. Furthermore LED-lights are lit when pressed and are turned off when the lift arrives. Finally an LED-display updates and shows the current floor of the lift. 2

Innehållsförteckning Innehållsförteckning 1. Inledning 1.1 Bakgrund 1.2 Problembeskrivning 1.3 Avgränsningar 2. Kravspecifikation 3. Teori 3.1 Hårdvara 3.1.1 Processor 3.1.2 Latchar 3.1.3 Hissmodell 3.1.4 JTAG 3.2 Mjukvara 4. Utförande 4.1 Planering 4.2 Konstruktion 4.3 Programmering 4.4 Test och felsökning 5. Resultat 6. Diskussion och slutsats 7. Källförteckning 8. Appendix Bilaga 1, Kopplingsschema Bilaga 2, programkoden 3

1. Inledning 1.1 Bakgrund Detta projekt har genomförts under våren 2016 inom ramen för kursen Digitala projekt (EITF11) som en del av teknikprofilen System- och programvaruutveckling på Industriell ekonomi. Syftet med kursenär att ge studenterna en inblick i hur industriellt utvecklingsarbete genomförs genom att studenterna får komma på en idé, designa en modell av denna idé, bygga modellen och slutligen testa och felsöka konstruktionen. Kursen är indelad i två delar, där den första består av föreläsningar och laborationer och den andra av självständigt arbete som ska resultera i en fungerande prototyp. 1.2 Problembeskrivning Som projekt i denna kurs valde vi att göra ett av de projekt som fanns att tillgå i kursens uppgiftskatalog. Detta projekt använder sig av en färdig modell av en hiss som tillhandages av handledarna. Hissen skulle kopplas till en processor som sedan skulle programmeras med programmeringsspråket C för att kunna svara på indata i form av knapptryckningar på modellen som får hissen att röra sig upp och ner och stanna på önskad våning. 1.3 Avgränsningar Hissmodellen har, som man kan se på bilden på titelsidan, två hisschakt. På grund av vår ringa erfarenhet av denna typ av arbete begränsade vi oss till att bara koppla och programmera ett av hissens schakt. 2. Kravspecifikation Man ska kunna välja vilken våning som man vill åka till genom att använda knapparna i hallen samt i hissen. Lamporna vid varje våningsplan ska tändas när en knapp trycks ner och släckas när hissen stannar vid våningsplanet. Den aktuella våningen som hissen befinner sig på ska visas på en LED-display. Hissen ska kunna ändra sin rutt under vägen om någon på ett mellanliggande hissplan trycker att han/hon vill åt samma håll som hissen är på väg. Hissen ska ha ett optimerat kösystem så att man inte behöver vänta på hissen alltför länge. 4

3. Teori 3.1 Hårdvara Detta avsnitt beskriver de komponenter som användes för att koppla hissmodellen. För kopplingsschema, se bilaga 1. 3.1.1 Processor AVR ATmega16, High performance AVR 8 bit Microcontroller. Processorn har 40 pinnar där sammanlagt 21 användes för att koppla processorn till fem latchar och delvis till de kontakter som kommer från själva hissmodellen. Dessutom användes några pinnar för att ge processorn ström, möjlggöra programmering genom JTAG och till att styra vilken latch systemet ska kommunicera med vid varje given tidpunkt. 3.1.2 Latchar 74HC373 octal transparent D-type latches with 3-state outputs Eftersom det behövdes fler pinnar än vad processorna hade för att hantera alla in- och utsignaler var vi tvungna att använda latchar för att skapa fler kontakter för in- och output till processorn. Två latchar användes för att se till att alla insignaler kom till processorn och tre latchar användes för att se till att processorn kunde skicka all utdata som den behövde. 3.1.3 Hissmodell Handledarna tillhandahöll hissmodellen som var färdigbyggd sedan tidigare och även redan använd vid ett par tillfällen. Hissmodellens uppbyggnad beskrevs förenklat i ett antal datablad. Det vi använde rent kopplingsmässigt från modellen var tre utkontakter som skulle kopplas till processorn och programmeras. Modellen består sedan av två schakt (där vi som tidigare nämnts valde att endast använda ett) och en liten hiss i varje schakt som drivs av varsin motor. 3.1.4 JTAG Atmel JTAG ICE Det verktyg som användes för att ladda och exekvera mjukvaran i processorn var en JTAG. Koden skrevs på programmeringsspråket C på dator och överfördes via en USB-sladd till JTAGen som laddade in det i processorn. 3.2 Mjukvara Programmet skrevs i språket C i utvecklingsplattformen Atmel Studio 6.1. Programkoden byggs upp av 14 olika metoder. De skrevs gradvis en och en för att säkerhetsställa att alla funktioner i hissen fungerade innan allt sattes ihop. En del av metoderna beskrivs kort här nedan, för komplett programkod se bilaga 2. 5

Startupmode(); En metod för att sätta alla portar och deras in- respektive utgångar till korrekta värden så att hissmodellen blir stabil. executequeue(); En metod för att bestämma vilken våning hissen ska till och få den att köra dit baserat på prioritetskön. checktkinhall(); En metod för att läsa av knapptryckningar och tända lamporna i hallen. CheckTKinHiss(); En metod för att läsa av knapptryckningar och tända lamporna i hissen. CheckSensors(); En metod för att läsa av sensorerna inuti hisschaktet. godown(); och goup(); Metoder för att få hissen att antingen åka nedåt eller uppåt. dispupdate(); En metod för att uppdatera LED-displayerna. addtoprio();, removeprio();, removespecificprio();, checklogicinhall();, refreshprio(); och hissupdate(); Metoder för att behandla bland annat prioritetskön och det som hisslogiken bygger på. 4. Utförande 4.1 Planering Arbetet började med att vi fick klart för oss idén kring vilken vi ville arbeta. Inspiration hämtades från kursens uppgiftskatalog och vad vi skulle göra bestämdes. Därefter skrevs en kravspecifikation och vi bestämde vilka komponenter som skulle behövas. Slutligen skapades ett kopplingsschema. 4.2 Konstruktion Efter att kopplingsschemat blev godkänt av handledarna kunde komponenterna hämtas ut. Därefter kopplades allt enligt kopplingsschemat. 4.3 Programmering När allt var kopplat och klart skrevs programkoden för hur hissen skulle fungera och reagera på interaktionerna på hissmodellen. 4.4 Test och felsökning Slutligen testades allting så att alla kopplingar och programmeringen gjorts korrekt så att hissmodellen betedde sig enligt kravspecifikationen. 5. Resultat 6

Resultatet blev en i princip väl fungerande hissmodell. Vid optimala förhållanden, det vill säga när inga störningar ligger på systemet, fungerar modellen mycket tillfredsställande. Då kan hissen besöka alla våningar i en logisk och rättvis ordningsföljd. Om hissen är påväg uppåt och passerar en våning där någon tryckt på uppåtknappen stannar hissen. Däremot om hissen passerar en våning där någon tryckt på nedåtknappen och hissen är på väg uppåt så stannar hissen inte. Dessutom tänds och släcks alla lysdioder som de ska och displayen uppdateras till att visa rätt våning. Det finns en bugg som inträffar om en knapp i hallen trycks ned på samma våning som hissen har stannat på vilket resulterar i att systemet kraschar. Tyvärr händer det också mer ofta än sällan att hårdvaran i hissmodellen fallerar. Detta gör att fel våning ibland registreras i systemet och hissen antingen stannar på fel ställe eller fortsätter upp eller ned i all oändlighet. 6. Diskussion och slutsats Projektet har överlag flutit på bra och varje vecka har nya framsteg gjorts. I början var det svårt att sätta sig in i och tolka all ny information. När vi väl förstod hur vi skulle gå tillväga gick själva kopplingen smärtfritt och den har i efterhand inte heller gett oss några problem. Vårt största misstag var att vi i inledningsvis gav modellen 12V istället för 5V vilket brände en del komponenter. Förutom det var all input och output var nästan korrekt kopplad från början vilket underlättade det senare arbetet. Programmeringsfasen var det som var mest tidskrävande och vållade flest problem. Dels för att det var ett nytt programmeringsspråk vilket gav en del logiska fel. Det var viktigt att håla reda på vilka portar som skulle göras tillgängliga och vilka latchar som skulle läsas. Dels var programmeringen även svår för att hårdvaran i sig inte är fri från störningar till följd av sin stigande ålder. Detta gjorde att trots att vi både kopplat och programmerat rätt betedde sig inte modellen som den skulle. Det går då och då strömmar i hisskretsen som ger ettor där det borde vara nollor. Något vi har försökt skydda oss mot genom att koppla och koda bort problemet. Det som gäckade oss allra mest var att den tredje sensorn i hissmodellen då och då ger en etta trots att hissen inte bryter sensorn, detta gör att systemet tror att hissen är på en annan våning än vad den egentligen är. Utöver ovan nämnda problem händer också att hissen beter sig annorlunda från gång till gång trots att koden är exakt likadan. Det har helt enkelt stundvis varit ett väldigt frustrerande och oberäkneligt projekt. Vi tror att det mesta har att göra med hissmodellens ålder då vi drabbats av icke fungerande komponenter, dåliga lödningar och lösa sladdar. Vi kan också konstatera att även om vår hisslogik är bra är den inte perfekt. Det kan uppstå situationer som inte är optimala ur ett effektiveringsperspektiv. Hade vi tagit projektet vidare hade vi fokuserat på att förfina programkoden och optimera hisslogiken. 7

7. Källförteckning Digitala projekt, Atmel, 8-bit AVR Microcontroller with 16K byte In-system programmable flash, ATmega16, ATmega16L Datablad, 74HC373 Octal 3-state NonInverting D-latch 8

8. Appendix Bilaga 1, Kopplingsschema 9

Bilaga 2, programkoden /* * hissen.c * * Created: 2016-04-26 11:44:02 * Author: digpi17 */ #include <avr/io.h> #include <stdio.h> #include <avr/interrupt.h> #include <avr/delay.h> int alarm = 0; int stop = 1; int inmotion = 0; int goingup = 0; int goingdown = 0; int currentfloor = 0; int previousfloor = 0; int targetfloor = 0; int hissq[5] = {0, 0, 0, 0, 0; int queuedown[4] = {0, 0,0,0; 10

int queueup[4] = {0, 0, 0, 0; int sensorvect[5] = {0, 0, 0, 0, 0; int prio[8] = {0,0,0,0,0,0,0,0; int direction; int waittime; volatile uint8_t tot_overflow; char LedHall = 0; char LedHiss = 0; char sensorinput = 0; char hallinput = 0; char hissinput = 0; int start = 1; int nodstop = 0; char temp = 0; char disp = 0; void Startupmode(); void checktkinhall(); void executequeue(); void CheckTKinHiss(); void CheckSensors(); void godown(); void goup(); 11

void dispupdate(); void addtoprio(); void removeprio(); void removespecificprio(); void checklogicinhall(); void refreshprio(); void hissupdate(); int main(void) { Startupmode(); currentfloor = 4; //targetfloor = 5; while(start) { checktkinhall(); CheckTKinHiss(); while(nodstop){ executequeue(); hissupdate(); while(waittime){ CheckTKinHiss(); 12

checktkinhall(); refreshprio(); TCCR1B = 0; cli(); //start = 1; void timer1_init(void){ TCCR1B = (1 << CS11); TCNT1 = 0; TIMSK = (1 << TOIE1); sei(); tot_overflow = 0; ISR(TIMER1_OVF_vect){ tot_overflow++; if(tot_overflow >= 7){ waittime = 0; tot_overflow = 0; 13

void checktkinhall(void){ DDRB = 0b11100000; //Sätt PB5 och PB6 och PB7 som output hallen. PORTB = 0b10100000; // sätt PB6 som output 1 och PB5 som output 0. Port D läser nu från hallinput = PIND; LedHall = hallinput LedHall; PORTC = 0b00000001; PORTA = LedHall; if((hallinput & 0b00000001)!= 0){ queueup[0] = 1; addtoprio(1); if((hallinput & 0b00000010)!= 0){ queuedown[0] = 1; addtoprio(2); 14

if((hallinput & 0b00000100)!= 0){ queueup[1] = 1; addtoprio(3); if((hallinput & 0b00001000)!= 0){ queuedown[1] = 1; addtoprio(4); if((hallinput & 0b00010000)!= 0){ queueup[2] = 1; addtoprio(5); if((hallinput & 0b00100000)!= 0){ queuedown[2] = 1; addtoprio(6); 15

if((hallinput & 0b01000000)!= 0){ queueup[3] = 1; addtoprio(7); if((hallinput & 0b10000000)!= 0){ addtoprio(8); queuedown[3] = 1; PORTB = 0b11100000; PORTC = 0b00000000; void executequeue(void){ if(inmotion == 0 ){ //&& Något som ser till att denna inte körs om vi läser från hallen istället -> remove körs för ofta// int x = prio[0]; switch (x) { case 1: 16

targetfloor = 1; direction = 1; //removeprio(); // borde kanske ta bort denna funktionen, istället gör vi så att den först tas ur prion när detta faktiskt är uppnått. Alltså tas prion bort då vi stannar på första våningen. På så vis kan vi inte lyckas fylla på med en 1a i prioque direkt. case 2: targetfloor = 2; direction = 0; //removeprio(); case 3: targetfloor = 2; direction = 1; //removeprio(); case 4: targetfloor = 3; direction = 0; //removeprio(); case 5: 17

targetfloor = 3; direction = 1; //removeprio(); case 6: targetfloor = 4; direction = 0; //removeprio(); case 7: targetfloor = 4; direction = 1; //removeprio(); case 8: targetfloor = 5; direction = 0; //removeprio(); if(currentfloor > targetfloor && targetfloor!= 0){ 18

stop = 1; godown(); else if( targetfloor > currentfloor && targetfloor!= 0){ stop = 1; goup(); void checklogicinhall(void){ if(goingdown == 1 && inmotion == 1){ int i = 0; int v; for(i = 0; i < 8; i = i +1){ v = prio[i]; switch(v){ case 2: if(currentfloor > 2 && targetfloor < 2){ targetfloor = 2; 19

case 4: if(currentfloor > 3 && targetfloor < 3){ targetfloor = 3; case 6: if(currentfloor > 4 && targetfloor < 4){ targetfloor = 4; if(goingup == 1 && inmotion){ int i = 0; int v; for(i = 0; i < 8; i = i +1){ v = prio[i]; switch(v){ case 3: if(currentfloor < 2 && targetfloor > 2){ 20

targetfloor = 2; case 5: if(currentfloor < 3 && targetfloor > 3){ targetfloor = 3; case 7: if(currentfloor < 4 && targetfloor > 4){ targetfloor = 4; void CheckTKinHiss(void){ DDRB = 0b11100000; PORTB = 0b11000000; hissinput = PIND; 21

hissinput = hissinput << 3; hissinput = hissinput >> 3; LedHiss = hissinput LedHiss; PORTC = 0b00000010; PORTA = LedHiss; hissinput = PIND; if((hissinput & 0b00000001)!= 0){ hissq[0] = 1; if((hissinput & 0b00000010)!= 0){ hissq[1] = 1; if((hissinput & 0b00000100)!= 0){ hissq[2] = 1; if((hissinput & 0b00001000)!= 0){ hissq[3] = 1; 22

if((hissinput & 0b00010000)!= 0){ hissq[4] = 1; if((hissinput & 0b00100000)!= 0){ nodstop = 1; stop = 0; if((hallinput & 0b01000000)!= 0){ alarm = 1; PORTB = 0b11100000; PORTC = 0b00000000; void CheckSensors(void){ DDRB = 0b11100000; sensorinput = PINB; char temp; temp = sensorinput << 3; sensorinput = temp >> 3; 23

if((sensorinput & 0b00000001 )!= 0){ sensorvect[0] = 1; else{ sensorvect[0] = 0; if((sensorinput & 0b00000010)!= 0 && goingup == 1){ sensorvect[1] = 1; if(previousfloor == 2 previousfloor == 0){ previousfloor = 1; else if((sensorinput & 0b00000010)!= 0 && goingdown == 1){ sensorvect[1] = 1; if(previousfloor == 1 previousfloor == 3 previousfloor == 0){ previousfloor = 2; else{ sensorvect[1] = 0; if((sensorinput & 0b00000100)!= 0 && goingup == 1){ sensorvect[2] = 1; if(previousfloor == 1 previousfloor == 3 previousfloor == 0){ 24

previousfloor = 2; else if((sensorinput & 0b00000100)!= 0 && goingdown == 1){ sensorvect[2] = 1; if(previousfloor == 4 previousfloor == 2 previousfloor == 0){ previousfloor = 3; else{ sensorvect[2] = 0; if((sensorinput & 0b00001000)!= 0 && goingup == 1){ sensorvect[3] = 1; if(previousfloor == 2 previousfloor == 4 previousfloor == 0){ previousfloor = 3; else if((sensorinput & 0b00001000)!= 0 && goingdown == 1){ sensorvect[3] = 1; if(previousfloor == 5 previousfloor == 3 previousfloor == 0){ previousfloor = 4; else{ sensorvect[3] = 0; 25

if((sensorinput & 0b00010000)!= 0 && goingup == 1){ sensorvect[4] = 1; if(previousfloor == 3 previousfloor == 0){ previousfloor = 4; else if((sensorinput & 0b00010000)!= 0 && goingdown == 1){ sensorvect[4] = 1; if(previousfloor == 4 previousfloor == 0){ previousfloor = 5; else{ sensorvect[4] = 0; if(sensorvect[1] == 0 && goingup == 1 && previousfloor == 1 && currentfloor == 1){ currentfloor = 2; 2){ else if( sensorvect[1] == 0 && goingdown == 1 && previousfloor == 2 && currentfloor == currentfloor = 1; if(sensorvect[2] == 0 && goingup == 1 && previousfloor == 2 && currentfloor == 2){ currentfloor = 3; 26

3){ else if( sensorvect[2] == 0 && goingdown == 1 && previousfloor == 3 && currentfloor == currentfloor = 2; if(sensorvect[3] == 0 && goingup == 1 && previousfloor == 3 && currentfloor == 3){ currentfloor = 4; 4){ else if( sensorvect[3] == 0 && goingdown == 1 && previousfloor == 4 && currentfloor == currentfloor = 3; if(sensorvect[4] == 0 && goingup == 1 && previousfloor == 4 && currentfloor == 4){ currentfloor = 5; 5){ else if( sensorvect[4] == 0 && goingdown == 1 && previousfloor == 5 && currentfloor == currentfloor = 4; if(sensorvect[0] == 1){ stop = 0; if((currentfloor == targetfloor) && (sensorvect[0] == 0) && (sensorvect[1] == 0) && (sensorvect[2] == 0) && (sensorvect[3] == 0) && (sensorvect[4] == 0)){ stop = 0; 27

waittime = 1; int f = currentfloor; switch(f){ PORTC = 0b00000010; case 1: LedHiss = 0b11111110 & LedHiss; PORTA = LedHiss; case 2: LedHiss = 0b11111101 & LedHiss; PORTA = LedHiss; case 3: LedHiss = 0b11111011 & LedHiss; PORTA = LedHiss; case 4: LedHiss = 0b11110111 & LedHiss; PORTA = LedHiss; case 5: 28

LedHiss = 0b11101111 & LedHiss; PORTA = LedHiss; PORTC = 0b00000000; PORTA = 0b00000000; if(goingdown == 1 && goingup == 0){ int f = currentfloor; switch(f){ PORTC = 0b00000001; case 1: LedHall = 0b11111110 & LedHall; PORTA = LedHall; case 2: LedHall = 0b11111101 & LedHall; PORTA = LedHall; case 3: LedHall = 0b11110111 & LedHall; PORTA = LedHall; 29

case 4: LedHall = 0b11011111 & LedHall; PORTA = LedHall; if(goingdown == 0 && goingup == 1){ int f = currentfloor; switch(f){ PORTC = 0b00000001; case 2: LedHall = 0b11111011 & LedHall; PORTA = LedHall; case 3: LedHall = 0b11101111 & LedHall; PORTA = LedHall; case 4: 30

LedHall = 0b10111111 & LedHall; PORTA = LedHall; case 5: LedHall = 0b01111111 & LedHall; PORTA = LedHall; PORTC = 0b00000000; PORTA = 0b00000000; PORTB = 0b11100000; PORTC = 0b00000000; timer1_init(); void Startupmode(void){ DDRB = 0b11100000; DDRC = 0b01000011; DDRD = 0b00000000; DDRA = 0b11111111; 31

PORTC = 0b00000001; PORTA = 0b00000000; PORTC = 0b00000010; PORTA = 0b00000000; PORTC = 0b01000000; PORTA = 0b00000000; void godown(void){ goingdown = 1; inmotion = 1; goingup = 0; if(stop == 1){ while(stop){ PORTC = 0b01000000; PORTA = 0b00000110; _delay_ms(10); PORTA = 0b00001010; _delay_ms(10); 32

PORTA = 0b00001001; _delay_ms(10); PORTA = 0b00000101; _delay_ms(10); checktkinhall(); CheckTKinHiss(); CheckSensors(); dispupdate(); hissupdate(); checklogicinhall(); PORTB = 0b11100000; PORTC = 0b00000000; int i; for(i = 0; i < 15; i = i + 1){ PORTC = 0b01000000; PORTA = 0b00000110; _delay_ms(10); PORTA = 0b00001010; 33

_delay_ms(10); PORTA = 0b00001001; _delay_ms(10); PORTA = 0b00000101; _delay_ms(10); checktkinhall(); CheckTKinHiss(); dispupdate(); PORTB = 0b11100000; PORTC = 0b00000000; inmotion = 0; void goup(void){ goingup = 1; inmotion = 1; goingdown = 0; while(stop){ 34

PORTC = 0b01000000; PORTA = 0b00000101; _delay_ms(10); PORTA = 0b00001001; _delay_ms(10); PORTA = 0b00001010; _delay_ms(10); PORTA = 0b00000110; _delay_ms(10); checktkinhall(); CheckTKinHiss(); CheckSensors(); dispupdate(); hissupdate(); checklogicinhall(); PORTB = 0b11100000; 35

PORTC = 0b00000000; inmotion = 0; void dispupdate(void){ PORTC = 0b00000010; char temp; temp = LedHiss << 3; LedHiss = temp >> 3; if(currentfloor == 1){ LedHiss = LedHiss 0b00100000; PORTA = LedHiss; if(currentfloor == 2){ LedHiss = LedHiss 0b01000000; PORTA = LedHiss; if(currentfloor == 3){ LedHiss = LedHiss 0b01100000; 36

PORTA = LedHiss; if(currentfloor == 4){ LedHiss = LedHiss 0b10000000; PORTA = LedHiss; if(currentfloor == 5){ LedHiss = LedHiss 0b10100000; PORTA = LedHiss; PORTB = 0b11100000; PORTC = 0b00000000; PORTA = 0b00000000; void addtoprio(int x){ int count; int priovalue; for(count = 0; count < 8; count = count + 1){ priovalue = prio[count]; if(priovalue == x){ 37

count = 8; if(priovalue == 0){ prio[count] = x; count = 8; void removeprio(void){ int temp[8] = {0, 0, 0, 0, 0, 0, 0, 0; int t = 0; int l; for(l = 1; l < 8; l = l + 1){ t = prio[l]; temp[l-1] = t; int j; for(j = 0; j < 8; j = j + 1){ t = temp[j]; prio[j] = t; 38

void removespecificprio(int pos){ int i; int tempvalue; int tempv[8] = {0,0,0,0,0,0,0,0; for(i = 0; i < pos; i = i +1){ tempvalue = prio[i]; tempv[i] = tempvalue; for(i = pos + 1; i < 8; i = i + 1){ tempvalue = prio[i]; tempv[i-1] = tempvalue; for(i = 0; i < 8; i = i + 1){ tempvalue = tempv[i]; prio[i] = tempvalue; void test(void){ currentfloor = 2; 39

targetfloor = 5; goup(); _delay_ms(500); stop = 1; currentfloor = 5; targetfloor = 1; godown(); _delay_ms(500); stop = 1; currentfloor = 1; targetfloor = 2; goup(); _delay_ms(500); stop = 1; currentfloor = 2; targetfloor = 4; goup(); _delay_ms(500); stop = 1; currentfloor = 4; targetfloor = 2; godown(); void refreshprio(void){ 40

int i; int e; for(i = 0; i < 8; i = i + 1){ e = prio[i]; if(goingdown == 1){ switch(e){ case 1: if(currentfloor == 1){ removespecificprio(i); hissq[0] = 0; case 2: if(currentfloor == 2){ removespecificprio(i); hissq[1] = 0; case 4: if(currentfloor == 3){ removespecificprio(i); hissq[2] = 0; 41

case 6: if(currentfloor == 4){ removespecificprio(i); hissq[3] = 0; if(goingup == 1){ switch(e){ case 3: if(currentfloor == 2){ removespecificprio(i); hissq[1] = 0; case 5: if(currentfloor == 3){ removespecificprio(i); hissq[2] = 0; 42

case 7: if(currentfloor == 4){ removespecificprio(i); hissq[3] = 0; case 8: if(currentfloor == 5){ removespecificprio(i); hissq[4] = 0; void hissupdate(void){ if(hissq[0] == 1 && currentfloor > 1){ addtoprio(1); 43

if(hissq[1] == 1 && currentfloor > 2){ addtoprio(2); if(hissq[1] == 1 && currentfloor < 2){ addtoprio(3); if(hissq[2] == 1 && currentfloor > 3){ addtoprio(4); if(hissq[2] == 1 && currentfloor < 3){ addtoprio(5); if(hissq[3] == 1 && currentfloor > 4){ addtoprio(6); if(hissq[3] == 1 && currentfloor < 4){ addtoprio(7); if(hissq[4] == 1 && currentfloor < 5){ 44

addtoprio(8); 45