CT3760 Mikrodatorteknik Föreläsning 2 Tisdag 2005-08-30 Minnestyper. Atmega 16 innehåller följande minnestyper: SRAM för dataminne FLASH för programminne EEPROM för parametrar och konstanter. Minnen delas in i två huvudgrupper, permanenta och icke permanenta. Non-volatile and volatile. Det finns många varianter av pemanenta minnen. De vanligaste är ROM, EEPROM och FLASH. För icke-permanenta minnen finns två huvudgrupper. Statiska och dynamiska. SRAM statiskt minne för att läsa och för att skriva till. Varje minnescell kan ses som en vippa. Informationen ligger kvar så länge som det finns matningsspänning. Varje cell byggs av 4 6 transistorer. Cellerna blir ganska stora. DRAM dynamiskt minne. Informationen lagras i en liten kondensator. Närvaro av laddning är samma som ett, frånvaro av laddning är noll. En kondensator blir aldrig ideal, utan laddningen läcker ut. För att behålla informationen så måste innehållet i minnet läsas ut ocj skrivas in igen. Detta sker med ett intervall på c:a 50 millisekunder. Fördelen med minnestypen är att det endast går åt en transistor per cell. DRAM kan byggas för mycket större kapacitet är ett SRAM. SRAM har lägre strömförbrukning än DRAM och är generellt snabbare. Accesstid i storleksordning 20 ns. De enskillda cellerna organiseras i block, exempelvis 8 celler för att forma en byte. 11 st adressledningar 11 Minne 2k x 8 8 st dataledningar 8 CS OE WE 2005-08-30 H:\CT3760\Period1_2005\F2.doc 1/7
CS står för Chip Select. Strecket ovanför står för aktivt låg. Funktionen är inkopplad då man har en nolla på ledningen. OE står för Output Enable. Då man har en etta på ledningen är dataledningarna inaktiva. Det är detsamma som om de vore bortkopplade. WE står får Write Enable. För att kunna skiva in data till minnet måste denna ledning vara noll. Vanligen består CS av flera ledningar. Detta för att man skall kunna koppla ihop flera minnen. Hanteringen av kontrollsignaler sker internt i microcontrollern, det är något som vi inte behöver ägna oss åt. EEPROM ROM är en förkortning av Read Only Memory. Utvecklingen ledde fram till att man kunde lagra information i en fälteffekttransistor med flytande styre. Laddningar kunde låsas fast i styret, och på så sätt programmerades minnescellen. Skillnaden mellan att lagra laddningar i en kondensator och att lagra i ett flytande styre är att urladdningen tar mycket längre tid. Storleksordingen 10 år. Programmeringen går till så att man lägger en hög spänning på den minnescell som skall ha en etta. ( 12,75 V i c:a 100 µs. Senare fann man att urladdningen kunde ske om man exponerade chipet med UV-ljus. Minneskapslarna fick ett kvartsfönster. Vanligen med en svart tejpbit över. Utvecklingen ledde senare till att man klarade av att göra en elektrisk radering istället för att radera med UV-ljus. Naturligtvis har EEPROM begränsningar. Antalet läs/skrivcykler begränsas till 100000 gånger. Tioårsgränsen gäller fortfarande. Men nästan all elektronik är gammalmodig och ersatt innan tio år. FLASH Att bara använda EEPROM till minnet i en microcontroller går alldeles utmärkt. Ett litet problem är att minnet är ganska dyrt. I ett EEPROM kan man radera enskillda minnesceller. Detta är inte möjligt i ett FLASH-minne. Istället raderas hela block, eller hela minnet på en gång. Om man sedan sänker kvaliteskravet till att minnet bara skall kunna programmeras om 10 000 gånger, kan man tillverka billigare minnen. En microcontroller som sitter inbyggt i ett system omprogrammeras bara några få gånger, eller kanske inte alls. Det som i dag kallas FLASH-minne hette först Flash-EEPROM. 2005-08-30 H:\CT3760\Period1_2005\F2.doc 2/7
En Atmega 16 innehåller 512 byte EEPROM 1kb = 1024 byte SRAM 16 kb =16 384 byte FLASH Interna register och SRAM ligger inom samma minnesområde. Minnesadr. Hex 0000 R0 0001 R1 000F R15 0010 R16 0019 R25 001A R26 X-reg Low byte 001B R27 X-reg High byte 001C R28 Y-reg Low byte 001D R29 Y-reg High byte 001E R30 Z-reg Low byte 001F R31 Z-reg High byte 0020 Här börjar I/O-register 64 st. 0030 PIND 10 0031 DDRD 11 0032 PORTD 12 0036 PINB 16 0037 DDRB 17 0038 PORTB 18 003C EECR Hantering av EEPROM 1C 003D EEDR 1D 003E EEARL 1E 003F EEARH!F 005D SPL Stackpekare low byte 3D 005E SPH Stackpekare high byte 3E 005F SREG Statusregister 3F 0060 Här börjar SRAM 045F SRAM slut Adress i Register Summary. Hex 00 Läses i register Kan läsas i Memory I/O Kan läsas i Memory Data 2005-08-30 H:\CT3760\Period1_2005\F2.doc 3/7
Hur maskinkod lagras i minnet. En port kan fungera som ingång eller som en utgång till processorn. För att ange hur porten skall fungera, skriver man ett värde till Data Direction Register. Man anger att PORTB skall vara inport genom att skriva noll till registret DDRB. Skall porten fungera som en ut-port skriver man ettor till DDRB. Registret DDRB finns på ardess =0x17. Antag att man vill skriva ut innehållet i register R16 till port B. Maskinkoden för detta blir: 1011 1011 0000 1000 uttryckt som hexadecimalt tal BB08. Detta är två byte och minnet är på en byte. Maskinkoden BB08 sparas på två minnesplatser. Börjar man med att skriva den mest sigifikanta byten, så hamnar den på den lägsta adressen. Nästa byte ( den minst sigifikanta byten) hamnar på en adress högre upp. MS Byte LS Byte adress adress +1 Detta sätt att spara två byte kallas Big Endian. Gör man tvärtom, lagras LS Byte först kallas sättet att lagra för Little Endian. Motorolas processorer och de flesta RISC-processorer använder Big Endian som lagringsprincip. Intels Pentiumprocessorer använder Little Endian. Allt detta innebär att när man läser av maskinkodsfilen så hittar man 08BB som kod för att skriva ut innehållet i register 16 till port B. Start av processorn Vid start ( eller vid reset ) kommer den istruktion som finns på adress noll att utföras. Vanligtvis är denna instruktion ett hopp till den plats där själva programmet startar. Programräknaren håller reda på var i programmet man befinner sig. Arbetsgången är sedan: Instuktion hämtas Programräknaren pekar på nästa instruktion. Instuktionen tolkas, avkodas. Instruktionen utförs. Programräknaren pekar alltid på nästa instruktion som står i tur att utföras. 2005-08-30 H:\CT3760\Period1_2005\F2.doc 4/7
Assembler. Maskinkoden för att skriva ut innehållet i register R16 till port B visades ovan, så här stod det: (Antag att man vill skriva ut innehållet i register R16 till port B. Maskinkoden för detta blir: 1011 1011 0000 1000 uttryckt som hexadecimalt tal BB08. ) Masskinkoden kan man hitta genom att läsa i AVR Instruction Set. Assembler innebär att man får hjälp med översättningen till hexadecimal form. En del annat ingår också i assemblatorn. Viktigt är att komma ihåg. Varje processor har sitt assemblerspråk. Vi skall skriva ett program som simulerar en binärräknare. Utången, PORTB skall ökas med en ehet i taget. Först bör man göra en liten skiss över hur programmet skall fungera. Flödesschema. Start Initieringar Utgång Port B Läs in ettor i ett register Läs ut till Port B Öka reg med 1 ; Program för att simulera en räknare ; Semikolon gör att resten av raden är en kommentar. ;.include "8515def.inc".def temp = r16.cseg.org 0 rjmp RESET RESET: ldi temp, low(ramend) out SPL, temp ldi temp, high(ramend) out SPH, temp ser temp out DDRB, temp loop: out PORTB, temp inc temp rjmp loop Hoppa tillbaka 2005-08-30 H:\CT3760\Period1_2005\F2.doc 5/7
När man skriver program skall man se till att man kommenterar hur man gjort. Ett semikolon gör att resten av raden är en kommentar. Asemblerdirektiv. Detta är upplysningar till assemblatorn. Det har inget med själva programmet att göra. I programmet ovan finns några direktiv. Direktiv börjar med en punkt. Första direktivet är.include "8515def.inc" En fil med namnet 8515def.inc skall inkluderas. I denna fil finns upplysningar om förkortningar och vad register har för adress osv. Man kan söka reda på filen, och öppna den med programmers notepad. Se bara till att inte ändra något i filen. Exempelvis:.equ SREG = 0x3f.equ SPH = 0x3e.equ SPL = 0x3d.equ PORTB = 0x18.equ DDRB = 0x17.equ PINB = 0x16.def innebär att vi sätter ett eget namn på R16 Registret heter i fortsättningen temp..cseg anger att start på avsnittet skall placeras i programminnet. (.dseg anger att avsnittet skall placeras i SRAM och.eseg att avsnittet skall finnas i EEPROM ).org 0 anger att programmet skall starta på minnesadress noll. Assemblerprogramm har tre avsnitt. Label Mnemonic Operand. Label är en etikett, en symbolisk adress. Mnemonic är förkortning för en instruktion. Denna förkortning ger en antydan om vad som skall göras Exempelvis står AND för och-funktionen ADD står för addition. Operand är de eller den ariabel som skall bearbetas.. Första instruktionen är: rjmp RESET Programräknaren ställs om så att den pekar på den adress där vi har Label RESET Observera kolon efter reset. Genom att använda labels så slipper man att själv räkna ut adressen dit man skall hoppa. Den beräkningen gör assemblatorprogrammet. Ldi temp, low(ramend) Det värde som skall läggas in i registret temp hämtas från 8515def.inc Värdet är 5F 2005-08-30 H:\CT3760\Period1_2005\F2.doc 6/7
Nästa instruktion läser in detta i SPL. Detta minne finns på 3D. Ldi temp high(ramend) Värdet är 02. Läses sedan in i SPH, som finns på 5E Stackpekare börjar att peka på 0x25F I det här lilla programmet används inte stacken, men man bör ta som vana att definiera en stack. När vi sedan skriver program i C så kommer kompilatorn att se till att det finns en stack. Instruktionen ser ettställer samtliga bitar i registret. Alla ettor läses ut till DDRB. Detta gör att hela porten B blir en ut-port. Inc ökar innehållet i temp med en enhet. Till slut så hoppar man tillbaka till den plats som anges av labeln loop. Programmet går sedan runt i en evig loop. 2005-08-30 H:\CT3760\Period1_2005\F2.doc 7/7