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



Relevanta dokument
A-del motsvarande KS1

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

Kontrollskrivning Mikrodatorteknik CDT S2-704

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

Dataminne I/O Stack 0x005D 0x3D SP low byte 0x005E 0x3E SP high byte

Programräknaren visar alltid på nästa instruktion som skall utföras. Så fort en instruktion har hämtats så visar programräknaren på nästa instruktion.

Digitala Projekt(EITF40) - Larm

Effektpedal för elgitarr

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

Växtviskaren EITF11 Digitala projekt VT15, I12

Datakommunikation med IR-ljus.

Digitala Projekt(EITF40) - Larm

Minnen delas in i två huvudgrupper, permanenta och icke permanenta. Non-volatile and volatile.

Microprocessor / Microcontroller. Industrial Electrical Engineering and Automation

Övning1 Datorteknik, HH vt12 - Talsystem, logik, minne, instruktioner, assembler

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

GPIO - General Purpose Input Output

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

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

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

CE_O6. Parallell in/utmatning (I/O). Förberedelser till laboration nios2io.

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

Tentamen. Datorteknik Y, TSEA28

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

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

TSIU50 Mikrodatorprojekt. LAB1 AVR-introduktion och logikanalysator

Övningsuppgifter STYRNING - i Mikrodatorteknik för U2 2010

The Phenomenal Doorbell Bilaga 2. Källkod

LEU240 Mikrodatorsystem

Övning 6. Parallellport, timer

Datorteknik. Tomas Nordström. Föreläsning 6. För utveckling av verksamhet, produkter och livskvalitet.

Att använda pekare i. C-kod

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

Datorteknik. Exempeluppgifter i Laborativ Examination

Lathund. C för inbyggda system

#include <pic.h> #include <sys.h> char LEFT,RIGHT,MOTORHASTIGHET;

Svar till Övning3 Datorteknik, HH vt12 Avbrott och timers

Datorsystem Laboration 2: Minnesmappade bussar

Microprocessor / Microcontroller

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

Laboration 5 C-programmering på AVR TSEA57 Datorteknik I

INGENJÖRSHÖGSKOLAN INGENJÖRSHÖGSKOLAN

Övningsuppgifterna i kapitel F avser FLIS-processorn, vars instruktioner och motsvarande koder definieras i INSTRUKTIONSLISTA FÖR FLISP.

Tentamen med lösningsförslag

Det finns en handledning till kortet på hemsidan. AVR STK500.

Digitala Projekt (EITF11) Hemlarm

Till assemblersystemet Zuper 80 Assembler krävs en SPECTRAVIDEO 328/318+minst 16K ram extra.

Laboration 2 i Datorteknik- Assemblerprogrammering II

Datorteknik Hyfsa kod

D/A- och A/D-omvandlarmodul MOD687-31

Lathund. C för inbyggda system

Det finns en hemsida. Adressen är

Digitala Projekt (EITF11)

Tenta i Digitalteknik

IS1500 Lösningar övning CE_O CE_O7. Programmerad in/utmatning. Serieport. Förberedelser till nios2io.

GPIO - General Purpose Input Output

Övning 7. Timer, serieport

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

Datorteknik 1 (AVR 1)

Vad bör göras? Steg 1. RISC => pipelining. Parallellism. Pipelining. Nya LDA 13. RISC(reduced instruction set computer) Öka klockfrekvensen

F4: Assemblerprogrammering

Grunderna i stegkodsprogrammering

Systemkonstruktion LABORATION REALTIDSPROGRAMMERING

Digital- och datorteknik

Tentamen. Datorteknik Y, TSEA28

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

Exempeluppgift i Logikstyrning. 1 Inledning. 2 Insignaler och utsignaler

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

Maskinorienterad programmering

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

Laboration 3 i Digital- och Mikrodatorteknik. Utvecklingssystemet MPLAB IDE Grundläggande assemblerprogrammering för PIC

Tentamen PC-teknik 5 p

Lösningar till tentamen i EIT070 Datorteknik

AVRStudio på tre minuter. Micke Josefsson, 2005

Thunder s Truck projektrapport

Maskinorienterad programmering

Digital- och datorteknik

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

Tentamen. Datorteknik Y, TSEA28

Realtidsprogrammering

7) Beskriv tre sätt att överföra parametrar mellan huvudprogram och subrutin.

