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

Relevanta dokument
Datorprojekt, del 1. Digitala system 15 p

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

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

Datorteknik 2 (AVR 2)

The Phenomenal Doorbell Bilaga 2. Källkod

Växtviskaren EITF11 Digitala projekt VT15, I12

Digitala Projekt(EITF40) - Larm

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

Digitala Projekt(EITF40) - Larm

Studera databladen för LCD på sid 4, 5, 7, 8, 14, 18, 19, 20 och 23. Datablad finns på kurshemsidan.

Digitala Projekt (EITF11) Hemlarm

Kontrollskrivning Mikrodatorteknik CDT S2-704

Övningsuppgifter STYRNING - i Mikrodatorteknik för U2 2010

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

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

Laborationens mål är att få displayen att visa timmar, minuter och sekunder samt att kunna ställa klockan.

Laboration 5. Temperaturmätning med analog givare. Tekniska gränssnitt 7,5 p. Förutsättningar: Uppgift: Temperatur:+22 C

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

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

Effektpedal för elgitarr

AVR 5. Styrning av trafikljus. Digitala system 15 p

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

Realtidsprogrammering. En introduktion Implementering (med exempel från PIC)

Ansvarig lärare: Olof Andersson, Telefon (besöker skrivsalen)

Projektlaboration 4, synkronisering av klockan

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

Systemkonstruktion LABORATION REALTIDSPROGRAMMERING

Avbrottshantering. Övningsuppgifter

High Core Remote Car X8000 Cool

Laboration 5 C-programmering på AVR TSEA57 Datorteknik I

LABORATION. Datorteknik Y

A-del motsvarande KS1

DIGITALA PROJEKT (EITF40) Fartmätare

GPIO - General Purpose Input Output

Ett program som frågar regelbundet om något skall utföras. Exempelvis om spänningen på ett batteri sjunkit under en viss nivå.

Thunder s Truck projektrapport

Pulsmätare Digitala Projekt EITF11

Bilen som inte kan krocka

Datorteknik 1 (AVR 1)

Projektrapport - Roterande digital LED-klocka

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

Digital- och datorteknik

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

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

(Lösningsförslag finns sist i denna fil.)

LABORATION. Datorteknik Y

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

Digitala Projekt (EITF11) Larmanläggning

Avbrottshantering. Övningsuppgifter Lösningsförslag Uppgift (Reservation för diverse fel!)

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

Drivrutiner för att hantera teckenfönster.

EDA480/EDA485 - Maskinorienterad programmering, tentamen 2006-xx-xx 1(7)

Enkla datatyper minne

GPIO - General Purpose Input Output

Tentamen med lösningsförslag

LEU240 Mikrodatorsystem

Microprocessor / Microcontroller

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

Beskrivning av porthantering i mikroprocessorn SAM3U som används på vårt labkort SAM3U- EK.

FRAMTAGNING AV DEMONSTRATORER

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

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

CPU. Carry/Borrow IX. Programräknare

DIGITALA PROJEKT - EITF11

LABORATIONSINSTRUKTION

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

Digitala System Projekt - EITA15 VT *SUPER DUPER KLOCKAN*

Programallokering. Programtyper. Att placera program i flashrespektive. Program i FLASH-minne. Program i RAM-minne

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

RAPPORT: DIGITALA PROJEKT

Tentamen med lösningsförslag

Lathund. C för inbyggda system

Att använda pekare i. C-kod

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

Arduinokurs. Del 1 - Vett och etikett. Talsystem. Binärt ettor och nollor

Högskolan i Halmstad Digital- och Mikrodatorteknik 7.5p. Lista på registeruppsättningen i PIC16F877A Datablad TTL-kretsar 74-serien

Microprocessor / Microcontroller. Industrial Electrical Engineering and Automation

I denna laboration undersöker vi hur aritmetiska beräkningar utförs. Vi tittar på olika variabeltyper: 8-bitars, 16-bitars, 32-bitars och flyttal.

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

Elektroteknik MF1016 föreläsning 9 MF1017 föreläsning 7 Mikrodatorteknik

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

Laboration 2 i Datorteknik- Assemblerprogrammering II

TEMPERATURMÄTARE MED GRAFRITARE

Föreläsningsanteckningar till Konstruktionsmetoder

EITF11: Bandkanon Grp 05

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

Provmoment: Ladokkod: Tentamen ges för: Tentamen TE111B El3. Namn: Personnummer: Tentamensdatum: Tid: 14:00-18:00.

Maskinorienterad programmering

Träff 1 - Introduktion

Projektrapport Målgång

Datakommunikation med IR-ljus.

