summaryrefslogtreecommitdiffstats
path: root/Bachelor/Mikroprozessorsysteme2/mi2/Termin6
diff options
context:
space:
mode:
authorSven Eisenhauer <sven@sven-eisenhauer.net>2023-11-10 15:11:48 +0100
committerSven Eisenhauer <sven@sven-eisenhauer.net>2023-11-10 15:11:48 +0100
commit33613a85afc4b1481367fbe92a17ee59c240250b (patch)
tree670b842326116b376b505ec2263878912fca97e2 /Bachelor/Mikroprozessorsysteme2/mi2/Termin6
downloadStudium-33613a85afc4b1481367fbe92a17ee59c240250b.tar.gz
Studium-33613a85afc4b1481367fbe92a17ee59c240250b.tar.bz2
add new repoHEADmaster
Diffstat (limited to 'Bachelor/Mikroprozessorsysteme2/mi2/Termin6')
-rw-r--r--Bachelor/Mikroprozessorsysteme2/mi2/Termin6/Doku.odtbin0 -> 18903 bytes
-rw-r--r--Bachelor/Mikroprozessorsysteme2/mi2/Termin6/Doku.pdfbin0 -> 117410 bytes
-rw-r--r--Bachelor/Mikroprozessorsysteme2/mi2/Termin6/Doku.sxwbin0 -> 18723 bytes
-rw-r--r--Bachelor/Mikroprozessorsysteme2/mi2/Termin6/Termin6.pdfbin0 -> 9240 bytes
-rw-r--r--Bachelor/Mikroprozessorsysteme2/mi2/Termin6/Termin6Aufgabe1.c288
-rw-r--r--Bachelor/Mikroprozessorsysteme2/mi2/Termin6/doku.txt19
-rw-r--r--Bachelor/Mikroprozessorsysteme2/mi2/Termin6/frank_micsys2_praktikum06.zipbin0 -> 27338 bytes
-rw-r--r--Bachelor/Mikroprozessorsysteme2/mi2/Termin6/makefile52
-rw-r--r--Bachelor/Mikroprozessorsysteme2/mi2/Termin6/ser_io.S57
-rw-r--r--Bachelor/Mikroprozessorsysteme2/mi2/Termin6/seriell.S73
-rw-r--r--Bachelor/Mikroprozessorsysteme2/mi2/Termin6/swi.S34
11 files changed, 523 insertions, 0 deletions
diff --git a/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/Doku.odt b/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/Doku.odt
new file mode 100644
index 0000000..9fdfe2a
--- /dev/null
+++ b/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/Doku.odt
Binary files differ
diff --git a/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/Doku.pdf b/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/Doku.pdf
new file mode 100644
index 0000000..ba7abd9
--- /dev/null
+++ b/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/Doku.pdf
Binary files differ
diff --git a/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/Doku.sxw b/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/Doku.sxw
new file mode 100644
index 0000000..6a2f644
--- /dev/null
+++ b/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/Doku.sxw
Binary files differ
diff --git a/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/Termin6.pdf b/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/Termin6.pdf
new file mode 100644
index 0000000..e9f745b
--- /dev/null
+++ b/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/Termin6.pdf
Binary files differ
diff --git a/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/Termin6Aufgabe1.c b/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/Termin6Aufgabe1.c
new file mode 100644
index 0000000..c4ffe50
--- /dev/null
+++ b/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/Termin6Aufgabe1.c
@@ -0,0 +1,288 @@
+// Lösung zu Termin6&7
+// Aufgabe 1...
+// Namen: Andreas Spirka; Sven Eisenhauer
+// Matr.: 702789; 707173
+// vom : 25.01.2006
+
+
+#include "../h/pmc.h"
+#include "../h/tc.h"
+#include "../h/pio.h"
+#include "../h/aic.h"
+
+void pmcinit(void);
+void pioinit(void);
+void Timer_init(void);
+int massemessen(void);
+void pumpestart(void);
+void pumpestop(void);
+void greeting(void);
+void ausgabe(int);
+int genaumessen(void);
+void Int2Str(int);
+void taste_irq_handler (void) __attribute__ ((interrupt));
+
+volatile int aktion=0;
+char lf[2];
+char cr[2];
+
+// für die Initialisierung der Zähler TC4 und TC5
+
+#define TC4_INIT TC_CLKS_MCK2 | TC_LDBSTOP | TC_CAPT | TC_LDRA_RISING_EDGE | TC_LDRB_RISING_EDGE
+#define TC5_INIT TC_CLKS_MCK2 | TC_LDBSTOP | TC_CAPT | TC_LDRA_RISING_EDGE | TC_LDRB_RISING_EDGE
+
+// Interruptserviceroutine für die Tasten SW1 und SW2
+void taste_irq_handler (void)
+{
+ StructPIO* piobaseB = PIOB_BASE; // Basisadresse PIO B
+ StructAIC* aicbase = AIC_BASE; // Basisadresse Advanced Interrupt Controller
+ int taste = piobaseB->PIO_PDSR;
+ if (!(taste & KEY1)) // falls Schalter 1 gedrückt
+ aktion=1;
+ if (!(taste & KEY2)) // falls Schalter 2 gedrückt
+ aktion=2;
+
+ aicbase->AIC_EOICR = piobaseB->PIO_ISR; // AIC End of Interrupt Command Register = 1
+}
+
+void pmcinit(void)
+{
+ StructPMC* pmcbase = PMC_BASE;
+ pmcbase->PMC_PCER = 0x06f84; // Clock PIOA, PIOB, Timer5, Timer4, Timer3,US0 einschalten
+}
+
+void pioinit(void)
+{
+ StructPIO* piobaseB = PIOB_BASE; // Basisadresse PIO B
+ StructAIC* aicbase = AIC_BASE; // Basisadresse Advanced Interrupt Controller
+ // disable all interrupt sources of pio
+ piobaseB->PIO_IDR = 0xFFFFFFFF;
+ piobaseB->PIO_PER = KEY1|KEY2; // Schalter 1-2 enabeled
+ // Interrupt Initialisierung für PIOB (0x4000)
+ aicbase->AIC_IDCR = (1<<PIOB_ID); // Interrupt disabled
+ aicbase->AIC_ICCR = (1<<PIOB_ID); // Interrupt clear
+ aicbase->AIC_SMR[PIOB_ID] = 0x1; // An Stelle 14 Level Sensitive / Höchste Priorität
+ aicbase->AIC_SVR[PIOB_ID] = (unsigned int)taste_irq_handler; // Adresse der Interrupt Service Routine in Vektor-Tabelle
+ aicbase->AIC_IECR = (1<<PIOB_ID); // enable PIOB Interrupt in AIC
+ piobaseB->PIO_IER = KEY1|KEY2; // Schalter 1+2 lösen Interrupts aus
+}
+
+void Timer_init(void)
+{
+ StructTC* tcbase3 = TCB3_BASE; // Basisadressse TC Block 3 Pumpe
+ StructTC* tcbase4 = TCB4_BASE; // Basisadressse TC Block 4 Waage
+ StructTC* tcbase5 = TCB5_BASE; // Basisadressse TC Block 5 Waage
+ StructPIO* piobaseA = PIOA_BASE; // Basisadresse PIO A
+
+ tcbase3->TC_CCR = TC_CLKDIS; // Disable Clock
+
+ // Initialize the mode of the timer 3
+ tcbase3->TC_CMR =
+ TC_ACPC_CLEAR_OUTPUT | //ACPC : Register C clear TIOA
+ TC_ACPA_SET_OUTPUT | //ACPA : Register A set TIOA
+ TC_WAVE | //WAVE : Waveform mode
+ TC_CPCTRG | //CPCTRG : Register C compare trigger enable
+ TC_CLKS_MCK1024; //TCCLKS : MCKI / 1024
+
+ // Initialize the counter:
+ tcbase3->TC_RA = 244;
+ tcbase3->TC_RC = 488; // RA = RC/2 für symmetrisches Signal
+
+ // Start the timer :
+ tcbase3->TC_CCR = TC_CLKEN ; //__
+ tcbase3->TC_CCR = TC_SWTRG ; //__
+ piobaseA->PIO_PER = (1<<PIOTIOA3) ; // Pio herrscht über pin
+ piobaseA->PIO_OER = (1<<PIOTIOA3) ; // Output an pin
+ piobaseA->PIO_CODR = (1<<PIOTIOA3) ; // clear output -> low signal, pumpe aus
+
+// Periodendauer der Waagensignale messen
+// Signal aud TIOA4 ca. 16kHz entspricht ca. einer Periodendauer von 62,5us
+// durch den Teiler von 32 ergeben sich ca. 2ms
+// Zähler mit positiver Flanke starten
+
+ //piobaseA->PIO_PDR = 0x090;
+ piobaseA->PIO_PDR = (1<<PIOTIOA4)|(1<<PIOTIOA5);
+ tcbase4->TC_CCR = TC_CLKDIS;
+ tcbase4->TC_CMR = TC4_INIT;
+ tcbase4->TC_CCR = TC_CLKEN;
+ tcbase4->TC_CCR = TC_SWTRG;
+
+ tcbase5->TC_CCR = TC_CLKDIS;
+ tcbase5->TC_CMR = TC5_INIT;
+ tcbase5->TC_CCR = TC_CLKEN;
+ tcbase5->TC_CCR = TC_SWTRG;
+}
+
+int massemessen(void)
+{
+ StructTC* tcbase4 = TCB4_BASE;
+ StructTC* tcbase5 = TCB5_BASE;
+ volatile int captureRA1;
+ volatile int captureRB1;
+ volatile int capturediff1;
+ volatile float Periodendauer1;
+ volatile int captureRA2;
+ volatile int captureRB2;
+ volatile int capturediff2;
+ volatile float Periodendauer2;
+ volatile int c1=18030;
+ volatile int c2=40;
+ volatile int masse;
+
+ tcbase4->TC_CCR = TC_SWTRG;
+ tcbase5->TC_CCR = TC_SWTRG;
+ while (!( tcbase4->TC_SR & TC_LDBSTOP)); // Capture Register B wurde geladen Messung abgeschlossen
+ captureRA1 = tcbase4->TC_RA; //
+ captureRB1 = tcbase4->TC_RB;
+ capturediff1 = abs(captureRB1) - abs(captureRA1);
+ Periodendauer1 = abs(capturediff1);
+ while (!( tcbase5->TC_SR & TC_LDBSTOP)); // Capture Register B wurde geladen Messung abgeschlossen
+ captureRA2 = tcbase5->TC_RA; //
+ captureRB2 = tcbase5->TC_RB;
+ capturediff2 = abs(captureRB2) - abs(captureRA2);
+ Periodendauer2 = abs(capturediff2);
+
+ masse = c1 * ((Periodendauer1 / Periodendauer2) -1) -c2;
+ return masse;
+}
+
+void pumpestart(void)
+{
+ StructPIO* piobaseA = PIOA_BASE;
+ piobaseA->PIO_PDR = (1<<PIOTIOA3); // Timer herrscht über Bit (Taktsignal)
+}
+
+void pumpestop(void)
+{
+ StructPIO* piobaseA = PIOA_BASE;
+ // Vermeiden, daß dauerhaftes High Signal (PIO herrscht über das BIT)
+ piobaseA->PIO_PER = (1<<PIOTIOA3) ; // PIN der PIO zuweisen
+ piobaseA->PIO_OER = (1<<PIOTIOA3) ; // wird auf Output gesetzt
+ piobaseA->PIO_CODR = (1<<PIOTIOA3) ; // Clear Output (low Signal)
+}
+
+void greeting(void)
+{
+ cr[0]=0x0d;
+ lf[0]=0x0a;
+ lf[1]='\0';
+ cr[1]='\0';
+ puts("AUSSCHANKSTATION\0");
+ puts(&cr[0]);
+ puts(&lf[0]);
+ puts("Bitte Becher auf die Waage stellen\0");
+ puts(&cr[0]);
+ puts(&lf[0]);
+ puts("SW1 zum tarieren drücken\0");
+ puts(&cr[0]);
+ puts(&lf[0]);
+}
+
+void ausgabe(int m)
+{
+ cr[0]=0x0d;
+ lf[0]=0x0a;
+ lf[1]='\0';
+ cr[1]='\0';
+ puts("Gemessene Gesamtmasse: \0");
+ Int2Str(m);
+ puts(&cr[0]);
+ puts(&lf[0]);
+ puts("Becher kann entfernt werden\0");
+ puts(&cr[0]);
+ puts(&lf[0]);
+
+}
+
+void Int2Str(int m)
+{
+ int a,i=7;
+ char string[9];
+ string[8] = '\0';
+
+ while(m != 0)
+ {
+ a = m%10;
+ string[i] = a + '0';
+ m = m/10;
+ i--;
+ }
+ puts(&string[i+1]);
+}
+
+int genaumessen(void)
+{
+ volatile int durchlaeufe=10;
+ volatile int summe=0;
+ volatile int retVal=0;
+ volatile int i=0;
+ for (i=0;i<durchlaeufe;i++)
+ {
+ summe+=massemessen();
+ }
+ retVal= summe/durchlaeufe;
+ return retVal;
+}
+
+int main(void)
+{
+ volatile int masse=0;
+ volatile int tara=0;
+ volatile int netto=0;
+
+ cr[0]=0x0d;
+ lf[0]=0x0a;
+ lf[1]='\0';
+ cr[1]='\0';
+
+ inits();
+ greeting();
+ pmcinit();
+ Timer_init();
+ pioinit();
+
+ for(;;)
+ {
+ if(aktion == 1)
+ {
+ puts("Tara: \0");
+ tara=genaumessen();
+ netto=0;
+ Int2Str(tara);
+ puts(" SW2 startet die Pumpe");
+ puts(&cr[0]);
+ aktion=0;
+ }
+ if (aktion == 2 && tara != 0)
+ {
+ puts(&cr[0]);
+ puts(&lf[0]);
+ pumpestart();
+ while(netto <= 50)
+ {
+ masse=genaumessen();
+ netto=masse-tara;
+ puts("Fuellgewicht: \0");
+ Int2Str(netto);
+ puts(&cr[0]);
+ }
+ pumpestop();
+ ausgabe(masse);
+ do {
+ masse=genaumessen();
+ }
+ while (masse > 10);
+ // Gewicht hat sich geändert, d. h. Becher wurde entfernt
+ // D. h. von vorne starten
+ greeting();
+ aktion=0;
+ }
+ }
+ // disable piob command register in AIC
+ //aicbase->AIC_IDCR = (1<<PIOB_ID);
+ // disable all interrupt sources of pio
+ //piobaseB->PIO_IDR = 0xFFFFFFFF;
+ // Timer (0x200), PIOA (0x2000), PIOB (0x4000) ausschalten
+ //pmcbase->PMC_PCDR = (1<<PIOA_ID)|(1<<PIOB_ID)|(1<<TC3_ID);
+ return 0;
+}
diff --git a/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/doku.txt b/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/doku.txt
new file mode 100644
index 0000000..ebab65e
--- /dev/null
+++ b/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/doku.txt
@@ -0,0 +1,19 @@
+Dokumentaion Ausschankstation
+
+1. Nach dem Start des Programms erscheint ein Begrüßungstext
+ auf der seriellen Konsole.
+
+2. Stellen Sie einen Becher oder ein Glas auf die Waage.
+
+3. Drücken Sie die Taste SW1 zum tarieren der Waage.
+
+4. Drücken Sie die Taste SW2 zum Start des Abfüllvorgangs.
+
+5. Es werden 50 ml bzw. g abgefüllt.
+
+6. Auf der seriellen Konsole erscheint das Gesamtgewicht
+ auf der Waage. (Behälter plus Inhalt)
+
+7. Entfernen Sie den Becher.
+
+8. Starten Sie einen weiteren Abfüllvorgang mit Schritt 2.
diff --git a/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/frank_micsys2_praktikum06.zip b/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/frank_micsys2_praktikum06.zip
new file mode 100644
index 0000000..70ea757
--- /dev/null
+++ b/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/frank_micsys2_praktikum06.zip
Binary files differ
diff --git a/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/makefile b/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/makefile
new file mode 100644
index 0000000..9cf7745
--- /dev/null
+++ b/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/makefile
@@ -0,0 +1,52 @@
+FILE = Termin6Aufgabe1
+Opti = 0
+all:
+
+# Übersetzen der Quelldatei
+ arm-elf-gcc -c -g -O$(Opti) $(FILE).c -I ../h
+
+# Erzeugen der Assemblerdatei aus der Quelldatei
+ arm-elf-gcc -S -O$(Opti) $(FILE).c -I ../h
+
+# Erzeugen der benötitgen Objektdateien
+ arm-elf-gcc -c -g -O$(Opti) swi.S -o swi.o -I ../h
+ arm-elf-gcc -c -g -O$(Opti) ../boot/boot.s -o boot.o -I ../h
+# arm-elf-gcc -c -g -O$(Opti) ../boot/boot_ice.S -o boot_ice.o -I ../h
+# arm-elf-gcc -c -g -O$(Opti) ../boot/boot_flash.S -o boot_flash.o -I ../h
+ arm-elf-gcc -c -g -O$(Opti) seriell.S -o seriell.o -I ../h
+ arm-elf-gcc -c -g -O$(Opti) ser_io.S -o ser_io.o -I ../h
+
+# Binden für die RAM-Version
+ arm-elf-ld -Ttext 0x02000000 -O$(Opti) boot.o swi.o seriell.o ser_io.o $(FILE).o -o $(FILE).elf /gnutools/lib/gcc-lib/arm-elf/3.3.2/libgcc.a
+# arm-elf-ld -Ttext 0x02000000 -O$(Opti) boot_ice.o swi.o $(FILE).o -o $(FILE).elf
+
+# Linkerskripte noch nicht getestet
+# arm-elf-ld -T ldscript.ram boot.o swi.o seriell.o ser_io.o swi.o $(FILE).o -o $(FILE).elf /gnutools/lib/gcc-lib/arm-elf/3.2.2/libgcc.a
+
+# Binden für die FLASH-Version
+# arm-elf-ld -Ttext 0x1000000 boot.o swi.o $(FILE).o -o $(FILE).out /usr/gnutools/lib/gcc-lib/arm-elf/3.3.2/libgcc.a
+# arm-elf-ld -Ttext 0x1000000 boot_flash.o swi.o $(FILE).o -o $(FILE).out
+
+# Linkerskripte noch nicht getestet
+# arm-elf-ld -T ldscript.rom boot.o seriell.o ser_io.o swi.o $(FILE).o -o $(FILE).out /gnutools/lib/gcc-lib/arm-elf/3.2.2/libgcc.a
+
+# -I --input-target <bfdname> Assume input file is in format <bfdname>
+# -O --output-target <bfdname> Create an output file in format <bfdname>
+# -S --strip-all Remove all symbol and relocation information
+# -x --discard-all Remove all non-global symbols
+# -N --strip-symbol <name> Do not copy symbol <name>
+# -O --output-target <bfdname> Create an output file in format <bfdname>
+# -g --strip-debug Remove all debugging symbols
+# arm-elf-objcopy -I elf32-littlearm -O binary -x -S -N -g $(FILE).out $(FILE).rom
+# programm.rom nach /tftpboot/downlaod.bin kopieren <cp name.rom /tftpboot/download.bin>
+# Jumper E7 muß auf STD stecken
+# Mit <telnet 141.100.xxx.xxx> mit dem BDI2000 verbinden.
+# mit <erase 0x1100000> flash-Bereich löschen
+# mit <prog 0x1100000 download.bin bin> Programm ins flash schreiben.
+#
+#
+clean:
+ rm *.o
+ rm *.s
+ rm *.elf
+ rm *.rom
diff --git a/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/ser_io.S b/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/ser_io.S
new file mode 100644
index 0000000..5bad2a8
--- /dev/null
+++ b/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/ser_io.S
@@ -0,0 +1,57 @@
+@----------------------------------------------------------------------------
+@ File Name : ser_io.S
+@ Object : Ein- Ausgabe-Funktionen der seriellen Schnittstelle
+@
+@ Namen : Matr.-Nr.:
+@ : Matr.-Nr.:
+@
+@----------------------------------------------------------------------------
+
+@ Debuginformationen
+ .file "ser_io.S"
+
+@ Funktion
+ .text
+ .align 2
+ .global inits
+ .type inits,function
+inits:
+ stmfd sp!,{lr} @ Retten der Register
+ swi 0
+ ldmfd sp!,{pc} @ Rücksprung
+
+@ Funktion
+ .text
+ .align 2
+ .global puts
+ .type puts,function
+puts:
+ stmfd sp!,{lr} @ Retten der Register
+
+// Hier muß Ihr Code eingefügt werden.
+ mov r5, r0 @ Anfangsadresse des kompletten Strings von r0 nach r5 kopieren
+loop: ldrb r0, [r5], #1 @ Holen des Zeichens der Adresse in r5 nach r0 und erhöhe dann Adresse in r5
+ cmp r0, #0 @ Ende des Strings? entspricht binärer Null
+ beq L1 @ Wenn Stringende erreicht
+ swi 1 @ Auslösen der SWI Methode putchar (swi + offset)
+ b loop @ weiter bei loop solange Stringende nicht erreicht
+L1:
+ @mov r0, #0x0d @ Carriage Return
+ @swi 1 @ Auslösen der SWI Methode putchar (swi + offset)
+ @mov r0, #0x0a @ Linefeed
+ @swi 1 @ Auslösen der SWI Methode putchar (swi + offset)
+ ldmfd sp!,{pc} @ Rücksprung
+
+@ Funktion
+ .text
+ .align 2
+ .global gets
+ .type gets,function
+gets:
+ stmfd sp!,{lr} @ Retten der Register
+
+// Hier könnte Ihr Code eingefügt werden!
+
+ ldmfd sp!,{pc} @ Rücksprung
+
+.end
diff --git a/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/seriell.S b/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/seriell.S
new file mode 100644
index 0000000..9560075
--- /dev/null
+++ b/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/seriell.S
@@ -0,0 +1,73 @@
+@----------------------------------------------------------------------------
+@ File Name : seriell.S
+@ Object : Grundfunktionen der seriellen Schnittstelle
+@
+@ 1.0 27/10/02 GR : Creation
+@----------------------------------------------------------------------------
+
+ .file "seriell.S"
+
+#include "../h/pmc.inc"
+#include "../h/pio.inc"
+#include "../h/usart.inc"
+
+DEFAULT_BAUD = 38400
+CLOCK_SPEED = 25000000
+US_BAUD = 0x29 @ CLOCK_SPEED / (16*(DEFAULT_BAUD))
+
+@ Funktion
+ .text
+ .align 2
+ .global init_ser
+ .type init_ser,function
+init_ser:
+ stmfd sp!, {r0-r3, lr} @ Register retten
+ adr r0,L1
+ adr r1,L1_end
+init_ser_loop:
+ ldmia r0!, {r2-r3}
+ cmp r0, r1
+ str r3, [r2]
+ bne init_ser_loop
+ ldmfd sp!, {r0-r3, pc} @ Rücksprung
+L1:
+ .word PMC_BASE+PMC_PCER, 0x4
+ .word PIOA_BASE+PIO_PDR, 0x18000
+ .word USART0_BASE+US_CR, 0xa0
+ .word USART0_BASE+US_MR, 0x8c0
+ .word USART0_BASE+US_BRGR, US_BAUD
+ .word USART0_BASE+US_CR, 0x50
+L1_end:
+
+@ Funktion
+ .text
+ .align 2
+ .global putchar
+ .type putchar,function
+putchar:
+ stmfd sp!, {r0-r2, lr} @ Register retten
+ ldr r2, =USART0_BASE
+1:
+ ldr r1, [r2, #US_CSR]
+ tst r1, #US_TXRDY @ ist Transmitter frei
+ beq 1b
+ str r0, [r2,#US_THR]
+ ldmfd sp!, {r0-r2, pc} @ Rücksprung
+
+@ Funktion
+ .text
+ .align 2
+ .global getchar
+ .type getchar,function
+getchar:
+ stmfd sp!, {r1, r2, lr} @ Register retten
+ ldr r2, =USART0_BASE
+
+1:
+ ldr r1, [r2, #US_CSR]
+ ands r1, r1, #US_RXRDY
+ beq 1b
+ ldr r0, [r2, #US_RHR]
+ ldmfd sp!, {r1, r2, pc} @ Rücksprung
+
+.end
diff --git a/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/swi.S b/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/swi.S
new file mode 100644
index 0000000..09d5cc4
--- /dev/null
+++ b/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/swi.S
@@ -0,0 +1,34 @@
+@----------------------------------------------------------------------------
+@ File Name : swi.S
+@ Object : SoftwareInterruptHandler
+@
+@ 1.0 27/10/02 GR : Creation
+@
+@----------------------------------------------------------------------------
+
+
+ .global SWIHandler
+ .text
+SWIHandler:
+
+ ldr sp, STACK @ den Wert von STACK (0x78c) auf sp kopieren
+ stmfd sp!, {lr} @ retten der Rücksprungadresse
+ ldr ip,[r14, #-4] @ hole "swi X" Aufruf in ip (lr steht auf Aufruf nach swi Befehl im aufrufenden Programm)
+ bic ip, ip, #0xff000000 @ maskiere X aus und speichere in ip
+ mov ip, ip, lsl #2 @ X ist in ip, X * 4 (entspricht lsl #2) ist Offset des swi
+ ldr lr, =SWIJumpTable @ Lade Adresse von SWIJumpTable in lr
+ ldr ip, [lr, ip] @ Addiere ip (Offset des SWI) zu Adresse SWIJumpTable und speichere in ip
+ mov lr, pc @ Speichere pc in lr für Rücksprung
+ mov pc, ip @ Lade ip nach pc, entspricht Sprung in jeweilige SWI-Routine
+ ldmfd sp!, {pc}^ @ Rücksprung
+STACK:
+ .word 0x78c
+
+SWIJumpTable:
+ .word init_ser
+ .word putchar
+ .word getchar
+.end
+
+
+