Tentamen. Datorteknik Y, TSEA28

Föreläsningsanteckningar till Konstruktionsmetoder

Digital- och datorteknik

Styrteknik: MELSEC FX och numeriska värden

Du har fått stycken taggar. (av föreningen okt-06 eller av den f.d. medlem du övertagit lägenheten från) Din pinkod är:

RAPPORT: DIGITALA PROJEKT

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

Tentamen. Datorteknik Y, TSEA28

Digital- och datorteknik

William Sandqvist

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

Systemkonstruktion SERIEKOMMUNIKATION

Försättsblad till skriftlig tentamen vid Linköpings Universitet

Pulsmätare Digitala Projekt EITF11

Digital- och datorteknik

Grundläggande C-programmering del 2 Pekare och Arrayer. Ulf Assarsson

Föreläsning 6: Introduktion av listor

Tentamen (Exempel) Datorteknik Y, TSEA28

Digital- och datorteknik

Transkript:

CT3760 Mikrodatorteknik Föreläsning 12 Torsdag 2006-10-05 Naxos Pollning Ett program som frågar regelbundet om något skall utföras. Exempelvis om spänningen på ett batteri sjunkit under en viss nivå. En rutin för detta kan skrivas in i ett huvudprogram. Exempelvis: while(1) Uppgift(1); Uppgift (2); if( batterispänning <= 1.1V) Subrutin; Uppgift (3); Om man har flera saker som skall kontrolleras kan man infoga ytterligare if-satsser i programmet. Istället för att regelbundet fråga om batterispänningen har blivit för låg kan man skicka en signal utifrån till processorn att det är dags för åtgärd. Ett sådant förfarande kallas för interrupt. While-slingan i main kan göras kortare. # include < avr/io.h> main( ) while(1) Uppgift 1 Uppgift 2 Uppgift 3 Interrupt 0 INT0 Interrupt 1 INT1 Interrupt 2 INT2 De olika interrupten kan bryta while-slingan. 2006-10-09 C:\Documents and Settings\oan01\My Documents\CT3760_H\Peroid1_2006\F12_2006.doc 1/10

Det är inte ens nödvändigt att ha några uppgifter i while-slingan. Alla program kan samlas i olika interrupt-rutiner. while-slingan består då av while(1) ; C-programmet får då följande struktur: #include <avr/io.h> #include <avr/interrupt.h> #include <avr/signal.h> SIGNAL(SIG_INTERRUPT0); void delay( unsigned char x); void main(void) //initieringar while(1) ; SIGNAL(SIG_INTERRUPT0) PORTD = 0x55; delay(30); // Uppgift som interruptet skall utföra. Initieringar: Sätt Portar till ingångar eller utgångar. Tillåt interrupt. Sätt I-bit i SERG MCUCR-registret Se sid 66 manualen GICR- registret. Se sid 67 manualen Detta gäller de tre interrupt som styrs av INT0 på pinne 2 PORTD INT1 på pinne 3 PORTD INT2 på pinne 2 PORTB Flera interrupt Det finns ytterligare ett antal interrupt. Dessa är knutna till bl.a. timers, ad-omvandling, usart mm. Interrupt som är knutna till funktioner inbyggda i microcontrollern. På föreläsning F9 behandlade vi analog komparator. Bilden för analog komparator finns nedan. 2006-10-09 C:\Documents and Settings\oan01\My Documents\CT3760_H\Peroid1_2006\F12_2006.doc 2/10

De signaler som hänger ihop med interrupt är ACIS1 ACIS0 och ACIE Exempel Vi har en analog komparator. Komparatorn kan jämföra två spänningar, och avgöra vilken som är störst. En av spänningarna kan vara en intern referensspänning, den används i det här exemplet. ( Spänningen är Band gap referens = 1,23 V ) Inspänningen till komparatorn finns på AIN1 dvs. PORTB pin 3. Normalt skall utsignalen till PORTD vara 0x03. Då komparatorn växlar utsignal (från noll till ett, eller från ett till noll) skall utsignalen istället bli 0x55 några sekunder. För att aktivera komparatorn skall ADC vara 0. För att välja bandgap referens skall ACBG vara 1 För att välja AIN1 skall ACME vara 0 För att aktivera interruptsignal skall ACIE vara 1 Interrupt select känner av signalen ACO. ACIS1 och ACIS0 bestämmer hur interruptet skall ske. Se tabell 79 sid. 210 ACIS1 ACIS0 Interrupt mode 0 0 Comparator interrupt on Output toggle 0 1 Reserved 1 0 Comparator interrupt on Falling Output Edge 1 1 Comparator interrupt on Rising Output Edge 2006-10-09 C:\Documents and Settings\oan01\My Documents\CT3760_H\Peroid1_2006\F12_2006.doc 3/10