Digitala Projekt VT13. PING-Pong

Enchipsdatorer med tillämpningar LABORATION 7, ROBOT

Minnets komponenter. Digitala System: Datorteknik. Programexekvering. Programexekvering. Enhet för utdata. Enhet för indata CPU.

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

Demonstration och konsultation Arbetsbokens avsnitt 7 Händelsestyrt processbyte Förberedande inför laboration 4

Lathund. C för inbyggda system

Lunds Tekniska Högskola EITF11 Digitala projekt. Bandspelaren

Digital- och datorteknik

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

Transkript:

ATMega16 Laborationer av Kjell 2 Rev:5 Datum: 29.09.2010 Page 1 of 7 Laboration 4: Knappstuds Drivrutiner för att eliminera störningar. Inledning: Laborationskortet EasyAVR6 har bland annat tryckknappar och LEDn kopplade till alla pinnar på alla portar. I denna laboration ska vi undersöka hur enkla tryckknappar beter sig och vilka problem som uppstår då man vill avläsa knappnedtryckningar. Vi ska också se hur man med programkod enkelt kommer tillrätta med dessa problem. Tryckknapparna är kopplade så att de ger en logisk etta (+5V) då de trycks ner. I uppsläppt läge finns en logisk nolla på ingångarna, det finns möjlighet att svänga knapparna så att de bryter spänningen till pinnarna om man vill använda sig av det. Förberedelser: Läs manualen sid. 68-70 om External interrupt. Alla förberedelseuppgifter ska vara gjorda vid laborationens början. Uppgift 1. För att få en fördröjning kan man skriva en enkel for-loop eller en while-sats: char i; for (i=5;i>0;i--); eller char i=5; while (i>0) i--; Men I AVR LibC finns fördefinerade funktioner för pauser i program. Läs om delay.h i libc manualen http://www.nongnu.org/avr-libc/usermanual/index.html För att delay funktionerna skall fungera krävs att F_CPU defineras, vad används F_CPU till och hur skall F_CPU anges?

ATMega16 Laborationer av Kjell 2 Rev:5 Datum: 29.09.2010 Page 2 of 7 Uppgift 2. Om man ska övervaka insignaler som är relaterade till mänsklig avtivitet (som t.ex. nedtryckning av knappar) är det onödigt att avläsa signalerna varje mikrosekund. Det är också uppenbart att det inte räcker att göra en avläsning var tionde sekund. Vad tror du kan vara lämpliga intervall? 1 sek 0,1 sek 10 ms 1 ms 100 µs 10 µs Uppgift 3. Antag att vi deklarerar tre variable enligt följande unsigned char nya_knappar, knappar, gamla_knappar; Variabeln nya_knappar uppdateras enligt nedan: nya_knappar = (knappar & ~gamla_knappar); Vad blir det nya värdet i variabeln nya_knappar om variablerna innehåller följande bitmönster: nya_knappar 0b00000010 knappar 0b00000001 gamla_knappar 0b00000000 Nytt värde i nya_knappar: Motivera!

ATMega16 Laborationer av Kjell 2 Rev:5 Datum: 29.09.2010 Page 3 of 7 Laborationsuppgifter: Uppgift 1. Enkel avläsning av knappnedtryckning. En enkel programkonstruktion som avläser en knappnedtryckning kan se ut såhär: #include <avr/io.h> unsigned char gamla_knappar = 0; // Är =0 om ingen knapp var nere förra gången int main(void) { DDRC = 0x00; //Port C ingångar DDRB = 0xFF; //Port B utgångar PORTB = 0; while(1){ // Om någon knapp är nere OCH ingen var nere förra gången: öka PORTB if ( PINC & 0x03 && (gamla_knappar == 0)){ PORTB++; // Uppdatera variabeln " gamla_knappar " gamla_knappar = PORTC & 0x03; return 0; Prova detta program. Logiskt sett så ser programmet bra ut: PORTB räknas upp om en knapp är nedtryckt och variabeln gamla_knappar har värdet noll. Vi ser ändå att programmet fungerar riktigt dåligt. Ofta detekteras flera studsar både vid nedtryckning och uppsläpp. Ibland missar programmet en nedtryckning. Hur kan det komma sig? Hur ska vi göra för att programmet absolut inte ska kunna missa en nedtryckning? Inför en ny 8-bitarsvariabel och förändra ditt program så att ingen nedtryckning missas. Du förstår säkert att de falska uppräkningarna kommer av att alla små studsar räknas som särskilda knappnedtryckningar. Signalerna från knapparna ser ju ut ungefär som på bilden här:

