<?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>ET Tutorials &#187; Mikrocontroller</title>
	<atom:link href="http://et-tutorials.de/category/mikrocontroller/feed/" rel="self" type="application/rss+xml" />
	<link>http://et-tutorials.de</link>
	<description>Eletrotechnik verstehen durch Video Tutorials</description>
	<lastBuildDate>Sat, 04 Feb 2012 23:44:25 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Programmierung der Pulsweitenmodulation</title>
		<link>http://et-tutorials.de/4789/programmierung-der-pulsweitenmodulation/</link>
		<comments>http://et-tutorials.de/4789/programmierung-der-pulsweitenmodulation/#comments</comments>
		<pubDate>Fri, 07 Oct 2011 10:03:08 +0000</pubDate>
		<dc:creator>Wolfgang Bengfort</dc:creator>
				<category><![CDATA[Aktuelle Artikel]]></category>
		<category><![CDATA[Mikrocontroller]]></category>

		<guid isPermaLink="false">http://et-tutorials.de/?p=4789</guid>
		<description><![CDATA[Heute geht es um die Programmierung der Pulsweitenmodulation in C. Mit Hilfe des Programmablaufplans ist das nun ganz einfach. Nach der Definition der Variablen muss nur noch der Programmablaufplan Schritt für Schritt in den C-Code übersetzt werden. Wichtig, und eine beliebte Fehlerquelle, ist die richtige Wahl des Variablentyps. Die Variablen Slot und temp sollen jeweils [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fet-tutorials.de%2F4789%2Fprogrammierung-der-pulsweitenmodulation%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fet-tutorials.de%2F4789%2Fprogrammierung-der-pulsweitenmodulation%2F&amp;source=ETTutorials&amp;style=compact&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><div style='float:left; padding-left:10px; margin-left:0px; padding-right:10px; margin-right:0px; padding-top:10px; padding-bottom: 10px;'>
<script type="text/javascript"><!--
google_ad_client = "ca-pub-9604435451771969";
/* oben links im Artikel Image */
google_ad_slot = "7784759186";
google_ad_width = 300;
google_ad_height = 250;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</div> Heute geht es um die Programmierung der Pulsweitenmodulation in C.</p>
<p>Mit Hilfe des Programmablaufplans ist das nun ganz einfach. </p>
<p>Nach der Definition der Variablen muss nur noch der Programmablaufplan Schritt für Schritt in den C-Code übersetzt werden.</p>
<p>Wichtig, und eine beliebte Fehlerquelle, ist die richtige Wahl des Variablentyps.<br />
Die Variablen Slot und temp sollen jeweils Werte von 0 bis 255 abspeichern können.<br />
Wie benötigen also 8 bit, d.h. 1 Byte. Die Variablen müssen aber vorzeichenlos sein, damit bis 255 gezählt werden kann.</p>
<p>Also: unsigned char slot, temp;</p>
<p>Anschließend muss, wie gesagt, der Programmablauf in das C-Programm übersetzt werden.</p>
<p>Im heutigen Video zeige ich diesen Vorgang.</p>
<p><iframe width="560" height="315" src="http://www.youtube.com/embed/He81vgwDMSA" frameborder="0" allowfullscreen></iframe><br />
<script type="text/javascript"><!--
google_ad_client = "ca-pub-9604435451771969";
/* Linkleiste unten */
google_ad_slot = "1662344633";
google_ad_width = 600;
google_ad_height = 15;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<center>
<script type="text/javascript"><!--
google_ad_client = "ca-pub-9604435451771969";
/* 336x280 unter Video */
google_ad_slot = "9597420007";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</center></p>
<p>Weil der Mikrocontroller das Programm sehr schnell abarbeitet, sieht man in Realzeit nur ob das Programm qualitativ funktioniert. Bei temp = 0 bleibt die Heizung ausgeschaltet, bei temp = 255 ist die Heizung eingeschaltet und bei Werten dazwischen wechselt der Zustand des Portpins für die Heizung.</p>
<p>In der nächsten Folge nutzen wir den Debugger von µVision und lassen das Programm einmal langsam, Schritt für Schritt, ablaufen und beobachten dabei den Zustand der Variablen, Register und Portpins.</p>
]]></content:encoded>
			<wfw:commentRss>http://et-tutorials.de/4789/programmierung-der-pulsweitenmodulation/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Ein Programmablaufplan für die Pulsweitenmodulation</title>
		<link>http://et-tutorials.de/4768/ein-programmablaufplan-fur-die-pulsweitenmodulation/</link>
		<comments>http://et-tutorials.de/4768/ein-programmablaufplan-fur-die-pulsweitenmodulation/#comments</comments>
		<pubDate>Wed, 05 Oct 2011 15:19:29 +0000</pubDate>
		<dc:creator>Wolfgang Bengfort</dc:creator>
				<category><![CDATA[Aktuelle Artikel]]></category>
		<category><![CDATA[Mikrocontroller]]></category>

		<guid isPermaLink="false">http://et-tutorials.de/?p=4768</guid>
		<description><![CDATA[Im heutigen Artikel soll die Pulsweitenmodulation mit Hilfe eines Programmablaufplans realisiert werden. Und zwar in Zusammenhang mit der Programmierung des Timers. Der Timer soll jeweils nach 1 ms ablaufen. Da der Mikrocontroller mit 12 MHz getaktet, die Timer-Register also jede µs inkrementiert werden, müssen wir bis 1.000 zählen bis 1 ms vergangen ist. Da wir [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fet-tutorials.de%2F4768%2Fein-programmablaufplan-fur-die-pulsweitenmodulation%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fet-tutorials.de%2F4768%2Fein-programmablaufplan-fur-die-pulsweitenmodulation%2F&amp;source=ETTutorials&amp;style=compact&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><div style='float:left; padding-left:10px; margin-left:0px; padding-right:10px; margin-right:0px; padding-top:10px; padding-bottom: 10px;'>
<script type="text/javascript"><!--
google_ad_client = "ca-pub-9604435451771969";
/* oben links im Artikel Image */
google_ad_slot = "7784759186";
google_ad_width = 300;
google_ad_height = 250;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</div>Im heutigen Artikel soll die <a href="http://et-tutorials.de/4741/pwm-pulsweitenmodulation/" target="_blank">Pulsweitenmodulation</a> mit Hilfe eines Programmablaufplans realisiert werden.</p>
<p>Und zwar in Zusammenhang mit der Programmierung des Timers.</p>
<p>Der Timer soll jeweils nach 1 ms ablaufen. Da der Mikrocontroller mit 12 MHz getaktet, die Timer-Register also jede µs inkrementiert werden, müssen wir bis 1.000 zählen bis 1 ms vergangen ist.</p>
<p>Da wir dafür TH0 und TL0 benötigen, mit einem Byte kann man ja nur bis 255 zählen, wählen wir nicht den <a href="http://et-tutorials.de/4696/timer-interrupts-8-bit-auto-reload/" target="_blank">auto-reload Modus</a>, sondern wählen den Modus 1, bei dem wir beide Timerregister für das Zählen zur Verfügung haben.</p>
<p>Berechnung der Initialisierungswerte für die Register TH0 und TL0<br />
Da wir bei 65536 einen Überlauf haben, müssen wir bei dezimal 64536 starten. Hexadezimal ist das FC18. Das bedeutet TH0=0xFC und TL0=0&#215;18.</p>
<p>In dem Video zeige ich noch einmal die Berechnung und die Programmierung der Registerwerte.</p>
<h2>Planung des Programms mit Hilfe eines Programmablaufplans, PAP</h2>
<p>In der Interrupt Service Routine des Timers soll nun die Pulsweitenmodulation realisiert werden.</p>
<p>Da die Realisierung des Programms nicht ganz trivial ist, ist die Planung des Programms zu empfehlen.<br />
Für diese Planung gibt es verschiedene Möglichkeiten. Neben Struktogrammen hat sich in der Programmierung der sogenannte Programmablaufplan als zweckmäßig erwiesen.</p>
<p>In einem Programmablaufplan plant man das Programm zunächst einmal unabhängig von der Sprachsyntax das Programm und schreibt den Ablauf der Programms mit all seinen Verzweigungen  zunächst einmal z.B. auf einem Blatt Papier auf.</p>
<p>Hierdurch bekommt man eine gute Vorstellung vom Ablauf des Programms. Ein Programmablaufplan ist hierbei einfacher zu lesen und zu erstellen als das benötigte C-Programm.</p>
<p>In einem zweiten Schritt schreibt man dann mit Hilfe des Programmablaufplans sein C-Programm. Diese Umsetzung geht einem dann in den meisten Fällen sehr leicht von der Hand.</p>
<p>Wie man einen Programmablaufplan erstellen kann, zeige ich im folgenden Video.</p>
<p><iframe width="560" height="315" src="http://www.youtube.com/embed/6jMHfdX5gmQ" frameborder="0" allowfullscreen></iframe><br />
<script type="text/javascript"><!--
google_ad_client = "ca-pub-9604435451771969";
/* Linkleiste unten */
google_ad_slot = "1662344633";
google_ad_width = 600;
google_ad_height = 15;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<center>
<script type="text/javascript"><!--
google_ad_client = "ca-pub-9604435451771969";
/* 336x280 unter Video */
google_ad_slot = "9597420007";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</center></p>
<h2>Deine Aufgabe</h2>
<p>Wenn ich Du wäre <img src='http://et-tutorials.de/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  , würde ich mir jetzt, nachdem Du das Video gesehen hast, ein Blatt Papier nehmen und versuchen, den Programmablaufplan einmal selbständig zu erstellen – ohne noch einmal in das Video zu spicken.</p>
<p>Anschließend kannst µVision aufrufen und die Interrupt Service Routine erstellen.<br />
<img src="http://vg08.met.vgwort.de/na/0a3436565c0040b78bb607cc5dc9378c" width="1" height="1" alt=""> </p>
]]></content:encoded>
			<wfw:commentRss>http://et-tutorials.de/4768/ein-programmablaufplan-fur-die-pulsweitenmodulation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PWM &#8211; Pulsweitenmodulation</title>
		<link>http://et-tutorials.de/4741/pwm-pulsweitenmodulation/</link>
		<comments>http://et-tutorials.de/4741/pwm-pulsweitenmodulation/#comments</comments>
		<pubDate>Tue, 27 Sep 2011 15:56:06 +0000</pubDate>
		<dc:creator>Wolfgang Bengfort</dc:creator>
				<category><![CDATA[Aktuelle Artikel]]></category>
		<category><![CDATA[Mikrocontroller]]></category>

		<guid isPermaLink="false">http://et-tutorials.de/?p=4741</guid>
		<description><![CDATA[Heute geht es wieder um die Programmierung unseres Kaffeeautomaten. Und zwar nutzen wir den Mechanismus der Pulsweitenmodulation, abgekürzt PWM, um die Wassertemperatur in der Anlage über eine Heizung gewünscht einzustellen. Mit Hilfe der PWM können elektrische Verbraucher, die relativ langsam auf Änderungen reagieren, wie beispielsweise Heizwiderstände, aber auch beispielsweise elektrische Motoren, mit Hilfe von digitalen [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fet-tutorials.de%2F4741%2Fpwm-pulsweitenmodulation%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fet-tutorials.de%2F4741%2Fpwm-pulsweitenmodulation%2F&amp;source=ETTutorials&amp;style=compact&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><div style='float:left; padding-left:10px; margin-left:0px; padding-right:10px; margin-right:0px; padding-top:10px; padding-bottom: 10px;'>
<script type="text/javascript"><!--
google_ad_client = "ca-pub-9604435451771969";
/* oben links im Artikel Image */
google_ad_slot = "7784759186";
google_ad_width = 300;
google_ad_height = 250;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</div>Heute geht es wieder um die Programmierung unseres Kaffeeautomaten. </p>
<p>Und zwar nutzen wir den Mechanismus der <strong>Pulsweitenmodulation</strong>, abgekürzt <strong>PWM</strong>, um die Wassertemperatur in der Anlage über eine Heizung gewünscht einzustellen.  </p>
<p>Mit Hilfe der PWM können elektrische Verbraucher, die relativ langsam auf Änderungen reagieren, wie beispielsweise Heizwiderstände, aber auch beispielsweise elektrische Motoren, mit Hilfe von digitalen Signalen gesteuert werden.</p>
<p>Der „Trick“ dabei ist, dass man die Stromstärke durch den Verbraucher nicht analog auf  den gewünschten Wert einstellt. Mit Hilfe der PWM wird der Verbraucher sehr schnell ein- und wieder ausgeschaltet.</p>
<p>Über das Verhältnis zwischen Einschalt- und Ausschaltzeit kann so die zugeführte Leistung eingestellt werden.<br />
</p>
<h2>Ein Beispiel</h2>
<p>
Wenn die Leistung des Heizwiderstandes auf die „halbe Leistung“ eingestellt werden soll, schaltet man die Heizung abwechselnd zu jeweils gleichen Zeiten ein- und wieder aus.</p>
<p>Soll die Leistung auf 80% der Maximalleitung eingestellt werden, schaltet man die Heizung 4 Zeiteinheiten ein und dann 1 Zeiteinheit aus. So wird die Heizung zu 80% der Zeit mit voller Leistung betrieben, 20% der Zeit ist sie ausgeschaltet. Im Mittel setzt die Heizung so 80% der größtmöglichen Leistung um.</p>
<h2>Das Video zur PWM-Pulsweitenmodulation</h2>
<p><iframe width="560" height="315" src="http://www.youtube.com/embed/FmG8BzLehx8" frameborder="0" allowfullscreen></iframe><br />
<script type="text/javascript"><!--
google_ad_client = "ca-pub-9604435451771969";
/* Linkleiste unten */
google_ad_slot = "1662344633";
google_ad_width = 600;
google_ad_height = 15;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<center>
<script type="text/javascript"><!--
google_ad_client = "ca-pub-9604435451771969";
/* 336x280 unter Video */
google_ad_slot = "9597420007";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</center></p>
<h2>Deine Aufgabe zur nächsten Woche </h2>
<p>Für die Wasserzubereitung soll über eine PWM-gesteuerte Heizung das Wasser auf die gewünschte Temperatur gebracht werden.</p>
<p>Die gewünschte Leistung kann über den Port P0 eingestellt werden. <br />
P1=0&#215;00 bedeutet also: die Heizung ist ausgeschaltet.</p>
<p>P1=0xFF bedeutet: die Heizung ist eingeschaltet und setzt die maximal mögliche Leistung um</p>
<p>Da der Port P0 8 Bit hat, kann die Leistung der Heizung also in 255 Stufen eingestellt werden.<br />
</p>
<h2>Ein möglicher Ansatz zur Lösung die PWM</h2>
<p>Möglich wäre beispielsweise einen Timer zu programmieren, der jede 1ms einen Interrupt auslöst. <br />
Das gesamte Zeitintervall könnte man dann auf 255 ms setzen. Der Wert in P0 bestimmt dann, in wie vielen Zeitschlitzen von jeweils 1 ms der Portpin 1.0 auf 1 gesetzt werden müsste. In den übrigen Zeitschlitzen müsste der Portpin P1.0 dann  auf 0 gesetzt werden.</p>
<p>Viel Spaß bei der Umsetzung und bis zum nächsten Mal.<br />
Dieser Artikel ist Teil des Mikrocontrollerkurs auf ET-Tutorials.de.<br />
<a href="http://et-tutorials.de/mikrocontroller/"> Hier geht es zurück zur Übersichtsseite des Mikrocontroller-Kurses</a> .<br />
<img src="http://vg08.met.vgwort.de/na/c9cf5f2bce3849ee9d4d71104abeb421" width="1" height="1" alt=""> </p>
]]></content:encoded>
			<wfw:commentRss>http://et-tutorials.de/4741/pwm-pulsweitenmodulation/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Timer Interrupts 8 bit auto reload</title>
		<link>http://et-tutorials.de/4696/timer-interrupts-8-bit-auto-reload/</link>
		<comments>http://et-tutorials.de/4696/timer-interrupts-8-bit-auto-reload/#comments</comments>
		<pubDate>Mon, 19 Sep 2011 10:41:51 +0000</pubDate>
		<dc:creator>Wolfgang Bengfort</dc:creator>
				<category><![CDATA[Aktuelle Artikel]]></category>
		<category><![CDATA[Mikrocontroller]]></category>

		<guid isPermaLink="false">http://et-tutorials.de/?p=4696</guid>
		<description><![CDATA[In dieser Folge geht es um den Mode 2 des Timer Interrupts, dem 8 bit auto-reload Modus. Im Gegensatz zum Mode 1, der ja die Register TH0 und TL0 als 16-Bit Zähler verwendet, wird in dem auto-reload Mode nur das Register TL0 als Zähler verwendet. Im nun freigewordene Register TH0 wird der gewünschte Startpunkt des [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fet-tutorials.de%2F4696%2Ftimer-interrupts-8-bit-auto-reload%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fet-tutorials.de%2F4696%2Ftimer-interrupts-8-bit-auto-reload%2F&amp;source=ETTutorials&amp;style=compact&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><div style='float:left; padding-left:10px; margin-left:0px; padding-right:10px; margin-right:0px; padding-top:10px; padding-bottom: 10px;'>
<script type="text/javascript"><!--
google_ad_client = "ca-pub-9604435451771969";
/* oben links im Artikel Image */
google_ad_slot = "7784759186";
google_ad_width = 300;
google_ad_height = 250;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</div>In dieser Folge geht es um den Mode 2 des Timer Interrupts, dem 8 bit auto-reload Modus.</p>
<p>Im Gegensatz zum <a href="http://et-tutorials.de/4464/programmieren-des-timer-interrupts/" target="_blank">Mode 1, der ja die Register TH0 und TL0 als 16-Bit Zähler verwendet</a>, wird in dem auto-reload Mode nur das Register TL0 als Zähler verwendet.</p>
<p>Im nun freigewordene Register TH0 wird der gewünschte Startpunkt des Zählers festgelegt.<br />
So muss nur einmal das Register initialisiert werden. Nach jedem Überlauf des Registers TL0, startet also nicht nur die Interrupt Service Routine des Timers.<br />
Die Mikrocontroller-Hardware kopiert zudem automatisch den Wert des Registers TH0 in das Register TL0. Der Zähler wird also automatisch wieder initialisiert und kann sofort ohne Zeitverzögerung weiterlaufen.</p>
<p>Wie das ganze im System funktioniert, zeige ich im heutigen Video.</p>
<p><iframe width="560" height="315" src="http://www.youtube.com/embed/JoSMJFTZNPo" frameborder="0" allowfullscreen></iframe><br />
<script type="text/javascript"><!--
google_ad_client = "ca-pub-9604435451771969";
/* Linkleiste unten */
google_ad_slot = "1662344633";
google_ad_width = 600;
google_ad_height = 15;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<center>
<script type="text/javascript"><!--
google_ad_client = "ca-pub-9604435451771969";
/* 336x280 unter Video */
google_ad_slot = "9597420007";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</center><br />
<br />
Viel Spaß und bis zur nächsten Folge, in der es wieder eine Aufgabe zum Thema Interrupts gibt.<br />
<br />
Dieser Artikel ist Teil des Mikrocontrollerkurs auf ET-Tutorials.de.<br />
<a href="http://et-tutorials.de/mikrocontroller/"> Hier geht es zurück zur Übersichtsseite des Mikrocontroller-Kurses</a> .</p>
]]></content:encoded>
			<wfw:commentRss>http://et-tutorials.de/4696/timer-interrupts-8-bit-auto-reload/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Timer Interrupt Lösung der Aufgabe</title>
		<link>http://et-tutorials.de/4628/timer-interrupt-losung-der-aufgabe/</link>
		<comments>http://et-tutorials.de/4628/timer-interrupt-losung-der-aufgabe/#comments</comments>
		<pubDate>Thu, 08 Sep 2011 07:27:21 +0000</pubDate>
		<dc:creator>Wolfgang Bengfort</dc:creator>
				<category><![CDATA[Aktuelle Artikel]]></category>
		<category><![CDATA[Mikrocontroller]]></category>

		<guid isPermaLink="false">http://et-tutorials.de/?p=4628</guid>
		<description><![CDATA[Am Ende der vergangen Folge, in der es um die Programmierung eines Timer Interrupts ging, hatte ich die Aufgabe gestellt, eine Interrupt Service Routine zu erstellen, die den Port P0 genau alle 10 Sekunden inkrementiert. Die Aufgabe sollte so gelöst werden, dass der Interrupt Service Routine des Timers 0 alle 10 ms aufgerufen wird. Bei [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fet-tutorials.de%2F4628%2Ftimer-interrupt-losung-der-aufgabe%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fet-tutorials.de%2F4628%2Ftimer-interrupt-losung-der-aufgabe%2F&amp;source=ETTutorials&amp;style=compact&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><div style='float:left; padding-left:10px; margin-left:0px; padding-right:10px; margin-right:0px; padding-top:10px; padding-bottom: 10px;'>
<script type="text/javascript"><!--
google_ad_client = "ca-pub-9604435451771969";
/* oben links im Artikel Image */
google_ad_slot = "7784759186";
google_ad_width = 300;
google_ad_height = 250;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</div>Am Ende der vergangen Folge, in der es um die Programmierung eines Timer Interrupts ging, hatte ich die Aufgabe gestellt, eine Interrupt Service Routine zu erstellen, die den Port P0 genau alle 10 Sekunden inkrementiert. </p>
<p>Die Aufgabe sollte so gelöst werden, dass der Interrupt Service Routine des Timers 0 alle 10 ms aufgerufen wird.</p>
<p>Bei jedem 1.000 Durchlauf der Interrupt Service Routine sollte dann der Port inkrementiert werden.</p>
<p>1000 x 10ms = 10s</p>
<p>Zunächst müssen also die SFR-Register TH0 und TL0 bestimmt werden, um eine Zeit von 10ms z realisieren. Im Video rechne ich die Prozedur einmal vor.</p>
<h2>Die Berechnung der Timer-Werte für TH0 und TL0</h2>
<p>Damit Du die Werte besser mit Deinen Werten vergleichen kannst, gebe ich die Rechung hier noch einmal kurz an.</p>
<p>Der Mikrocontroller wird mit 12 MHz getaktet. Durch den Teiler von 12 wird TL0 also jede µs inkrementiert. </p>
<p>10 ms entsprechen 10.000 Inkrementierungen, denn 10.000 x 1µs = 10 ms</p>
<p>Da die beiden Bytes bei 0xFF, dezimal also 65536 überlaufen, muss der Timerstand dezimal auf </p>
<p>65536-10000 =55536</p>
<p>gesetzt werden.</p>
<p>55536 dez entspricht D8F0 hexadezimal</p>
<p>Damit ergeben sich folgende Werte:</p>
<p>TH0 = 0xD8;<br />
TL0 = 0xF0</p>
<p>Soweit zur Theorie <img src='http://et-tutorials.de/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<h2>Video zur Programmierung des Timers</h2>
<p>Im Video zeige ich die Programmierung der Interrupt Service Routine. Wichtig hierbei ist die Werte  für TH0 und TL0 in der Interrupt Service Routine noch einmal zu setzen, weil die Zähler ansonsten beim aktuellen Stand, also TH0 = 0&#215;00 und TL0=0&#215;00 loslaufen würden, statt bei TH0 = 0xD8 und TL0 = 0xF0.<br />
Zudem darf natürlich nicht vergessen werden mit</p>
<ul>
<li>EAL = 1; Interrupts generell freizugeben</li>
<li>ET0 = 1; den Interrupt für den Timer 0 freizugeben</li>
<li>TR0 = 1; den Timer zu starten</li>
</ul>
<p>Viel Spaß beim Video und bis zum nächsten Mal. Dann geht es um das auto-reload, bei dem der Timerstartwert „automatisch“ gesetzt wird.</p>
<p><object width="560" height="345"><param name="movie" value="http://www.youtube.com/v/ZFNlFsA0DBY?version=3&amp;hl=de_DE&amp;hd=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/ZFNlFsA0DBY?version=3&amp;hl=de_DE&amp;hd=1" type="application/x-shockwave-flash" width="560" height="345" allowscriptaccess="always" allowfullscreen="true"></embed></object><br />
<script type="text/javascript"><!--
google_ad_client = "ca-pub-9604435451771969";
/* Linkleiste unten */
google_ad_slot = "1662344633";
google_ad_width = 600;
google_ad_height = 15;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<center>
<script type="text/javascript"><!--
google_ad_client = "ca-pub-9604435451771969";
/* 336x280 unter Video */
google_ad_slot = "9597420007";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</center><br />
<br />
Dieser Artikel ist Teil des Mikrocontrollerkurs auf ET-Tutorials.de.<br />
<a href="http://et-tutorials.de/mikrocontroller/"> Hier geht es zurück zur Übersichtsseite des Mikrocontroller-Kurses</a> .</p>
<p><img src="http://vg08.met.vgwort.de/na/90784b3223114747b1cf5a17cbeba942" width="1" height="1" alt=""></p>
]]></content:encoded>
			<wfw:commentRss>http://et-tutorials.de/4628/timer-interrupt-losung-der-aufgabe/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Programmieren des Timer Interrupts</title>
		<link>http://et-tutorials.de/4464/programmieren-des-timer-interrupts/</link>
		<comments>http://et-tutorials.de/4464/programmieren-des-timer-interrupts/#comments</comments>
		<pubDate>Thu, 01 Sep 2011 08:50:21 +0000</pubDate>
		<dc:creator>Wolfgang Bengfort</dc:creator>
				<category><![CDATA[Aktuelle Artikel]]></category>
		<category><![CDATA[Mikrocontroller]]></category>

		<guid isPermaLink="false">http://et-tutorials.de/?p=4464</guid>
		<description><![CDATA[Heute geht es wieder ans Eingemachte. Mit einer schönen Aufgabe zum Schluss. Wann wird ein Timer Interrupt denn nun aufgerufen, bzw. wie stellst Du ein, dass der Timer Interrupt genau dann ausgelöst wird, wann Du es möchtest? Um diese Fragen geht es heute. Die Zeit, bis ein Time raubgelaufen ist, ist zunächst einmal abhängig von [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fet-tutorials.de%2F4464%2Fprogrammieren-des-timer-interrupts%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fet-tutorials.de%2F4464%2Fprogrammieren-des-timer-interrupts%2F&amp;source=ETTutorials&amp;style=compact&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><div style='float:left; padding-left:10px; margin-left:0px; padding-right:10px; margin-right:0px; padding-top:10px; padding-bottom: 10px;'>
<script type="text/javascript"><!--
google_ad_client = "ca-pub-9604435451771969";
/* oben links im Artikel Image */
google_ad_slot = "7784759186";
google_ad_width = 300;
google_ad_height = 250;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</div>Heute geht es wieder ans Eingemachte. Mit einer schönen Aufgabe zum Schluss.<br />
Wann wird ein Timer Interrupt denn nun aufgerufen, bzw. wie stellst Du ein, dass der Timer Interrupt genau dann ausgelöst wird, wann Du es möchtest?<br />
<br />
Um diese Fragen geht es heute.</p>
<p>Die Zeit, bis ein Time raubgelaufen ist, ist zunächst einmal abhängig von der Taktfrequenz, mit der der Mikrocontroller betrieben wird. Von dieser Taktfrequenz ist abhängig, wie lange ein Maschinenzyklus dauert und die Dauer eines Maschinenzyklus bestimmt, wie schnell die Register TH0 und TL0 inkrementiert werden.<br />
Ein Machinenzyklus dauert 12 Taktzyklen und nach jedem Maschinenzyklus wird der Zähler um 1 inkrementiert.</p>
<p><strong>Ein Beispiel:</strong></p>
<p>Wir der Mikrocontroller mit 12 MHz getaktet, beträgt die Frequenz für die Maschinenzyklen<br />
12 Mhz : 12 = 1 MHz. Es gibt dann also 1 Million Maschinenzyklen pro Sekunde.<br />
Ein Maschinenzyklus dauert also 1 µs. Jede µs wird das Registerpaar TH0/TL0 also inkrementiert.</p>
<p>Im Video lasse ich den Initialwert von TH0 und TL0 auf 0. Wir benötigen also 2 hoch 16 = 65536 Inkrementierungen bis zum Überlauf.<br />
Die Interrupt Service Routine des Timers wird also jede 65536 x 1µs = 0,065536s aufgerufen.</p>
<h2>Die Programmierung dieses Timers im Video</h2>
<p><object width="560" height="349"><param name="movie" value="http://www.youtube.com/v/aCduSaVNFc0?version=3&amp;hl=de_DE&amp;hd=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/aCduSaVNFc0?version=3&amp;hl=de_DE&amp;hd=1" type="application/x-shockwave-flash" width="560" height="349" allowscriptaccess="always" allowfullscreen="true"></embed></object><br />
<script type="text/javascript"><!--
google_ad_client = "ca-pub-9604435451771969";
/* Linkleiste unten */
google_ad_slot = "1662344633";
google_ad_width = 600;
google_ad_height = 15;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<center>
<script type="text/javascript"><!--
google_ad_client = "ca-pub-9604435451771969";
/* 336x280 unter Video */
google_ad_slot = "9597420007";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</center></p>
<h2>Deine Aufgabe</h2>
<p>Durch die Wahl der Werte von TH0 und TL0 kann man bestimmen, wie lange es vom Start des Timers bis zum Aufruf der Interrupt Service Routine dauert.<br />
Es soll nun ein Timer programmiert werden , der alle 10 ms aufgerufen wird und dann bei jedem 1000. Mal den Port P1 inkrementiert. Der Port P1 wird dann also genau alle 10s inkrementiert.</p>
<h2>Hinweis</h2>
<p>Berechne also zunächst einmal die Werte für TH0 und TL0, um einen Überlauf nach 10ms zu erreichen. Diese Werte musst Du in die Register TH0 und TL0 schreiben, bevor Du den Timer startest.<br />
Zudem musst Du die Werte in der Interrupt Service Routine wieder in die Register TH0 und TL0 schreiben, weil Du ja möchtest, dass der Zähler genau bei diesen Werten weiterzählt,um nach 10 ms den nächsten Überlauf zu erhalten.</p>
<p>Viel Spaß!</p>
<p>Dieser Artikel ist Teil des Mikrocontrollerkurs auf ET-Tutorials.de.<br />
<a href="http://et-tutorials.de/mikrocontroller/"> Hier geht es zurück zur Übersichtsseite des Mikrocontroller-Kurses</a> .</p>
<p><img src="http://vg08.met.vgwort.de/na/d4ccb910403f444cbd85d965490cd8b6" width="1" height="1" alt=""></p>
]]></content:encoded>
			<wfw:commentRss>http://et-tutorials.de/4464/programmieren-des-timer-interrupts/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Timer Interrupt des 8051 Mikrocontrollers</title>
		<link>http://et-tutorials.de/4458/timer-interrupt-des-8051-mikrocontrollers/</link>
		<comments>http://et-tutorials.de/4458/timer-interrupt-des-8051-mikrocontrollers/#comments</comments>
		<pubDate>Mon, 29 Aug 2011 08:00:20 +0000</pubDate>
		<dc:creator>Wolfgang Bengfort</dc:creator>
				<category><![CDATA[Aktuelle Artikel]]></category>
		<category><![CDATA[Dies&Das]]></category>
		<category><![CDATA[Mikrocontroller]]></category>

		<guid isPermaLink="false">http://et-tutorials.de/?p=4458</guid>
		<description><![CDATA[Zu den wichtigsten Aufgaben eines Mikrocontrollers gehören Steuerungs-, Regelungs- und Messaufgaben. Sehr häufig müssen in diesen Aufgabenstellungen Zeiten sehr genau eingehalten werden, um zeitkritische Abläufe zu messen und zu steuern . Aus diesem Grund sind Mikrocontroller häufig mit mehreren Timern ausgestattet, die unabhängig voneinander programmiert werden können. Bei Ablauf eines Timers wird dann beispielsweise eine [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fet-tutorials.de%2F4458%2Ftimer-interrupt-des-8051-mikrocontrollers%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fet-tutorials.de%2F4458%2Ftimer-interrupt-des-8051-mikrocontrollers%2F&amp;source=ETTutorials&amp;style=compact&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><div style='float:left; padding-left:10px; margin-left:0px; padding-right:10px; margin-right:0px; padding-top:10px; padding-bottom: 10px;'>
<script type="text/javascript"><!--
google_ad_client = "ca-pub-9604435451771969";
/* oben links im Artikel Image */
google_ad_slot = "7784759186";
google_ad_width = 300;
google_ad_height = 250;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</div>Zu den wichtigsten Aufgaben eines Mikrocontrollers gehören Steuerungs-, Regelungs- und Messaufgaben.</p>
<p>Sehr häufig müssen in diesen Aufgabenstellungen Zeiten sehr genau eingehalten werden, um zeitkritische Abläufe zu messen und zu steuern .</p>
<p>Aus diesem Grund sind Mikrocontroller häufig mit mehreren <strong>Timern</strong> ausgestattet, die unabhängig voneinander programmiert werden können.</p>
<p>Bei Ablauf eines Timers wird dann beispielsweise eine Interrupt Service Routine aufgerufen, die so also genau zu dem gewünschten Zeitpunkt zuschlägt <img src='http://et-tutorials.de/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Heute geht es darum, wie die Timer eines 8051 Mikrocontrollers programmiert werden und welche Register man zur Programmierung benötigt.</p>
<h2>Konfiguration eines Timers</h2>
<p>Die Konfiguration eines Timer Interrupts ist etwas aufwändiger als beim externen Interrupt.<br />
Im ersten Video zeige ich also zunächst einmal die wichtigsten Register zur Konfiguration eines Timers.</p>
<p><object width="560" height="349"><param name="movie" value="http://www.youtube.com/v/kR0P-9daZlI?version=3&amp;hl=de_DE&amp;hd=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/kR0P-9daZlI?version=3&amp;hl=de_DE&amp;hd=1" type="application/x-shockwave-flash" width="560" height="349" allowscriptaccess="always" allowfullscreen="true"></embed></object><br />
<script type="text/javascript"><!--
google_ad_client = "ca-pub-9604435451771969";
/* Linkleiste unten */
google_ad_slot = "1662344633";
google_ad_width = 600;
google_ad_height = 15;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<center>
<script type="text/javascript"><!--
google_ad_client = "ca-pub-9604435451771969";
/* 336x280 unter Video */
google_ad_slot = "9597420007";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</center></p>
<p>Im zweiten Video zeige ich dann die Konfiguration des Timers und die Programmierung der Interrupt Service Routine am Emulator.</p>
<p><object width="560" height="349"><param name="movie" value="http://www.youtube.com/v/i7SBb5at9h8?version=3&amp;hl=de_DE&amp;hd=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/i7SBb5at9h8?version=3&amp;hl=de_DE&amp;hd=1" type="application/x-shockwave-flash" width="560" height="349" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<h2>Deine Aufgabe</h2>
<p>Heute gibt es keine spezielle Programmieraufgabe, in der Du eine bestimmte Aufgabe lösen sollst.</p>
<p>Du solltest Dich aber bis zur nächsten Folge mit dem Timer beschäftigen. So könntest Du beispielsweise das Beispiel nachprogrammieren, oder dieses Beispiel auf den Timer 1 übertragen.</p>
<p>Wichtig ist hierbei, dass Du die zu verwendenden Register kennenlernst. Also: Mit welchem Register gibt man den Timer frei, wie startet man einen Timer, wie schreibt man eine Interrupt Service Routine, usw.</p>
<p>Man muss die Befehle einmal selbst eingetippt haben, die Regioster einmal selbst gesetzt und gelöscht haben, um ein Gefühl dafür zu bekommen.</p>
<p>Also: Programmiere das Beispiel einmal nach und setze es anschließend für den Timer 1 um.</p>
<p>Die Priority Order für den Timer 1 ist übrigens 3.</p>
<p>Also void ISR_Timer1(void) interrupt 3</p>
<p>{}</p>
<p>Dieser Artikel ist Teil des Mikrocontrollerkurs auf ET-Tutorials.de.<br />
<a href="http://et-tutorials.de/mikrocontroller/"> Hier geht es zurück zur Übersichtsseite des Mikrocontroller-Kurses</a> .<br />
<img src="http://vg08.met.vgwort.de/na/45a2da1ef77f42d892348059234716c3" width="1" height="1" alt=""></p>
]]></content:encoded>
			<wfw:commentRss>http://et-tutorials.de/4458/timer-interrupt-des-8051-mikrocontrollers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Software Interrupts, Traps</title>
		<link>http://et-tutorials.de/4453/software-interrupts-traps/</link>
		<comments>http://et-tutorials.de/4453/software-interrupts-traps/#comments</comments>
		<pubDate>Mon, 22 Aug 2011 07:31:59 +0000</pubDate>
		<dc:creator>Wolfgang Bengfort</dc:creator>
				<category><![CDATA[Aktuelle Artikel]]></category>
		<category><![CDATA[Mikrocontroller]]></category>

		<guid isPermaLink="false">http://et-tutorials.de/?p=4453</guid>
		<description><![CDATA[Wie bereits in der Übersicht zu externen Interrupts gezeigt, können Interrupts auch durch Software ausgelöst werden. Dies nennt man Software Interrupt, Trap oder Exception. Ein solcher Software Interrupts sollte in der Aufgabe aus der letzten Folge genutzt werden, um bei dem Eintreffen eines Signals für den Interrupt INT1 auch die Interrupt Service Routine für den [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fet-tutorials.de%2F4453%2Fsoftware-interrupts-traps%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fet-tutorials.de%2F4453%2Fsoftware-interrupts-traps%2F&amp;source=ETTutorials&amp;style=compact&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><div style='float:left; padding-left:10px; margin-left:0px; padding-right:10px; margin-right:0px; padding-top:10px; padding-bottom: 10px;'>
<script type="text/javascript"><!--
google_ad_client = "ca-pub-9604435451771969";
/* oben links im Artikel Image */
google_ad_slot = "7784759186";
google_ad_width = 300;
google_ad_height = 250;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</div>Wie bereits in der <a href="http://et-tutorials.de/4429/externe-interrupts-beim-8051/">Übersicht zu externen Interrupts</a> gezeigt, können Interrupts auch durch Software ausgelöst werden. </p>
<p>Dies nennt man Software Interrupt, Trap oder Exception.</p>
<p>Ein solcher Software Interrupts sollte in der Aufgabe aus der letzten Folge genutzt werden, um bei dem Eintreffen eines <a href="http://et-tutorials.de/4444/losung-der-aufgabe-zu-den-externen-interrupts">Signals für den Interrupt INT1 auch die Interrupt Service Routine für den Interrupt INT0</a> auszuführen.</p>
<p>Um Software Interrupts auszuführen nutz man das Interrupt Pending Flag.</p>
<p>Es muss also lediglich das Interrupt Pending Flag IE0 in der Interrupt Service Routine für den Interrupt INT1 gesetzt werden.</p>
<p>Voilá</p>
<p><object width="560" height="349"><param name="movie" value="http://www.youtube.com/v/_jiullJjEcg?version=3&amp;hl=de_DE&amp;hd=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/_jiullJjEcg?version=3&amp;hl=de_DE&amp;hd=1" type="application/x-shockwave-flash" width="560" height="349" allowscriptaccess="always" allowfullscreen="true"></embed></object><br />
<script type="text/javascript"><!--
google_ad_client = "ca-pub-9604435451771969";
/* Linkleiste unten */
google_ad_slot = "1662344633";
google_ad_width = 600;
google_ad_height = 15;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<center>
<script type="text/javascript"><!--
google_ad_client = "ca-pub-9604435451771969";
/* 336x280 unter Video */
google_ad_slot = "9597420007";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</center></p>
<p>Dieser Artikel ist Teil des Mikrocontrollerkurs auf ET-Tutorials.de.<br />
<a href="http://et-tutorials.de/mikrocontroller/"> Hier geht es zurück zur Übersichtsseite des Mikrocontroller-Kurses</a> .</p>
]]></content:encoded>
			<wfw:commentRss>http://et-tutorials.de/4453/software-interrupts-traps/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lösung der Aufgabe zu den externen Interrupts</title>
		<link>http://et-tutorials.de/4444/losung-der-aufgabe-zu-den-externen-interrupts/</link>
		<comments>http://et-tutorials.de/4444/losung-der-aufgabe-zu-den-externen-interrupts/#comments</comments>
		<pubDate>Tue, 16 Aug 2011 08:00:24 +0000</pubDate>
		<dc:creator>Wolfgang Bengfort</dc:creator>
				<category><![CDATA[Aktuelle Artikel]]></category>
		<category><![CDATA[Leitartikel]]></category>
		<category><![CDATA[Mikrocontroller]]></category>

		<guid isPermaLink="false">http://et-tutorials.de/?p=4444</guid>
		<description><![CDATA[Heute geht es nun um die Lösung aus dem Artikel der vergangenen Woche, in dem ich die Mechansmen des externen Interrupts des 8051 Mikrocontrollers vorgstellt habe. Zur Erinnerung. Die Aufgabe lautete: Bei der Kaffeemaschine könen zwei Störungen auftreten, die jeweils einen Interrupt am Mikrocontroller auslösen. Diese beiden Fehlermeldungen sollen ausgewertet werden. Die Maschine muss (bei [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fet-tutorials.de%2F4444%2Flosung-der-aufgabe-zu-den-externen-interrupts%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fet-tutorials.de%2F4444%2Flosung-der-aufgabe-zu-den-externen-interrupts%2F&amp;source=ETTutorials&amp;style=compact&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><div style='float:left; padding-left:10px; margin-left:0px; padding-right:10px; margin-right:0px; padding-top:10px; padding-bottom: 10px;'>
<script type="text/javascript"><!--
google_ad_client = "ca-pub-9604435451771969";
/* oben links im Artikel Image */
google_ad_slot = "7784759186";
google_ad_width = 300;
google_ad_height = 250;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</div>Heute geht es nun um die Lösung aus dem Artikel der vergangenen Woche, in dem ich die Mechansmen des <a href="http://et-tutorials.de/4429/externe-interrupts-beim-8051/">externen Interrupts des 8051 Mikrocontrollers</a> vorgstellt habe.</p>
<p>Zur Erinnerung. Die Aufgabe lautete:</p>
<p>Bei der Kaffeemaschine könen zwei Störungen auftreten, die jeweils einen Interrupt am Mikrocontroller auslösen.</p>
<p>Diese beiden Fehlermeldungen sollen ausgewertet werden.</p>
<ol>
<li>Die Maschine muss (bei Gelegenheit) entkalkt werden<br />
	Der Sensor, der eine zu hohe Verkalkung anzeigt, ist an INT0 angeschlossen und gibt als Meldung eine „0“ aus. Wenn der Sensor eine Verkalkung feststellt, soll an Portpin P0.0 eine 1 ausgegeben werden. Hierdurch wird ein Warnsummer eingeschaltet. Da diese Meldung nicht so kritisch ist, kann der Summer ausgeschaltet werden. Er soll nicht automatisch wieder eingeschaltet werden, auch wenn die Kaffeemaschinen noch nicht entkalkt worden ist.</li>
<li>Der Druck der Maschine ist zu hoch. Der Sensor hierfür ist an INT1 angeschlossen und gibt als Meldung eine „0“ aus. Dieser Zustand ist kritisch. In der zugehörigen Interrupt Service Routine soll an Port P0.1 eine 1 ausgegeben werden. Hierdurch wird ein Alarm ausgelöst und die Kaffeemaschine heruntergefahren. Sollte jemand den Alam löschen, der Druck aber immer noch zu hoch sein, soll automatisch die ISR wieder aufgerufen werden.</li>
</ol>
<p>&nbsp;</p>
<h2>Flankengesteuerter Interrupt</h2>
<p>Für den ersten Fall sollte die Programmierung also so aussehen, dass die Fehlermeldung „weggedrückt“ werden kann. Obwohl der Fehler vom Sensor weiter gemeldet wird, sollten keine neuen Interrupts generiert werden. Die Lösung dafür ist, den Interrupt INT0 flankengesteuert zu konfigurieren, so dass die Interrupt Service Routine nur einmal, beim Auftreten des Fehlers, ausgelöst wird. Nur dann sehen wir die negative Flanke.</p>
<h2>Pegelgesteuerter Interrupt</h2>
<p>Im zweiten Fall soll der Alarm nicht abgeschaltet werden können. So lange der Druck zu groß ist, soll der Alarm wieder erneut eingeschaltet werden.</p>
<p>Das kann dadurch erreicht werden, indem der Interrupt pegelgesteuert realisiert wird. Das heißt, so lange die Fehlerbedingung anlegt, wird laufend die Interrupt Service Routine ausgeführt.</p>
<h2>Das Video</h2>
<p><object width="560" height="349" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/JrarrV2FXp8?version=3&amp;hl=de_DE&amp;hd=1" /><param name="allowfullscreen" value="true" /><embed width="560" height="349" type="application/x-shockwave-flash" src="http://www.youtube.com/v/JrarrV2FXp8?version=3&amp;hl=de_DE&amp;hd=1" allowFullScreen="true" allowscriptaccess="always" allowfullscreen="true" /></object><br />
<script type="text/javascript"><!--
google_ad_client = "ca-pub-9604435451771969";
/* Linkleiste unten */
google_ad_slot = "1662344633";
google_ad_width = 600;
google_ad_height = 15;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<center>
<script type="text/javascript"><!--
google_ad_client = "ca-pub-9604435451771969";
/* 336x280 unter Video */
google_ad_slot = "9597420007";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</center></p>
<p>Auch in dieser Woche gibt es wieder eine kleine Aufgabe. Du erinnerst Dich vielleicht noch an den Begriff der Interrupt Pending Flags aus der Folge <a href="http://et-tutorials.de/4429/externe-interrupts-beim-8051/">externe Interrupts</a>.</p>
<p>Dieser Mechanismus, das Auslösen von Interrupts per Software, soll nun genutzt werden.</p>
<h2>Aufgabe</h2>
<p>Wenn der Druck zu hoch ist, soll so viel Radau wie möglich gemacht werden. Es soll neben dem eigentlichen Alarm „Druck zu hoch“ auch der Summer für die Kalkmeldung eingeschaltet werden.</p>
<p>Da nicht an der Hardware geschraubt werden soll, muss dies durch Software gelöst werden. Hierzu soll auch der Interrupt INT0 ausgelöst werden, wenn der Druck zu hoch ist.</p>
<p>Dieser Artikel ist Teil des Mikrocontrollerkurs auf ET-Tutorials.de.<br />
<a href="http://et-tutorials.de/mikrocontroller/"> Hier geht es zurück zur Übersichtsseite des Mikrocontroller-Kurses</a> .</p>
<p><img src="http://vg08.met.vgwort.de/na/368ed99aca4d4cd09bcedbdedf1c9039" width="1" height="1" alt=""></p>
]]></content:encoded>
			<wfw:commentRss>http://et-tutorials.de/4444/losung-der-aufgabe-zu-den-externen-interrupts/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Externe Interrupts beim 8051</title>
		<link>http://et-tutorials.de/4429/externe-interrupts-beim-8051/</link>
		<comments>http://et-tutorials.de/4429/externe-interrupts-beim-8051/#comments</comments>
		<pubDate>Tue, 09 Aug 2011 09:16:23 +0000</pubDate>
		<dc:creator>Wolfgang Bengfort</dc:creator>
				<category><![CDATA[Aktuelle Artikel]]></category>
		<category><![CDATA[Leitartikel]]></category>
		<category><![CDATA[Mikrocontroller]]></category>

		<guid isPermaLink="false">http://et-tutorials.de/?p=4429</guid>
		<description><![CDATA[Heute geht es nun um die Programmierung eines externen Interrupts. Die Programmierung eines externen Interrupts ist eigentlich sehr einfach. Lediglich einige wichtige Register, die über die Special Function Register des 8051 erreicht werden können, müssen gesetzt werden. Dann muss noch die gewünschte Interrupts Service Routine erstellt werden und schon kann auf externe Signale reagiert werden. [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fet-tutorials.de%2F4429%2Fexterne-interrupts-beim-8051%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fet-tutorials.de%2F4429%2Fexterne-interrupts-beim-8051%2F&amp;source=ETTutorials&amp;style=compact&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><div style='float:left; padding-left:10px; margin-left:0px; padding-right:10px; margin-right:0px; padding-top:10px; padding-bottom: 10px;'>
<script type="text/javascript"><!--
google_ad_client = "ca-pub-9604435451771969";
/* oben links im Artikel Image */
google_ad_slot = "7784759186";
google_ad_width = 300;
google_ad_height = 250;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</div>Heute geht es nun um die Programmierung eines externen Interrupts. Die Programmierung eines externen Interrupts ist eigentlich sehr einfach.</p>
<p>Lediglich einige wichtige Register, die über die Special Function Register des 8051 erreicht werden können, müssen gesetzt werden. Dann muss noch die gewünschte Interrupts Service Routine erstellt werden und schon kann auf externe Signale reagiert werden.</p>
<p>Der heutige Artikel besteht aus 2 Videos. Im ersten Video erläutere ich die wichtigsten Register, die ich hier noch einmal aufführe.</p>
<h2>Register für den Interrupt INT0</h2>
<p><strong>/INT0</strong> am Portpin 3.2: <br />
An diesen Anschluss muss das Signal für den externen Interrupt 0 angeschlossen werden.</p>
<p><strong>EAL</strong>, Enable All Interrupts: <br />
EAL muss gleich 1 gesetzt werden, damit eine Anforderung eines Interrupts überhaupt durchgelassen werden können. Dieses Bit ist nach dem Start des Controllers auf 0 gesetzt. Interrupts werden also zunächst nicht zugelassen. So kann das Gesamtsystem zunächst einmal initialisiert werden, ohne von Interrupts gestört zu werden.</p>
<p><strong>EX0</strong>, Enable eXternal Interrupt 0: <br />
schaltet den externen Interrupt 0 Freitag</p>
<p><strong>IT0</strong>:        <br />
0 bedeutet pegelgesteuerter Interrupt<br />
1 bedeutet flankengesteuerter Interrupt</p>
<p><strong>IE0</strong>: ist das zugehörige Interrupt Pendig Flag, <br />
das auch per Software gesetzt werden kann. SO könnte man eine Interrupt Service Routine auch per Software auslösen, ein sogenannter Software Trap.</p>
<p>&nbsp;</p>
<h2>Externer Interrupt 0</h2>
<p>Jetzt aber zum Video <img src='http://et-tutorials.de/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p><object width="560" height="349"><param name="movie" value="http://www.youtube.com/v/Wa28lx0TGCA?version=3&amp;hl=de_DE&amp;hd=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/Wa28lx0TGCA?version=3&amp;hl=de_DE&amp;hd=1" type="application/x-shockwave-flash" width="560" height="349" allowscriptaccess="always" allowfullscreen="true"></embed></object><br />
<script type="text/javascript"><!--
google_ad_client = "ca-pub-9604435451771969";
/* Linkleiste unten */
google_ad_slot = "1662344633";
google_ad_width = 600;
google_ad_height = 15;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<center>
<script type="text/javascript"><!--
google_ad_client = "ca-pub-9604435451771969";
/* 336x280 unter Video */
google_ad_slot = "9597420007";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</center></p>
<h2>Der Externer Interrupt 0 umgesetzt</h2>
<p>Im folgenden Video zeige ich eine Umsetzung des externen Interrupts 0, bei der ich auch den Unterschied zwischen flankengesteuertem Interrupt und pegelgesteuerten Interrupt erläutere.</p>
<p><object width="425" height="349"><param name="movie" value="http://www.youtube.com/v/XC3CfPrY2mA?version=3&amp;hl=de_DE&amp;hd=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/XC3CfPrY2mA?version=3&amp;hl=de_DE&amp;hd=1" type="application/x-shockwave-flash" width="425" height="349" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p>&nbsp;</p>
<h2>Deine Aufgabe</h2>
<p>Heute lohnt es sich wieder eine Funktion für den Kaffeeautomaten zu schreiben. Und zwar fehlen noch einige Sicherheitsfunktionen.</p>
<p>In so einer professionellen Kaffeemaschine <img src='http://et-tutorials.de/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  muss die Funktionstüchtigkeit der Gesamtanlage dauernd überwacht werden.</p>
<p>Deine Aufgabe ist es zwei mögliche Fehler auszuwerten und anzuzeigen.</p>
<ol>
<li>Die Maschine muss (bei Gelegenheit) entkalkt werden<br />
Der Sensor, der eine zu hohe Verkalkung anzeigt, ist an INT0 angeschlossen und gibt als Meldung eine „0“ aus. Wenn der Sensor eine Verkalkung feststellt, soll an Portpin P0.0 eine 1 ausgegeben werden. Hierdurch wird ein Warnsummer eingeschaltet. Da diese Meldung nicht so kritisch ist, kann der Summer ausgeschaltet werden. Er soll nicht automatisch wieder eingeschaltet werden, auch wenn die Kaffeemaschinen noch nicht entkalkt worden ist.</li>
<li>Der Druck der Maschine ist zu hoch. Der Sensor hierfür ist an INT1 angeschlossen und gibt als Meldung eine „0“ aus. Dieser Zustand ist kritisch. In der zugehörigen Interrupt Service Routine soll an Port P0.1 eine 1 ausgegeben werden. Hierdurch wird ein Alarm ausgelöst und die Kaffeemaschine heruntergefahren. Sollte jemand den Alam löschen, der Druck aber immer noch zu hoch sein, soll automatisch die ISR wieder aufgerufen werden.</li>
</ol>
<p>Es geht also in der Aufgabe sowohl um den Interrupt 0 und den Interrupt 1 und um pegelgesteuerte wie auch um flankengesteuerte Interrupts.</p>
<h2>Hinweis zur Programmierung der Internet Service Routine.</h2>
<p>Im Video habe ich gezeigt, dass für den Interrupt 0 die Priority Order 0 gilt. Für den Interrupt 1 gilt die Priority Order 2.</p>
<p>Die Interrupt Service Routinen sehen also beispielsweise wie folgt aus:</p>
<p>void ISR_INT0 (void) interrupt 0<br />
{}</p>
<p>void ISR_INT1 (void) interrupt 2<br />
{}</p>
<p>Dieser Artikel ist Teil des Mikrocontrollerkurs auf ET-Tutorials.de.<br />
<a href="http://et-tutorials.de/mikrocontroller/"> Hier geht es zurück zur Übersichtsseite des Mikrocontroller-Kurses</a> .<br />
<img src="http://vg08.met.vgwort.de/na/cd32caca1cd54db19d713be1ebf816f8" width="1" height="1" alt=""></p>
]]></content:encoded>
			<wfw:commentRss>http://et-tutorials.de/4429/externe-interrupts-beim-8051/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