Bit 7 6 5 4 3 2 1 0 ACSR ACD ACBG ACO ACI ACIE ACIC ACIS1 ACIS0 Read/Write R/W R/W R R/W R/W R/W R/W R/W Initialt 0 0 N/A 0 0 0 0 0 Så här blir inställningarna. 0 1 -- -- 1 -- 0 0 De bitar som markerats med har ingen inverkan I den här tillämpningen. ACSR = 0x48 och ACSR = 0x7C kommer att fungera lika bra. ACME finns i register SFIOR bit 3. Här räcker det med att sätta SFIOR = 0, För att tillåta interrupt måste I-bit i SREG vara satt PORTB skall vara inport, minst bit 3 i porten. PORTD skall vara utport.. Så här blir programmet: #include <avr/io.h> #include <avr/interrupt.h> #include <avr/signal.h> SIGNAL( SIG_COMPARATOR); void delay( unsigned char x); void main(void) SREG = 0x80; DDRB = 0; DDRD =0xFF; SFIOR =0x00; // tillåter interrupt ACSR = 0x48; // sid 200 // sid 199 Använder PB3 som ingång. Jämför med // intern referens. // end main while(1) PORTD = 0x03; // end while SIGNAL( SIG_COMPARATOR) PORTD = 0x55; delay(10); 2006-10-09 C:\Documents and Settings\oan01\My Documents\CT3760_H\Peroid1_2006\F12_2006.doc 4/10

void delay( unsigned char x) unsigned char a; unsigned int b; for(a=1;a<x;a++) for(b=1;b<65000;b++) ; // end delay För varje gång som insignalen på port B passerar spänningen 1,23 V så kommer interruptrutinen att anropas. Watchdog Ett dataprogram kan hamna i en oändlig loop. Detta innebär att programmet låser sig. För att komma igång med normal programkärning så måste man tillgripa reset, eller att slå av spänningsmatningen. Watchdog är ett register som räknas upp från 0 till 255. Om registret når 255 och slår om till 0 så genereras ett reset. Watchdog har sin egen klocka. Frekvens 1 MHz vid 5 V matningsspänning. Tiden det tar för räknaren att nå 255 kan ställas in mellan 15ms upp till 1900 ms. Bit 7 6 5 4 3 2 1 0 WDTCR --- --- --- WDTOE WDE WDP2 WDP1 WDP0 Read/Write R R R R/W R/W R/W R/W R/W Initialt 0 0 0 0 0 0 0 0 2006-10-09 C:\Documents and Settings\oan01\My Documents\CT3760_H\Peroid1_2006\F12_2006.doc 5/10

Funktion Iden är att vid normal programkörning nollställa räknaren med jämna mellanrum. Att inte låta räknaren nå 255. Vid programfel så kommer inte nollställningen att ske, utan man får ett omslag från 255 till 0. Detta innebär att processorn kommer att få reset. Start av Watchdog är enkelt. Att avbryta den kräver en något med komplicerad process. Det senare för att den inte skall kunna stängas av en tillfällighet. Watchdog Timer Control Register WDTCR finns beskriven på sid 41. För att starta Watchdog med maximalt tidsintervall 1900 ms kan man använda följande kod: WDR ; sätter räknaren till noll LDI R16, 0x0F ; maxtid och WDE =1 OUT WDTCR, R16 Instuktionen WDR måste sedan återkomma regelbundet, så att räknaren nollställs innan den når sitt maxvärde. För att stänga Watchdog kan man använda följande kod: LDI R16,0x1E OUT WDTCR, R16 LDI R16, 0x10 OUT WDTCR, R16 C-kod och assembler. Ibland kan det vara praktiskt att använda ett assembleruttryck i C-kod. Eller en subrutin skriven i assembler. Det är fullt möjligt att blanda in assembler i C-kod. Hur det sker är lite olika beroende på vilken kompilator som används. Endast som information CodeWizardAVR använder följande metod: #asm( sei ) Detta uttryck kommer att tillåta interrupt. SEI sätter I-biten i SREG. Flera rader kan också användas. #asm LDI R16, 0x80 OUT SREG, R16 #endasm I WINAVR är proceduren en annan. Det är den kompilator som vi använder. Det här är ett litet program som börjar med att läsa ut 0xAA till lysdioderna. Efter det så kommer en etta att skrivas ut till dioderna så att man får ett rinnande ljus. 2006-10-09 C:\Documents and Settings\oan01\My Documents\CT3760_H\Peroid1_2006\F12_2006.doc 6/10

