<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Mikroprozessorsysteme Archive - Maximilian Krieg</title>
	<atom:link href="https://maximiliankrieg.de/category/studium/bachelor-of-science/2-semester-b-sc/mikroprozessorsysteme/feed/" rel="self" type="application/rss+xml" />
	<link>https://maximiliankrieg.de/category/studium/bachelor-of-science/2-semester-b-sc/mikroprozessorsysteme/</link>
	<description>Wissen, Technik &#38; Erfahrungen</description>
	<lastBuildDate>Sun, 01 Mar 2026 06:13:16 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://maximiliankrieg.de/wp-content/uploads/2026/05/cropped-20260524_logo_2_512-2-32x32.png</url>
	<title>Mikroprozessorsysteme Archive - Maximilian Krieg</title>
	<link>https://maximiliankrieg.de/category/studium/bachelor-of-science/2-semester-b-sc/mikroprozessorsysteme/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Mikroprozessorsysteme (Praktikum 4)</title>
		<link>https://maximiliankrieg.de/2012/05/mikroprozessorsysteme-praktikum-4/</link>
					<comments>https://maximiliankrieg.de/2012/05/mikroprozessorsysteme-praktikum-4/#respond</comments>
		
		<dc:creator><![CDATA[Maximilian]]></dc:creator>
		<pubDate>Fri, 11 May 2012 05:10:00 +0000</pubDate>
				<category><![CDATA[Mikroprozessorsysteme]]></category>
		<guid isPermaLink="false">https://maximiliankrieg.de/?p=1513</guid>

					<description><![CDATA[<p>Aufgabe 1 Das Programm aus Termin4-Aufgabe1.c soll übersetzt und getestet werden. Wie groß ist die gemessene Periodendauer TPA4? Verändert sich die Periodendauer bei Belastung der&#8230;</p>
<p>Der Beitrag <a href="https://maximiliankrieg.de/2012/05/mikroprozessorsysteme-praktikum-4/">Mikroprozessorsysteme (Praktikum 4)</a> erschien zuerst auf <a href="https://maximiliankrieg.de">Maximilian Krieg</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">Aufgabe 1</h2>



<p class="wp-block-paragraph">Das Programm aus Termin4-Aufgabe1.c soll übersetzt und getestet werden. Wie groß ist die gemessene Periodendauer TPA4? Verändert sich die Periodendauer bei Belastung der Waage.</p>



<ul class="wp-block-list">
<li>Die Periodendauer TPA4 beträgt bei unbelasteter Waage(0g) 1999,71001μs, also ungefähr 2ms.</li>



<li>Bei einer Belastung der Waage um bspw. 50g steigt die Periodendauer von TPA4</li>
</ul>



<pre class="wp-block-code"><code>#include "../h/pio.h"
#include "../h/tc.h"
#include "../h/pmc.h"

// für die Initialisierung der Zähler TC4 &amp; TC5 // Define TC5_INIT aus Platzgründen gelöscht
#define TC4_INIT TC_CLKS_MCK2 | TC_LDBSTOP | TC_CAPT | TC_LDRA_RISING_EDGE | TC_LDRB_RISING_EDGE

int main(void)
{
volatile int captureRA1 = 0, captureRA2 = 0; volatile int captureRB1 = 0, captureRB2 = 0;
volatile int capturediff1 = 0, capturediff2 = 0; volatile float Periodendauer1 = 0, Periodendauer2 = 0;

StructPMC* pmcbase = PMC_BASE;
StructPIO* piobaseA = PIOA_BASE; StructPIO* piobaseB = PIOB_BASE;
StructTC* tcbase4 = TCB4_BASE; StructTC* tcbase5 = TCB5_BASE;

pmcbase-&gt;PMC_PCER = 0x06f80; // Clock PIOA, PIOB, Timer5, Timer4, Timer1 einschalten
piobaseB-&gt;PIO_PER = KEY3; // PIO kontrolliert SW2 // Key2
piobaseB-&gt;PIO_ODR = KEY3; // als Eingang

// 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-&gt;PIO_PDR = 0x090;
tcbase4-&gt;TC_CCR = TC_CLKDIS; tcbase5-&gt;TC_CCR = TC_CLKDIS;
tcbase4-&gt;TC_CMR = TC4_INIT; tcbase5-&gt;TC_CMR = TC5_INIT;
tcbase4-&gt;TC_CCR = TC_CLKEN; tcbase5-&gt;TC_CCR = TC_CLKEN;

while((piobaseB-&gt;PIO_PDSR &amp; KEY3)) // Wenn KEY3 gedrückt wird
{
int temp = tcbase4-&gt;TC_SR &amp; 0x40; // vor SWTRG beide Timer-Statusregister lesen
temp = tcbase5-&gt;TC_SR &amp; 0x40;
tcbase4-&gt;TC_CCR = TC_SWTRG; tcbase5-&gt;TC_CCR = TC_SWTRG;
while (!( tcbase4-&gt;TC_SR &amp; 0x40));
while (!( tcbase5-&gt;TC_SR &amp; 0x40)); // Capture Register B wurde geladen -&gt; Messung abgeschlossen
captureRA1 = tcbase4-&gt;TC_RA; captureRB1 = tcbase4-&gt;TC_RB; capturediff1 = abs(captureRB1) - abs(captureRA1);
Periodendauer1 = abs(capturediff1) / 12.5; // Zeit in us

captureRA2 = tcbase5-&gt;TC_RA; captureRB2 = tcbase5-&gt;TC_RB;
capturediff2 = abs(captureRB2) - abs(captureRA2);
Periodendauer2 = abs(capturediff2) / 12.5; // Zeit in us
Periodendauer2 = abs(capturediff2) / 12.5; // Zeit in us
}
return 0;
}</code></pre>



<h2 class="wp-block-heading">Aufgabe 2</h2>



<p class="wp-block-paragraph">Das Programm soll so erweitert werden, dass auch die Periodendauer TPA7 erfasst wird (Siehe Code auf Seite 1). Es soll getestet werden, ob sich auch hier die Periodendauer um die 2ms bewegt.</p>



<p class="wp-block-paragraph">→&nbsp;Der Test hat gezeigt, dass sich auch die Periodendauer von TPA7 um 2ms bewegt.</p>



<h2 class="wp-block-heading">Aufgabe 3</h2>



<p class="wp-block-paragraph">Aus dem Verhältnis der Frequenzen fPA4 und fPA7 lässt sich mit der folgenden Gleichung die Masse m berechnen:</p>



<p class="wp-block-paragraph">m = C1 * [(fPA7/ fPA4) -1] – C2</p>



<p class="wp-block-paragraph">oder</p>



<p class="wp-block-paragraph">m = C1 * [(TPA7/ TPA4) -1] – C2,</p>



<p class="wp-block-paragraph">wobei C1, C2 = wägezellenspezifische Konstanten sind. Die Frequenz an PA4 wird mit zunehmendem Gewicht kleiner, während die Frequenz von PA7 mit zunehmendem Gewicht größer wird.</p>



<p class="wp-block-paragraph">Um die Messwerte des Programms zu verifizieren, soll die Masse m, die auf der Waage liegt, zur Kontrolle berechnet werden (WaSim: C1 = 2000, C2 = 0).</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td>Eingestelltes Gewicht</td><td>TPA4</td><td>TPA7</td><td>Errechnete Masse m</td></tr><tr><td>0 g</td><td>1999,76001 μs</td><td>1999,76001 μs</td><td>0 g</td></tr><tr><td>50 g</td><td>1974,71997 μs</td><td>2024,64001 μs</td><td>49,31g</td></tr><tr><td>100 g</td><td>1950,88000 μs</td><td>2048,56006 μs</td><td>100,13 g</td></tr></tbody></table></figure>



<h2 class="wp-block-heading">Aufgabe 4</h2>



<pre class="wp-block-code"><code>void Timer_Init(void)
{
StructTC* tcbase4 = TCB4_BASE; StructTC* tcbase5 = TCB5_BASE;
StructPIO* piobaseA = PIOA_BASE;
// 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-&gt;PIO_PDR = 0x090;
tcbase4-&gt;TC_CCR = TC_CLKDIS; tcbase5-&gt;TC_CCR = TC_CLKDIS;
tcbase4-&gt;TC_CMR = TC4_INIT; tcbase5-&gt;TC_CMR = TC5_INIT;
tcbase4-&gt;TC_CCR = TC_CLKEN; tcbase5-&gt;TC_CCR = TC_CLKEN;
}

int MessungderMasse(void)
{
StructPMC* pmcbase = PMC_BASE;
StructPIO* piobaseA = PIOA_BASE; StructPIO* piobaseB = PIOB_BASE;
StructTC* tcbase4 = TCB4_BASE; StructTC* tcbase5 = TCB5_BASE;
volatile int captureRA1 = 0, captureRA2 = 0; volatile int captureRB1 = 0, captureRB2 = 0;
volatile int capturediff1 = 0, capturediff2 = 0;
volatile float Periodendauer1 = 0, Periodendauer2 = 0;
volatile int C1 = 2000; volatile int C2 = 0;
volatile float m; // Masse

while((piobaseB-&gt;PIO_PDSR &amp; KEY3)) // Wenn KEY3 gedrückt wird
{
volatile int temp = tcbase4-&gt;TC_SR &amp; 0x40; // vor SWTRG beide Timer-Register lesen
temp = tcbase5-&gt;TC_SR &amp; 0x40;
tcbase4-&gt;TC_CCR = TC_SWTRG;
tcbase5-&gt;TC_CCR = TC_SWTRG;
while (!( tcbase4-&gt;TC_SR &amp; 0x40));
while (!( tcbase5-&gt;TC_SR &amp; 0x40)); // Capture Register B wurde geladen Messung abgeschlossen
captureRA1 = tcbase4-&gt;TC_RA; // captureRB1 = tcbase4-&gt;TC_RB;
capturediff1 = abs(captureRB1) - abs(captureRA1);
Periodendauer1 = abs(capturediff1) / 12.5; // Zeit in us

captureRA2 = tcbase5-&gt;TC_RA; // captureRB2 = tcbase5-&gt;TC_RB;
capturediff2 = abs(captureRB2) - abs(captureRA2);
Periodendauer2 = abs(capturediff2) / 12.5; // Zeit in us
Periodendauer2 = abs(capturediff2) / 12.5; // Zeit in us

m = C1*((Periodendauer1/Periodendauer2)-1)-C2;
return m; }
}

int main(void)
{
StructPMC* pmcbase = PMC_BASE;
StructPIO* piobaseA = PIOA_BASE;
StructPIO* piobaseB = PIOB_BASE;
volatile int Masse;
PIO_Init();
Timer_Init();

while(!(piobaseA-&gt;PIO_ODSR &amp; KEY3))
{
Masse = MessungderMasse();
}
return 0;
}</code></pre>



<p class="wp-block-paragraph">Es soll eine Funktion int MessungderMasse(void) zur Ermittlung der Masse in Gramm erstellt werden.</p>



<p class="wp-block-paragraph">Hinweis:&nbsp;Es sollte der Mittelwert aus mehreren Messungen gebildet werden um die Masse möglichst genau bestimmen zu können.</p>
<p>Der Beitrag <a href="https://maximiliankrieg.de/2012/05/mikroprozessorsysteme-praktikum-4/">Mikroprozessorsysteme (Praktikum 4)</a> erschien zuerst auf <a href="https://maximiliankrieg.de">Maximilian Krieg</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://maximiliankrieg.de/2012/05/mikroprozessorsysteme-praktikum-4/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Mikroprozessorsysteme (Praktikum 3)</title>
		<link>https://maximiliankrieg.de/2012/05/mikroprozessorsysteme-praktikum-3/</link>
					<comments>https://maximiliankrieg.de/2012/05/mikroprozessorsysteme-praktikum-3/#respond</comments>
		
		<dc:creator><![CDATA[Maximilian]]></dc:creator>
		<pubDate>Sat, 05 May 2012 05:11:00 +0000</pubDate>
				<category><![CDATA[Mikroprozessorsysteme]]></category>
		<guid isPermaLink="false">https://maximiliankrieg.de/?p=1515</guid>

					<description><![CDATA[<p>Aufgabe 1: / Aufgabe 1 // von: // vom: // #include "../h/pmc.h" #include "../h/tc.h" #include "../h/pio.h" #include "../h/aic.h" // Timer3 initialisieren void Timer3_init( void )&#8230;</p>
<p>Der Beitrag <a href="https://maximiliankrieg.de/2012/05/mikroprozessorsysteme-praktikum-3/">Mikroprozessorsysteme (Praktikum 3)</a> erschien zuerst auf <a href="https://maximiliankrieg.de">Maximilian Krieg</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">Aufgabe 1:</h2>



<ul class="wp-block-list">
<li>Es soll eine Kolbenhubpumpe, welche über PA1/TIOA3 angesteuert wird, betrieben werden.</li>



<li>Die Pumpe benötigt ein symmetrisches Rechtecksignal mit einer Frequenz von ca. 50Hz. Sie könnten eine Zeitschleife programmieren. Hiermit würden Sie aber den Prozessor blockieren (Erinnerung an Termin 2). Besser ist es, Sie initialisieren einen Timer (Timer3) so, dass dieser selbstständig das Signal für die Pumpe erzeugt.</li>



<li>Vervollständigen Sie die das gegebene Programm <strong>Termin3Aufgabe1.c</strong> entsprechend. Ergänzen Sie auch die noch fehlenden Kommentare.</li>
</ul>



<pre class="wp-block-preformatted">/ Aufgabe 1
// von:
// vom:
//

#include "../h/pmc.h"
#include "../h/tc.h"
#include "../h/pio.h"
#include "../h/aic.h"

// Timer3 initialisieren
void Timer3_init( void )
{
StructTC* timerbase3 = TCB3_BASE; // Basisadressse TC Block 1
StructPIO* piobaseA = PIOA_BASE; // Basisadresse PIO B

timerbase3-&gt;TC_CCR = TC_CLKDIS; // Disable Clock
// Initialize the mode of the timer 3
timerbase3-&gt;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_MCK8; //TCCLKS : MCKI / 8

// Initialize the counter:
timerbase3-&gt;TC_RA = 31250; //Flanke hoch
timerbase3-&gt;TC_RC = 62500; //Flanke runter

// Start the timer :
timerbase3-&gt;TC_CCR = TC_CLKEN ; //Clock enable
timerbase3-&gt;TC_CCR = TC_SWTRG ; //Enable Software Trigger
piobaseA-&gt;PIO_PER = (1&lt;&lt;PIOTIOA3) ; // PIO A kontrolliert Timer3
piobaseA-&gt;PIO_OER = (1&lt;&lt;PIOTIOA3) ; // als Ausgang
piobaseA-&gt;PIO_CODR = (1&lt;&lt;PIOTIOA3) ; // einschalten
}

int main(void)
{

StructPMC* pmcbase = PMC_BASE; // Basisadresse des PMC
StructPIO* piobaseA = PIOA_BASE; // Basisadresse PIO A
StructPIO* piobaseB = PIOB_BASE; // Basisadresse PIO B

pmcbase-&gt;PMC_PCER = 0x6200; // Peripheral Clocks einschalten für PIOA,PIOB,TC3

// ab hier entsprechend der Aufgabestellung ergänzen
//**************************************************

Timer3_init(); // Timer3 initialisieren

while(1)
{

}

return 0;
}</pre>



<ul class="wp-block-list">
<li><strong>Notizen:</strong></li>
</ul>



<p class="wp-block-paragraph"><strong>Power Management</strong></p>



<ul class="wp-block-list">
<li>Man darf nicht vergessen sowohl <strong>PIO A</strong>, als auch <strong>PIO B</strong> und den <strong>Timer 3</strong> am Peripheral Clock Enable Register einzuschalten, wenn man Timer als auch Tasten verwenden möchte ( bezieht sich auf Aufgabe 2 ) Hierbei ergibt sich folgende binäre Aktivierung: <strong>11</strong>000<strong>1</strong>000000000 ( bzw.: 0x6200 ).</li>
</ul>



<p class="wp-block-paragraph"><strong>Berechnung der Zähler RA und RC:</strong></p>



<ul class="wp-block-list">
<li>Bei der Berechnung der Werte für die Register RA und RC sind mehrere Lösungen möglich.</li>



<li>RA steht hierbei für den Zeitpunkt einer steigenden Flanke und RC steht für den Zeitpunkt der fallenden Flanke und dem Neubeginn des Taktzyklus.</li>



<li>Um die Frequenz so präzise wie möglich zu berechnen wird mittels <strong>TC_CLKS_MCKX </strong>die Taktrate skaliert ( <strong>CPU</strong> / <strong>X</strong> ) , damit der Wert des Registers RC nicht bereits vor dem Ende der eigentlichen Taktzeit erreicht wird. ( <strong>X</strong> steht für 2/8/32/128/1024 → <strong>TC_CLKS_MCK8</strong> ). </li>



<li>Würde man die Skalierung mit 2 wählen, so wäre ein Überlauf bereits nach <strong>0,002</strong>62144 Sekunden erreicht, wir haben mit 50Hz aber eine Laufzeit von <strong>0,02</strong>097152 Sekunden.</li>



<li>Je kleiner der Nenner, desto exakter ist der berechnete Wert. Um Rundungsfehler zu vermeiden, sollte die Skalierung so gewählt werden, dass nur ganzzahlige Integer-Werte ( und keine Double-Werte ) verwendet werden.</li>
</ul>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td class="has-text-align-center" data-align="center">MCK</td><td class="has-text-align-center" data-align="center">Takt(Hz)</td><td class="has-text-align-center" data-align="center">MCK/X</td><td class="has-text-align-center" data-align="center">Periodendauer</td><td class="has-text-align-center" data-align="center">Counter Duration (sec)</td><td class="has-text-align-center" data-align="center">Überlauf/sec</td><td class="has-text-align-center" data-align="center">Frequenz</td><td class="has-text-align-center" data-align="center">Register-Wert</td></tr><tr><td class="has-text-align-right" data-align="right">1</td><td class="has-text-align-right" data-align="right">25.000.000</td><td class="has-text-align-right" data-align="right">25000000</td><td class="has-text-align-right" data-align="right">0,00000004</td><td class="has-text-align-right" data-align="right">0,00262144</td><td class="has-text-align-right" data-align="right">381,4697266</td><td class="has-text-align-right" data-align="right">50</td><td class="has-text-align-right" data-align="right">500000</td></tr><tr><td>2</td><td>25.000.000</td><td>12500000</td><td>0,00000008</td><td>0,00524288</td><td>190,7348633</td><td>50</td><td>250000</td></tr><tr><td>8</td><td>25.000.000</td><td>3125000</td><td>0,00000032</td><td>0,02097152</td><td>47,68371582</td><td>50</td><td>62500</td></tr><tr><td>32</td><td>25.000.000</td><td>781250</td><td>0,00000128</td><td>0,08388608</td><td>11,92092896</td><td>50</td><td>15625</td></tr><tr><td>128</td><td>25.000.000</td><td>195312,5</td><td>0,00000512</td><td>0,33554432</td><td>2,980232239</td><td>50</td><td>3906,25</td></tr><tr><td class="has-text-align-right" data-align="right">1024</td><td class="has-text-align-right" data-align="right">25.000.000</td><td class="has-text-align-right" data-align="right">24414,0625</td><td class="has-text-align-right" data-align="right">0,00004096</td><td class="has-text-align-right" data-align="right">2,68435456</td><td class="has-text-align-right" data-align="right">0,37252903</td><td class="has-text-align-right" data-align="right">50</td><td class="has-text-align-right" data-align="right">488,28125</td></tr></tbody></table></figure>



<h2 class="wp-block-heading">Aufgabe 2</h2>



<ul class="wp-block-list">
<li>Entwickeln Sie eine Funktion, mit der Sie die Tasten SW1 – SW3 der auf dem Board befindlichen Tasten abfragen können.</li>



<li>Mit der Taste SW2 soll die Pumpe eingeschaltet und mit der Taste SW1 soll die Pumpe abgeschaltet werden können.</li>
</ul>



<pre class="wp-block-code"><code>// Lösung zu Termin3
// Aufgabe 1
// von:
// vom:
//

#include "../h/pmc.h"
#include "../h/tc.h"
#include "../h/pio.h"
#include "../h/aic.h"

void taste_irq_handler (void) __attribute__ ((interrupt));

// 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 AIC

// ab hier entsprechend der Aufgabestellung ergänzen
// *************************************************
StructPIO* piobaseA = PIOA_BASE;

// Einschalten
if(!(piobaseB-&gt;PIO_PDSR &amp; 0x10)) { // Taste 2 zum einschalten
piobaseA-&gt;PIO_PDR = (1PIO_PER = (1PIO_ISR; // Interrupt beenden
}

// Timer3 initialisieren
void Timer3_init( void )
{
StructTC* timerbase3 = TCB3_BASE; // Basisadressse TC Block 1
StructPIO* piobaseA = PIOA_BASE; // Basisadresse PIO B

timerbase3-&gt;TC_CCR = TC_CLKDIS; // Disable Clock
// Initialize the mode of the timer 3
timerbase3-&gt;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_MCK8; //TCCLKS : MCKI / 8

// Initialize the counter:
timerbase3-&gt;TC_RA = 31250; //Flanke hoch
timerbase3-&gt;TC_RC = 62500; //Flanke runter

// Start the timer :
timerbase3-&gt;TC_CCR = TC_CLKEN ; //Clock enable
timerbase3-&gt;TC_CCR = TC_SWTRG ; //Enable Software Trigger
piobaseA-&gt;PIO_PER = (1AIC_ICCR= 1 &lt;&lt; 14; // InterruptPIOB löschen aicbase-&gt;AIC_SVR&#91;PIOB_ID] = (unsigned int)taste_irq_handler;
aicbase-&gt;AIC_SMR&#91;PIOB_ID] = 0x7; // Priorität
aicbase-&gt;AIC_IECR= 1 &lt;&lt; 14; // InterruptPIOB einschalten piobaseB-&gt;PIO_IER= KEY1|KEY2; // Interrupt innerhalb PIOB erlauben ////

pmcbase-&gt;PMC_PCER = 0x6200; // Peripheral Clocks einschalten für PIOA,PIOB,TC3

// ab hier entsprechend der Aufgabestellung ergänzen
//**************************************************

Timer3_init(); // Timer3 initialisieren

while(1)
{

}

return 0;
}</code></pre>



<ul class="wp-block-list">
<li><strong>Notizen:</strong></li>
</ul>



<p class="wp-block-paragraph"><strong>Termin 6:</strong></p>



<ul class="wp-block-list">
<li>Der Quellcode ist 1:1 portierbar auf das finale System im 6. Praktikumstermin. Der Wagensimulator ist eine identische Abbildung des physikalischen Systems, verwendet dabei die gleichen Adressen, Register und bietet die gleichen Funktionalitäten an.</li>
</ul>



<p class="wp-block-paragraph"><strong>Ausgabe des Signals:&nbsp;</strong></p>



<ul class="wp-block-list">
<li>Um das Signal von PIOA ( immer low ) an den WaSim zu übertragen, muss die Herrschaft des Ausgangs an PIOA übergeben werden. (Aus)</li>



<li>Damit das Signal des Timers an den WaSim übermittelt wird, muss die Herrschaft des Ausgangs PIOA entzogen werden. ( Ein )</li>



<li>Der Ausgang verhält sich hierbei gewissermaßen wie ein 2:1 Multiplexer.</li>
</ul>
<p>Der Beitrag <a href="https://maximiliankrieg.de/2012/05/mikroprozessorsysteme-praktikum-3/">Mikroprozessorsysteme (Praktikum 3)</a> erschien zuerst auf <a href="https://maximiliankrieg.de">Maximilian Krieg</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://maximiliankrieg.de/2012/05/mikroprozessorsysteme-praktikum-3/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Mikroprozessorsysteme (Praktikum 2)</title>
		<link>https://maximiliankrieg.de/2012/04/mikroprozessorsysteme-praktikum-2/</link>
					<comments>https://maximiliankrieg.de/2012/04/mikroprozessorsysteme-praktikum-2/#respond</comments>
		
		<dc:creator><![CDATA[Maximilian]]></dc:creator>
		<pubDate>Sat, 21 Apr 2012 05:12:00 +0000</pubDate>
				<category><![CDATA[Mikroprozessorsysteme]]></category>
		<guid isPermaLink="false">https://maximiliankrieg.de/?p=1517</guid>

					<description><![CDATA[<p>Hinweise für den Praktikumstermin 6: Aufgabe 1 In eingebetteten Systemen und für Kartentreiber muss man oft auf Register zugreifen, die auf festen&#160;Adressen liegen. Wir werden&#8230;</p>
<p>Der Beitrag <a href="https://maximiliankrieg.de/2012/04/mikroprozessorsysteme-praktikum-2/">Mikroprozessorsysteme (Praktikum 2)</a> erschien zuerst auf <a href="https://maximiliankrieg.de">Maximilian Krieg</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">Hinweise für den Praktikumstermin 6:</h2>



<ul class="wp-block-list">
<li>Es sollte immer auf eine Implementierung geachtet werden, die auf jeder Optimierungsstufe weiterhin ausführbar ist. Dabei ist auf die Verwendung von <em>&#8222;volatil&#8220;</em> zu achten.</li>



<li>Wenn es möglich ist, sollten bereits programmierte Aufgabenteile in die Gesamtlösung von Termin 6 integriert werden, aber nicht alles was im Voraus programmiert wurde, muss schlussendlich auch einen Platz in der Lösung von Termin 6 finden.</li>



<li><em>&#8222;Je weniger Code, desto besser.&#8220;</em>, d.h., dass eine Interrupt Service Routine oder das Beachten von Stromsparmodi für die Lösungen nicht zur notwendigen Implementierung gehören, sondern optional sind. Je mehr Code ein Programm besitzt, desto anfälliger für Fehler kann es werden.</li>
</ul>



<h2 class="wp-block-heading">Aufgabe 1</h2>



<p class="wp-block-paragraph">In eingebetteten Systemen und für Kartentreiber muss man oft auf Register zugreifen, die auf festen&nbsp;Adressen liegen. Wir werden uns zuerst mit den Registern der PIO des hier eingesetzten Mikrocontroller&nbsp;(AT91M63200) beschäftigen.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td><strong>Name&nbsp;&nbsp;</strong></td><td><strong>Adresse</strong></td><td><strong>Bedeutung</strong></td></tr><tr><td>PIOB_PER</td><td>0xFFFF0000</td><td>PIOB Port Enable Register</td></tr><tr><td>PIOB_OER</td><td>0xFFFF0010</td><td>PIOB Output Enable Register</td></tr><tr><td>PIOB_SODR</td><td>0xFFFF0030</td><td>PIOB Set Output Data Register</td></tr><tr><td>PIOB_CODR</td><td>0xFFFF0034</td><td>PIOB Clear Output Data Register</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Legen Sie zunächst Zeigervariablen (PIOB_PER, PIOB_OER, ..) an und initialisieren Sie diese im Code&nbsp;auf die Adresse des Registers. Danach können Sie über diese Zeiger auf die Register zugreifen.&nbsp;Schreiben Sie zunächst den Wert 0x100 ins PIOB_PER und dann ins PIOB_OER. Danach schreiben Sie&nbsp;nacheinander den Wert 0x100 einige Male alternierend ins PIOB_SODR und PIOB_CODR. Dadurch sollte&nbsp;die LED DS1 auf dem Board AT91EB63 an und aus gehen. Testen Sie dieses mit Einzelschritten aus.</p>



<pre class="wp-block-preformatted">#define PIOB_PER ((volatile unsigned int*) 0xFFFF0000) // Port Enable Register
#define PIOB_OER ((volatile unsigned int*) 0xFFFF0010) // Output Enable Register
#define PIOB_SODR ((volatile unsigned int*) 0xFFFF0030) // Set Output Data Register (disable)
#define PIOB_CODR ((volatile unsigned int*) 0xFFFF0034) // Clear Output Data Register (enable)

int main(void)
{
*PIOB_PER = 0xE300; // LED's 1,2,6,7,8 an PIOB aktivieren
*PIOB_OER = 0xE300; // LED's 1, 2, 6, 7, 8 als Output definieren

*PIOB_SODR = 0xE300; // Set Output Data Register ausschalten

// Schleife zum Ein- und Ausschalten der LED 1
while(1)
{
*PIOB_SODR = 0x0100; // LED 1 ausschalten
*PIOB_CODR = 0x0100; // LED 1 einschalten
}

return 0;
}</pre>



<p class="wp-block-paragraph"><strong>Notizen:</strong>&nbsp;Während dem Start des Programmes haben die LEDs 2, 6, 7 und 8 gebrannt. Die Anpassungen zu Beginn des Codes dienen dazu, damit diese ausgeschaltet werden.</p>



<h2 class="wp-block-heading">Aufgabe 2</h2>



<p class="wp-block-paragraph">Gut, wir können jetzt eine LED (DS1) kontrollieren. Schauen Sie sich die Dateien im Verzeichnis&nbsp;~/mpsSS2012/h an. Sie können diese Header-Dateien in Ihren nächsten Programmen benutzen.&nbsp;Ändern und erweitern Sie Ihr Programm so, dass die LED DS1 durch drücken der Taste SW1 eingeschaltet&nbsp;und&nbsp;durch&nbsp;drücken&nbsp;der&nbsp;Taste&nbsp;SW2&nbsp;ausgeschaltet&nbsp;wird.&nbsp;Sollte&nbsp;die&nbsp;Taste&nbsp;nicht&nbsp;funktionieren,&nbsp;so überprüfen&nbsp;Sie ob im Power Management Controller (PMC) der Clock für PIOB eingeschaltet ist. In&nbsp;welchem Register muss welches Bit gesetzt sein?</p>



<pre class="wp-block-preformatted">#include &amp;quot;../h/pmc.h&amp;quot;
#include &amp;quot;../h/pio.h&amp;quot;

int main(void)
{
StructPMC* pmcbase = PMC_BASE; // Basisadresse des PMC
StructPIO* piobaseB = PIOB_BASE; // Basisadresse PIO B
pmcbase-&gt;PMC_PCER = 0x4000; // Peripherial Clock einschalten für PIOB

piobaseB-&gt;PIO_PER = 0x0100; // PIO kontrolliert LED1 (0x100)
piobaseB-&gt;PIO_OER = 0x0100; // als Ausgang

piobaseB-&gt;PIO_PER = KEY1; // PIO kontrolliert SW1 bzw. Key 1
piobaseB-&gt;PIO_ODR = KEY1; // als Eingang ((!!!))

piobaseB-&gt;PIO_PER = KEY2; // PIO kontrolliert SW2 bzw. Key 2
piobaseB-&gt;PIO_ODR = KEY2; // als Eingang ((!!!))

// Schleife zum Ein- und Ausschalten der LED 1
while(1)
{
// Einschalten wenn Taste 1 gedrückt wird
if(!(piobaseB-&gt;PIO_PDSR &amp;amp; KEY1))
piobaseB-&gt;PIO_CODR = 0x0100;

// Ausschalten wenn Taste 2 gedrückt wird
if(!(piobaseB-&gt;PIO_PDSR &amp;amp; KEY2))
piobaseB-&gt;PIO_SODR = 0x0100;
}

return 0;
}
</pre>



<p class="wp-block-paragraph"><strong>Notizen:&nbsp;</strong>Das Drücken der Taste SW1 erzeugt eine 0. Wenn die Taste SW1 nicht gedrückt wird, erzeugt sie als Signal eine 1. Deshalb müssen die IF-Abfragen innerhalb der Schleife mit negierten Bedinungen geprüft werden. Das &amp; steht für die binäre Verknüpfung zwischen Status Register und Taste.</p>



<h2 class="wp-block-heading">Aufgabe 3</h2>



<p class="wp-block-paragraph">Lassen Sie im nächsten Programm zusätzlich die LED DS2 mit ca. 0,5Hz (Zeitschleife programmieren)&nbsp;blinken.&nbsp;Wie reagieren&nbsp;Ihre&nbsp;Tastendrücke&nbsp;an&nbsp;SW1&nbsp;und&nbsp;SW2?</p>



<pre class="wp-block-preformatted">#include &amp;quot;../h/pmc.h&amp;quot;
#include &amp;quot;../h/pio.h&amp;quot;

#define DELAY 500000 // Anzahl der Durchläufe für die Schleife

int main(void)
{

StructPMC* pmcbase = PMC_BASE; // Basisadresse des PMC
StructPIO* piobaseB = PIOB_BASE; // Basisadresse PIO B

pmcbase-&gt;PMC_PCER = 0x4000; // Peripherial Clock einschalten für PIOB (0x4200)

piobaseB-&gt;PIO_PER = 0x0100; // PIO kontrolliert LED1
piobaseB-&gt;PIO_OER = 0x0100; // als Ausgang

piobaseB-&gt;PIO_PER = 0x0200; // PIO kontrolliert LED2
piobaseB-&gt;PIO_OER = 0x0200; // als Ausgang

piobaseB-&gt;PIO_PER = 0x08; // PIO kontrolliert SW1 bzw. Key1
piobaseB-&gt;PIO_ODR = 0x08; // als Eingang

piobaseB-&gt;PIO_PER = 0x10; // PIO kontrolliert SW2 bzw. Key2
piobaseB-&gt;PIO_ODR = 0x10; // als Eingang

volatile int an = 1; // Variable zum Ein- und Ausschalten

// Schleife zum Ein- und Ausschalten der LED 1
while(1)
{
volatile int i=0; // Variable der Pausen-Schleife

// Einschalten
if(!(piobaseB-&gt;PIO_PDSR &amp;amp; 0x08))
piobaseB-&gt;PIO_CODR = 0x0100;

// Ausschalten
if(!(piobaseB-&gt;PIO_PDSR &amp;amp; 0x10))
piobaseB-&gt;PIO_SODR = 0x0100;

if(an==1){
piobaseB-&gt;PIO_CODR = 0x0200;
an=0;
}
else {
piobaseB-&gt;PIO_SODR = 0x0200;
an=1;
}
for(i = 0; i&lt;DELAY;i++) {}

}

return 0;
}

</pre>



<p class="wp-block-paragraph"><strong>Notizen:</strong>&nbsp;Um den Code zu optimieren, wurde anstelle zwei FOR-Schleifen einzusetzen, die Variante mit einer integer-Variablen &#8222;an&#8220; gewählt, deren Wert bei jedem Durchlauf der WHILE-Schleife alterniert zwischen 1 (an=true) und 0 (an=false). Das Signal der Tasten wird während der Pausen-Schleife nicht angenommen, auch nachträglich wird das Signal nicht übertragen in die Register. Um die Taste zu setzen ist ein häufiges Drücken oder das permanente Drücken notwendig. Die Dauer der Schleife ist durch eine Programmierung in C stark von der Optimierungsstufe abhängig und sollte deshalb in Assembler geschrieben werden. Als weiteres Kriterium ist die Prozessor- und RAM-Taktrate und das Pipelining ausschlaggebend bei der Wahl der Durchläufe der Schleifen. Der Mikrocontroller im Labor arbeitet mit einer CPU-Taktrate von 25MHz, der interne RAM besitzt allerdings einen eigenen Takt, der noch durch Wait-States beeinflusst wird.&nbsp;Formel zur Berechnung der Durchläufe der Pausen-Schleife:</p>



<p class="wp-block-paragraph">Prozessor-Geschwindigkeit = 25 MHz = 25.000.000 Hz&nbsp;Taktzeit =&nbsp;1 /&nbsp;25.000.000 Hz&nbsp;&nbsp;Takte pro Durchlauf = 4&nbsp;Frequenz = 0,5 Hz = 2s&nbsp;Durchläufe&nbsp;=&nbsp;Frequenz&nbsp;/ (&nbsp;Taktzeit&nbsp;*&nbsp;Takte pro Durchlauf&nbsp;) =&nbsp;12500000&nbsp;?</p>



<h2 class="wp-block-heading">Aufgabe 4</h2>



<p class="wp-block-paragraph">Schreiben Sie für die Tasten SW1 und SW2 eine passende Interruptserviceroutine. Erklären Sie die&nbsp;Wechsel der ARM-Betriebsmodi. Wie reagieren nun Ihre Tastendrücke an SW1 und SW2? Welchen&nbsp;Einfluss hat das Bedienen der Tasten auf die Blinkfrequenz von DS2?</p>



<pre class="wp-block-preformatted">#include &amp;quot;../h/pmc.h&amp;quot;
#include &amp;quot;../h/pio.h&amp;quot;
#include &amp;quot;../h/aic.h&amp;quot;

// Anzahl der Durchläufe für die Schleife
#define DELAY 500000

// Compiler mitteilen, dass es sich um eine Interrupt Service Routine handelt
void irq_handler(void) __attribute__ ((interrupt));

// Interrupt-Service-Routine
void irq_handler( void)
{
StructPIO* piobaseB= PIOB_BASE; // Basisadr. PIO B
StructAIC* aicbase= AIC_BASE; // Basisadresse AIC

// Einschalten
if(!(piobaseB-&gt;PIO_PDSR &amp;amp; 0x08))
piobaseB-&gt;PIO_CODR = 0x0100;

// Ausschalten
if(!(piobaseB-&gt;PIO_PDSR &amp;amp; 0x10))
piobaseB-&gt;PIO_SODR = 0x0100;

// Interrupt-Status-Register lesen und in das
// End of InterruptCommandRegister (EOICR) schreiben
aicbase-&gt;AIC_EOICR= piobaseB-&gt;PIO_ISR;
}

int main(void)
{
StructAIC* aicbase = AIC_BASE; // Basisadresse AIC
StructPIO* piobaseB= PIOB_BASE; // Basisadr. PIO B

aicbase-&gt;AIC_IDCR = 1 &lt;&lt; 14; // InterruptPIOB ausschalten
aicbase-&gt;AIC_ICCR= 1 &lt;&lt; 14; // InterruptPIOB löschen

aicbase-&gt;AIC_SVR[PIOB_ID] = (unsigned int)irq_handler;
aicbase-&gt;AIC_SMR[PIOB_ID] = 0x7; // Priorität definieren

aicbase-&gt;AIC_IECR= 1 &lt;&lt; 14; // InterruptPIOB einschalten
piobaseB-&gt;PIO_IER= KEY1|KEY2; // Interrupt innerhalb PIOB erlauben

piobaseB-&gt;PIO_PER = 0x0100; // PIO kontrolliert LED1
piobaseB-&gt;PIO_OER = 0x0100; // als Ausgang

piobaseB-&gt;PIO_PER = 0x0200; // PIO kontrolliert LED2
piobaseB-&gt;PIO_OER = 0x0200; // als Ausgang

piobaseB-&gt;PIO_PER = 0x08; // PIO kontrolliert SW1 // Key1
piobaseB-&gt;PIO_ODR = 0x08; // als Eingang

piobaseB-&gt;PIO_PER = 0x10; // PIO kontrolliert SW2 // Key2
piobaseB-&gt;PIO_ODR = 0x10; // als Eingang

int an = 1; // Variable zum Ein- und Ausschalten

while(1)
{
volatile int i=0;

if(an==1){
piobaseB-&gt;PIO_CODR = 0x0200;
an=0;
}
else {
piobaseB-&gt;PIO_SODR = 0x0200;
an=1;
}
for(i = 0; i&lt;DELAY;i++) {}

}

aicbase-&gt;AIC_IDCR= 1 &lt;&lt; 14; // InterruptPIOB ausschalten
aicbase-&gt;AIC_ICCR= 1 &lt;&lt; 14; // InterruptPIOB löschen

return(0);
}

</pre>



<p class="wp-block-paragraph"><strong>Notizen:&nbsp;</strong>Im Gegensatz zu der Implementierung ohne ISR nehmen die Tasten nun jederzeit und ohne direkte Verzögerung die Tastendrücke an. Die Blinkfrequenz von LED2 wird durch das Drücken der Tasten nicht gestört.&nbsp;Für die menschliche Wahrnehmung sind Tastendrücke ab einer Reaktionszeit von weniger als 20ms in&nbsp;<em>&#8222;Echtzeit&#8220;</em>. Unterschiedliche Optimierungsstufen können unterschiedliche Blinkzeiten bei den LEDs erzeugen. Deswegen ist darauf zu achten, dass der Code so gut wie möglich auf alle Optimierungsstufen angepasst zu sein. Dafür soll künftig der&nbsp;Timer in ARM programmiert werden.</p>



<h2 class="wp-block-heading">&nbsp;</h2>
<p>Der Beitrag <a href="https://maximiliankrieg.de/2012/04/mikroprozessorsysteme-praktikum-2/">Mikroprozessorsysteme (Praktikum 2)</a> erschien zuerst auf <a href="https://maximiliankrieg.de">Maximilian Krieg</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://maximiliankrieg.de/2012/04/mikroprozessorsysteme-praktikum-2/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Mikroprozessorsysteme (Praktikum 1)</title>
		<link>https://maximiliankrieg.de/2012/03/mikroprozessorsysteme-praktikum-1/</link>
					<comments>https://maximiliankrieg.de/2012/03/mikroprozessorsysteme-praktikum-1/#respond</comments>
		
		<dc:creator><![CDATA[Maximilian]]></dc:creator>
		<pubDate>Fri, 30 Mar 2012 05:12:00 +0000</pubDate>
				<category><![CDATA[Mikroprozessorsysteme]]></category>
		<guid isPermaLink="false">https://maximiliankrieg.de/?p=1519</guid>

					<description><![CDATA[<p>Organisatorisches Hardware Snavigator starten Debugger Makefile Optimierungsstufen Verbinden mit dem Mikrocontroller Ziele An ganz einfachen Programmen soll ermittelt werden, welchen Code ein Compiler erzeugt, wo&#8230;</p>
<p>Der Beitrag <a href="https://maximiliankrieg.de/2012/03/mikroprozessorsysteme-praktikum-1/">Mikroprozessorsysteme (Praktikum 1)</a> erschien zuerst auf <a href="https://maximiliankrieg.de">Maximilian Krieg</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">Organisatorisches</h2>



<ul class="wp-block-list">
<li><strong>Praktika:</strong>
<ul class="wp-block-list">
<li>6 Termine</li>



<li>Keine Testate für die einzelnen Termine mehr</li>



<li>Eigenverantwortung der Funktionsfähigkeit der Programme</li>



<li>Vorbereitung und Anwesenheit sind Pflicht für jeden Termin</li>



<li>Dokumentation in Form eines Pflichtenhefts müssen geführt werden</li>



<li>Die Dokumentation und das fertige Programm werden abgenommen.</li>



<li>Während der Abnahme hat man 10 Minuten Zeit den Prüfer zu überzeugen</li>
</ul>
</li>



<li><strong>Änderungen:</strong>
<ul class="wp-block-list">
<li>8. Juni auf den 11. Juni verschieben ( 3. Block )</li>
</ul>
</li>
</ul>



<h2 class="wp-block-heading">Hardware</h2>



<ul class="wp-block-list">
<li><strong>Etablieren von Kommunikation zwischen:</strong>
<ul class="wp-block-list">
<li>Schnittstellen</li>



<li>Tasten</li>



<li>etc.</li>
</ul>
</li>



<li>Beherrscht kein <strong>C++</strong>, aber <strong>C </strong>( bessere Performance )</li>
</ul>



<h2 class="wp-block-heading">Snavigator starten</h2>



<ol class="wp-block-list">
<li>In den Zielpfad wechseln</li>



<li><strong>F4</strong> drücken und ins integrierte Terminal wechseln</li>



<li><em>&#8222;snavigator&#8220;</em> eingeben und mit <strong>Enter</strong> bestätigen</li>



<li>New Project auswählen</li>
</ol>



<h2 class="wp-block-heading">Debugger</h2>



<ul class="wp-block-list">
<li>Wechseln von <strong>arm-elf</strong> auf <strong>arm-eb63-elf </strong></li>



<li>Im <strong>snavigator</strong> als Debugger <strong>&#8222;arm-eb63-elf-insight&#8220;</strong> eintragen</li>
</ul>



<h2 class="wp-block-heading">Makefile</h2>



<ul class="wp-block-list">
<li>Wurde nun mittels Variablen aufgebaut und erlaubt mehr Dynamik beim Wechseln der Compiler</li>
</ul>



<h2 class="wp-block-heading">Optimierungsstufen</h2>



<ul class="wp-block-list">
<li>Im Praktikum sollte so viel wie möglich damit gespielt werden, um die Veränderungen zu beobachten.</li>



<li>Mittels volatile kann man das <em>&#8222;Wegoptimieren&#8220;</em> von Variablen verhindern</li>
</ul>



<h2 class="wp-block-heading">Verbinden mit dem Mikrocontroller</h2>



<ul class="wp-block-list">
<li>Programmier-Schnittstelle befindet sich auf dem Adapter</li>



<li>File → Target Settings → Remote/TCP → 141.100.52.14:2001</li>



<li>Run → Connect to Target</li>
</ul>



<h2 class="wp-block-heading">Ziele</h2>



<p class="wp-block-paragraph">An ganz einfachen Programmen soll ermittelt werden, welchen Code ein Compiler erzeugt, wo welche Variablen abgefragt werden und wie ein&nbsp;<em>call by value/ reference</em>&nbsp;in ARM Assembler umgesetzt wird.</p>



<h2 class="wp-block-heading">Aufgabe 1</h2>



<p class="wp-block-paragraph">In einer Tabelle sind die elementaren Datentypen auszufüllen.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td><strong>Datentyp</strong></td><td><strong>Bit</strong></td><td><strong>kleinster Wert</strong></td><td><strong>größter Wert</strong></td><td><strong>Bemerkungen</strong></td></tr><tr><td>Char</td><td>8</td><td>0x80 / -128</td><td>0x7F / 127</td><td>&nbsp;</td></tr><tr><td>short int</td><td>16</td><td>0x8000 / -32768</td><td>0x7FFF / 32767</td><td>&nbsp;</td></tr><tr><td>Int</td><td>(16)32(64)</td><td>0x80000000 /-2.147.483.648</td><td>0x7FFFFFFF /2.147.483.647</td><td>Abhängig von Compiler und System</td></tr><tr><td>unsigned int</td><td>16</td><td>0</td><td>0xFFFFFFFF /2.147.483.648</td><td>&nbsp;</td></tr><tr><td>long int</td><td>32(64)</td><td>0x80000000 /-2.147.483.648</td><td>0x7FFFFFFF /2.147.483.647</td><td>Abhängig von Compiler und System</td></tr><tr><td>Float</td><td>32</td><td>ca. 3,4E-38</td><td>ca. 3,4E38</td><td>&nbsp;</td></tr><tr><td>double</td><td>64</td><td>ca. 1,7E-308</td><td>ca. 1,7E308</td><td>&nbsp;</td></tr><tr><td>long double</td><td>80</td><td>ca. 1,2E-4932</td><td>ca. 1,2E4932</td></tr></tbody></table></figure>



<h2 class="wp-block-heading">Aufgabe 2</h2>



<p class="wp-block-paragraph">Anzugeben sind die folgenden Zahlen sowohl als&nbsp;<em>int</em>&nbsp;als auch als&nbsp;<em>float</em>.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td>&gt;<strong>Dezimal</strong></td><td>&gt;<strong>int</strong></td><td>&gt;<strong>float</strong></td></tr><tr><td>&gt;1</td><td>&gt;0x00000001</td><td>&gt;0x3F800000</td></tr><tr><td>&gt;-1</td><td>&gt;0xFFFFFFFF</td><td>&gt;0xBF800000</td></tr><tr><td>&gt;65535</td><td>&gt;0x0000FFFF</td><td>&gt;0x477FFF00</td></tr><tr><td>&gt;1,024*10³</td><td>&gt;0x00000400</td><td>&gt;0x44FFFFFF</td></tr><tr><td>&gt;2.963.527.434.23</td><td>&gt;0x44FFFFFFFF</td><td>&gt;0x4E8A0000</td></tr></tbody></table></figure>



<h2 class="wp-block-heading">Aufgabe 3</h2>



<p class="wp-block-paragraph">In einem C Programm werden zwei lokale Variablen angelegt, denen die Werte 0x1 und 0x2 zugewiesen werden. Das Programm soll übersetzt und der erzeugte Code dokumentiert werden.</p>



<pre class="wp-block-preformatted">49 int iLoc1 = 0x1; <br>0x8304 &lt;main+248&gt;: mov r3, #1 ; 0x1 // Variable 1 den Wert 0x1 zuweisen<br>0x8308 &lt;main+252&gt;: str r3, [r11, #-24] // und auf den Stack schieben <br>50 int iLoc2 = 0x2; <br>0x830c &lt;main+256&gt;: mov r3, #2 ; 0x2 // Variable 2 den Wert 0x2 zuweisen <br>0x8310 &lt;main+260&gt;: str r3, [r11, #-20] // und auf den Stack schieben 51 </pre>



<h2 class="wp-block-heading">Aufgabe 4</h2>



<p class="wp-block-paragraph">Anstelle von lokalen Variablen sollen nun globale Variablen benutzt werden und die Veränderung dokumentiert werden.</p>



<pre class="wp-block-preformatted">54 iGlob1 = 0x1; <br>0x8314 &lt;main+264&gt;: ldr r2, [pc, #72] ; 0x8364 &lt;main+344&gt; <br>0x8318 &lt;main+268&gt;: mov r3, #1 ; 0x1 <br>0x831c &lt;main+272&gt;: str r3, [r2] <br>55 iGlob2 = 0x2; <br>0x8320 &lt;main+276&gt;: ldr r2, [pc, #64] ; 0x8368 &lt;main+348&gt; <br>0x8324 &lt;main+280&gt;: mov r3, #2 ; 0x2 <br>0x8328 &lt;main+284&gt;: str r3, [r2] <br>56 </pre>



<p class="wp-block-paragraph"><strong>Notiz:&nbsp;</strong>Wie man sieht werden die global definierten Variablen zunächst aus der&nbsp;<em>data section</em>&nbsp;geholt, modifiziert und schließlich wieder zurück geschrieben. Die Adressen der globalen Variablen findet man über den Befehl&nbsp;<em>arm-eb63-elf-mn</em>&nbsp;heraus.</p>



<h2 class="wp-block-heading">Aufgabe 5</h2>



<p class="wp-block-paragraph">Nun sollen zwei globale und zwei lokale Variablen angelegt und die Zuweisung „global=lokal“ gemacht werden.</p>



<pre class="wp-block-preformatted">58 iGlob1 = iLoc1; <br>0x832c &lt;main+288&gt;: ldr r2, [pc, #72] ; 0x837c &lt;main+368&gt; <br>0x8330 &lt;main+292&gt;: ldr r3, [r11, #-24] <br>0x8334 &lt;main+296&gt;: str r3, [r2] <br>59 iGlob2 = iLoc2; <br>0x8338 &lt;main+300&gt;: ldr r2, [pc, #64] ; <br>0x8380 &lt;main+372&gt; <br>0x833c &lt;main+304&gt;: ldr r3, [r11, #-20] <br>0x8340 &lt;main+308&gt;: str r3, [r2] </pre>



<p class="wp-block-paragraph"><strong>Notiz:&nbsp;</strong>Die globale Variable wird aus der&nbsp;<em>data section</em>&nbsp;geladen, die lokale Variable aus dem Stack. Anschließend erfolgt die Zuweisung. Durch eine höhere Optimierungsstufe wird die globale Variable direkt mit dem Wert der lokalen Variable initialisiert.</p>



<h2 class="wp-block-heading">Aufgabe 6</h2>



<p class="wp-block-paragraph">Es wird eine Funktion&nbsp;<em>addition&nbsp;</em>erstellt, die als Parameter zwei lokale und einer globale Variable übergeben kriegt.</p>



<pre class="wp-block-preformatted">63 addition(iLoc1,iLoc2,iGlob1); <br>0x833c &lt;main+304&gt;: ldr r2, [r11, #-108] <br>0x8340 &lt;main+308&gt;: ldr r1, [r11, #-112] <br>0x8344 &lt;main+312&gt;: ldr r3, [pc, #92] ; <br>0x83a8 &lt;main+412&gt; <br>0x8348 &lt;main+316&gt;: ldr r3, [r3] <br>0x834c &lt;main+320&gt;: mov r0, r2 <br>0x8350 &lt;main+324&gt;: mov r2, r3 <br>0x8354 &lt;main+328&gt;: bl <br>0x83b0 &lt;addition&gt; </pre>



<p class="wp-block-paragraph"><strong>Notiz:</strong>&nbsp;Es finden keine wesentlichen Änderungen im Vergleich zu Aufgabe 5 statt. Die höchste Optimierungsstufe lässt die Funktion vollständig verschwinden.</p>
<p>Der Beitrag <a href="https://maximiliankrieg.de/2012/03/mikroprozessorsysteme-praktikum-1/">Mikroprozessorsysteme (Praktikum 1)</a> erschien zuerst auf <a href="https://maximiliankrieg.de">Maximilian Krieg</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://maximiliankrieg.de/2012/03/mikroprozessorsysteme-praktikum-1/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
