Gles adressrymd
Endast en liten del av minnet är utbyggt.
(vanligt för inbyggda system) Mellan adresserna 0x800 till 0xA20 finns I/O-kretsar – med allt det roliga på DE2-kortet code motsvarar.text
IO-adresserna är speciella
Även om IO-enheternas register adresseras som vanligt minne så har dom ju helt andra egenskaper än vad vanligt minne har!
Om man skriver talet 17 till DE2-kortets toggle-switchar, så är det ingen magisk kraft som förflyttar dom till ett läge som motsvarar talet 17!
Om Du däremot ställer switcharna för hand så att det motsvarar talet 17 så kommer man att kunna läsa talet 17 på denna minnesadress. I C-program bör man använda ordet volatile (flyktigt) om sådana minnesadresser. Då talar man om för kompilatorn att den inte kan räkna med att ett lagrat tal på en sådan minnesadress är det man får tillbaka om man senare läser adressen!
5.1 de2_pio_toggles18
IO är mappade till minnesadresser. 0x850 … 0x85C
5.1 inmatning från ”toggles” Get_Data()
.equ toggles18, 0x850 # toggles18’s adress .text # Datasegmentet .align 2 .global Get_Data # label synligt utanför filenGet_Data: movia r8,toggles18 # adressen till toggles i R8 ldw r2,0(r8) # läs toggles till R2 movia r8,0x3ffff # mask med 18 ettor (movia) and r2,r2,r8 # maska bort oanvända bitar ret int Get_Data( void );
5.2 de2_pio_geenled9
IO är mappade till minnesadresser. 0xA10 … 0xA1C
5.2 Utmatning till ”greenled” Green_Light()
.equ greenled9, 0xA10 # greenled9’s adress .text # Datasegmentet .align 2 .global Green_Light # label synligt utanför filenGreen_Light: andi r4,r4,0x1ff # 0:ställ oanvända bitar movia r8,greenled9 # adressen till greenled i R8 stw r4,0(r8) # skriv till LED ret void Green_Light( int );
de2_pio_redled18
IO är mappade till minnesadresser. 0x810 … 0x81C
5.3 Sjusegmentdisplayer
IO är mappade till minnesadresserna 0xA00 och 0x9F0
5.3 Segmentöversikt
5.3 Teckenöversikt
Kan Du nu gissa varför simulatorn redovisar att alla oanvända register innehåller ”deadbeef” (dökött)? nörd-humor …
5.3 Siffran ”0”
5.3 Siffran ”1”
5.3 omvandling hex7seg()
int tabell[] = { 0x40, 0x79, 0x24, 0x30, 0x19, 0x12, 0x02, 0x78, 0x00, 0x10, 0x08, 0x03, 0x46, 0x21, 0x06, 0x0e };int hex7seg( int hex){ register int tmp = hex & 0xf; return tabell[ tmp ];} C-funktion som omvandlar en hex-siffra till motsvarande 7-bitskod (för utmatning på 7-segmentdisplay).
5.4 Utmatning 4 st 7-segment siffror
void PutLow7SegDisp( int ); .equ hex_low28,0x9f0 # adressen till hex_low28 .text # Datasegmentet .align 2 .global PutLow7SegmDisp # label synligt i andra filerPutLow7SegmDisp: movia r8,hex_low28 # adressen till hex_low i R8 stw r4,0(r8) # skriv till 4 st 7-segm siffror ret
Simulatorn har inga 7-segmentdisplayer?
Ett hjälpmedel kan vara att låta utskriften i console-fönstret efterlikna 7-segmentdisplayen!
Programmet: put_hexsim(in_value)är skrivet för att uppföra sig exakt som displayen kommer att göra vid laborationen.
– Fungerar det med simulatorn, är chansen stor att ditt program även fungerar vid laborationen!
5.5 toggles 4 7-Segment display
main: # main kör evighetsloop – returnerar ej call GetData # hämta värde från toggles, R2 mov r16,r2 # spara värdet i R16 mov r4,r2 # kopiera värdet till R4 call hex7seg # kodomvandling 1:a siffran (C-funktion) mov r17,r2 # spara resultat i R17 srli r4,r16,4 # skifta fram andra hex-siffran call hex7seg # kodomvandling 2:a siffran slli r8,r2,7 # skifta fram till nästa 7 bitar or r17,r17,r8 # lägg till 7 skiftade bitar
# fortsättning följer ...
5.5 toggles 4 7-Seg forts.
srli r4,r16,8 # skifta fram tredje hex-siffrancall hex7seg # kodomvandling 3:e siffranslli r8,r2,14 # skifta fram till nästa 7 bitaror r17,r17,r8 # lägg till de skiftade 7 bitarnasrli r4,r16,12 # skifta fram fjärde hex-siffrancall hex7seg # kodomvandling 4:e siffran slli r8,r2,21 # skifta fram till nästa 7 bitaror r17,r17,r8 # lägg till de skiftade 7 bitarnamov r4,r17 # kopiera till R4, parametercall PutLow7SegmDisp # skriv på displayenbr main # main är evighets-loop
Comments