Mikroprozessoren

Werbung
Mikroprozessoren
Grundlagen
Aufbau, Blockschaltbild
Grundlegende Datentypen
AVR-Controller
Anatomie
Befehlssatz
Assembler
Speicherzugriff
Adressierungsarten
Kontrollstrukturen
Stack
Input / Output (I/O)
Parallel I/O
Seriell I/O
Timer
Zusammenfassung I/O
Interrupt
Mathematische Operationen
Implementierung von
Berechnungen
Zahlenformate
• signed
• unsigned
• BCD
• fractional
• Fliesskomma
Signed / Unsigned Format
unsigned : 0..255
0..65535
signed:
-128 ..
8bit
16bit
0 .. 127
-32768 .. 0 .. 32767
(2er Komplement)
8bit
16bit
Big-endian / Little-endian
Speicheranordnung
Beispiel:
Zahl N = $12 34 56 78
$1000: 12 34 56 78
Big -endian Format
$1000: 78 56 34 12
Little -endian Format
8 -> 16 Bit Umwandlung
MSB
MSB
LSB
LSB MSB
LSB
upper Byte
unsigned: Links Nullen auffüllen
lower Byte
Sign – Extension
MSB
LSB
MSB
LSB
upper Byte
lower Byte
Signed: links das Sign-bit 8 mal kopieren
Subtract Two 16-Bit Values
Without Zero Flag Propagation
R1:R0 - R3:R2 ($E104 - $E101)
R1
R0
Z
E1
04
X
sub r0,r2
E1
03
0
sbc r1,r3
00
03
1
Wrong!
sbc : Z = Z_war_null && (Erg = = 0)
Subtract Two 16-Bit Values
With Zero Flag Propagation
R1:R0 - R3:R2 ($E104 - $E101)
R1
R0
Z
E1
04
X
sub r0,r2
E1
03
0
sbc r1,r3
00
03
0
So macht es der AVR !
Correct!
16-bit Befehle
Zero flag propagation:
SUB
SBC
BR??
R16,R24
SUBI
R17,R25
SBCI
BR??
R16,1
R17,0
S Z V C werden nach dem 16 Bit Ergebnis gesetzt !
Alle Sprungbefehle funktionieren dann richtig !
32 Bit Vergleich
Example: Compare R3:R2:R1:R0 and R7:R6:R5:R4
cp
cpc
cpc
cpc
r0,r4
r1,r5
r2,r6
r3,r7
At the end, the Status Register Indicates Equal,
Higher, Lower, Greater (signed), Less Than (signed).
Besides, it takes only 4 instructions and 4 clock
cycles to do it...
Multiplikation
„shift & add“
A *
B
10101100 * 10001001
7
3 0
10101100
10101100
10101100
101110000001100
(A)
(A<<3)
(A<<7)
=
A * B
Multiplikation 8*8 bit unsigned
.def
.def
.def
.def
.def
mc
mp
mL
mH
cnt
=
=
=
=
=
r16
r17
r17
r18
r19
;multiplicand
;multiplier
;result Low byte
;result High byte
;loop counter
mpy8u: clr
ldi
lsr
mH
cnt,8
mp
;clear result High byte
;init loop counter
;rotate multiplier
l1:
l2
mH,mc
mH
mL
mcnt
l1
;carry set
;add multiplicand to result High byte
;rotate right result High byte
;rotate right result L byte and multiplier
;decrement loop counter
;if not done, loop more
l2:
brcc
add
ror
ror
dec
brne
ret
MUL / MULS / MULSU
Integer Multiplikation
• 8 * 8 bit -> 16 bit Multiplikation
• unsigned oder signed oder gemischt
• Geht für R0 .. R31
• Ziel ist immer R1:R0
• Syntax Beispiel :
mul
muls
mulsu
R13,R30
R13,R14
R13,R14
Multiplikation 16*16->32bit
A:B * C:D
= (A * 28 + B) * (C * 28 + D)
= AC * 216 + (AD + BC) * 28 + BD
BD
+
AD
+
BC
+
=
AC
Resultat
r19:r18:r17:r16 = r23:r22 * r21:r20
mul16x16_32:
clr r2
mul r23, r21
; A * C
movw r19:r18, r1:r0
mul r22, r20
; B * D
movw r17:r16, r1:r0
mul r23, r20
; A * D
add r17, r0
adc r18, r1
adc r19, r2
mul r21, r22
; C * B
add r17, r0
adc r18, r1
adc r19, r2
ret
Division 8/8 bit unsigned
.def
.def
.def
.def
rem
dd_res
div
cnt
=
=
=
=
r15
r16
r17
r18
;remainder
;dividend and result
;divisor
;loop counter
div8u: clr
ldi
l1:
rol
dec
brne
ret
rem
cnt,9
dd_res
cnt
l2
;clear remainder and carry
;init loop counter
;shift left dividend
;decrement counter
;if done
;
return
l2:
rem
rem,div
l3
rem,div
;shift dividend into remainder
;remainder = remainder - divisor
;if result negative
;
restore remainder
;
clear carry to be shifted into result
;else
;
set carry to be shifted into result
l3:
rol
sub
brcc
add
clc
rjmp
sec
rjmp
l1
l1
BCD Zahlen
Spezialdarstellung für Dezimalzahlen
0x5423 -> 542310
5
1
4
1
1
2
3
1
1 1
Aufpassen bei der Implementierung
von BCD Rechenoperationen !
Bitkombinationen > Zahl 9 = “Pseudo-Tetraden”
Anwendungen auf Microcomputer heute eher selten !
Fractional
MSB
128 64
LSB
32
16
8
4
2
1
1/2 1/4 1/8 1/16 1/32 1/64 1/1281/256
Dezimalpunkt
Fractional 0.8
U
unsigned Byte
F
fractional Byte
F = U / 256
Beispiel:
HEX
$00
$80
$40
$c0
$1
unsigned
0
128
64
192
1
fractional
0
1/2
= 0.5
1/4
= 0.25
3/4
= 0.75
1/256 = 0.0039
16 Bit Fractional
unsigned
0 .. 65535
signed
-32768 .. 0 .. +32767
fractional unsigned
0.00001526 .. 0.9999847
(1.526 e-5)
fractional signed
-0.5 .. 0 .. 0.4999923
1.7 Fractional
Dieses Format verwendet der AVR !
1
1/2 1/4 1/8 1/16 1/32 1/64 1/128
Dezimalpunkt
Fractional 1.7 signed
U
signed Byte
F
fractional Byte
F = U / 128
Beispiel:
HEX
0xff
0x80
0x7f
0x40
0x01
0x00
signed
-1
-128
127
64
1
0
fractional
-1/128 = - 0.0078125
-1
127/128= 0.9921875
1/2
= 0.5
1/128 = 0.0078125
0
Fixpunkt – Darstellung
VZ 64
1
1/2
1/256
MSB
LSB
Dezimalpunkt
Vorkommastellen
wie (un)signed
Nachkommastellen
wie fractional
Fractional Multiplikationsbefehle
(Nur bei AT Mega verfügbar)
fmul
1.7 * 1.7 -> 1.15 bit fractional
unsigned
fmuls
1.7 * 1.7 -> 1.15 bit fractional
signed
fmulsu
1.7 * 1.7 -> 1.15 bit fractional
signed*unsigned
FMUL / FMULS / FMULSU
Fractional Multiplikation
• 1.7 * 1.7 bit -> 1.15 bit Fractional Multiplikation
• unsigned oder signed oder gemischt
• Geht für R0 .. R31
• Ziel ist immer R1:R0
• Syntax Beispiel :
fmul
R13,R30
fmuls
R13,R14
fmulsu R13,R14
Eigenschaften
der Fixpunkt Darstellung
• Addition + Subtraktion gehen schnell und einfach
(wie bei ganzen Zahlen)
• Dynamikbereich sehr begrenzt
-> Fliesskommazahlen
IEEE Float Darstellung
Idee:
Zahl F darstellen als:
F=M*2E
M = Mantisse
E = Exponent ( Basis 2)
IEEE 754
Fließkommazahlen (nur C)
•
⇒ Normung: durch z.B. IEEE, ⇒ Länge: 32 Bit, 64 bzw. 128 Bit
•
⇒ Eingabeformat: 1.5 E+13
•
⇒ Paramter (Bsp. 32 Bit):
→ Mantisse: 23 dargestellte Bit, bzw. 24 Bit Genauigkeit
→ Wertigkeit der Mantisse
→ Exponenten: 8 Bit unsigned, vermindert um Charakteristik C
→ Basis: 2 (binär)
→ Vorzeichen: durch ein Bit
•
In C/C++:
•
⇒ Datentyp float: 32 Bit. ⇒ double: 64 Bit, ⇒long double: 128 Bit
•
⇒ Bei fehlendem Prototyp werden immer “double” an Funktionen übergeben.
Sonderfälle:
Exponent
1..254
255
0
0
Mantisse
beliebig
≠0
=0
≠0
Bedeutung
H=1, normalisiert
NAN (ungültig)
±0
H=0, unnormalisiert
Beispiel: IEEE 32 Bit
Normierung
einer Flieskommazahl
Z= 1101001001 . 100010010010101001010001
Z= 1 . 101001001100010010010101001010001
* 29
Mantisse
= 1 + 0.101001001100010010010101001010001
Exponent = 9
“Normierung”
IEEE Float
Bit 31
Bit 0
v
V
exp
man
exp
man
8 Bit
23 Bit
Vorzeichen
Exponent
Mantisse
1 für negative Zahlen
exp = e - 127
normierte Mantisse
Zahl = v * (man/223 + 1) * 2 (exp -127)
Sonderfälle IEEE Float
Exp
man
Bedeutung
0
0
0
1..254
!=0
OK
255
!= 0
NAN
255
0
+ - unendlich
0
!=0
verboten
Zahlenbereich real - Zahlen
IEEE single precision (32 bit)
float
+/- 10-37 .. +-10+38
Mantisse: 23 bit
(Nmax=340282346638528859811704183484516925440.0 )
IEEE double precision (64 bit)
double
+/- 10-307 .. +-10+308
Mantisse: 52 bit
(Abstand Erde-Mond: 384401 km / 252 = 0.085 nm !)
Mikroprozessoren
Grundlagen
Aufbau, Blockschaltbild
Grundlegende Datentypen
AVR-Controller
Anatomie
Befehlssatz
Assembler
Speicherzugriff
Adressierungsarten
Kontrollstrukturen
Stack
Input / Output (I/O)
Parallel I/O
Seriell I/O
Timer
Zusammenfassung I/O
Interrupt
Mathematische Operationen
Herunterladen