Programmering


For at få vores minikit til at reagere, skal man programmere hver enkel del, alt efter hvad man ville have kittet til at udføre. Når man skal programmere kittet, er det lidt af en bøvlet proces, da man skal benytte to programmer for at få det overført programmet til kittet. I gruppen har vi valgt programmeringssproget C, hvilket er et meget nemt og lige til programmeringssprog. Programmet vi valgte at skrive vores kode i hed CodeVisionAVR, hvilket er et supert program, da det er velegnet til vores kit. Det der gør programmet godt, er at man i opsætningen af programmet selv kan bestemme, hvilke porte der skal være in- og output på kittet fra starten af. Programmet kan hentes som en prøveversion, dog er der en begrænsning på, der gør hvor lang ens kompilerede program må være.
Når ens programkode er skrevet færdigt, skal man med det andet program (ved navn Ponyprog) ind og vælge den genererede hex-fil fra CodeVisionAVR, hvor man derefter uploader filen til ens kit.

De to programmer kan hentes via disse links:
http://www.lancos.com/prog.html
http://www.hpinfotech.ro/html/download.htm

Inden man hopper ud i det store opgør, er det vigtigt, at man forinden har overvejet, hvordan ens program skal forløbe. Det allerførste man gør, er at finde ud af hvad ens program skal kunne. Derefter skal man finde ud af, i hvilken rækkefølge de forskellige funktioner skal udføres, og hvordan de udføres. Den nemmeste måde man kan gribe det an på, er at lave et rutediagram, på den måde får man et meget overskueligt overblik over situationen. Når ens rutediagram så er blevet lavet kan man nemt sætte sig ned og skrive sit program.

Her i gruppen valgte vi dog at gribe tingene lidt anderledes an, da vi syntes det var nemmere at lave rutediagrammet, når ens program var lavet færdig.

Det første vi prøvede var at finde ud af hvordan vores bil skulle reagere, hvis en kontakt blev ramt, hvilket der opstod en del diskussion om. Vi blev hurtigt enige om, at vores kontakter på ingen tidspunkt ville komme til at blive aktiveret på samme tid, så der var visse ting vi skulle tage os i agt for.

For at lave vores forklaring om vores program nemmere at forstå, har vi valgt at dele det op i to afsnit.
I første afsnit begynder vi med at starte motoren til bilen, så den begynder at køre fremad. Når motoren er sat i gang, står programmet og venter på, at en af de forreste knapper bliver trykket ind. Problemet med vores knapper er at de ikke på noget tidspunkt vil blive aktiveret på samme tid, så vi har skrevet programmet på sådan en måde, at hvis f.eks. højre frontkontakt bliver aktiveret, så vil programmet tælle op til et bestemt tal og alt efter om programmet får færdig talt, eller om venstre knap i mellemtiden bliver aktiveret, vil programmet udføre nogle bestemte kommandoer.

Anden afsnit handler om hvordan programmet reagerer gennem forløbet, om hvordan den henter de forskellige kommandoer frem fra vores funktioner m.m.
Som tidligere nævnt så har vi lavet programmet på sådan en måde, at der skal tages stilling til, om det er begge frontknapper, der bliver aktiveret eller om det kun en af dem.

Hvis vi nu siger, at det er begge knapper, der bliver aktiveret, vil programmet begynde og hente fra vores funktioner vi har lavet. Det første vi får bilen til at gøre, er at bakke med funktionen tilbage; som den udfører i et sekund. Efter det sekund begynder programmet enten at udføre funktionen right_tilbage(); eller left_tilbage(); alt efter hvilken af frontknapperne der blev ramt først.

Når funktionen f.eks. right_tilbage(); bliver udført, begynder bilen at bakke samtidig med at den drejer forhjulene til højre, mens bilen bakker, står programmet igen og tæller op og tjekker om en af de bagerste knapper bliver aktiveret. Hvis bilen støder ind i noget inden programmet har talt færdig, udfører den i stedet funktionen left_frem();, ellers hopper den tilbage i hovedprogrammet igen.

Som tidligere nævnt har vi monteret vores kontakter til vores kit. På kittet har vi i forvejen fire knapper som vi har sat til at være input. For at få de forskellige porte og relæer aktiveret skal man ind og stille på de enkelte DDR'er (Data Direction Register). For eksempel hvis man nu vil have buzzeren på kittet til at hyle, skal man i sin kode sætte DDR for port D til 01000000 (logisk 1 på 7. bit), og samtidig sætte porten (som nu er output) til 01000000, for at åbne op for de 5v ud til buzzeren.

Hvis man tager brug af funktioner er der en del man skal tage sig i agt for fordi man hurtigt kan løbe ind i problemer. Her i gruppen kom vi selv ud i så stort et problem at vi blev nødt til at slette hele vores kode og begynde forfra. Problemet lå i at vi havde lavet funktioner der var afhængige af andre funktioner, hvilket kan give store problemer når funktionerne skal stå først i koden.

Det vi gjorde galt var at vi brugte 2 funktioner rekursivt fra hinanden. Det er der som sådan ikke noget galt i, problemet er at C ikke tillader at man bruger funktioner før de er blevet skrevet - altså funktionen void hest(void) kan ikke bruges i void ko(void), med mindre funktionen hest(); står først:

Programmering sucks!

Download kildekoden (i C) til vores MUHKO-bil:

Hent kildekoden her som PDF    Hent kildekoden her som Word DOC    Hent kildekoden her som tekst

Rutediagrammer (Visio):

Hent rutediagram       Hent rutediagram