#include <avr/io.h> void delay(unsigned char x); // funktion skriven i C. void las_ut(void); // funktion skriven i assembler void nolla(void); // funktion skriven i assembler void main () DDRB=0xFF; // Port B utgång PORTB =0xFF; // alla dioder släckta unsigned char x[]=0,1,2,4,8,16,32,64,128 ; int i; las_ut(); // läser ut 0xAA till portb delay(100); for(i=0;i<9;i++) PORTB = ~ x[i]; // invertering för att inte få rinnande mörker delay(100); nolla(); // stannar programmet void delay(unsigned char x) unsigned char i; unsigned int j; for(i=0;i<x;i++) for(j=0;j<50000;j++) ; De funktioner som har skrivits i assembler finns i en egen fil, en textfil. Filens namn är: subrutiner.s Observera att filslutet är ett stort S. ;subrutiner.s ; Observera stort S som filtillägg. ; det här är information som finns i m16def.inc Det går inte att använda filen direkt ; ;.equ PORTB = $18 ;.equ DDRB = $17 ;.equ PINB = $16 # define PINB 0x16 # define DDRB 0x17 # define PORTB 0x18 2006-10-09 C:\Documents and Settings\oan01\My Documents\CT3760_H\Peroid1_2006\F12_2006.doc 7/10

.text.global las_ut las_ut: LDI R20, 0xFF OUT DDRB, R20 LDI R20, 0xAA OUT PORTB, R20 RET.text.global nolla nolla: rjmp nolla RET Det går bra att ha flera funktioner i samma fil. Här har jag två, las_ut( ) och nolla( ). Kompileringen av programmen sker med hjälp av Makefile Vid inställningen av makefile har vi hittills hoppat över alternativet Assembler source file(s): Nu har vi användning av det. I fönstret skriver man in subrutiner.s Detta gör att kompilatorn tar hänsyn till de funktioner som vi skrivit i assembler. När man sedan sparat sin makefile så fortsätter man som tidigare. Nedan visar hur kompilatorn hanterar programmet. Disassembler från AVRStudio En del har jag markerat med fetstil för att man lättare skall kunna hitta i koden. @00000047: delay ---- main.c --------------------------------------------------------------------------------------- 27: for(i=0;i<x;i++) // subrutin för delay +00000047: E090 LDI R25,0x00 Load immediate 27: for(i=0;i<x;i++) +00000048: 1798 CP R25,R24 Compare +00000049: F450 BRCC PC+0x0B Branch if carry cleared 28: for(j=0;j<50000;j++) +0000004A: E020 LDI R18,0x00 Load immediate +0000004B: E030 LDI R19,0x00 Load immediate +0000004C: 5C2E SUBI R18,0xCE Subtract immediate +0000004D: 4F3F SBCI R19,0xFF Subtract immediate with carry +0000004E: EC43 LDI R20,0xC3 Load immediate +0000004F: 3520 CPI R18,0x50 Compare with immediate +00000050: 0734 CPC R19,R20 Compare with carry +00000051: F3D0 BRCS PC-0x05 Branch if carry set 2006-10-09 C:\Documents and Settings\oan01\My Documents\CT3760_H\Peroid1_2006\F12_2006.doc 8/10

