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