ATMega16 Laborationer av Kjell 2 Rev:5 Datum: 29.09.2010 Page 4 of 7 Tydligen läser vi av knapparna lite för ofta. Ungefär hur ofta? Hur ofta kan det vara lagom att göra en avläsning? Lägg in en delay i loopen: _delay_ms(??); eller _delay_us(??); Programraderna utgör en fördröjningsloop i loopen så att programmet kommer att pausa mellan varje knappavläsning.

ATMega16 Laborationer av Kjell 2 Rev:5 Datum: 29.09.2010 Page 5 of 7 Uppgift 2. Avbrottsstyrd drivrutin för knappavläsning. En stor förbättring får vi genom att ersätta fördröjningsloopen med ett periodiskt avbrott. Programmet binds nu inte upp i loopar. Avbrottsrutinen som kommer in med jämna mellanrum kommer att fungera som en fristående enhet som lämnar ifrån sig uppsnyggade och lattanvända värden. O.B.S: Variabler som används både i interrupten och övriga programmet måste deklareras volatile Ex: volatile unsigned char count_ctc; Interruptrutinen skall ligga under hela huvudprogrammet och det finns olika interruptvektorer. Nedan finns ett exempel på hur Timer 1 outputcompare A skall skrivas. (Övriga vektorer, se sid 45-46 i manualen) Ex: ISR(TIMER1_COMPA_vect) { //Er kod Steg 1: Inför en avbrottsrutin: ISR(Interrupt_vect){ Vi använder en inbyggd avbrottsmekanism som kallas ISR. Den skrivs som en funktion på ovanstående sätt. Det som skiljer från en vanlig function är att man kan ha samma funktions namn på olika ISR funktioner så länge Interrupt vektorn skiljer. Detta behövs för att mekanismen som styr programexekveringen till avbrottsfunktionen ska veta var i minnet den ligger. Interrupt vektorer för AVR mcpun finns på adressen http://www.nongnu.org/avr-libc/usermanual/group avr interrupts.html OBS! ATMega16 har 3 stycken externa interrupter, vi kommer att använda oss av INT0 som ligger på port D pin 2 Steg 2: Flytta de tre programraderna i main som ligger efter fördröjningsloopen in till avbrottsfunktionen och ta bort fördröjningsloopen: ISR(INT0_vect){ knappar = PIND & (1 << PD2); if ( knappar && (gamla_knappar == 0)){ PORTB++; gamla_knappar = knappar;

ATMega16 Laborationer av Kjell 2 Rev:5 Datum: 29.09.2010 Page 6 of 7 I funktionen main finns nu endast. DDRD = 0x00; // Inport DDRB = 0xff; // Utport while(1); Steg 3: Starta avbrottet. Kontrollera i manualen på sid 68-69 hur du skall ställa registret MCUCR för att reagera på stigande flank på INT0 och hur du skall ställa registeret GICR för att aktivera INT0. MCUCR =?? // INT0 stigande flank GICR =?? //INT0 Aktiverad sei(); // Starta hela avbrottssystemet Gör om programmet med avbrott. Prova så att det fungerar lika bra som innan.

ATMega16 Laborationer av Kjell 2 Rev:5 Datum: 29.09.2010 Page 7 of 7 3. Den slutliga drivrutinen. Det finns en stor nackdel med de knappavläsningsrutiner vi skrivit hittills: Man kan inte lätt ändra uppgift för vad som ska utföras vid resp. knappnedtryckning. Vi ska nu ändra lite i avbrottsrutinen: 1) if ( knappar && (gamla_knappar == 0)) PORTB++; ersätts med: nya_knappar = (knappar & ~gamla_knappar); 2) Vi tar bort PORTB++ så vi lättare kan ändra på vad som ska hända när en knapp trycks ner. 3) Vi skapar ytterligare en variabel, nya_knappar. Ettställda bitar i den variabeln betyder att någon tryckt på en knapp. Den programdel som använder sig av den informationen kvitterar motsvarande bit genom att nollställa den. På så vis får man ett mycket behändig kommunikation mellan avbrottsfunktionen och de övriga delarna. Huvudprogrammet behöver inte längre veta om hur knapparna är inkopplade och hur dåliga dom är. Vi har skaffat oss ett par idealiserade knappar (två bitar i variabeln nya_kappar). Ersätt nu den tomma while loopen med detta: while(1){ if (nya_knappar & (1 << PD1)){ // Har knappen tryckts igen? PORTB++; // Ja, räkna upp nya_knappar &= ~(1 << PD1); // och kvittera. Komplettera programmet så att man kan räkna ner värdet med knappen ansluten till INT1.