27: for(i=0;i<x;i++) +00000052: 5F9F SUBI R25,0xFF Subtract immediate ---- No Source ------------------------------------------------------------------------------------ +00000053: CFF4 RJMP PC-0x000B Relative jump +00000054: 9508 RET Subroutine return // för delay @00000055: main ---- main.c --------------------------------------------------------------------------------------- 6: void main () 7: +00000055: E5C6 LDI R28,0x56 Load immediate // skapar +00000056: E0D4 LDI R29,0x04 Load immediate // stack +00000057: BFDE OUT 0x3E,R29 Out to I/O location +00000058: BFCD OUT 0x3D,R28 Out to I/O location 9: DDRB=0xFF; //Port B utgång +00000059: EF8F SER R24 Set Register +0000005A: BB87 OUT 0x17,R24 Out to I/O location 10: PORTB =0xFF; // alla dioder släckta +0000005B: BB88 OUT 0x18,R24 Out to I/O location 11: unsigned char x[]=0,1,2,4,8,16,32,64,128 ; +0000005C: E089 LDI R24,0x09 Load immediate +0000005D: 018E MOVW R16,R28 Copy register pair +0000005E: 5F0F SUBI R16,0xFF Subtract immediate +0000005F: 4F1F SBCI R17,0xFF Subtract immediate with carry +00000060: 01D8 MOVW R26,R16 Copy register pair +00000061: E6E0 LDI R30,0x60 Load immediate +00000062: E0F0 LDI R31,0x00 Load immediate +00000063: 9001 LD R0,Z+ Load indirect and postincrement +00000064: 920D ST X+,R0 Store indirect and postincrement +00000065: 958A DEC R24 Decrement +00000066: F7E1 BRNE PC-0x03 Branch if not equal 14: las_ut(); // läser ut 0xAA till portb Hoppar till subrutin //finns på adress 0x80 +00000067: 940E0080 CALL 0x00000080 Call subroutine 15: delay(100); +00000069: E684 LDI R24,0x64 Load immediate +0000006A: 940E0047 CALL 0x00000047 Call subroutine +0000006C: E089 LDI R24,0x09 Load immediate +0000006D: 2EE8 MOV R14,R24 Copy register +0000006E: 2CF1 MOV R15,R1 Copy register +0000006F: 0EEC ADD R14,R28 Add without carry +00000070: 1EFD ADC R15,R29 Add with carry 18: PORTB =~ x[i]; +00000071: 01F8 MOVW R30,R16 Copy register pair +00000072: 9181 LD R24,Z+ Load indirect and postincrement +00000073: 018F MOVW R16,R30 Copy register pair +00000074: 9580 COM R24 One's complement +00000075: BB88 OUT 0x18,R24 Out to I/O location 19: delay(100); 2006-10-09 C:\Documents and Settings\oan01\My Documents\CT3760_H\Peroid1_2006\F12_2006.doc 9/10

+00000076: E684 LDI R24,0x64 Load immediate +00000077: 940E0047 CALL 0x00000047 Call subroutine 16: for(i=0;i<9;i++) +00000079: 16E0 CP R14,R16 Compare +0000007A: 06F1 CPC R15,R17 Compare with carry +0000007B: F7AC BRGE PC-0x0A Branch if greater or equal, signed 21: nolla(); // stannar programmet +0000007C: 940E0085 CALL 0x00000085 Call subroutine ---- No Source ------------------------------------------------------------------------------------ +0000007E: 940C0087 JMP 0x00000087 Jump @00000080: Letext +00000080: EF4F SER R20 Set Register // las_ut +00000081: BB47 OUT 0x17,R20 Out to I/O location +00000082: EA4A LDI R20,0xAA Load immediate +00000083: BB48 OUT 0x18,R20 Out to I/O location +00000084: 9508 RET Subroutine return för las_ut +00000085: CFFF RJMP PC-0x0000 Relative jump //nolla +00000086: 9508 RET Subroutine return för nolla +00000087: CFFF RJMP PC-0x0000 Relative jump +00000088: 0100 MOVW R0,R0 Copy register pair +00000089: 0402 CPC R0,R2 Compare with carry +0000008A: 1008 CPSE R0,R8 Compare, skip if equal +0000008B: 4020 SBCI R18,0x00 Subtract immediate with carry +0000008C: 0080??? Data or unknown opcode +0000008D: FFFF??? Data or unknown opcode +0000008E: FFFF??? Data or unknown opcode +0000008F: FFFF??? Data or unknown opcode +00000090: FFFF??? Data or unknown op 2006-10-09 C:\Documents and Settings\oan01\My Documents\CT3760_H\Peroid1_2006\F12_2006.doc 10/10