<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://www.mikrocontroller.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Thomas1123</id>
	<title>Mikrocontroller.net - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://www.mikrocontroller.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Thomas1123"/>
	<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/articles/Spezial:Beitr%C3%A4ge/Thomas1123"/>
	<updated>2026-04-10T21:41:29Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Benutzer:Thomas1123&amp;diff=50734</id>
		<title>Benutzer:Thomas1123</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Benutzer:Thomas1123&amp;diff=50734"/>
		<updated>2010-09-18T07:55:09Z</updated>

		<summary type="html">&lt;p&gt;Thomas1123: /* Zu meiner Person */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Alles noch Baustelle *&lt;br /&gt;
&lt;br /&gt;
== Zu meiner Person ==&lt;br /&gt;
&lt;br /&gt;
* Baujahr 1982&lt;br /&gt;
* Erweiterter Hauptschulabschluss 1999&lt;br /&gt;
* 99 bis 2003 3 1/2 Jahre Lehre als Elektroinstallateur&lt;br /&gt;
* Weitere 3 1/2 Jahre als Elektroinstallateur gearbeitet&lt;br /&gt;
* Sommer 2006 Beginn der zweijährigen Fachschule für Technik&lt;br /&gt;
* Sommer 2008 staatlich geprüfter Techniker mit nem Schnitt von 2.1&lt;br /&gt;
* Seit Juli 2008 arbeite ich als Softwareentwickler für CNC-Steuerungen (EN 61131-3 ST)&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Projekte ==&lt;br /&gt;
&lt;br /&gt;
=== Labornetzteil ===&lt;br /&gt;
&lt;br /&gt;
Nachdem ich von 06-2008 bis 08-2010 meine kompletten Elektronikprojekte auf Eis gelegt hatte und dann auch noch von PIC auf AVR umgestiegen bin erkläre ich hiermit das Labornetzteil zur Totgeburt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Grundsätzlich baue ich das Netzteil nicht um das beste, tollste, schönste Labornetzteil von allen zu haben, sondern weil ich spass dran habe.&#039;&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Wem es nicht gefällt der soll es nicht nachbauen oder benutzen.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== Vorhaben ====&lt;br /&gt;
&lt;br /&gt;
* Spannung regelbar von 0...20V&lt;br /&gt;
* Strombegrenzung regelbar von 0...2A&lt;br /&gt;
* Als Stellgrösse für Spanung und Strom jeweils 0..2048mV (12-Bit da-Wandler)&lt;br /&gt;
* Einstellung von Strom und Spannung mit Endlospotis&lt;br /&gt;
* Anzeige von diversen Werten (Istspannung, Sollspannung, Iststrom, Maxstrom, aktuelle Leistung in W und was sonst noch so gefällt) auf 4*16 oder 4*20 LC-Display&lt;br /&gt;
* Steuer µC PIC 16F877 oder PIC 16F887&lt;br /&gt;
* Diverse feste Spannungen (+5V +12V etc.)&lt;br /&gt;
&lt;br /&gt;
==== Schön wärs aber nicht umbedingt nötig ====&lt;br /&gt;
&lt;br /&gt;
*Temperaturüberwachung der Leistungsbauteile&lt;br /&gt;
*Kommunikation über RS232&lt;br /&gt;
*Speicherbare Einstellungen (wie im Autoradio Taste lang gedrückt halten und Einstellungen (Sender) sind gespeichert, Taste kurz drücken und das Setting wird aufgerufen.&lt;br /&gt;
*Integriertes Radio mit TV und Premiere Decoder :-)&lt;br /&gt;
&lt;br /&gt;
==== Was sich bis jetzt so getan hat ====&lt;br /&gt;
[[Bild:Tastenabfrage.png|thumb|right|Spannungsteiler für die analoge Tastenabfrage]]&lt;br /&gt;
[[Bild:Tastenabfrage_S1.png|thumb|right|Schaltung des Spannungsteilers bei gedrücktem Taster S1]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Der Steuerpic wird wahrscheinlich doch ein PIC 16F690 (ist mein persönlicher Liebling) werden der hat zwar nur die Hälfte der Pins aber mit etwas Trixen müsste des gehen.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Als Display habe ich mich für ein 20*4 zeichen DIP-Display von ELECTRONIC ASSEMBLY entschieden (Reichelt Bestellnummer: LCD 204 DIP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Die Abfrage der Tasten wird über einen Analogeingang realisiert. Somit lassen sich mehrere Tasten an einem Pin abfragen indem man die Ausgangsspannung des Spannungsteilers misst und diese dann mit vorgegebenen Werten im Programm vergleicht. Es empfiehlt sich einen Tolleranzwert für den Analogwert der Tastenabfrage zu verwenden. &amp;lt;br/&amp;gt;&lt;br /&gt;
Wenn nur ein Taster gedrückt wird hat man einen &amp;quot;relativ&amp;quot; einfach zu berechnenden Spannungsteiler. Zuerst muss man den Ersatzwiederstand &amp;lt;math&amp;gt;R_e&amp;lt;/math&amp;gt; ausrechnen. Dies ist aber nicht weiters schwierig wenn man sich die Schaltung mal etwas anderst aufmalt und erkennt, dass mehrere Widerstände in reihe und diese Reihenschaltungen dann Paralell zu einander sind(siehe Bild 2).&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Beispielhaft die Berechnung der Ausgangsspannung wenn Taster S1 gedrückt wird.&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
R_e = \frac{1}{(R_2+R_8)^{-1}+ (R_3+R_9)^{-1}+ (R_4+R_{10})^{-1}+ (R_5+R_{11})^{-1}+ (R_6+R_{12})^{-1}} \,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Ja ich weiss das ist viel Tipparbeit und ganz bestimmt gibt es auch eine einfacherre möglichkei &amp;lt;math&amp;gt;R_e&amp;lt;/math&amp;gt; auszurechnen,wenn man davon ausgeht,dass &amp;lt;math&amp;gt;R_1&amp;lt;/math&amp;gt; bis &amp;lt;math&amp;gt;R_6&amp;lt;/math&amp;gt; gleich gross sind. Ich bin halt net so der Held was Formeln umstellen angeht :-).&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
U_{AD-Wandler} = U \cdot \frac{R_e}{R_7+R_e} \,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Links ====&lt;br /&gt;
http://www.elektronik-kompendium.de/public/schaerer/kdarl2.htm&amp;lt;br/&amp;gt;&lt;br /&gt;
http://www.mikrocontroller.net/topic/90246&amp;lt;br/&amp;gt;&lt;br /&gt;
http://www.mikrocontroller.net/topic/90417&amp;lt;br/&amp;gt;&lt;br /&gt;
http://www.mikrocontroller.net/topic/90780&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Codeschnipsel ==&lt;br /&gt;
http://www.mikrocontroller.net/topic/99323 Bargraph anzeige für Text-Displays&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;/div&gt;</summary>
		<author><name>Thomas1123</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Benutzer:Thomas1123&amp;diff=50733</id>
		<title>Benutzer:Thomas1123</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Benutzer:Thomas1123&amp;diff=50733"/>
		<updated>2010-09-18T07:49:08Z</updated>

		<summary type="html">&lt;p&gt;Thomas1123: /* Labornetzteil */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Alles noch Baustelle *&lt;br /&gt;
&lt;br /&gt;
== Zu meiner Person ==&lt;br /&gt;
&lt;br /&gt;
* Baujahr 1982&lt;br /&gt;
* Erweiterter Hauptschulabschluss 1999&lt;br /&gt;
* 99 bis 2003 3 1/2 Jahre Lehre als Elektroinstallateur&lt;br /&gt;
* Weitere 3 1/2 Jahre als Elektroinstallateur gearbeitet&lt;br /&gt;
* Sommer 2006 Beginn der zweijährigen Fachschule für Technik&lt;br /&gt;
* Sommer 2008 staatlich geprüfter Techniker mit nem Schnitt von 2.1&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Projekte ==&lt;br /&gt;
&lt;br /&gt;
=== Labornetzteil ===&lt;br /&gt;
&lt;br /&gt;
Nachdem ich von 06-2008 bis 08-2010 meine kompletten Elektronikprojekte auf Eis gelegt hatte und dann auch noch von PIC auf AVR umgestiegen bin erkläre ich hiermit das Labornetzteil zur Totgeburt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Grundsätzlich baue ich das Netzteil nicht um das beste, tollste, schönste Labornetzteil von allen zu haben, sondern weil ich spass dran habe.&#039;&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Wem es nicht gefällt der soll es nicht nachbauen oder benutzen.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== Vorhaben ====&lt;br /&gt;
&lt;br /&gt;
* Spannung regelbar von 0...20V&lt;br /&gt;
* Strombegrenzung regelbar von 0...2A&lt;br /&gt;
* Als Stellgrösse für Spanung und Strom jeweils 0..2048mV (12-Bit da-Wandler)&lt;br /&gt;
* Einstellung von Strom und Spannung mit Endlospotis&lt;br /&gt;
* Anzeige von diversen Werten (Istspannung, Sollspannung, Iststrom, Maxstrom, aktuelle Leistung in W und was sonst noch so gefällt) auf 4*16 oder 4*20 LC-Display&lt;br /&gt;
* Steuer µC PIC 16F877 oder PIC 16F887&lt;br /&gt;
* Diverse feste Spannungen (+5V +12V etc.)&lt;br /&gt;
&lt;br /&gt;
==== Schön wärs aber nicht umbedingt nötig ====&lt;br /&gt;
&lt;br /&gt;
*Temperaturüberwachung der Leistungsbauteile&lt;br /&gt;
*Kommunikation über RS232&lt;br /&gt;
*Speicherbare Einstellungen (wie im Autoradio Taste lang gedrückt halten und Einstellungen (Sender) sind gespeichert, Taste kurz drücken und das Setting wird aufgerufen.&lt;br /&gt;
*Integriertes Radio mit TV und Premiere Decoder :-)&lt;br /&gt;
&lt;br /&gt;
==== Was sich bis jetzt so getan hat ====&lt;br /&gt;
[[Bild:Tastenabfrage.png|thumb|right|Spannungsteiler für die analoge Tastenabfrage]]&lt;br /&gt;
[[Bild:Tastenabfrage_S1.png|thumb|right|Schaltung des Spannungsteilers bei gedrücktem Taster S1]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Der Steuerpic wird wahrscheinlich doch ein PIC 16F690 (ist mein persönlicher Liebling) werden der hat zwar nur die Hälfte der Pins aber mit etwas Trixen müsste des gehen.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Als Display habe ich mich für ein 20*4 zeichen DIP-Display von ELECTRONIC ASSEMBLY entschieden (Reichelt Bestellnummer: LCD 204 DIP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Die Abfrage der Tasten wird über einen Analogeingang realisiert. Somit lassen sich mehrere Tasten an einem Pin abfragen indem man die Ausgangsspannung des Spannungsteilers misst und diese dann mit vorgegebenen Werten im Programm vergleicht. Es empfiehlt sich einen Tolleranzwert für den Analogwert der Tastenabfrage zu verwenden. &amp;lt;br/&amp;gt;&lt;br /&gt;
Wenn nur ein Taster gedrückt wird hat man einen &amp;quot;relativ&amp;quot; einfach zu berechnenden Spannungsteiler. Zuerst muss man den Ersatzwiederstand &amp;lt;math&amp;gt;R_e&amp;lt;/math&amp;gt; ausrechnen. Dies ist aber nicht weiters schwierig wenn man sich die Schaltung mal etwas anderst aufmalt und erkennt, dass mehrere Widerstände in reihe und diese Reihenschaltungen dann Paralell zu einander sind(siehe Bild 2).&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Beispielhaft die Berechnung der Ausgangsspannung wenn Taster S1 gedrückt wird.&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
R_e = \frac{1}{(R_2+R_8)^{-1}+ (R_3+R_9)^{-1}+ (R_4+R_{10})^{-1}+ (R_5+R_{11})^{-1}+ (R_6+R_{12})^{-1}} \,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Ja ich weiss das ist viel Tipparbeit und ganz bestimmt gibt es auch eine einfacherre möglichkei &amp;lt;math&amp;gt;R_e&amp;lt;/math&amp;gt; auszurechnen,wenn man davon ausgeht,dass &amp;lt;math&amp;gt;R_1&amp;lt;/math&amp;gt; bis &amp;lt;math&amp;gt;R_6&amp;lt;/math&amp;gt; gleich gross sind. Ich bin halt net so der Held was Formeln umstellen angeht :-).&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
U_{AD-Wandler} = U \cdot \frac{R_e}{R_7+R_e} \,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Links ====&lt;br /&gt;
http://www.elektronik-kompendium.de/public/schaerer/kdarl2.htm&amp;lt;br/&amp;gt;&lt;br /&gt;
http://www.mikrocontroller.net/topic/90246&amp;lt;br/&amp;gt;&lt;br /&gt;
http://www.mikrocontroller.net/topic/90417&amp;lt;br/&amp;gt;&lt;br /&gt;
http://www.mikrocontroller.net/topic/90780&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Codeschnipsel ==&lt;br /&gt;
http://www.mikrocontroller.net/topic/99323 Bargraph anzeige für Text-Displays&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;/div&gt;</summary>
		<author><name>Thomas1123</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=PIC_Codebeispiele&amp;diff=30188</id>
		<title>PIC Codebeispiele</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=PIC_Codebeispiele&amp;diff=30188"/>
		<updated>2008-08-14T20:59:58Z</updated>

		<summary type="html">&lt;p&gt;Thomas1123: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt; &#039;&#039;&#039;Diese Seite ist noch in Bearbeitung. Die Codebeispiele sind noch nicht vollständig bzw. korrekt. Ich gelobe jedoch Besserung bis zum 15.8.08&#039;&#039;&#039; --- Naja aus zeitlichen Gründen at es leider mit der weiteren Verbesserung doch nicht geklappt. Ich habe mir die anderen Artikel angesehen und muss sagen: &amp;quot;sind nen paar beeindruckende dabei.&amp;quot; Ich wünsche Allen viel erfolg bei dem Wettbewerb. mfg Thomas&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;von [[Benutzer:Thomas1123|Thomas1123]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ich persönlich benutze den Hitech PIC-C Lite Compiler für meine Projekte.&amp;lt;br/&amp;gt;&lt;br /&gt;
Hierbei handelt es sich um die abgespeckte Version des Hitech PIC-C Compilers von der Firma HiTech Software.&amp;lt;br/&amp;gt;&lt;br /&gt;
Ich möchte hier eine Sammlung von Codebeispielen beginnen mit der es Einsteigern ermöglicht wird verschiedene interne und externe Pereferie zu initialiesieren und zu benutzen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Da der [http://www.microchip.com/stellent/idcplgidcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1335&amp;amp;dDocName=en023112 PIC16F690] mein persönlicher Liebling ist möchte ich die hier gezeigten Beispiele anhand dieses PICs aufzeigen. Die nachfolgenden Beispiele sind nicht nur für den PIC16F690 vewendbar z.B. sind die Timer0-Module in vielen Pics identisch. Dies trifft auch auf die meisten anderen Module zu jedoch kann ein zusätzlicher Blick in das Datenblatt nich schaden, da eventuell mache Register einen anderen Namen besitzen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Selbstverständlich kann dieser Artikel noch mit Codebeispielen für cc5x und ASM erweitert werden, des Weiteren kann man auch Beispiele für andere PICs der 10er, 12er, und 16er Kategorie einfügen.&lt;br /&gt;
&lt;br /&gt;
== Pinbelegung ==&lt;br /&gt;
[[Bild:PIC16F690-Pins.png|thumb|right|Pinbelegung des PIC16F690]]&lt;br /&gt;
Der PIC16F690 verfügt über eine grosse Anzahl an interner Pereferie beispielsweise 10-Bit AD-Wandler, SPI/I2C Interface, mehrere Timer (2*8-Bit 1*16-Bit), EUSART (RS232 etc.) usw.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
== Codebeispiele ==&lt;br /&gt;
----&lt;br /&gt;
=== Timer0 ===&lt;br /&gt;
==== Timer0 Hardware ====&lt;br /&gt;
[[Bild:Timer0-PIC16F690.png|thumb|right|Hardware Timer0 und WDT im PIC16F690]]&lt;br /&gt;
Der Timer0 ist ein 8-Bit Timer/Zähler, welcher entweder mit dem internen Takt des PIC oder mit einer externen Taktquelle am Pin 17 (RA2/T0CKI) Betrieben werden kann. Beim Betrieb mit einer externen Taktquelle kann man zusätzlich auswählen ob bei einer steigenden oder fallenden Flanke das Timerregister inkrementiert werden soll. Gleich welche Taktquelle gewählt wird, kann bei einem Überlauf des Timerregisters ein Interrupt ausgelöst werden. Hierfür ist es notwendig die Bits &#039;&#039;&#039;GIE&#039;&#039;&#039; und &#039;&#039;&#039;T0IE&#039;&#039;&#039; auf 1 zu setzen. Beide Bits befinden sich im &#039;&#039;&#039;INTCON&#039;&#039;&#039;-Register und sind im Datenblatt auf Seite 38 zu finden.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Im nebenstehendem Diagramm ist der aufbau des Timer0 zusammen mit dem Watchdogtimer dargestellt.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Im Option Register (&#039;&#039;&#039;OPTION&#039;&#039;&#039; Datenblatt Seite 83) kann mit Bit 5 (&#039;&#039;&#039;T0CS&#039;&#039;&#039;) ausgewählt werden ob der interne Takt (0) oder ein externer Takt (1) verwendet wird. Bei einem externen Takt kann mit Bit 4 (&#039;&#039;&#039;T0SE&#039;&#039;&#039;) auswählen ob bei einer steigenden (0) oder bei einer fallenden Flanke (1) das Timer0-Register inkrenemtiert werden soll. Mit Bit 3 (&#039;&#039;&#039;PSA&#039;&#039;&#039;) wird der Prescaler entweder dem Timer (0) &#039;&#039;&#039;oder&#039;&#039;&#039; dem Watchdogtimer (1) zugewiesen. Der Prescaler selbst wird mit den Bits 0 bis 2 (&#039;&#039;&#039;PS0 PS1 PS2&#039;&#039;&#039;) des Option Registers eingestellt.&amp;lt;br/&amp;gt;&lt;br /&gt;
Eine Übersicht der Einstellmöglichkeiten ist auf Seite 83 im Datenblatt einsehbar.&lt;br /&gt;
&lt;br /&gt;
==== Timer0 Codebeispiel mit Verwendung des Programmtaktes Fosc/4 ====&lt;br /&gt;
&#039;&#039;Szenario:&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC verwendet als Taktquelle einen 32,768 kHz Uhrenquarz.&amp;lt;br/&amp;gt;&lt;br /&gt;
An PORTB sind 8 LEDs mit Vorwiderständen gegen Masse verschaltet.&amp;lt;br/&amp;gt;&lt;br /&gt;
Jede Sekunde soll PORTB um den Wert 1 inkrementiert werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
Zu diesem Zweck wird der Timer0 mit Prescaler verwendet.&amp;lt;br/&amp;gt;&lt;br /&gt;
Die Einstellungen des Prescaler errechenen sich wie folgt:&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{Fosc}{4*Prescaler*2^8}= t \,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fosc/4 weil der PIC für eine Anweisung 4 Takte benötigt.&amp;lt;br/&amp;gt;&lt;br /&gt;
Der Prescaler als zusätzlicher Teiler des Timertaktes.&amp;lt;br/&amp;gt;&lt;br /&gt;
2^8 (256) Schritte benötigt der Timer 0 zum Überlauf.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{32768Hz}{4*2^8*32}= \frac {1}{Sek}\,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei einem Prescaler von 1:32 lösen wir somit exakt jede Sekunde einen Interrupt aus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
#include &amp;quot;htc.h&amp;quot;&lt;br /&gt;
__CONFIG (0x30e0);&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
static void interrupt global_int(void)&lt;br /&gt;
{&lt;br /&gt;
	GIE  = 0;		// Alle Interruptquellen ausschalten&lt;br /&gt;
	T0IF = 0;		// Timer0 Interruptflag Löschen&lt;br /&gt;
	PORTB++;		// PORTB inkrementieren&lt;br /&gt;
	GIE  = 1;		// Interrupts wieder einschalten&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void t0_ini ()&lt;br /&gt;
{&lt;br /&gt;
				// Datenblatt Seite 83&lt;br /&gt;
	OPTION 	= 0b11000100;		&lt;br /&gt;
		 // 1-------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // -1------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // --0-----	Internen Takt für Timer0 verwenden&lt;br /&gt;
		 // ---0----	Bei externem Takt an steigender Flanke inkrementieren&lt;br /&gt;
		 // 		(in diesem Fall egal ob 1 oder 0 weil der interne Takt verwendet wird)&lt;br /&gt;
		 // ----0---	Prescaler für Timer0 verwenden&lt;br /&gt;
		 // -----100	Prescaler 1:32&lt;br /&gt;
&lt;br /&gt;
	T0IF	= 0;		// Interruptflag von Timer0 löschen&lt;br /&gt;
	GIE 	= 1;		// Alle nichtmaskierten Interrupts erlauben&lt;br /&gt;
	T0IE 	= 1;		// Timer0 Interrupt erlauben&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
	ANSEL  = 0b00000000;		// Pins als digital I/O &lt;br /&gt;
	ANSELH = 0b00000000;		// Pins als digital I/O&lt;br /&gt;
	PORTA  = 0;			// Latch von Port A,B und C löschen&lt;br /&gt;
	PORTB  = 0;&lt;br /&gt;
	PORTC  = 0;&lt;br /&gt;
	TRISA  = 0b00000000;		// Port A,B und C als Ausgänge schalten&lt;br /&gt;
	TRISB  = 0b00000000;&lt;br /&gt;
	TRISC  = 0b00000000;&lt;br /&gt;
}&lt;br /&gt;
//========================================================================&lt;br /&gt;
void main ()&lt;br /&gt;
{&lt;br /&gt;
	setup();&lt;br /&gt;
	t0_ini();&lt;br /&gt;
&lt;br /&gt;
	while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
==== Timer0 Codebeispiel mit Verwendung eines externen Taktes ====&lt;br /&gt;
Der Code ist fast identisch, es wurden lediglich Änderungen im &#039;&#039;&#039;OPTION&#039;&#039;&#039;-Register vorgenommen und der Pin 17 (RA2) wurde als Eingang definiert. Weiters wurde der interne Oszillator mit 4MHz verwendet. &amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Der externe Takt kann nicht beliebig schnell sein. siehe Datenblatt Kapitel 5.1.5 Seite 82 und Kapitel 17 Seite 243. &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;Szenario&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC verwendet als Taktquelle den internen 4MHz Oszillator.&amp;lt;br/&amp;gt;&lt;br /&gt;
An PORTB sind 8 LEDs mit Vorwiderständen gegen Masse verschaltet.&amp;lt;br/&amp;gt;&lt;br /&gt;
PORTB soll bei jedem Timer0-Überlauf um den Wert 1 inkrementiert werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
Zu diesem Zweck wird der Timer0 mit Prescaler verwendet.&amp;lt;br/&amp;gt;&lt;br /&gt;
Die Einstellungen errechenen sich wie folgt:&amp;lt;br/&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{Takt_{T0CKI}}{Prescaler*2^8}= t \,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Gehen wir mal davon aus, dass der takt an T0CKI 100kHz beträgt und der Prescaler als 1:2 Vorteiler eingestellt ist. Somit läuft der Timer0 alle 512 Takte über.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{100kHz}{2*2^8}= \frac{195,3125}{Sek} \,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Bei diesen Einstellungen bekommen wir 195,3125 Timer0-Überläufe pro Sekunde was wiederum einem Zeitinterwall von 5,12ms entspricht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
#include &amp;quot;htc.h&amp;quot;&lt;br /&gt;
__CONFIG (0x30e4);&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
static void interrupt global_int(void)&lt;br /&gt;
{&lt;br /&gt;
	GIE  = 0;		// Alle Interruptquellen ausschalten&lt;br /&gt;
	T0IF = 0;		// Timer0 Interruptflag Löschen&lt;br /&gt;
	PORTB++;		// PORTB inkrementieren&lt;br /&gt;
	GIE  = 1;		// Interrupts wieder einschalten&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void t0_ini ()&lt;br /&gt;
{&lt;br /&gt;
				// Datenblatt Seite 83&lt;br /&gt;
	OPTION 	= 0b11000100;		&lt;br /&gt;
		 // 1-------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // -1------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // --1-----	Takt an T0CKI für Timer0 verwenden&lt;br /&gt;
		 // ---0----	Bei externem Takt an steigender Flanke inkrementieren&lt;br /&gt;
		 // ----0---	Prescaler für Timer0 verwenden&lt;br /&gt;
		 // -----000	Prescaler 1:2&lt;br /&gt;
&lt;br /&gt;
	T0IF	= 0;		// Interruptflag von Timer0 löschen&lt;br /&gt;
	GIE 	= 1;		// Alle nichtmaskierten Interrupts erlauben&lt;br /&gt;
	T0IE 	= 1;		// Timer0 Interrupt erlauben&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
	ANSEL  = 0b00000000;		// Pins als digital I/O &lt;br /&gt;
	ANSELH = 0b00000000;		// Pins als digital I/O&lt;br /&gt;
	PORTA  = 0;			// Latch von Port A,B und C löschen&lt;br /&gt;
	PORTB  = 0;&lt;br /&gt;
	PORTC  = 0;&lt;br /&gt;
	TRISA  = 0b00000100;		// RA2 als Eingang setzen und restliche Pins als &lt;br /&gt;
					// Ausgang setzen.&lt;br /&gt;
	TRISB  = 0b00000000;&lt;br /&gt;
	TRISC  = 0b00000000;&lt;br /&gt;
}&lt;br /&gt;
//========================================================================&lt;br /&gt;
void main ()&lt;br /&gt;
{&lt;br /&gt;
	setup();&lt;br /&gt;
	t0_ini();&lt;br /&gt;
&lt;br /&gt;
	while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Links zu Application Notes und weiterführenden Informationen zum Timer0 ====&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/51682A.pdf Microchip Timer Tutorial (Part 1)] PDF&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/51702A.pdf Microchip Timer Tutorial (Part 2)] PDF&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/31011a.pdf Microchip Timer0 Manual] PDF&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1824&amp;amp;appnote=en011033 AN592 Frequency Counter Using PIC16C5x]&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1824&amp;amp;appnote=en011031 AN590 A Clock Design Using the PIC16C54 for LED Displays and Switch Inputs]&lt;br /&gt;
* [http://www.sprut.de/electronic/pic/grund/timer/timer.htm#timer0 Erklärung zum Timer0 auf der Homepage von Sprut]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Timer1 ===&lt;br /&gt;
==== Timer1 Hardware ====&lt;br /&gt;
[[Bild:Timer1-PIC16F690.png|right|thumb|Hardware Timer1 im PIC16F690]]&lt;br /&gt;
Der Timer1 ist ein 16-Bit Timer/Zähler. Für den Timer1 gibt es viele Verwendungsmöglichkeiten auf Grund seiner zahlreichen Einstellmöglichkeiten. Man kann Ihn als einfachen Timer verwenden, wofür er eigentlich schon fast zu schade ist, oder als raffinierten Zähler, welcher erst bei einem bestimmten Ereignis wie z.B. dem auslösen des Komparators oder eines bestimmten zustandes am TG1-Pin (RA4/Pin 3) zu zählen beginnt.&amp;lt;br/&amp;gt;&lt;br /&gt;
die 16-Bit des Timers teilen sich auf zwei 8-Bit-Register auf, &#039;&#039;&#039;TMR1H&#039;&#039;&#039; und &#039;&#039;&#039;TMR1L&#039;&#039;&#039;. &#039;&#039;&#039;TMR1H&#039;&#039;&#039; beherbergt die oberen 8 Bit und &#039;&#039;&#039;TMR1L&#039;&#039;&#039; die unteren 8 Bit.&amp;lt;br/&amp;gt;&lt;br /&gt;
Der Timer1 wird zusätzlich noch vom CCP-Modul verwendet, insbesondere vom Capture- und vom Compare-Modul. Für das PWM-Modul wird der Timer2 als Zeitbasis verwendet.&lt;br /&gt;
&lt;br /&gt;
==== Timer1 Codebeispiel mit Verwendung des Programmtaktes Fosc/4 ====&lt;br /&gt;
&#039;&#039;Szenario&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC verwendet als Taktquelle den internen Oszilator mit 8MHz.&amp;lt;br/&amp;gt;&lt;br /&gt;
An PORTB sind 8 LEDs mit Vorwiderständen gegen Masse verschaltet.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
#include &amp;quot;htc.h&amp;quot;&lt;br /&gt;
__CONFIG (0x30e4);&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
static void interrupt global_int(void)&lt;br /&gt;
{&lt;br /&gt;
	GIE    = 0;		// Alle Interruptquellen ausschalten&lt;br /&gt;
	TMR1IF = 0;		// Timer1 Interruptflag Löschen&lt;br /&gt;
	PORTB++;		// PORTB inkrementieren&lt;br /&gt;
	GIE    = 1;		// Interrupts wieder einschalten&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void t1_ini ()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	TMR1IF	= 0;		// Interruptflag von Timer1 löschen+&lt;br /&gt;
&lt;br /&gt;
				// Datenblatt Seite 88&lt;br /&gt;
	T1CON 	= 0b00110000;		&lt;br /&gt;
		 // 0-------	Timer1 Gate-invertier-Bit (in diesem Beispiel uninteressant)&lt;br /&gt;
		 // -0------	Timer1 Gate-enable-Bit (auf 0 gesetzt sodass der timer1 &lt;br /&gt;
		 //		mit dem TMR1ON-Bit direkt ein und ausgeschaltet werden kann&lt;br /&gt;
		 // --11----	Prescaler auf 1:8 einstellen&lt;br /&gt;
		 // ----0---	Low Power Oszillator aus&lt;br /&gt;
		 // -----0--	(in diesem Beispiel uninteressant weil Bit 1 == 0)&lt;br /&gt;
		 // ------0-	interen Takt verwenden&lt;br /&gt;
		 // -------1	Timer1 einschalten&lt;br /&gt;
&lt;br /&gt;
	GIE 	= 1;		// Alle nichtmaskierten Interrupts erlauben&lt;br /&gt;
	PEIE 	= 1;		// Pereferieinterrupt erlauben&lt;br /&gt;
				// Die Bits GIE und PEIE befinden sich in INTCON Register&lt;br /&gt;
				// und sind im Datenblatt auf Seite 38 erläutert.&lt;br /&gt;
	TMR1IE 	= 1;		// Timer1 Interrupt erlauben&lt;br /&gt;
				// Das TMR1IE-Bit ist im ist im PIE1 Register&lt;br /&gt;
				// und im Datenblatt auf Seite 39&lt;br /&gt;
}&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
	OSCCON = 0b01110000;		// 8 MHz Datenblatt Seite 48&lt;br /&gt;
	ANSEL  = 0b00000000;		// Pins als digital I/O &lt;br /&gt;
	ANSELH = 0b00000000;		// Pins als digital I/O&lt;br /&gt;
	PORTA  = 0;			// Latch von Port A,B und C löschen&lt;br /&gt;
	PORTB  = 0;&lt;br /&gt;
	PORTC  = 0;&lt;br /&gt;
	TRISA  = 0b00000000;		// Port A,B und C als Ausgänge schalten&lt;br /&gt;
	TRISB  = 0b00000000;&lt;br /&gt;
	TRISC  = 0b00000000;&lt;br /&gt;
}&lt;br /&gt;
//========================================================================&lt;br /&gt;
void main ()&lt;br /&gt;
{&lt;br /&gt;
	setup();&lt;br /&gt;
	t1_ini();&lt;br /&gt;
&lt;br /&gt;
	while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
==== Links zu Application Notes und weiterführenden Informationen zum Timer1 ====&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/31012a.pdf Microchip Timer1 Manual] PDF&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1824&amp;amp;appnote=en011055 AN580 Using Timer 1 in Asynchronous Clock Mode]&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1824&amp;amp;appnote=en011057 AN582 Low-Power Real Time Clock]&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1824&amp;amp;appnote=en011068 AN649 Yet Another Clock Featuring the PIC16C924]&lt;br /&gt;
* [http://www.sprut.de/electronic/pic/grund/timer/timer.htm#timer1 Erklärung zum Timer0 auf der Homepage von Sprut]&lt;br /&gt;
----&lt;br /&gt;
=== Timer2 ===&lt;br /&gt;
==== Timer2 Hardware ====&lt;br /&gt;
[[Bild:Timer2-PIC16F690.png|right|thumb|Hardware Timer2 im PIC16F690]]&lt;br /&gt;
Der Timer2 ist ein 8-Bit Timer. Mit dem Timer2 lässt sich nahezu jede Zeitbasis einstellen da er über einen Prescaler von 1:1, 1:4, 1:16 und über einen Postscaler von 1:1 bis 1:16 verfügt. Des Weiteren verfügt der Timer2 über einen Comparator, welcher kontinuirlich den Wert des Timer2-Registers und des PR2-Registers vergleicht und bei Übereinstimmung einen Takt an den Postscaler weiter gibt. Wenn der Postscaler überläuft wird ein Timer2 Interrupt ausgelöst.&amp;lt;br/&amp;gt;&lt;br /&gt;
Der Timer2 wird vom CCP-Modul für die PWM verwendet ist somit nicht immer frei zur verfügung.&lt;br /&gt;
==== Timer2 Codebeispiel ====&lt;br /&gt;
==== Links zu Application Notes und weiterführenden Informationen zum Timer2 ====&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/31013a.pdf Microchip Timer2 Manual] PDF&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1824&amp;amp;appnote=en011064 AN549 Using the CCP Module(s)]&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1824&amp;amp;appnote=en011108 AN600 Air Flow Control Using Fuzzy Logic]&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1824&amp;amp;appnote=en011118 AN643 Adaptive Differential Pulse Code Modulation using the PIC16/17]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== AD-Wandler ===&lt;br /&gt;
==== AD-Wandler Hardware ====&lt;br /&gt;
[[Bild:AD-Wandler-PIC16F690.png|right|thumb|Hardware AD-Wandler im PIC16F690]]&lt;br /&gt;
==== AD-Wandler Codebeispiel ====&lt;br /&gt;
==== Links zu Application Notes und weiterführenden Informationen zum AD-Wandler ====&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/31023a.pdf Microchip ADC Manual] PDF&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Comparator ===&lt;br /&gt;
==== Comparator Hardware ====&lt;br /&gt;
==== Comparator Codebeispiel ====&lt;br /&gt;
==== Links zu Application Notes und weiterführenden Informationen zum Comparator-Modul ====&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/31020a.pdf Microchip Comparator Manual] PDF&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== CCP-Modul (Compare/Capture/PWM) ===&lt;br /&gt;
==== Compare Hardware ====&lt;br /&gt;
==== Compare Codebeispiel ====&lt;br /&gt;
==== PWM Hardware ====&lt;br /&gt;
==== Capture Hardware ====&lt;br /&gt;
==== Capture Codebeispiel ====&lt;br /&gt;
[[Bild:PWM-PIC16F690.png|thumb|right|Hardware PWM im PIC16F690]]&lt;br /&gt;
==== PWM Codebeispiel ====&lt;br /&gt;
==== Links zu Application Notes und weiterführenden Informationen zum CCP-Modul ====&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/31014a.pdf Microchip CCP Manual] PDF&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== EUSART ===&lt;br /&gt;
==== EUSART Hardware ====&lt;br /&gt;
[[Bild:EUSART-TX-PIC16F690.png|thumb|right|Hardware EUSART im PIC16F690]]&lt;br /&gt;
[[Bild:EUSART-RX-PIC16F690.png|thumb|right|Hardware EUSART im PIC16F690]]&lt;br /&gt;
==== EUSART TX Codebeispiel ====&lt;br /&gt;
==== EUSART RX Codebeispiel ====&lt;br /&gt;
==== Links zu Application Notes und weiterführenden Informationen zum EUSART-Modul ====&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/31018a.pdf Microchip USART Manual] PDF&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1824&amp;amp;appnote=en011091 AN547 Serial Port Utilities Implementing Table Read and Table Write]&lt;br /&gt;
* [http://www.microchip.com/Stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1824&amp;amp;appnote=en020584 AN964 Using the EUSART on the PIC16F688]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== SSP-Modul (Synchronous Serial Port) ===&lt;br /&gt;
==== SPI Hardware ====&lt;br /&gt;
[[Bild:SPI-PIC16F690.png|thumb|right|Hardware SPI im PIC16F690]]&lt;br /&gt;
==== SPI Codebeispiel ====&lt;br /&gt;
==== I2C Hardware ====&lt;br /&gt;
[[Bild:I2C-PIC16F690.png|thumb|right|Hardware I2C im PIC16F690]]&lt;br /&gt;
==== I2C Codebeispiel ====&lt;br /&gt;
==== Links zu Application Notes und weiterführenden Informationen zum SSP-Modul ====&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/31015a.pdf Microchip SSP Manual] PDF&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/31017a.pdf Microchip MSSP Manual] PDF&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1824&amp;amp;appnote=en011051 AN578 Use of the SSP Module in the IIC Multi-Master Environment]&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1824&amp;amp;appnote=en011043 AN554 Software Implementation of I²C Bus Master]&lt;br /&gt;
* [http://www.microchip.com/Stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1824&amp;amp;appnote=en011798 AN734 Using the PICmicro SSP for Slave I2C Communication]&lt;br /&gt;
* [http://www.microchip.com/Stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1824&amp;amp;appnote=en011810 AN736 An I2C Network Protocol for Environmental Monitoring]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.microchip.com Homepage Microchip]&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/33023a.pdf Microchip Mid-Range Reference Manual] PDF&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplgidcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1335&amp;amp;dDocName=en023112 Produktseite PIC16F690]&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/41262E.pdf Datenblatt PIC16F690] PDF&lt;br /&gt;
* [http://www.htsoft.com HiTech Software]&lt;br /&gt;
* [http://www.sprut.de Sprut -&amp;gt; DIE deutschsprachige Seite zum Thema PIC]&lt;br /&gt;
* ...&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
* Den Code auf dieser Seite &amp;quot;einklappbar&amp;quot; machen, sodass nicht ewig weit gescrollt werden muss&lt;br /&gt;
* Die Bilder neu malen wegen eventuellem Copyright-Schnickschnack&lt;br /&gt;
* Timer1&lt;br /&gt;
: Codebeispiel mit externer Taktquelle&lt;br /&gt;
: Codebeispiel mit externem Quarz&lt;br /&gt;
: Codebeispiel mit T1G als Zählbeginn/ende&lt;br /&gt;
: Codebeispiel mit Comparator als Zählbeginn/ende&lt;br /&gt;
: Codebeispiel mit Synchronem Zähler&lt;br /&gt;
* Timer2&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
* AD-Wandler&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
: Codebeispiel mehrere Kanäle&lt;br /&gt;
* CCP-Modul&lt;br /&gt;
: PWM&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
* Komparator&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
* Eusart&lt;br /&gt;
: Erklärung Hardware RX&lt;br /&gt;
: Erklärung Hardware TX&lt;br /&gt;
: Codebeispiel RX&lt;br /&gt;
: Codebeispiel TX&lt;br /&gt;
: Codebeispiel RX-TX&lt;br /&gt;
: SPI&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel senden &lt;br /&gt;
: Codebeispiel empfangen&lt;br /&gt;
: I2C&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel senden &lt;br /&gt;
: Codebeispiel empfangen&lt;br /&gt;
* Brown Out Reset&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
* EEPROM&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Wettbewerb|P]]&lt;br /&gt;
[[Category:PIC|P]]&lt;/div&gt;</summary>
		<author><name>Thomas1123</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=PIC_Codebeispiele&amp;diff=28812</id>
		<title>PIC Codebeispiele</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=PIC_Codebeispiele&amp;diff=28812"/>
		<updated>2008-06-28T12:20:01Z</updated>

		<summary type="html">&lt;p&gt;Thomas1123: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt; &#039;&#039;&#039;Diese Seite ist noch in Bearbeitung. Die Codebeispiele sind noch nicht vollständig bzw. korrekt. Ich gelobe jedoch Besserung bis zum 15.8.08&#039;&#039;&#039; &amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;von [[Benutzer:Thomas1123|Thomas1123]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ich persönlich benutze den Hitech PIC-C Lite Compiler für meine Projekte.&amp;lt;br/&amp;gt;&lt;br /&gt;
Hierbei handelt es sich um die abgespeckte Version des Hitech PIC-C Compilers von der Firma HiTech Software.&amp;lt;br/&amp;gt;&lt;br /&gt;
Ich möchte hier eine Sammlung von Codebeispielen beginnen mit der es Einsteigern ermöglicht wird verschiedene interne und externe Pereferie zu initialiesieren und zu benutzen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Da der [http://www.microchip.com/stellent/idcplgidcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1335&amp;amp;dDocName=en023112 PIC16F690] mein persönlicher Liebling ist möchte ich die hier gezeigten Beispiele anhand dieses PICs aufzeigen. Die nachfolgenden Beispiele sind nicht nur für den PIC16F690 vewendbar z.B. sind die Timer0-Module in vielen Pics identisch. Dies trifft auch auf die meisten anderen Module zu jedoch kann ein zusätzlicher Blick in das Datenblatt nich schaden, da eventuell mache Register einen anderen Namen besitzen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Selbstverständlich kann dieser Artikel noch mit Codebeispielen für cc5x und ASM erweitert werden, des Weiteren kann man auch Beispiele für andere PICs der 10er, 12er, und 16er Kategorie einfügen.&lt;br /&gt;
&lt;br /&gt;
== Pinbelegung ==&lt;br /&gt;
[[Bild:PIC16F690-Pins.png|thumb|right|Pinbelegung des PIC16F690]]&lt;br /&gt;
Der PIC16F690 verfügt über eine grosse Anzahl an interner Pereferie beispielsweise 10-Bit AD-Wandler, SPI/I2C Interface, mehrere Timer (2*8-Bit 1*16-Bit), EUSART (RS232 etc.) usw.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
== Codebeispiele ==&lt;br /&gt;
----&lt;br /&gt;
=== Timer0 ===&lt;br /&gt;
==== Timer0 Hardware ====&lt;br /&gt;
[[Bild:Timer0-PIC16F690.png|thumb|right|Hardware Timer0 und WDT im PIC16F690]]&lt;br /&gt;
Der Timer0 ist ein 8-Bit Timer/Zähler, welcher entweder mit dem internen Takt des PIC oder mit einer externen Taktquelle am Pin 17 (RA2/T0CKI) Betrieben werden kann. Beim Betrieb mit einer externen Taktquelle kann man zusätzlich auswählen ob bei einer steigenden oder fallenden Flanke das Timerregister inkrementiert werden soll. Gleich welche Taktquelle gewählt wird, kann bei einem Überlauf des Timerregisters ein Interrupt ausgelöst werden. Hierfür ist es notwendig die Bits &#039;&#039;&#039;GIE&#039;&#039;&#039; und &#039;&#039;&#039;T0IE&#039;&#039;&#039; auf 1 zu setzen. Beide Bits befinden sich im &#039;&#039;&#039;INTCON&#039;&#039;&#039;-Register und sind im Datenblatt auf Seite 38 zu finden.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Im nebenstehendem Diagramm ist der aufbau des Timer0 zusammen mit dem Watchdogtimer dargestellt.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Im Option Register (&#039;&#039;&#039;OPTION&#039;&#039;&#039; Datenblatt Seite 83) kann mit Bit 5 (&#039;&#039;&#039;T0CS&#039;&#039;&#039;) ausgewählt werden ob der interne Takt (0) oder ein externer Takt (1) verwendet wird. Bei einem externen Takt kann mit Bit 4 (&#039;&#039;&#039;T0SE&#039;&#039;&#039;) auswählen ob bei einer steigenden (0) oder bei einer fallenden Flanke (1) das Timer0-Register inkrenemtiert werden soll. Mit Bit 3 (&#039;&#039;&#039;PSA&#039;&#039;&#039;) wird der Prescaler entweder dem Timer (0) &#039;&#039;&#039;oder&#039;&#039;&#039; dem Watchdogtimer (1) zugewiesen. Der Prescaler selbst wird mit den Bits 0 bis 2 (&#039;&#039;&#039;PS0 PS1 PS2&#039;&#039;&#039;) des Option Registers eingestellt.&amp;lt;br/&amp;gt;&lt;br /&gt;
Eine Übersicht der Einstellmöglichkeiten ist auf Seite 83 im Datenblatt einsehbar.&lt;br /&gt;
&lt;br /&gt;
==== Timer0 Codebeispiel mit Verwendung des Programmtaktes Fosc/4 ====&lt;br /&gt;
&#039;&#039;Szenario:&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC verwendet als Taktquelle einen 32,768 kHz Uhrenquarz.&amp;lt;br/&amp;gt;&lt;br /&gt;
An PORTB sind 8 LEDs mit Vorwiderständen gegen Masse verschaltet.&amp;lt;br/&amp;gt;&lt;br /&gt;
Jede Sekunde soll PORTB um den Wert 1 inkrementiert werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
Zu diesem Zweck wird der Timer0 mit Prescaler verwendet.&amp;lt;br/&amp;gt;&lt;br /&gt;
Die Einstellungen des Prescaler errechenen sich wie folgt:&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{Fosc}{4*Prescaler*2^8}= t \,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fosc/4 weil der PIC für eine Anweisung 4 Takte benötigt.&amp;lt;br/&amp;gt;&lt;br /&gt;
Der Prescaler als zusätzlicher Teiler des Timertaktes.&amp;lt;br/&amp;gt;&lt;br /&gt;
2^8 (256) Schritte benötigt der Timer 0 zum Überlauf.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{32768Hz}{4*2^8*32}= \frac {1}{Sek}\,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei einem Prescaler von 1:32 lösen wir somit exakt jede Sekunde einen Interrupt aus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
#include &amp;quot;htc.h&amp;quot;&lt;br /&gt;
__CONFIG (0x30e0);&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
static void interrupt global_int(void)&lt;br /&gt;
{&lt;br /&gt;
	GIE  = 0;		// Alle Interruptquellen ausschalten&lt;br /&gt;
	T0IF = 0;		// Timer0 Interruptflag Löschen&lt;br /&gt;
	PORTB++;		// PORTB inkrementieren&lt;br /&gt;
	GIE  = 1;		// Interrupts wieder einschalten&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void t0_ini ()&lt;br /&gt;
{&lt;br /&gt;
				// Datenblatt Seite 83&lt;br /&gt;
	OPTION 	= 0b11000100;		&lt;br /&gt;
		 // 1-------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // -1------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // --0-----	Internen Takt für Timer0 verwenden&lt;br /&gt;
		 // ---0----	Bei externem Takt an steigender Flanke inkrementieren&lt;br /&gt;
		 // 		(in diesem Fall egal ob 1 oder 0 weil der interne Takt verwendet wird)&lt;br /&gt;
		 // ----0---	Prescaler für Timer0 verwenden&lt;br /&gt;
		 // -----100	Prescaler 1:32&lt;br /&gt;
&lt;br /&gt;
	T0IF	= 0;		// Interruptflag von Timer0 löschen&lt;br /&gt;
	GIE 	= 1;		// Alle nichtmaskierten Interrupts erlauben&lt;br /&gt;
	T0IE 	= 1;		// Timer0 Interrupt erlauben&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
	ANSEL  = 0b00000000;		// Pins als digital I/O &lt;br /&gt;
	ANSELH = 0b00000000;		// Pins als digital I/O&lt;br /&gt;
	PORTA  = 0;			// Latch von Port A,B und C löschen&lt;br /&gt;
	PORTB  = 0;&lt;br /&gt;
	PORTC  = 0;&lt;br /&gt;
	TRISA  = 0b00000000;		// Port A,B und C als Ausgänge schalten&lt;br /&gt;
	TRISB  = 0b00000000;&lt;br /&gt;
	TRISC  = 0b00000000;&lt;br /&gt;
}&lt;br /&gt;
//========================================================================&lt;br /&gt;
void main ()&lt;br /&gt;
{&lt;br /&gt;
	setup();&lt;br /&gt;
	t0_ini();&lt;br /&gt;
&lt;br /&gt;
	while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
==== Timer0 Codebeispiel mit Verwendung eines externen Taktes ====&lt;br /&gt;
Der Code ist fast identisch, es wurden lediglich Änderungen im &#039;&#039;&#039;OPTION&#039;&#039;&#039;-Register vorgenommen und der Pin 17 (RA2) wurde als Eingang definiert. Weiters wurde der interne Oszillator mit 4MHz verwendet. &amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Der externe Takt kann nicht beliebig schnell sein. siehe Datenblatt Kapitel 5.1.5 Seite 82 und Kapitel 17 Seite 243. &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;Szenario&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC verwendet als Taktquelle den internen 4MHz Oszillator.&amp;lt;br/&amp;gt;&lt;br /&gt;
An PORTB sind 8 LEDs mit Vorwiderständen gegen Masse verschaltet.&amp;lt;br/&amp;gt;&lt;br /&gt;
PORTB soll bei jedem Timer0-Überlauf um den Wert 1 inkrementiert werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
Zu diesem Zweck wird der Timer0 mit Prescaler verwendet.&amp;lt;br/&amp;gt;&lt;br /&gt;
Die Einstellungen errechenen sich wie folgt:&amp;lt;br/&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{Takt_{T0CKI}}{Prescaler*2^8}= t \,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Gehen wir mal davon aus, dass der takt an T0CKI 100kHz beträgt und der Prescaler als 1:2 Vorteiler eingestellt ist. Somit läuft der Timer0 alle 512 Takte über.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{100kHz}{2*2^8}= \frac{195,3125}{Sek} \,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Bei diesen Einstellungen bekommen wir 195,3125 Timer0-Überläufe pro Sekunde was wiederum einem Zeitinterwall von 5,12ms entspricht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
#include &amp;quot;htc.h&amp;quot;&lt;br /&gt;
__CONFIG (0x30e4);&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
static void interrupt global_int(void)&lt;br /&gt;
{&lt;br /&gt;
	GIE  = 0;		// Alle Interruptquellen ausschalten&lt;br /&gt;
	T0IF = 0;		// Timer0 Interruptflag Löschen&lt;br /&gt;
	PORTB++;		// PORTB inkrementieren&lt;br /&gt;
	GIE  = 1;		// Interrupts wieder einschalten&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void t0_ini ()&lt;br /&gt;
{&lt;br /&gt;
				// Datenblatt Seite 83&lt;br /&gt;
	OPTION 	= 0b11000100;		&lt;br /&gt;
		 // 1-------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // -1------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // --1-----	Takt an T0CKI für Timer0 verwenden&lt;br /&gt;
		 // ---0----	Bei externem Takt an steigender Flanke inkrementieren&lt;br /&gt;
		 // ----0---	Prescaler für Timer0 verwenden&lt;br /&gt;
		 // -----000	Prescaler 1:2&lt;br /&gt;
&lt;br /&gt;
	T0IF	= 0;		// Interruptflag von Timer0 löschen&lt;br /&gt;
	GIE 	= 1;		// Alle nichtmaskierten Interrupts erlauben&lt;br /&gt;
	T0IE 	= 1;		// Timer0 Interrupt erlauben&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
	ANSEL  = 0b00000000;		// Pins als digital I/O &lt;br /&gt;
	ANSELH = 0b00000000;		// Pins als digital I/O&lt;br /&gt;
	PORTA  = 0;			// Latch von Port A,B und C löschen&lt;br /&gt;
	PORTB  = 0;&lt;br /&gt;
	PORTC  = 0;&lt;br /&gt;
	TRISA  = 0b00000100;		// RA2 als Eingang setzen und restliche Pins als &lt;br /&gt;
					// Ausgang setzen.&lt;br /&gt;
	TRISB  = 0b00000000;&lt;br /&gt;
	TRISC  = 0b00000000;&lt;br /&gt;
}&lt;br /&gt;
//========================================================================&lt;br /&gt;
void main ()&lt;br /&gt;
{&lt;br /&gt;
	setup();&lt;br /&gt;
	t0_ini();&lt;br /&gt;
&lt;br /&gt;
	while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Links zu Application Notes und weiterführenden Informationen zum Timer0 ====&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/51682A.pdf Microchip Timer Tutorial (Part 1)] PDF&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/51702A.pdf Microchip Timer Tutorial (Part 2)] PDF&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/31011a.pdf Microchip Timer0 Manual] PDF&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1824&amp;amp;appnote=en011033 AN592 Frequency Counter Using PIC16C5x]&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1824&amp;amp;appnote=en011031 AN590 A Clock Design Using the PIC16C54 for LED Displays and Switch Inputs]&lt;br /&gt;
* [http://www.sprut.de/electronic/pic/grund/timer/timer.htm#timer0 Erklärung zum Timer0 auf der Homepage von Sprut]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Timer1 ===&lt;br /&gt;
==== Timer1 Hardware ====&lt;br /&gt;
[[Bild:Timer1-PIC16F690.png|right|thumb|Hardware Timer1 im PIC16F690]]&lt;br /&gt;
Der Timer1 ist ein 16-Bit Timer/Zähler. Für den Timer1 gibt es viele Verwendungsmöglichkeiten auf Grund seiner zahlreichen Einstellmöglichkeiten. Man kann Ihn als einfachen Timer verwenden, wofür er eigentlich schon fast zu schade ist, oder als raffinierten Zähler, welcher erst bei einem bestimmten Ereignis wie z.B. dem auslösen des Komparators oder eines bestimmten zustandes am TG1-Pin (RA4/Pin 3) zu zählen beginnt.&amp;lt;br/&amp;gt;&lt;br /&gt;
die 16-Bit des Timers teilen sich auf zwei 8-Bit-Register auf, &#039;&#039;&#039;TMR1H&#039;&#039;&#039; und &#039;&#039;&#039;TMR1L&#039;&#039;&#039;. &#039;&#039;&#039;TMR1H&#039;&#039;&#039; beherbergt die oberen 8 Bit und &#039;&#039;&#039;TMR1L&#039;&#039;&#039; die unteren 8 Bit.&amp;lt;br/&amp;gt;&lt;br /&gt;
Der Timer1 wird zusätzlich noch vom CCP-Modul verwendet, insbesondere vom Capture- und vom Compare-Modul. Für das PWM-Modul wird der Timer2 als Zeitbasis verwendet.&lt;br /&gt;
&lt;br /&gt;
==== Timer1 Codebeispiel mit Verwendung des Programmtaktes Fosc/4 ====&lt;br /&gt;
&#039;&#039;Szenario&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC verwendet als Taktquelle den internen Oszilator mit 8MHz.&amp;lt;br/&amp;gt;&lt;br /&gt;
An PORTB sind 8 LEDs mit Vorwiderständen gegen Masse verschaltet.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
#include &amp;quot;htc.h&amp;quot;&lt;br /&gt;
__CONFIG (0x30e4);&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
static void interrupt global_int(void)&lt;br /&gt;
{&lt;br /&gt;
	GIE    = 0;		// Alle Interruptquellen ausschalten&lt;br /&gt;
	TMR1IF = 0;		// Timer1 Interruptflag Löschen&lt;br /&gt;
	PORTB++;		// PORTB inkrementieren&lt;br /&gt;
	GIE    = 1;		// Interrupts wieder einschalten&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void t1_ini ()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	TMR1IF	= 0;		// Interruptflag von Timer1 löschen+&lt;br /&gt;
&lt;br /&gt;
				// Datenblatt Seite 88&lt;br /&gt;
	T1CON 	= 0b00110000;		&lt;br /&gt;
		 // 0-------	Timer1 Gate-invertier-Bit (in diesem Beispiel uninteressant)&lt;br /&gt;
		 // -0------	Timer1 Gate-enable-Bit (auf 0 gesetzt sodass der timer1 &lt;br /&gt;
		 //		mit dem TMR1ON-Bit direkt ein und ausgeschaltet werden kann&lt;br /&gt;
		 // --11----	Prescaler auf 1:8 einstellen&lt;br /&gt;
		 // ----0---	Low Power Oszillator aus&lt;br /&gt;
		 // -----0--	(in diesem Beispiel uninteressant weil Bit 1 == 0)&lt;br /&gt;
		 // ------0-	interen Takt verwenden&lt;br /&gt;
		 // -------1	Timer1 einschalten&lt;br /&gt;
&lt;br /&gt;
	GIE 	= 1;		// Alle nichtmaskierten Interrupts erlauben&lt;br /&gt;
	PEIE 	= 1;		// Pereferieinterrupt erlauben&lt;br /&gt;
				// Die Bits GIE und PEIE befinden sich in INTCON Register&lt;br /&gt;
				// und sind im Datenblatt auf Seite 38 erläutert.&lt;br /&gt;
	TMR1IE 	= 1;		// Timer1 Interrupt erlauben&lt;br /&gt;
				// Das TMR1IE-Bit ist im ist im PIE1 Register&lt;br /&gt;
				// und im Datenblatt auf Seite 39&lt;br /&gt;
}&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
	OSCCON = 0b01110000;		// 8 MHz Datenblatt Seite 48&lt;br /&gt;
	ANSEL  = 0b00000000;		// Pins als digital I/O &lt;br /&gt;
	ANSELH = 0b00000000;		// Pins als digital I/O&lt;br /&gt;
	PORTA  = 0;			// Latch von Port A,B und C löschen&lt;br /&gt;
	PORTB  = 0;&lt;br /&gt;
	PORTC  = 0;&lt;br /&gt;
	TRISA  = 0b00000000;		// Port A,B und C als Ausgänge schalten&lt;br /&gt;
	TRISB  = 0b00000000;&lt;br /&gt;
	TRISC  = 0b00000000;&lt;br /&gt;
}&lt;br /&gt;
//========================================================================&lt;br /&gt;
void main ()&lt;br /&gt;
{&lt;br /&gt;
	setup();&lt;br /&gt;
	t1_ini();&lt;br /&gt;
&lt;br /&gt;
	while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
==== Links zu Application Notes und weiterführenden Informationen zum Timer1 ====&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/31012a.pdf Microchip Timer1 Manual] PDF&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1824&amp;amp;appnote=en011055 AN580 Using Timer 1 in Asynchronous Clock Mode]&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1824&amp;amp;appnote=en011057 AN582 Low-Power Real Time Clock]&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1824&amp;amp;appnote=en011068 AN649 Yet Another Clock Featuring the PIC16C924]&lt;br /&gt;
* [http://www.sprut.de/electronic/pic/grund/timer/timer.htm#timer1 Erklärung zum Timer0 auf der Homepage von Sprut]&lt;br /&gt;
----&lt;br /&gt;
=== Timer2 ===&lt;br /&gt;
==== Timer2 Hardware ====&lt;br /&gt;
[[Bild:Timer2-PIC16F690.png|right|thumb|Hardware Timer2 im PIC16F690]]&lt;br /&gt;
Der Timer2 ist ein 8-Bit Timer. Mit dem Timer2 lässt sich nahezu jede Zeitbasis einstellen da er über einen Prescaler von 1:1, 1:4, 1:16 und über einen Postscaler von 1:1 bis 1:16 verfügt. Des Weiteren verfügt der Timer2 über einen Comparator, welcher kontinuirlich den Wert des Timer2-Registers und des PR2-Registers vergleicht und bei Übereinstimmung einen Takt an den Postscaler weiter gibt. Wenn der Postscaler überläuft wird ein Timer2 Interrupt ausgelöst.&amp;lt;br/&amp;gt;&lt;br /&gt;
Der Timer2 wird vom CCP-Modul für die PWM verwendet ist somit nicht immer frei zur verfügung.&lt;br /&gt;
==== Timer2 Codebeispiel ====&lt;br /&gt;
==== Links zu Application Notes und weiterführenden Informationen zum Timer2 ====&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/31013a.pdf Microchip Timer2 Manual] PDF&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1824&amp;amp;appnote=en011064 AN549 Using the CCP Module(s)]&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1824&amp;amp;appnote=en011108 AN600 Air Flow Control Using Fuzzy Logic]&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1824&amp;amp;appnote=en011118 AN643 Adaptive Differential Pulse Code Modulation using the PIC16/17]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== AD-Wandler ===&lt;br /&gt;
==== AD-Wandler Hardware ====&lt;br /&gt;
[[Bild:AD-Wandler-PIC16F690.png|right|thumb|Hardware AD-Wandler im PIC16F690]]&lt;br /&gt;
==== AD-Wandler Codebeispiel ====&lt;br /&gt;
==== Links zu Application Notes und weiterführenden Informationen zum AD-Wandler ====&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/31023a.pdf Microchip ADC Manual] PDF&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Comparator ===&lt;br /&gt;
==== Comparator Hardware ====&lt;br /&gt;
==== Comparator Codebeispiel ====&lt;br /&gt;
==== Links zu Application Notes und weiterführenden Informationen zum Comparator-Modul ====&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/31020a.pdf Microchip Comparator Manual] PDF&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== CCP-Modul (Compare/Capture/PWM) ===&lt;br /&gt;
==== Compare Hardware ====&lt;br /&gt;
==== Compare Codebeispiel ====&lt;br /&gt;
==== PWM Hardware ====&lt;br /&gt;
==== Capture Hardware ====&lt;br /&gt;
==== Capture Codebeispiel ====&lt;br /&gt;
[[Bild:PWM-PIC16F690.png|thumb|right|Hardware PWM im PIC16F690]]&lt;br /&gt;
==== PWM Codebeispiel ====&lt;br /&gt;
==== Links zu Application Notes und weiterführenden Informationen zum CCP-Modul ====&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/31014a.pdf Microchip CCP Manual] PDF&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== EUSART ===&lt;br /&gt;
==== EUSART Hardware ====&lt;br /&gt;
[[Bild:EUSART-TX-PIC16F690.png|thumb|right|Hardware EUSART im PIC16F690]]&lt;br /&gt;
[[Bild:EUSART-RX-PIC16F690.png|thumb|right|Hardware EUSART im PIC16F690]]&lt;br /&gt;
==== EUSART TX Codebeispiel ====&lt;br /&gt;
==== EUSART RX Codebeispiel ====&lt;br /&gt;
==== Links zu Application Notes und weiterführenden Informationen zum EUSART-Modul ====&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/31018a.pdf Microchip USART Manual] PDF&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1824&amp;amp;appnote=en011091 AN547 Serial Port Utilities Implementing Table Read and Table Write]&lt;br /&gt;
* [http://www.microchip.com/Stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1824&amp;amp;appnote=en020584 AN964 Using the EUSART on the PIC16F688]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== SSP-Modul (Synchronous Serial Port) ===&lt;br /&gt;
==== SPI Hardware ====&lt;br /&gt;
[[Bild:SPI-PIC16F690.png|thumb|right|Hardware SPI im PIC16F690]]&lt;br /&gt;
==== SPI Codebeispiel ====&lt;br /&gt;
==== I2C Hardware ====&lt;br /&gt;
[[Bild:I2C-PIC16F690.png|thumb|right|Hardware I2C im PIC16F690]]&lt;br /&gt;
==== I2C Codebeispiel ====&lt;br /&gt;
==== Links zu Application Notes und weiterführenden Informationen zum SSP-Modul ====&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/31015a.pdf Microchip SSP Manual] PDF&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/31017a.pdf Microchip MSSP Manual] PDF&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1824&amp;amp;appnote=en011051 AN578 Use of the SSP Module in the IIC Multi-Master Environment]&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1824&amp;amp;appnote=en011043 AN554 Software Implementation of I²C Bus Master]&lt;br /&gt;
* [http://www.microchip.com/Stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1824&amp;amp;appnote=en011798 AN734 Using the PICmicro SSP for Slave I2C Communication]&lt;br /&gt;
* [http://www.microchip.com/Stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1824&amp;amp;appnote=en011810 AN736 An I2C Network Protocol for Environmental Monitoring]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.microchip.com Homepage Microchip]&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/33023a.pdf Microchip Mid-Range Reference Manual] PDF&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplgidcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1335&amp;amp;dDocName=en023112 Produktseite PIC16F690]&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/41262E.pdf Datenblatt PIC16F690] PDF&lt;br /&gt;
* [http://www.htsoft.com HiTech Software]&lt;br /&gt;
* [http://www.sprut.de Sprut -&amp;gt; DIE deutschsprachige Seite zum Thema PIC]&lt;br /&gt;
* ...&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
* Den Code auf dieser Seite &amp;quot;einklappbar&amp;quot; machen, sodass nicht ewig weit gescrollt werden muss&lt;br /&gt;
* Die Bilder neu malen wegen eventuellem Copyright-Schnickschnack&lt;br /&gt;
* Timer1&lt;br /&gt;
: Codebeispiel mit externer Taktquelle&lt;br /&gt;
: Codebeispiel mit externem Quarz&lt;br /&gt;
: Codebeispiel mit T1G als Zählbeginn/ende&lt;br /&gt;
: Codebeispiel mit Comparator als Zählbeginn/ende&lt;br /&gt;
: Codebeispiel mit Synchronem Zähler&lt;br /&gt;
* Timer2&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
* AD-Wandler&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
: Codebeispiel mehrere Kanäle&lt;br /&gt;
* CCP-Modul&lt;br /&gt;
: PWM&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
* Komparator&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
* Eusart&lt;br /&gt;
: Erklärung Hardware RX&lt;br /&gt;
: Erklärung Hardware TX&lt;br /&gt;
: Codebeispiel RX&lt;br /&gt;
: Codebeispiel TX&lt;br /&gt;
: Codebeispiel RX-TX&lt;br /&gt;
: SPI&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel senden &lt;br /&gt;
: Codebeispiel empfangen&lt;br /&gt;
: I2C&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel senden &lt;br /&gt;
: Codebeispiel empfangen&lt;br /&gt;
* Brown Out Reset&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
* EEPROM&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Wettbewerb|P]]&lt;br /&gt;
[[Category:PIC|P]]&lt;/div&gt;</summary>
		<author><name>Thomas1123</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=PIC_Codebeispiele&amp;diff=28808</id>
		<title>PIC Codebeispiele</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=PIC_Codebeispiele&amp;diff=28808"/>
		<updated>2008-06-28T11:52:25Z</updated>

		<summary type="html">&lt;p&gt;Thomas1123: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt; &#039;&#039;&#039;Diese Seite ist noch in Bearbeitung. Die Codebeispiele sind noch nicht vollständig bzw. korrekt. Ich gelobe jedoch Besserung bis zum 15.8.08&#039;&#039;&#039; &amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;von [[Benutzer:Thomas1123|Thomas1123]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ich persönlich benutze den Hitech PIC-C Lite Compiler für meine Projekte.&amp;lt;br/&amp;gt;&lt;br /&gt;
Hierbei handelt es sich um die abgespeckte Version des Hitech PIC-C Compilers von der Firma HiTech Software.&amp;lt;br/&amp;gt;&lt;br /&gt;
Ich möchte hier eine Sammlung von Codebeispielen beginnen mit der es Einsteigern ermöglicht wird verschiedene interne und externe Pereferie zu initialiesieren und zu benutzen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Da der [http://www.microchip.com/stellent/idcplgidcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1335&amp;amp;dDocName=en023112 PIC16F690] mein persönlicher Liebling ist möchte ich die hier gezeigten Beispiele anhand dieses PICs aufzeigen. Die nachfolgenden Beispiele sind nicht nur für den PIC16F690 vewendbar z.B. sind die Timer0-Module in vielen Pics identisch. Dies trifft auch auf die meisten anderen Module zu jedoch kann ein zusätzlicher Blick in das Datenblatt nich schaden, da eventuell mache Register einen anderen Namen besitzen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Selbstverständlich kann dieser Artikel noch mit Codebeispielen für cc5x und ASM erweitert werden, des Weiteren kann man auch Beispiele für andere PICs der 10er, 12er, und 16er Kategorie einfügen.&lt;br /&gt;
&lt;br /&gt;
== Pinbelegung ==&lt;br /&gt;
[[Bild:PIC16F690-Pins.png|thumb|right|Pinbelegung des PIC16F690]]&lt;br /&gt;
Der PIC16F690 verfügt über eine grosse Anzahl an interner Pereferie beispielsweise 10-Bit AD-Wandler, SPI/I2C Interface, mehrere Timer (2*8-Bit 1*16-Bit), EUSART (RS232 etc.) usw.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
== Codebeispiele ==&lt;br /&gt;
----&lt;br /&gt;
=== Timer0 ===&lt;br /&gt;
==== Timer0 Hardware ====&lt;br /&gt;
[[Bild:Timer0-PIC16F690.png|thumb|right|Hardware Timer0 und WDT im PIC16F690]]&lt;br /&gt;
Der Timer0 ist ein 8-Bit Timer/Zähler, welcher entweder mit dem internen Takt des PIC oder mit einer externen Taktquelle am Pin 17 (RA2/T0CKI) Betrieben werden kann. Beim Betrieb mit einer externen Taktquelle kann man zusätzlich auswählen ob bei einer steigenden oder fallenden Flanke das Timerregister inkrementiert werden soll. Gleich welche Taktquelle gewählt wird, kann bei einem Überlauf des Timerregisters ein Interrupt ausgelöst werden. Hierfür ist es notwendig die Bits &#039;&#039;&#039;GIE&#039;&#039;&#039; und &#039;&#039;&#039;T0IE&#039;&#039;&#039; auf 1 zu setzen. Beide Bits befinden sich im &#039;&#039;&#039;INTCON&#039;&#039;&#039;-Register und sind im Datenblatt auf Seite 38 zu finden.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Im nebenstehendem Diagramm ist der aufbau des Timer0 zusammen mit dem Watchdogtimer dargestellt.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Im Option Register (&#039;&#039;&#039;OPTION&#039;&#039;&#039; Datenblatt Seite 83) kann mit Bit 5 (&#039;&#039;&#039;T0CS&#039;&#039;&#039;) ausgewählt werden ob der interne Takt (0) oder ein externer Takt (1) verwendet wird. Bei einem externen Takt kann mit Bit 4 (&#039;&#039;&#039;T0SE&#039;&#039;&#039;) auswählen ob bei einer steigenden (0) oder bei einer fallenden Flanke (1) das Timer0-Register inkrenemtiert werden soll. Mit Bit 3 (&#039;&#039;&#039;PSA&#039;&#039;&#039;) wird der Prescaler entweder dem Timer (0) &#039;&#039;&#039;oder&#039;&#039;&#039; dem Watchdogtimer (1) zugewiesen. Der Prescaler selbst wird mit den Bits 0 bis 2 (&#039;&#039;&#039;PS0 PS1 PS2&#039;&#039;&#039;) des Option Registers eingestellt.&amp;lt;br/&amp;gt;&lt;br /&gt;
Eine Übersicht der Einstellmöglichkeiten ist auf Seite 83 im Datenblatt einsehbar.&lt;br /&gt;
&lt;br /&gt;
==== Timer0 Codebeispiel mit Verwendung des Programmtaktes Fosc/4 ====&lt;br /&gt;
&#039;&#039;Szenario:&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC verwendet als Taktquelle einen 32,768 kHz Uhrenquarz.&amp;lt;br/&amp;gt;&lt;br /&gt;
An PORTB sind 8 LEDs mit Vorwiderständen gegen Masse verschaltet.&amp;lt;br/&amp;gt;&lt;br /&gt;
Jede Sekunde soll PORTB um den Wert 1 inkrementiert werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
Zu diesem Zweck wird der Timer0 mit Prescaler verwendet.&amp;lt;br/&amp;gt;&lt;br /&gt;
Die Einstellungen des Prescaler errechenen sich wie folgt:&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{Fosc}{4*Prescaler*2^8}= t \,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fosc/4 weil der PIC für eine Anweisung 4 Takte benötigt.&amp;lt;br/&amp;gt;&lt;br /&gt;
Der Prescaler als zusätzlicher Teiler des Timertaktes.&amp;lt;br/&amp;gt;&lt;br /&gt;
2^8 (256) Schritte benötigt der Timer 0 zum Überlauf.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{32768Hz}{4*2^8*32}= \frac {1}{Sek}\,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei einem Prescaler von 1:32 lösen wir somit exakt jede Sekunde einen Interrupt aus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
#include &amp;quot;htc.h&amp;quot;&lt;br /&gt;
__CONFIG (0x30e0);&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
static void interrupt global_int(void)&lt;br /&gt;
{&lt;br /&gt;
	GIE  = 0;		// Alle Interruptquellen ausschalten&lt;br /&gt;
	T0IF = 0;		// Timer0 Interruptflag Löschen&lt;br /&gt;
	PORTB++;		// PORTB inkrementieren&lt;br /&gt;
	GIE  = 1;		// Interrupts wieder einschalten&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void t0_ini ()&lt;br /&gt;
{&lt;br /&gt;
				// Datenblatt Seite 83&lt;br /&gt;
	OPTION 	= 0b11000100;		&lt;br /&gt;
		 // 1-------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // -1------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // --0-----	Internen Takt für Timer0 verwenden&lt;br /&gt;
		 // ---0----	Bei externem Takt an steigender Flanke inkrementieren&lt;br /&gt;
		 // 		(in diesem Fall egal ob 1 oder 0 weil der interne Takt verwendet wird)&lt;br /&gt;
		 // ----0---	Prescaler für Timer0 verwenden&lt;br /&gt;
		 // -----100	Prescaler 1:32&lt;br /&gt;
&lt;br /&gt;
	T0IF	= 0;		// Interruptflag von Timer0 löschen&lt;br /&gt;
	GIE 	= 1;		// Alle nichtmaskierten Interrupts erlauben&lt;br /&gt;
	T0IE 	= 1;		// Timer0 Interrupt erlauben&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
	ANSEL  = 0b00000000;		// Pins als digital I/O &lt;br /&gt;
	ANSELH = 0b00000000;		// Pins als digital I/O&lt;br /&gt;
	PORTA  = 0;			// Latch von Port A,B und C löschen&lt;br /&gt;
	PORTB  = 0;&lt;br /&gt;
	PORTC  = 0;&lt;br /&gt;
	TRISA  = 0b00000000;		// Port A,B und C als Ausgänge schalten&lt;br /&gt;
	TRISB  = 0b00000000;&lt;br /&gt;
	TRISC  = 0b00000000;&lt;br /&gt;
}&lt;br /&gt;
//========================================================================&lt;br /&gt;
void main ()&lt;br /&gt;
{&lt;br /&gt;
	setup();&lt;br /&gt;
	t0_ini();&lt;br /&gt;
&lt;br /&gt;
	while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
==== Timer0 Codebeispiel mit Verwendung eines externen Taktes ====&lt;br /&gt;
Der Code ist fast identisch, es wurden lediglich Änderungen im &#039;&#039;&#039;OPTION&#039;&#039;&#039;-Register vorgenommen und der Pin 17 (RA2) wurde als Eingang definiert. Weiters wurde der interne Oszillator mit 4MHz verwendet. &amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Der externe Takt kann nicht beliebig schnell sein. siehe Datenblatt Kapitel 5.1.5 Seite 82 und Kapitel 17 Seite 243. &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;Szenario&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC verwendet als Taktquelle den internen 4MHz Oszillator.&amp;lt;br/&amp;gt;&lt;br /&gt;
An PORTB sind 8 LEDs mit Vorwiderständen gegen Masse verschaltet.&amp;lt;br/&amp;gt;&lt;br /&gt;
PORTB soll bei jedem Timer0-Überlauf um den Wert 1 inkrementiert werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
Zu diesem Zweck wird der Timer0 mit Prescaler verwendet.&amp;lt;br/&amp;gt;&lt;br /&gt;
Die Einstellungen errechenen sich wie folgt:&amp;lt;br/&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{Takt_{T0CKI}}{Prescaler*2^8}= t \,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Gehen wir mal davon aus, dass der takt an T0CKI 100kHz beträgt und der Prescaler als 1:2 Vorteiler eingestellt ist. Somit läuft der Timer0 alle 512 Takte über.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{100kHz}{2*2^8}= \frac{195,3125}{Sek} \,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Bei diesen Einstellungen bekommen wir 195,3125 Timer0-Überläufe pro Sekunde was wiederum einem Zeitinterwall von 5,12ms entspricht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
#include &amp;quot;htc.h&amp;quot;&lt;br /&gt;
__CONFIG (0x30e4);&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
static void interrupt global_int(void)&lt;br /&gt;
{&lt;br /&gt;
	GIE  = 0;		// Alle Interruptquellen ausschalten&lt;br /&gt;
	T0IF = 0;		// Timer0 Interruptflag Löschen&lt;br /&gt;
	PORTB++;		// PORTB inkrementieren&lt;br /&gt;
	GIE  = 1;		// Interrupts wieder einschalten&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void t0_ini ()&lt;br /&gt;
{&lt;br /&gt;
				// Datenblatt Seite 83&lt;br /&gt;
	OPTION 	= 0b11000100;		&lt;br /&gt;
		 // 1-------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // -1------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // --1-----	Takt an T0CKI für Timer0 verwenden&lt;br /&gt;
		 // ---0----	Bei externem Takt an steigender Flanke inkrementieren&lt;br /&gt;
		 // ----0---	Prescaler für Timer0 verwenden&lt;br /&gt;
		 // -----000	Prescaler 1:2&lt;br /&gt;
&lt;br /&gt;
	T0IF	= 0;		// Interruptflag von Timer0 löschen&lt;br /&gt;
	GIE 	= 1;		// Alle nichtmaskierten Interrupts erlauben&lt;br /&gt;
	T0IE 	= 1;		// Timer0 Interrupt erlauben&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
	ANSEL  = 0b00000000;		// Pins als digital I/O &lt;br /&gt;
	ANSELH = 0b00000000;		// Pins als digital I/O&lt;br /&gt;
	PORTA  = 0;			// Latch von Port A,B und C löschen&lt;br /&gt;
	PORTB  = 0;&lt;br /&gt;
	PORTC  = 0;&lt;br /&gt;
	TRISA  = 0b00000100;		// RA2 als Eingang setzen und restliche Pins als &lt;br /&gt;
					// Ausgang setzen.&lt;br /&gt;
	TRISB  = 0b00000000;&lt;br /&gt;
	TRISC  = 0b00000000;&lt;br /&gt;
}&lt;br /&gt;
//========================================================================&lt;br /&gt;
void main ()&lt;br /&gt;
{&lt;br /&gt;
	setup();&lt;br /&gt;
	t0_ini();&lt;br /&gt;
&lt;br /&gt;
	while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Links zu Application Notes und weiterführenden Informationen zum Timer0 ====&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/51682A.pdf Microchip Timer Tutorial (Part 1)] PDF&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/51702A.pdf Microchip Timer Tutorial (Part 2)] PDF&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/31011a.pdf Microchip Timer0 Manual] PDF&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1824&amp;amp;appnote=en011033 AN592 Frequency Counter Using PIC16C5x]&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1824&amp;amp;appnote=en011031 AN590 A Clock Design Using the PIC16C54 for LED Displays and Switch Inputs]&lt;br /&gt;
* [http://www.sprut.de/electronic/pic/grund/timer/timer.htm#timer0 Erklärung zum Timer0 auf der Homepage von Sprut]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Timer1 ===&lt;br /&gt;
==== Timer1 Hardware ====&lt;br /&gt;
[[Bild:Timer1-PIC16F690.png|right|thumb|Hardware Timer1 im PIC16F690]]&lt;br /&gt;
Der Timer1 ist ein 16-Bit Timer/Zähler. Für den Timer1 gibt es viele Verwendungsmöglichkeiten auf Grund seiner zahlreichen Einstellmöglichkeiten. Man kann Ihn als einfachen Timer verwenden, wofür er eigentlich schon fast zu schade ist, oder als raffinierten Zähler, welcher erst bei einem bestimmten Ereignis wie z.B. dem auslösen des Komparators oder eines bestimmten zustandes am TG1-Pin (RA4/Pin 3) zu zählen beginnt.&amp;lt;br/&amp;gt;&lt;br /&gt;
die 16-Bit des Timers teilen sich auf zwei 8-Bit-Register auf, &#039;&#039;&#039;TMR1H&#039;&#039;&#039; und &#039;&#039;&#039;TMR1L&#039;&#039;&#039;. &#039;&#039;&#039;TMR1H&#039;&#039;&#039; beherbergt die oberen 8 Bit und &#039;&#039;&#039;TMR1L&#039;&#039;&#039; die unteren 8 Bit.&amp;lt;br/&amp;gt;&lt;br /&gt;
Der Timer1 wird zusätzlich noch vom CCP-Modul verwendet, insbesondere vom Capture- und vom Compare-Modul. Für das PWM-Modul wird der Timer2 als Zeitbasis verwendet.&lt;br /&gt;
&lt;br /&gt;
==== Timer1 Codebeispiel mit Verwendung des Programmtaktes Fosc/4 ====&lt;br /&gt;
&#039;&#039;Szenario&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC verwendet als Taktquelle den internen Oszilator mit 8MHz.&amp;lt;br/&amp;gt;&lt;br /&gt;
An PORTB sind 8 LEDs mit Vorwiderständen gegen Masse verschaltet.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
#include &amp;quot;htc.h&amp;quot;&lt;br /&gt;
__CONFIG (0x30e4);&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
static void interrupt global_int(void)&lt;br /&gt;
{&lt;br /&gt;
	GIE    = 0;		// Alle Interruptquellen ausschalten&lt;br /&gt;
	TMR1IF = 0;		// Timer1 Interruptflag Löschen&lt;br /&gt;
	PORTB++;		// PORTB inkrementieren&lt;br /&gt;
	GIE    = 1;		// Interrupts wieder einschalten&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void t1_ini ()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	TMR1IF	= 0;		// Interruptflag von Timer1 löschen+&lt;br /&gt;
&lt;br /&gt;
				// Datenblatt Seite 88&lt;br /&gt;
	T1CON 	= 0b00110000;		&lt;br /&gt;
		 // 0-------	Timer1 Gate-invertier-Bit (in diesem Beispiel uninteressant)&lt;br /&gt;
		 // -0------	Timer1 Gate-enable-Bit (auf 0 gesetzt sodass der timer1 &lt;br /&gt;
		 //		mit dem TMR1ON-Bit direkt ein und ausgeschaltet werden kann&lt;br /&gt;
		 // --11----	Prescaler auf 1:8 einstellen&lt;br /&gt;
		 // ----0---	Low Power Oszillator aus&lt;br /&gt;
		 // -----0--	(in diesem Beispiel uninteressant weil Bit 1 == 0)&lt;br /&gt;
		 // ------0-	interen Takt verwenden&lt;br /&gt;
		 // -------1	Timer1 einschalten&lt;br /&gt;
&lt;br /&gt;
	GIE 	= 1;		// Alle nichtmaskierten Interrupts erlauben&lt;br /&gt;
	PEIE 	= 1;		// Pereferieinterrupt erlauben&lt;br /&gt;
				// Die Bits GIE und PEIE befinden sich in INTCON Register&lt;br /&gt;
				// und sind im Datenblatt auf Seite 38 erläutert.&lt;br /&gt;
	TMR1IE 	= 1;		// Timer1 Interrupt erlauben&lt;br /&gt;
				// Das TMR1IE-Bit ist im ist im PIE1 Register&lt;br /&gt;
				// und im Datenblatt auf Seite 39&lt;br /&gt;
}&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
	OSCCON = 0b01110000;		// 8 MHz Datenblatt Seite 48&lt;br /&gt;
	ANSEL  = 0b00000000;		// Pins als digital I/O &lt;br /&gt;
	ANSELH = 0b00000000;		// Pins als digital I/O&lt;br /&gt;
	PORTA  = 0;			// Latch von Port A,B und C löschen&lt;br /&gt;
	PORTB  = 0;&lt;br /&gt;
	PORTC  = 0;&lt;br /&gt;
	TRISA  = 0b00000000;		// Port A,B und C als Ausgänge schalten&lt;br /&gt;
	TRISB  = 0b00000000;&lt;br /&gt;
	TRISC  = 0b00000000;&lt;br /&gt;
}&lt;br /&gt;
//========================================================================&lt;br /&gt;
void main ()&lt;br /&gt;
{&lt;br /&gt;
	setup();&lt;br /&gt;
	t1_ini();&lt;br /&gt;
&lt;br /&gt;
	while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
==== Links zu Application Notes und weiterführenden Informationen zum Timer1 ====&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/31012a.pdf Microchip Timer1 Manual] PDF&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1824&amp;amp;appnote=en011055 AN580 Using Timer 1 in Asynchronous Clock Mode]&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1824&amp;amp;appnote=en011057 AN582 Low-Power Real Time Clock]&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1824&amp;amp;appnote=en011068 AN649 Yet Another Clock Featuring the PIC16C924]&lt;br /&gt;
* [http://www.sprut.de/electronic/pic/grund/timer/timer.htm#timer1 Erklärung zum Timer0 auf der Homepage von Sprut]&lt;br /&gt;
----&lt;br /&gt;
=== Timer2 ===&lt;br /&gt;
==== Timer2 Hardware ====&lt;br /&gt;
[[Bild:Timer2-PIC16F690.png|right|thumb|Hardware Timer2 im PIC16F690]]&lt;br /&gt;
Der Timer2 ist ein 8-Bit Timer. Mit dem Timer2 lässt sich nahezu jede Zeitbasis einstellen da er über einen Prescaler von 1:1, 1:4, 1:16 und über einen Postscaler von 1:1 bis 1:16 verfügt. Des Weiteren verfügt der Timer2 über einen Comparator, welcher kontinuirlich den Wert des Timer2-Registers und des PR2-Registers vergleicht und bei Übereinstimmung einen Takt an den Postscaler weiter gibt. Wenn der Postscaler überläuft wird ein Timer2 Interrupt ausgelöst.&amp;lt;br/&amp;gt;&lt;br /&gt;
Der Timer2 wird vom CCP-Modul für die PWM verwendet ist somit nicht immer frei zur verfügung.&lt;br /&gt;
==== Timer2 Codebeispiel ====&lt;br /&gt;
==== Links zu Application Notes und weiterführenden Informationen zum Timer2 ====&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/31013a.pdf Microchip Timer2 Manual] PDF&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== AD-Wandler ===&lt;br /&gt;
==== AD-Wandler Hardware ====&lt;br /&gt;
[[Bild:AD-Wandler-PIC16F690.png|right|thumb|Hardware AD-Wandler im PIC16F690]]&lt;br /&gt;
==== AD-Wandler Codebeispiel ====&lt;br /&gt;
==== Links zu Application Notes und weiterführenden Informationen zum AD-Wandler ====&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/31023a.pdf Microchip ADC Manual] PDF&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Comparator ===&lt;br /&gt;
==== Comparator Hardware ====&lt;br /&gt;
==== Comparator Codebeispiel ====&lt;br /&gt;
==== Links zu Application Notes und weiterführenden Informationen zum Comparator-Modul ====&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/31020a.pdf Microchip Comparator Manual] PDF&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== CCP-Modul (Compare/Capture/PWM) ===&lt;br /&gt;
==== Compare Hardware ====&lt;br /&gt;
==== Compare Codebeispiel ====&lt;br /&gt;
==== PWM Hardware ====&lt;br /&gt;
==== Capture Hardware ====&lt;br /&gt;
==== Capture Codebeispiel ====&lt;br /&gt;
[[Bild:PWM-PIC16F690.png|thumb|right|Hardware PWM im PIC16F690]]&lt;br /&gt;
==== PWM Codebeispiel ====&lt;br /&gt;
==== Links zu Application Notes und weiterführenden Informationen zum CCP-Modul ====&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/31014a.pdf Microchip CCP Manual] PDF&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== EUSART ===&lt;br /&gt;
==== EUSART Hardware ====&lt;br /&gt;
[[Bild:EUSART-TX-PIC16F690.png|thumb|right|Hardware EUSART im PIC16F690]]&lt;br /&gt;
[[Bild:EUSART-RX-PIC16F690.png|thumb|right|Hardware EUSART im PIC16F690]]&lt;br /&gt;
==== EUSART TX Codebeispiel ====&lt;br /&gt;
==== EUSART RX Codebeispiel ====&lt;br /&gt;
==== Links zu Application Notes und weiterführenden Informationen zum EUSART-Modul ====&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/31018a.pdf Microchip USART Manual] PDF&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== SSP-Modul (Synchronous Serial Port) ===&lt;br /&gt;
==== SPI Hardware ====&lt;br /&gt;
[[Bild:SPI-PIC16F690.png|thumb|right|Hardware SPI im PIC16F690]]&lt;br /&gt;
==== SPI Codebeispiel ====&lt;br /&gt;
==== I2C Hardware ====&lt;br /&gt;
[[Bild:I2C-PIC16F690.png|thumb|right|Hardware I2C im PIC16F690]]&lt;br /&gt;
==== I2C Codebeispiel ====&lt;br /&gt;
==== Links zu Application Notes und weiterführenden Informationen zum SSP-Modul ====&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/31015a.pdf Microchip SSP Manual] PDF&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/31017a.pdf Microchip MSSP Manual] PDF&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1824&amp;amp;appnote=en011051 AN578 Use of the SSP Module in the IIC Multi-Master Environment]&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1824&amp;amp;appnote=en011043 AN554 Software Implementation of I²C Bus Master]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.microchip.com Homepage Microchip]&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/33023a.pdf Microchip Mid-Range Reference Manual] PDF&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplgidcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1335&amp;amp;dDocName=en023112 Produktseite PIC16F690]&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/41262E.pdf Datenblatt PIC16F690] PDF&lt;br /&gt;
* [http://www.htsoft.com HiTech Software]&lt;br /&gt;
* [http://www.sprut.de Sprut -&amp;gt; DIE deutschsprachige Seite zum Thema PIC]&lt;br /&gt;
* ...&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
* Den Code auf dieser Seite &amp;quot;einklappbar&amp;quot; machen, sodass nicht ewig weit gescrollt werden muss&lt;br /&gt;
* Die Bilder neu malen wegen eventuellem Copyright-Schnickschnack&lt;br /&gt;
* Timer1&lt;br /&gt;
: Codebeispiel mit externer Taktquelle&lt;br /&gt;
: Codebeispiel mit externem Quarz&lt;br /&gt;
: Codebeispiel mit T1G als Zählbeginn/ende&lt;br /&gt;
: Codebeispiel mit Comparator als Zählbeginn/ende&lt;br /&gt;
: Codebeispiel mit Synchronem Zähler&lt;br /&gt;
* Timer2&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
* AD-Wandler&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
: Codebeispiel mehrere Kanäle&lt;br /&gt;
* CCP-Modul&lt;br /&gt;
: PWM&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
* Komparator&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
* Eusart&lt;br /&gt;
: Erklärung Hardware RX&lt;br /&gt;
: Erklärung Hardware TX&lt;br /&gt;
: Codebeispiel RX&lt;br /&gt;
: Codebeispiel TX&lt;br /&gt;
: Codebeispiel RX-TX&lt;br /&gt;
: SPI&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel senden &lt;br /&gt;
: Codebeispiel empfangen&lt;br /&gt;
: I2C&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel senden &lt;br /&gt;
: Codebeispiel empfangen&lt;br /&gt;
* Brown Out Reset&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
* EEPROM&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Wettbewerb|P]]&lt;br /&gt;
[[Category:PIC|P]]&lt;/div&gt;</summary>
		<author><name>Thomas1123</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=PIC_Codebeispiele&amp;diff=28794</id>
		<title>PIC Codebeispiele</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=PIC_Codebeispiele&amp;diff=28794"/>
		<updated>2008-06-28T10:54:00Z</updated>

		<summary type="html">&lt;p&gt;Thomas1123: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt; &#039;&#039;&#039;Diese Seite ist noch in Bearbeitung. Die Codebeispiele sind noch nicht vollständig bzw. korrekt. Ich gelobe jedoch Besserung bis zum 15.8.08&#039;&#039;&#039; &amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;von [[Benutzer:Thomas1123|Thomas1123]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ich persönlich benutze den Hitech PIC-C Lite Compiler für meine Projekte.&amp;lt;br/&amp;gt;&lt;br /&gt;
Hierbei handelt es sich um die abgespeckte Version des Hitech PIC-C Compilers von der Firma HiTech Software.&amp;lt;br/&amp;gt;&lt;br /&gt;
Ich möchte hier eine Sammlung von Codebeispielen beginnen mit der es Einsteigern ermöglicht wird verschiedene interne und externe Pereferie zu initialiesieren und zu benutzen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Da der [http://www.microchip.com/stellent/idcplgidcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1335&amp;amp;dDocName=en023112 PIC16F690] mein persönlicher Liebling ist möchte ich die hier gezeigten Beispiele anhand dieses PICs aufzeigen. Die nachfolgenden Beispiele sind nicht nur für den PIC16F690 vewendbar z.B. sind die Timer0-Module in vielen Pics identisch. Dies trifft auch auf die meisten anderen Module zu jedoch kann ein zusätzlicher Blick in das Datenblatt nich schaden, da eventuell mache Register einen anderen Namen besitzen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Selbstverständlich kann dieser Artikel noch mit Codebeispielen für cc5x und ASM erweitert werden, des Weiteren kann man auch Beispiele für andere PICs der 10er, 12er, und 16er Kategorie einfügen.&lt;br /&gt;
&lt;br /&gt;
== Pinbelegung ==&lt;br /&gt;
[[Bild:PIC16F690-Pins.png|thumb|right|Pinbelegung des PIC16F690]]&lt;br /&gt;
Der PIC16F690 verfügt über eine grosse Anzahl an interner Pereferie beispielsweise 10-Bit AD-Wandler, SPI/I2C Interface, mehrere Timer (2*8-Bit 1*16-Bit), EUSART (RS232 etc.) usw.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
== Codebeispiele ==&lt;br /&gt;
----&lt;br /&gt;
=== Timer0 ===&lt;br /&gt;
==== Timer0 Hardware ====&lt;br /&gt;
[[Bild:Timer0-PIC16F690.png|thumb|right|Hardware Timer0 und WDT im PIC16F690]]&lt;br /&gt;
Der Timer0 ist ein 8-Bit Timer/Zähler, welcher entweder mit dem internen Takt des PIC oder mit einer externen Taktquelle am Pin 17 (RA2/T0CKI) Betrieben werden kann. Beim Betrieb mit einer externen Taktquelle kann man zusätzlich auswählen ob bei einer steigenden oder fallenden Flanke das Timerregister inkrementiert werden soll. Gleich welche Taktquelle gewählt wird, kann bei einem Überlauf des Timerregisters ein Interrupt ausgelöst werden. Hierfür ist es notwendig die Bits &#039;&#039;&#039;GIE&#039;&#039;&#039; und &#039;&#039;&#039;T0IE&#039;&#039;&#039; auf 1 zu setzen. Beide Bits befinden sich im &#039;&#039;&#039;INTCON&#039;&#039;&#039;-Register und sind im Datenblatt auf Seite 38 zu finden.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Im nebenstehendem Diagramm ist der aufbau des Timer0 zusammen mit dem Watchdogtimer dargestellt.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Im Option Register (&#039;&#039;&#039;OPTION&#039;&#039;&#039; Datenblatt Seite 83) kann mit Bit 5 (&#039;&#039;&#039;T0CS&#039;&#039;&#039;) ausgewählt werden ob der interne Takt (0) oder ein externer Takt (1) verwendet wird. Bei einem externen Takt kann mit Bit 4 (&#039;&#039;&#039;T0SE&#039;&#039;&#039;) auswählen ob bei einer steigenden (0) oder bei einer fallenden Flanke (1) das Timer0-Register inkrenemtiert werden soll. Mit Bit 3 (&#039;&#039;&#039;PSA&#039;&#039;&#039;) wird der Prescaler entweder dem Timer (0) &#039;&#039;&#039;oder&#039;&#039;&#039; dem Watchdogtimer (1) zugewiesen. Der Prescaler selbst wird mit den Bits 0 bis 2 (&#039;&#039;&#039;PS0 PS1 PS2&#039;&#039;&#039;) des Option Registers eingestellt.&amp;lt;br/&amp;gt;&lt;br /&gt;
Eine Übersicht der Einstellmöglichkeiten ist auf Seite 83 im Datenblatt einsehbar.&lt;br /&gt;
&lt;br /&gt;
==== Timer0 Codebeispiel mit Verwendung des Programmtaktes Fosc/4 ====&lt;br /&gt;
&#039;&#039;Szenario:&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC verwendet als Taktquelle einen 32,768 kHz Uhrenquarz.&amp;lt;br/&amp;gt;&lt;br /&gt;
An PORTB sind 8 LEDs mit Vorwiderständen gegen Masse verschaltet.&amp;lt;br/&amp;gt;&lt;br /&gt;
Jede Sekunde soll PORTB um den Wert 1 inkrementiert werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
Zu diesem Zweck wird der Timer0 mit Prescaler verwendet.&amp;lt;br/&amp;gt;&lt;br /&gt;
Die Einstellungen des Prescaler errechenen sich wie folgt:&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{Fosc}{4*Prescaler*2^8}= t \,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fosc/4 weil der PIC für eine Anweisung 4 Takte benötigt.&amp;lt;br/&amp;gt;&lt;br /&gt;
Der Prescaler als zusätzlicher Teiler des Timertaktes.&amp;lt;br/&amp;gt;&lt;br /&gt;
2^8 (256) Schritte benötigt der Timer 0 zum Überlauf.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{32768Hz}{4*2^8*32}= \frac {1}{Sek}\,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei einem Prescaler von 1:32 lösen wir somit exakt jede Sekunde einen Interrupt aus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
#include &amp;quot;htc.h&amp;quot;&lt;br /&gt;
__CONFIG (0x30e0);&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
static void interrupt global_int(void)&lt;br /&gt;
{&lt;br /&gt;
	GIE  = 0;		// Alle Interruptquellen ausschalten&lt;br /&gt;
	T0IF = 0;		// Timer0 Interruptflag Löschen&lt;br /&gt;
	PORTB++;		// PORTB inkrementieren&lt;br /&gt;
	GIE  = 1;		// Interrupts wieder einschalten&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void t0_ini ()&lt;br /&gt;
{&lt;br /&gt;
				// Datenblatt Seite 83&lt;br /&gt;
	OPTION 	= 0b11000100;		&lt;br /&gt;
		 // 1-------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // -1------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // --0-----	Internen Takt für Timer0 verwenden&lt;br /&gt;
		 // ---0----	Bei externem Takt an steigender Flanke inkrementieren&lt;br /&gt;
		 // 		(in diesem Fall egal ob 1 oder 0 weil der interne Takt verwendet wird)&lt;br /&gt;
		 // ----0---	Prescaler für Timer0 verwenden&lt;br /&gt;
		 // -----100	Prescaler 1:32&lt;br /&gt;
&lt;br /&gt;
	T0IF	= 0;		// Interruptflag von Timer0 löschen&lt;br /&gt;
	GIE 	= 1;		// Alle nichtmaskierten Interrupts erlauben&lt;br /&gt;
	T0IE 	= 1;		// Timer0 Interrupt erlauben&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
	ANSEL  = 0b00000000;		// Pins als digital I/O &lt;br /&gt;
	ANSELH = 0b00000000;		// Pins als digital I/O&lt;br /&gt;
	PORTA  = 0;			// Latch von Port A,B und C löschen&lt;br /&gt;
	PORTB  = 0;&lt;br /&gt;
	PORTC  = 0;&lt;br /&gt;
	TRISA  = 0b00000000;		// Port A,B und C als Ausgänge schalten&lt;br /&gt;
	TRISB  = 0b00000000;&lt;br /&gt;
	TRISC  = 0b00000000;&lt;br /&gt;
}&lt;br /&gt;
//========================================================================&lt;br /&gt;
void main ()&lt;br /&gt;
{&lt;br /&gt;
	setup();&lt;br /&gt;
	t0_ini();&lt;br /&gt;
&lt;br /&gt;
	while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
==== Timer0 Codebeispiel mit Verwendung eines externen Taktes ====&lt;br /&gt;
Der Code ist fast identisch, es wurden lediglich Änderungen im &#039;&#039;&#039;OPTION&#039;&#039;&#039;-Register vorgenommen und der Pin 17 (RA2) wurde als Eingang definiert. Weiters wurde der interne Oszillator mit 4MHz verwendet. &amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Der externe Takt kann nicht beliebig schnell sein. siehe Datenblatt Kapitel 5.1.5 Seite 82 und Kapitel 17 Seite 243. &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;Szenario&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC verwendet als Taktquelle den internen 4MHz Oszillator.&amp;lt;br/&amp;gt;&lt;br /&gt;
An PORTB sind 8 LEDs mit Vorwiderständen gegen Masse verschaltet.&amp;lt;br/&amp;gt;&lt;br /&gt;
PORTB soll bei jedem Timer0-Überlauf um den Wert 1 inkrementiert werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
Zu diesem Zweck wird der Timer0 mit Prescaler verwendet.&amp;lt;br/&amp;gt;&lt;br /&gt;
Die Einstellungen errechenen sich wie folgt:&amp;lt;br/&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{Takt_{T0CKI}}{Prescaler*2^8}= t \,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Gehen wir mal davon aus, dass der takt an T0CKI 100kHz beträgt und der Prescaler als 1:2 Vorteiler eingestellt ist. Somit läuft der Timer0 alle 512 Takte über.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{100kHz}{2*2^8}= \frac{195,3125}{Sek} \,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Bei diesen Einstellungen bekommen wir 195,3125 Timer0-Überläufe pro Sekunde was wiederum einem Zeitinterwall von 5,12ms entspricht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
#include &amp;quot;htc.h&amp;quot;&lt;br /&gt;
__CONFIG (0x30e4);&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
static void interrupt global_int(void)&lt;br /&gt;
{&lt;br /&gt;
	GIE  = 0;		// Alle Interruptquellen ausschalten&lt;br /&gt;
	T0IF = 0;		// Timer0 Interruptflag Löschen&lt;br /&gt;
	PORTB++;		// PORTB inkrementieren&lt;br /&gt;
	GIE  = 1;		// Interrupts wieder einschalten&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void t0_ini ()&lt;br /&gt;
{&lt;br /&gt;
				// Datenblatt Seite 83&lt;br /&gt;
	OPTION 	= 0b11000100;		&lt;br /&gt;
		 // 1-------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // -1------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // --1-----	Takt an T0CKI für Timer0 verwenden&lt;br /&gt;
		 // ---0----	Bei externem Takt an steigender Flanke inkrementieren&lt;br /&gt;
		 // ----0---	Prescaler für Timer0 verwenden&lt;br /&gt;
		 // -----000	Prescaler 1:2&lt;br /&gt;
&lt;br /&gt;
	T0IF	= 0;		// Interruptflag von Timer0 löschen&lt;br /&gt;
	GIE 	= 1;		// Alle nichtmaskierten Interrupts erlauben&lt;br /&gt;
	T0IE 	= 1;		// Timer0 Interrupt erlauben&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
	ANSEL  = 0b00000000;		// Pins als digital I/O &lt;br /&gt;
	ANSELH = 0b00000000;		// Pins als digital I/O&lt;br /&gt;
	PORTA  = 0;			// Latch von Port A,B und C löschen&lt;br /&gt;
	PORTB  = 0;&lt;br /&gt;
	PORTC  = 0;&lt;br /&gt;
	TRISA  = 0b00000100;		// RA2 als Eingang setzen und restliche Pins als &lt;br /&gt;
					// Ausgang setzen.&lt;br /&gt;
	TRISB  = 0b00000000;&lt;br /&gt;
	TRISC  = 0b00000000;&lt;br /&gt;
}&lt;br /&gt;
//========================================================================&lt;br /&gt;
void main ()&lt;br /&gt;
{&lt;br /&gt;
	setup();&lt;br /&gt;
	t0_ini();&lt;br /&gt;
&lt;br /&gt;
	while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Links zu Application Notes und weiterführenden Informationen zum Timer0 ====&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/51682A.pdf Microchip Timer Tutorial (Part 1)] PDF&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/51702A.pdf Microchip Timer Tutorial (Part 2)] PDF&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/31011a.pdf Microchip Timer0 Manual] PDF&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1824&amp;amp;appnote=en011033 AN592 Frequency Counter Using PIC16C5x] PDF&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1824&amp;amp;appnote=en011031 AN590 A Clock Design Using the PIC16C54 for LED Displays and Switch Inputs] PDF&lt;br /&gt;
* [http://www.sprut.de/electronic/pic/grund/timer/timer.htm#timer0 Erklärung zum Timer0 auf der Homepage von Sprut]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Timer1 ===&lt;br /&gt;
==== Timer1 Hardware ====&lt;br /&gt;
[[Bild:Timer1-PIC16F690.png|right|thumb|Hardware Timer1 im PIC16F690]]&lt;br /&gt;
Der Timer1 ist ein 16-Bit Timer/Zähler. Für den Timer1 gibt es viele Verwendungsmöglichkeiten auf Grund seiner zahlreichen Einstellmöglichkeiten. Man kann Ihn als einfachen Timer verwenden, wofür er eigentlich schon fast zu schade ist, oder als raffinierten Zähler, welcher erst bei einem bestimmten Ereignis wie z.B. dem auslösen des Komparators oder eines bestimmten zustandes am TG1-Pin (RA4/Pin 3) zu zählen beginnt.&amp;lt;br/&amp;gt;&lt;br /&gt;
die 16-Bit des Timers teilen sich auf zwei 8-Bit-Register auf, &#039;&#039;&#039;TMR1H&#039;&#039;&#039; und &#039;&#039;&#039;TMR1L&#039;&#039;&#039;. &#039;&#039;&#039;TMR1H&#039;&#039;&#039; beherbergt die oberen 8 Bit und &#039;&#039;&#039;TMR1L&#039;&#039;&#039; die unteren 8 Bit.&amp;lt;br/&amp;gt;&lt;br /&gt;
Der Timer1 wird zusätzlich noch vom CCP-Modul verwendet, insbesondere vom Capture- und vom Compare-Modul. Für das PWM-Modul wird der Timer2 als Zeitbasis verwendet.&lt;br /&gt;
&lt;br /&gt;
==== Timer1 Codebeispiel mit Verwendung des Programmtaktes Fosc/4 ====&lt;br /&gt;
&#039;&#039;Szenario&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC verwendet als Taktquelle den internen Oszilator mit 8MHz.&amp;lt;br/&amp;gt;&lt;br /&gt;
An PORTB sind 8 LEDs mit Vorwiderständen gegen Masse verschaltet.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
#include &amp;quot;htc.h&amp;quot;&lt;br /&gt;
__CONFIG (0x30e4);&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
static void interrupt global_int(void)&lt;br /&gt;
{&lt;br /&gt;
	GIE    = 0;		// Alle Interruptquellen ausschalten&lt;br /&gt;
	TMR1IF = 0;		// Timer1 Interruptflag Löschen&lt;br /&gt;
	PORTB++;		// PORTB inkrementieren&lt;br /&gt;
	GIE    = 1;		// Interrupts wieder einschalten&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void t1_ini ()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	TMR1IF	= 0;		// Interruptflag von Timer1 löschen+&lt;br /&gt;
&lt;br /&gt;
				// Datenblatt Seite 88&lt;br /&gt;
	T1CON 	= 0b00110000;		&lt;br /&gt;
		 // 0-------	Timer1 Gate-invertier-Bit (in diesem Beispiel uninteressant)&lt;br /&gt;
		 // -0------	Timer1 Gate-enable-Bit (auf 0 gesetzt sodass der timer1 &lt;br /&gt;
		 //		mit dem TMR1ON-Bit direkt ein und ausgeschaltet werden kann&lt;br /&gt;
		 // --11----	Prescaler auf 1:8 einstellen&lt;br /&gt;
		 // ----0---	Low Power Oszillator aus&lt;br /&gt;
		 // -----0--	(in diesem Beispiel uninteressant weil Bit 1 == 0)&lt;br /&gt;
		 // ------0-	interen Takt verwenden&lt;br /&gt;
		 // -------1	Timer1 einschalten&lt;br /&gt;
&lt;br /&gt;
	GIE 	= 1;		// Alle nichtmaskierten Interrupts erlauben&lt;br /&gt;
	PEIE 	= 1;		// Pereferieinterrupt erlauben&lt;br /&gt;
				// Die Bits GIE und PEIE befinden sich in INTCON Register&lt;br /&gt;
				// und sind im Datenblatt auf Seite 38 erläutert.&lt;br /&gt;
	TMR1IE 	= 1;		// Timer1 Interrupt erlauben&lt;br /&gt;
				// Das TMR1IE-Bit ist im ist im PIE1 Register&lt;br /&gt;
				// und im Datenblatt auf Seite 39&lt;br /&gt;
}&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
	OSCCON = 0b01110000;		// 8 MHz Datenblatt Seite 48&lt;br /&gt;
	ANSEL  = 0b00000000;		// Pins als digital I/O &lt;br /&gt;
	ANSELH = 0b00000000;		// Pins als digital I/O&lt;br /&gt;
	PORTA  = 0;			// Latch von Port A,B und C löschen&lt;br /&gt;
	PORTB  = 0;&lt;br /&gt;
	PORTC  = 0;&lt;br /&gt;
	TRISA  = 0b00000000;		// Port A,B und C als Ausgänge schalten&lt;br /&gt;
	TRISB  = 0b00000000;&lt;br /&gt;
	TRISC  = 0b00000000;&lt;br /&gt;
}&lt;br /&gt;
//========================================================================&lt;br /&gt;
void main ()&lt;br /&gt;
{&lt;br /&gt;
	setup();&lt;br /&gt;
	t1_ini();&lt;br /&gt;
&lt;br /&gt;
	while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
==== Links zu Application Notes und weiterführenden Informationen zum Timer1 ====&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/31012a.pdf Microchip Timer1 Manual] PDF&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1824&amp;amp;appnote=en011055 AN580 Using Timer 1 in Asynchronous Clock Mode] PDF&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1824&amp;amp;appnote=en011057 AN582 Low-Power Real Time Clock] PDF&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1824&amp;amp;appnote=en011068 AN649 Yet Another Clock Featuring the PIC16C924] PDF&lt;br /&gt;
* [http://www.sprut.de/electronic/pic/grund/timer/timer.htm#timer1 Erklärung zum Timer0 auf der Homepage von Sprut]&lt;br /&gt;
----&lt;br /&gt;
=== Timer2 ===&lt;br /&gt;
==== Timer2 Hardware ====&lt;br /&gt;
[[Bild:Timer2-PIC16F690.png|right|thumb|Hardware Timer2 im PIC16F690]]&lt;br /&gt;
Der Timer2 ist ein 8-Bit Timer. Mit dem Timer2 lässt sich nahezu jede Zeitbasis einstellen da er über einen Prescaler von 1:1, 1:4, 1:16 und über einen Postscaler von 1:1 bis 1:16 verfügt. Des Weiteren verfügt der Timer2 über einen Comparator, welcher kontinuirlich den Wert des Timer2-Registers und des PR2-Registers vergleicht und bei Übereinstimmung einen Takt an den Postscaler weiter gibt. Wenn der Postscaler überläuft wird ein Timer2 Interrupt ausgelöst.&amp;lt;br/&amp;gt;&lt;br /&gt;
Der Timer2 wird vom CCP-Modul für die PWM verwendet ist somit nicht immer frei zur verfügung.&lt;br /&gt;
==== Timer2 Codebeispiel ====&lt;br /&gt;
==== Links zu Application Notes und weiterführenden Informationen zum Timer2 ====&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/31013a.pdf Microchip Timer2 Manual] PDF&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== AD-Wandler ===&lt;br /&gt;
==== AD-Wandler Hardware ====&lt;br /&gt;
[[Bild:AD-Wandler-PIC16F690.png|right|thumb|Hardware AD-Wandler im PIC16F690]]&lt;br /&gt;
==== AD-Wandler Codebeispiel ====&lt;br /&gt;
==== Links zu Application Notes und weiterführenden Informationen zum AD-Wandler ====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Comparator ===&lt;br /&gt;
==== Comparator Hardware ====&lt;br /&gt;
==== Comparator Codebeispiel ====&lt;br /&gt;
==== Links zu Application Notes und weiterführenden Informationen zum Comparator-Modul ====&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/31020a.pdf Microchip Comparator Manual] PDF&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== CCP-Modul (Compare/Capture/PWM) ===&lt;br /&gt;
==== Compare Hardware ====&lt;br /&gt;
==== Compare Codebeispiel ====&lt;br /&gt;
==== PWM Hardware ====&lt;br /&gt;
==== Capture Hardware ====&lt;br /&gt;
==== Capture Codebeispiel ====&lt;br /&gt;
[[Bild:PWM-PIC16F690.png|thumb|right|Hardware PWM im PIC16F690]]&lt;br /&gt;
==== PWM Codebeispiel ====&lt;br /&gt;
==== Links zu Application Notes und weiterführenden Informationen zum CCP-Modul ====&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/31014a.pdf Microchip CCP Manual] PDF&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== EUSART ===&lt;br /&gt;
==== EUSART Hardware ====&lt;br /&gt;
[[Bild:EUSART-TX-PIC16F690.png|thumb|right|Hardware EUSART im PIC16F690]]&lt;br /&gt;
[[Bild:EUSART-RX-PIC16F690.png|thumb|right|Hardware EUSART im PIC16F690]]&lt;br /&gt;
==== EUSART TX Codebeispiel ====&lt;br /&gt;
==== EUSART RX Codebeispiel ====&lt;br /&gt;
==== Links zu Application Notes und weiterführenden Informationen zum EUSART-Modul ====&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/31018a.pdf Microchip USART Manual] PDF&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== SSP-Modul (Synchronous Serial Port) ===&lt;br /&gt;
==== SPI Hardware ====&lt;br /&gt;
[[Bild:SPI-PIC16F690.png|thumb|right|Hardware SPI im PIC16F690]]&lt;br /&gt;
==== SPI Codebeispiel ====&lt;br /&gt;
==== I2C Hardware ====&lt;br /&gt;
[[Bild:I2C-PIC16F690.png|thumb|right|Hardware I2C im PIC16F690]]&lt;br /&gt;
==== I2C Codebeispiel ====&lt;br /&gt;
==== Links zu Application Notes und weiterführenden Informationen zum SSP-Modul ====&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/31015a.pdf Microchip SSP Manual] PDF&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/31017a.pdf Microchip MSSP Manual] PDF&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.microchip.com Homepage Microchip]&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/33023a.pdf Microchip Mid-Range Reference Manual] PDF&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplgidcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1335&amp;amp;dDocName=en023112 Produktseite PIC16F690]&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/41262E.pdf Datenblatt PIC16F690] PDF&lt;br /&gt;
* [http://www.htsoft.com HiTech Software]&lt;br /&gt;
* [http://www.sprut.de Sprut -&amp;gt; DIE deutschsprachige Seite zum Thema PIC]&lt;br /&gt;
* ...&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
* Den Code auf dieser Seite &amp;quot;einklappbar&amp;quot; machen, sodass nicht ewig weit gescrollt werden muss&lt;br /&gt;
* Die Bilder neu malen wegen eventuellem Copyright-Schnickschnack&lt;br /&gt;
* Timer1&lt;br /&gt;
: Codebeispiel mit externer Taktquelle&lt;br /&gt;
: Codebeispiel mit externem Quarz&lt;br /&gt;
: Codebeispiel mit T1G als Zählbeginn/ende&lt;br /&gt;
: Codebeispiel mit Comparator als Zählbeginn/ende&lt;br /&gt;
: Codebeispiel mit Synchronem Zähler&lt;br /&gt;
* Timer2&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
* AD-Wandler&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
: Codebeispiel mehrere Kanäle&lt;br /&gt;
* CCP-Modul&lt;br /&gt;
: PWM&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
: Komparator&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
* Eusart&lt;br /&gt;
: Erklärung Hardware RX&lt;br /&gt;
: Erklärung Hardware TX&lt;br /&gt;
: Codebeispiel RX&lt;br /&gt;
: Codebeispiel TX&lt;br /&gt;
: Codebeispiel RX-TX&lt;br /&gt;
* CCP-Modul&lt;br /&gt;
: SPI&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel senden &lt;br /&gt;
: Codebeispiel empfangen&lt;br /&gt;
: I2C&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel senden &lt;br /&gt;
: Codebeispiel empfangen&lt;br /&gt;
* Brown Out Reset&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
* EEPROM&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Wettbewerb|P]]&lt;br /&gt;
[[Category:PIC|P]]&lt;/div&gt;</summary>
		<author><name>Thomas1123</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=PIC_Codebeispiele&amp;diff=28792</id>
		<title>PIC Codebeispiele</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=PIC_Codebeispiele&amp;diff=28792"/>
		<updated>2008-06-28T10:04:25Z</updated>

		<summary type="html">&lt;p&gt;Thomas1123: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt; &#039;&#039;&#039;Diese Seite ist noch in Bearbeitung. Die Codebeispiele sind noch nicht vollständig bzw. korrekt. Ich gelobe jedoch Besserung bis zum 15.8.08&#039;&#039;&#039; &amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;von [[Benutzer:Thomas1123|Thomas1123]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ich persönlich benutze den Hitech PIC-C Lite Compiler für meine Projekte.&amp;lt;br/&amp;gt;&lt;br /&gt;
Hierbei handelt es sich um die abgespeckte Version des Hitech PIC-C Compilers von der Firma HiTech Software.&amp;lt;br/&amp;gt;&lt;br /&gt;
Ich möchte hier eine Sammlung von Codebeispielen beginnen mit der es Einsteigern ermöglicht wird verschiedene interne und externe Pereferie zu initialiesieren und zu benutzen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Da der [http://www.microchip.com/stellent/idcplgidcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1335&amp;amp;dDocName=en023112 PIC16F690] mein persönlicher Liebling ist möchte ich die hier gezeigten Beispiele anhand dieses PICs aufzeigen. Die nachfolgenden Beispiele sind nicht nur für den PIC16F690 vewendbar z.B. sind die Timer0-Module in vielen Pics identisch. Dies trifft auch auf die meisten anderen Module zu jedoch kann ein zusätzlicher Blick in das Datenblatt nich schaden, da eventuell mache Register einen anderen Namen besitzen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Selbstverständlich kann dieser Artikel noch mit Codebeispielen für cc5x und ASM erweitert werden, des Weiteren kann man auch Beispiele für andere PICs der 10er, 12er, und 16er Kategorie einfügen.&lt;br /&gt;
&lt;br /&gt;
== Pinbelegung ==&lt;br /&gt;
[[Bild:PIC16F690-Pins.png|thumb|right|Pinbelegung des PIC16F690]]&lt;br /&gt;
Der PIC16F690 verfügt über eine grosse Anzahl an interner Pereferie beispielsweise 10-Bit AD-Wandler, SPI/I2C Interface, mehrere Timer (2*8-Bit 1*16-Bit), EUSART (RS232 etc.) usw.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
== Codebeispiele ==&lt;br /&gt;
----&lt;br /&gt;
=== Timer0 ===&lt;br /&gt;
==== Timer0 Hardware ====&lt;br /&gt;
[[Bild:Timer0-PIC16F690.png|thumb|right|Hardware Timer0 und WDT im PIC16F690]]&lt;br /&gt;
Der Timer0 ist ein 8-Bit Timer/Zähler, welcher entweder mit dem internen Takt des PIC oder mit einer externen Taktquelle am Pin 17 (RA2/T0CKI) Betrieben werden kann. Beim Betrieb mit einer externen Taktquelle kann man zusätzlich auswählen ob bei einer steigenden oder fallenden Flanke das Timerregister inkrementiert werden soll. Gleich welche Taktquelle gewählt wird, kann bei einem Überlauf des Timerregisters ein Interrupt ausgelöst werden. Hierfür ist es notwendig die Bits &#039;&#039;&#039;GIE&#039;&#039;&#039; und &#039;&#039;&#039;T0IE&#039;&#039;&#039; auf 1 zu setzen. Beide Bits befinden sich im &#039;&#039;&#039;INTCON&#039;&#039;&#039;-Register und sind im Datenblatt auf Seite 38 zu finden.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Im nebenstehendem Diagramm ist der aufbau des Timer0 zusammen mit dem Watchdogtimer dargestellt.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Im Option Register (&#039;&#039;&#039;OPTION&#039;&#039;&#039; Datenblatt Seite 83) kann mit Bit 5 (&#039;&#039;&#039;T0CS&#039;&#039;&#039;) ausgewählt werden ob der interne Takt (0) oder ein externer Takt (1) verwendet wird. Bei einem externen Takt kann mit Bit 4 (&#039;&#039;&#039;T0SE&#039;&#039;&#039;) auswählen ob bei einer steigenden (0) oder bei einer fallenden Flanke (1) das Timer0-Register inkrenemtiert werden soll. Mit Bit 3 (&#039;&#039;&#039;PSA&#039;&#039;&#039;) wird der Prescaler entweder dem Timer (0) &#039;&#039;&#039;oder&#039;&#039;&#039; dem Watchdogtimer (1) zugewiesen. Der Prescaler selbst wird mit den Bits 0 bis 2 (&#039;&#039;&#039;PS0 PS1 PS2&#039;&#039;&#039;) des Option Registers eingestellt.&amp;lt;br/&amp;gt;&lt;br /&gt;
Eine Übersicht der Einstellmöglichkeiten ist auf Seite 83 im Datenblatt einsehbar.&lt;br /&gt;
&lt;br /&gt;
==== Timer0 Codebeispiel mit Verwendung des Programmtaktes Fosc/4 ====&lt;br /&gt;
&#039;&#039;Szenario:&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC verwendet als Taktquelle einen 32,768 kHz Uhrenquarz.&amp;lt;br/&amp;gt;&lt;br /&gt;
An PORTB sind 8 LEDs mit Vorwiderständen gegen Masse verschaltet.&amp;lt;br/&amp;gt;&lt;br /&gt;
Jede Sekunde soll PORTB um den Wert 1 inkrementiert werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
Zu diesem Zweck wird der Timer0 mit Prescaler verwendet.&amp;lt;br/&amp;gt;&lt;br /&gt;
Die Einstellungen des Prescaler errechenen sich wie folgt:&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{Fosc}{4*Prescaler*2^8}= t \,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fosc/4 weil der PIC für eine Anweisung 4 Takte benötigt.&amp;lt;br/&amp;gt;&lt;br /&gt;
Der Prescaler als zusätzlicher Teiler des Timertaktes.&amp;lt;br/&amp;gt;&lt;br /&gt;
2^8 (256) Schritte benötigt der Timer 0 zum Überlauf.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{32768Hz}{4*2^8*32}= \frac {1}{Sek}\,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei einem Prescaler von 1:32 lösen wir somit exakt jede Sekunde einen Interrupt aus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
#include &amp;quot;htc.h&amp;quot;&lt;br /&gt;
__CONFIG (0x30e0);&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
static void interrupt global_int(void)&lt;br /&gt;
{&lt;br /&gt;
	GIE  = 0;		// Alle Interruptquellen ausschalten&lt;br /&gt;
	T0IF = 0;		// Timer0 Interruptflag Löschen&lt;br /&gt;
	PORTB++;		// PORTB inkrementieren&lt;br /&gt;
	GIE  = 1;		// Interrupts wieder einschalten&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void t0_ini ()&lt;br /&gt;
{&lt;br /&gt;
				// Datenblatt Seite 83&lt;br /&gt;
	OPTION 	= 0b11000100;		&lt;br /&gt;
		 // 1-------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // -1------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // --0-----	Internen Takt für Timer0 verwenden&lt;br /&gt;
		 // ---0----	Bei externem Takt an steigender Flanke inkrementieren&lt;br /&gt;
		 // 		(in diesem Fall egal ob 1 oder 0 weil der interne Takt verwendet wird)&lt;br /&gt;
		 // ----0---	Prescaler für Timer0 verwenden&lt;br /&gt;
		 // -----100	Prescaler 1:32&lt;br /&gt;
&lt;br /&gt;
	T0IF	= 0;		// Interruptflag von Timer0 löschen&lt;br /&gt;
	GIE 	= 1;		// Alle nichtmaskierten Interrupts erlauben&lt;br /&gt;
	T0IE 	= 1;		// Timer0 Interrupt erlauben&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
	ANSEL  = 0b00000000;		// Pins als digital I/O &lt;br /&gt;
	ANSELH = 0b00000000;		// Pins als digital I/O&lt;br /&gt;
	PORTA  = 0;			// Latch von Port A,B und C löschen&lt;br /&gt;
	PORTB  = 0;&lt;br /&gt;
	PORTC  = 0;&lt;br /&gt;
	TRISA  = 0b00000000;		// Port A,B und C als Ausgänge schalten&lt;br /&gt;
	TRISB  = 0b00000000;&lt;br /&gt;
	TRISC  = 0b00000000;&lt;br /&gt;
}&lt;br /&gt;
//========================================================================&lt;br /&gt;
void main ()&lt;br /&gt;
{&lt;br /&gt;
	setup();&lt;br /&gt;
	t0_ini();&lt;br /&gt;
&lt;br /&gt;
	while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
==== Timer0 Codebeispiel mit Verwendung eines externen Taktes ====&lt;br /&gt;
Der Code ist fast identisch, es wurden lediglich Änderungen im &#039;&#039;&#039;OPTION&#039;&#039;&#039;-Register vorgenommen und der Pin 17 (RA2) wurde als Eingang definiert. Weiters wurde der interne Oszillator mit 4MHz verwendet. &amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Der externe Takt kann nicht beliebig schnell sein. siehe Datenblatt Kapitel 5.1.5 Seite 82 und Kapitel 17 Seite 243. &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;Szenario&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC verwendet als Taktquelle den internen 4MHz Oszillator.&amp;lt;br/&amp;gt;&lt;br /&gt;
An PORTB sind 8 LEDs mit Vorwiderständen gegen Masse verschaltet.&amp;lt;br/&amp;gt;&lt;br /&gt;
PORTB soll bei jedem Timer0-Überlauf um den Wert 1 inkrementiert werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
Zu diesem Zweck wird der Timer0 mit Prescaler verwendet.&amp;lt;br/&amp;gt;&lt;br /&gt;
Die Einstellungen errechenen sich wie folgt:&amp;lt;br/&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{Takt_{T0CKI}}{Prescaler*2^8}= t \,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Gehen wir mal davon aus, dass der takt an T0CKI 100kHz beträgt und der Prescaler als 1:2 Vorteiler eingestellt ist. Somit läuft der Timer0 alle 512 Takte über.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{100kHz}{2*2^8}= \frac{195,3125}{Sek} \,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Bei diesen Einstellungen bekommen wir 195,3125 Timer0-Überläufe pro Sekunde was wiederum einem Zeitinterwall von 5,12ms entspricht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
#include &amp;quot;htc.h&amp;quot;&lt;br /&gt;
__CONFIG (0x30e4);&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
static void interrupt global_int(void)&lt;br /&gt;
{&lt;br /&gt;
	GIE  = 0;		// Alle Interruptquellen ausschalten&lt;br /&gt;
	T0IF = 0;		// Timer0 Interruptflag Löschen&lt;br /&gt;
	PORTB++;		// PORTB inkrementieren&lt;br /&gt;
	GIE  = 1;		// Interrupts wieder einschalten&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void t0_ini ()&lt;br /&gt;
{&lt;br /&gt;
				// Datenblatt Seite 83&lt;br /&gt;
	OPTION 	= 0b11000100;		&lt;br /&gt;
		 // 1-------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // -1------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // --1-----	Takt an T0CKI für Timer0 verwenden&lt;br /&gt;
		 // ---0----	Bei externem Takt an steigender Flanke inkrementieren&lt;br /&gt;
		 // ----0---	Prescaler für Timer0 verwenden&lt;br /&gt;
		 // -----000	Prescaler 1:2&lt;br /&gt;
&lt;br /&gt;
	T0IF	= 0;		// Interruptflag von Timer0 löschen&lt;br /&gt;
	GIE 	= 1;		// Alle nichtmaskierten Interrupts erlauben&lt;br /&gt;
	T0IE 	= 1;		// Timer0 Interrupt erlauben&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
	ANSEL  = 0b00000000;		// Pins als digital I/O &lt;br /&gt;
	ANSELH = 0b00000000;		// Pins als digital I/O&lt;br /&gt;
	PORTA  = 0;			// Latch von Port A,B und C löschen&lt;br /&gt;
	PORTB  = 0;&lt;br /&gt;
	PORTC  = 0;&lt;br /&gt;
	TRISA  = 0b00000100;		// RA2 als Eingang setzen und restliche Pins als &lt;br /&gt;
					// Ausgang setzen.&lt;br /&gt;
	TRISB  = 0b00000000;&lt;br /&gt;
	TRISC  = 0b00000000;&lt;br /&gt;
}&lt;br /&gt;
//========================================================================&lt;br /&gt;
void main ()&lt;br /&gt;
{&lt;br /&gt;
	setup();&lt;br /&gt;
	t0_ini();&lt;br /&gt;
&lt;br /&gt;
	while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Links zu Application Notes und weiterführenden Informationen zum Timer0 ====&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/51682A.pdf Microchip Timer Tutorial (Part 1)]&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/51702A.pdf Microchip Timer Tutorial (Part 2)]&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/31011a.pdf Microchip Timer0 Manual]&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1824&amp;amp;appnote=en011033 AN592 Frequency Counter Using PIC16C5x]&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1824&amp;amp;appnote=en011031 AN590 A Clock Design Using the PIC16C54 for LED Displays and Switch Inputs]&lt;br /&gt;
* [http://www.sprut.de/electronic/pic/grund/timer/timer.htm#timer0 Erklärung zum Timer0 auf der Homepage von Sprut]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Timer1 ===&lt;br /&gt;
==== Timer1 Hardware ====&lt;br /&gt;
[[Bild:Timer1-PIC16F690.png|right|thumb|Hardware Timer1 im PIC16F690]]&lt;br /&gt;
Der Timer1 ist ein 16-Bit Timer/Zähler. Für den Timer1 gibt es viele Verwendungsmöglichkeiten auf Grund seiner zahlreichen Einstellmöglichkeiten. Man kann Ihn als einfachen Timer verwenden, wofür er eigentlich schon fast zu schade ist, oder als raffinierten Zähler, welcher erst bei einem bestimmten Ereignis wie z.B. dem auslösen des Komparators oder eines bestimmten zustandes am TG1-Pin (RA4/Pin 3) zu zählen beginnt.&amp;lt;br/&amp;gt;&lt;br /&gt;
die 16-Bit des Timers teilen sich auf zwei 8-Bit-Register auf, &#039;&#039;&#039;TMR1H&#039;&#039;&#039; und &#039;&#039;&#039;TMR1L&#039;&#039;&#039;. &#039;&#039;&#039;TMR1H&#039;&#039;&#039; beherbergt die oberen 8 Bit und &#039;&#039;&#039;TMR1L&#039;&#039;&#039; die unteren 8 Bit.&amp;lt;br/&amp;gt;&lt;br /&gt;
Der Timer1 wird zusätzlich noch vom CCP-Modul verwendet, insbesondere vom Capture- und vom Compare-Modul. Für das PWM-Modul wird der Timer2 als Zeitbasis verwendet.&lt;br /&gt;
&lt;br /&gt;
==== Timer1 Codebeispiel mit Verwendung des Programmtaktes Fosc/4 ====&lt;br /&gt;
&#039;&#039;Szenario&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC verwendet als Taktquelle den internen Oszilator mit 8MHz.&amp;lt;br/&amp;gt;&lt;br /&gt;
An PORTB sind 8 LEDs mit Vorwiderständen gegen Masse verschaltet.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
#include &amp;quot;htc.h&amp;quot;&lt;br /&gt;
__CONFIG (0x30e4);&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
static void interrupt global_int(void)&lt;br /&gt;
{&lt;br /&gt;
	GIE    = 0;		// Alle Interruptquellen ausschalten&lt;br /&gt;
	TMR1IF = 0;		// Timer1 Interruptflag Löschen&lt;br /&gt;
	PORTB++;		// PORTB inkrementieren&lt;br /&gt;
	GIE    = 1;		// Interrupts wieder einschalten&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void t1_ini ()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	TMR1IF	= 0;		// Interruptflag von Timer1 löschen+&lt;br /&gt;
&lt;br /&gt;
				// Datenblatt Seite 88&lt;br /&gt;
	T1CON 	= 0b00110000;		&lt;br /&gt;
		 // 0-------	Timer1 Gate-invertier-Bit (in diesem Beispiel uninteressant)&lt;br /&gt;
		 // -0------	Timer1 Gate-enable-Bit (auf 0 gesetzt sodass der timer1 &lt;br /&gt;
		 //		mit dem TMR1ON-Bit direkt ein und ausgeschaltet werden kann&lt;br /&gt;
		 // --11----	Prescaler auf 1:8 einstellen&lt;br /&gt;
		 // ----0---	Low Power Oszillator aus&lt;br /&gt;
		 // -----0--	(in diesem Beispiel uninteressant weil Bit 1 == 0)&lt;br /&gt;
		 // ------0-	interen Takt verwenden&lt;br /&gt;
		 // -------1	Timer1 einschalten&lt;br /&gt;
&lt;br /&gt;
	GIE 	= 1;		// Alle nichtmaskierten Interrupts erlauben&lt;br /&gt;
	PEIE 	= 1;		// Pereferieinterrupt erlauben&lt;br /&gt;
				// Die Bits GIE und PEIE befinden sich in INTCON Register&lt;br /&gt;
				// und sind im Datenblatt auf Seite 38 erläutert.&lt;br /&gt;
	TMR1IE 	= 1;		// Timer1 Interrupt erlauben&lt;br /&gt;
				// Das TMR1IE-Bit ist im ist im PIE1 Register&lt;br /&gt;
				// und im Datenblatt auf Seite 39&lt;br /&gt;
}&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
	OSCCON = 0b01110000;		// 8 MHz Datenblatt Seite 48&lt;br /&gt;
	ANSEL  = 0b00000000;		// Pins als digital I/O &lt;br /&gt;
	ANSELH = 0b00000000;		// Pins als digital I/O&lt;br /&gt;
	PORTA  = 0;			// Latch von Port A,B und C löschen&lt;br /&gt;
	PORTB  = 0;&lt;br /&gt;
	PORTC  = 0;&lt;br /&gt;
	TRISA  = 0b00000000;		// Port A,B und C als Ausgänge schalten&lt;br /&gt;
	TRISB  = 0b00000000;&lt;br /&gt;
	TRISC  = 0b00000000;&lt;br /&gt;
}&lt;br /&gt;
//========================================================================&lt;br /&gt;
void main ()&lt;br /&gt;
{&lt;br /&gt;
	setup();&lt;br /&gt;
	t1_ini();&lt;br /&gt;
&lt;br /&gt;
	while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
==== Links zu Application Notes und weiterführenden Informationen zum Timer1 ====&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/31012a.pdf Microchip Timer1 Manual]&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1824&amp;amp;appnote=en011055 AN580 Using Timer 1 in Asynchronous Clock Mode]&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1824&amp;amp;appnote=en011057 AN582 Low-Power Real Time Clock]&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1824&amp;amp;appnote=en011068 AN649 Yet Another Clock Featuring the PIC16C924]&lt;br /&gt;
* [http://www.sprut.de/electronic/pic/grund/timer/timer.htm#timer1 Erklärung zum Timer0 auf der Homepage von Sprut]&lt;br /&gt;
----&lt;br /&gt;
=== Timer2 ===&lt;br /&gt;
==== Timer2 Hardware ====&lt;br /&gt;
[[Bild:Timer2-PIC16F690.png|right|thumb|Hardware Timer2 im PIC16F690]]&lt;br /&gt;
Der Timer2 ist ein 8-Bit Timer. Mit dem Timer2 lässt sich nahezu jede Zeitbasis einstellen da er über einen Prescaler von 1:1, 1:4, 1:16 und über einen Postscaler von 1:1 bis 1:16 verfügt. Des Weiteren verfügt der Timer2 über einen Comparator, welcher kontinuirlich den Wert des Timer2-Registers und des PR2-Registers vergleicht und bei Übereinstimmung einen Takt an den Postscaler weiter gibt. Wenn der Postscaler überläuft wird ein Timer2 Interrupt ausgelöst.&amp;lt;br/&amp;gt;&lt;br /&gt;
Der Timer2 wird vom CCP-Modul für die PWM verwendet ist somit nicht immer frei zur verfügung.&lt;br /&gt;
==== Timer2 Codebeispiel ====&lt;br /&gt;
==== Links zu Application Notes und weiterführenden Informationen zum Timer2 ====&lt;br /&gt;
*[http://ww1.microchip.com/downloads/en/DeviceDoc/31013a.pdf Microchip Timer2 Manual]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== AD-Wandler ===&lt;br /&gt;
==== AD-Wandler Hardware ====&lt;br /&gt;
[[Bild:AD-Wandler-PIC16F690.png|right|thumb|Hardware AD-Wandler im PIC16F690]]&lt;br /&gt;
==== AD-Wandler Codebeispiel ====&lt;br /&gt;
==== Links zu Application Notes und weiterführenden Informationen zum AD-Wandler ====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== PWM ===&lt;br /&gt;
==== PWM Hardware ====&lt;br /&gt;
[[Bild:PWM-PIC16F690.png|thumb|right|Hardware PWM im PIC16F690]]&lt;br /&gt;
==== PWM Codebeispiel ====&lt;br /&gt;
==== Links zu Application Notes und weiterführenden Informationen zum PWM-Modul ====&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== EUSART ===&lt;br /&gt;
==== EUSART Hardware ====&lt;br /&gt;
[[Bild:EUSART-TX-PIC16F690.png|thumb|right|Hardware EUSART im PIC16F690]]&lt;br /&gt;
[[Bild:EUSART-RX-PIC16F690.png|thumb|right|Hardware EUSART im PIC16F690]]&lt;br /&gt;
==== EUSART TX Codebeispiel ====&lt;br /&gt;
==== EUSART RX Codebeispiel ====&lt;br /&gt;
==== Links zu Application Notes und weiterführenden Informationen zum EUSART-Modul ====&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== SSP-Modul (Synchronous Serial Port) ===&lt;br /&gt;
==== SPI Hardware ====&lt;br /&gt;
[[Bild:SPI-PIC16F690.png|thumb|right|Hardware SPI im PIC16F690]]&lt;br /&gt;
==== SPI Codebeispiel ====&lt;br /&gt;
==== I2C Hardware ====&lt;br /&gt;
[[Bild:I2C-PIC16F690.png|thumb|right|Hardware I2C im PIC16F690]]&lt;br /&gt;
==== I2C Codebeispiel ====&lt;br /&gt;
==== Links zu Application Notes und weiterführenden Informationen zum SSP-Modul ====&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/31015a.pdf Microchip SSP Manual]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.microchip.com Homepage Microchip]&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplgidcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1335&amp;amp;dDocName=en023112 Produktseite PIC16F690]&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/41262E.pdf Datenblatt PIC16F690]&lt;br /&gt;
* [http://www.htsoft.com HiTech Software]&lt;br /&gt;
* [http://www.sprut.de Sprut -&amp;gt; DIE deutschsprachige Seite zum Thema PIC]&lt;br /&gt;
* ...&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
* Den Code auf dieser Seite &amp;quot;einklappbar&amp;quot; machen, sodass nicht ewig weit gescrollt werden muss&lt;br /&gt;
* Die Bilder neu malen wegen eventuellem Copyright-Schnickschnack&lt;br /&gt;
* Timer1&lt;br /&gt;
: Codebeispiel mit externer Taktquelle&lt;br /&gt;
: Codebeispiel mit externem Quarz&lt;br /&gt;
: Codebeispiel mit T1G als Zählbeginn/ende&lt;br /&gt;
: Codebeispiel mit Comparator als Zählbeginn/ende&lt;br /&gt;
: Codebeispiel mit Synchronem Zähler&lt;br /&gt;
* Timer2&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
* AD-Wandler&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
: Codebeispiel mehrere Kanäle&lt;br /&gt;
* PWM&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
* Eusart&lt;br /&gt;
: Erklärung Hardware RX&lt;br /&gt;
: Erklärung Hardware TX&lt;br /&gt;
: Codebeispiel RX&lt;br /&gt;
: Codebeispiel TX&lt;br /&gt;
: Codebeispiel RX-TX&lt;br /&gt;
* Komparator&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
* SPI&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel senden &lt;br /&gt;
: Codebeispiel empfangen&lt;br /&gt;
* I2C&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel senden &lt;br /&gt;
: Codebeispiel empfangen&lt;br /&gt;
* Brown Out Reset&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
* EEPROM&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Wettbewerb|P]]&lt;br /&gt;
[[Category:PIC|P]]&lt;/div&gt;</summary>
		<author><name>Thomas1123</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=PIC_Codebeispiele&amp;diff=28783</id>
		<title>PIC Codebeispiele</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=PIC_Codebeispiele&amp;diff=28783"/>
		<updated>2008-06-28T09:27:25Z</updated>

		<summary type="html">&lt;p&gt;Thomas1123: /* Timer0 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt; &#039;&#039;&#039;Diese Seite ist noch in Bearbeitung. Die Codebeispiele sind noch nicht vollständig bzw. korrekt. Ich gelobe jedoch Besserung bis zum 15.8.08&#039;&#039;&#039; &amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;von [[Benutzer:Thomas1123|Thomas1123]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ich persönlich benutze den Hitech PIC-C Lite Compiler für meine Projekte.&amp;lt;br/&amp;gt;&lt;br /&gt;
Hierbei handelt es sich um die abgespeckte Version des Hitech PIC-C Compilers von der Firma HiTech Software.&amp;lt;br/&amp;gt;&lt;br /&gt;
Ich möchte hier eine Sammlung von Codebeispielen beginnen mit der es Einsteigern ermöglicht wird verschiedene interne und externe Pereferie zu initialiesieren und zu benutzen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Da der [http://www.microchip.com/stellent/idcplgidcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1335&amp;amp;dDocName=en023112 PIC16F690] mein persönlicher Liebling ist möchte ich die hier gezeigten Beispiele anhand dieses PICs aufzeigen. Die nachfolgenden Beispiele sind nicht nur für den PIC16F690 vewendbar z.B. sind die Timer0-Module in vielen Pics identisch. Dies trifft auch auf die meisten anderen Module zu jedoch kann ein zusätzlicher Blick in das Datenblatt nich schaden, da eventuell mache Register einen anderen Namen besitzen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Selbstverständlich kann dieser Artikel noch mit Codebeispielen für cc5x und ASM erweitert werden, des Weiteren kann man auch Beispiele für andere PICs der 10er, 12er, und 16er Kategorie einfügen.&lt;br /&gt;
&lt;br /&gt;
== Pinbelegung ==&lt;br /&gt;
[[Bild:PIC16F690-Pins.png|thumb|right|Pinbelegung des PIC16F690]]&lt;br /&gt;
Der PIC16F690 verfügt über eine grosse Anzahl an interner Pereferie beispielsweise 10-Bit AD-Wandler, SPI/I2C Interface, mehrere Timer (2*8-Bit 1*16-Bit), EUSART (RS232 etc.) usw.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
== Codebeispiele ==&lt;br /&gt;
----&lt;br /&gt;
=== Timer0 ===&lt;br /&gt;
==== Timer0 Hardware ====&lt;br /&gt;
[[Bild:Timer0-PIC16F690.png|thumb|right|Hardware Timer0 und WDT im PIC16F690]]&lt;br /&gt;
Der Timer0 ist ein 8-Bit Timer/Zähler, welcher entweder mit dem internen Takt des PIC oder mit einer externen Taktquelle am Pin 17 (RA2/T0CKI) Betrieben werden kann. Beim Betrieb mit einer externen Taktquelle kann man zusätzlich auswählen ob bei einer steigenden oder fallenden Flanke das Timerregister inkrementiert werden soll. Gleich welche Taktquelle gewählt wird, kann bei einem Überlauf des Timerregisters ein Interrupt ausgelöst werden. Hierfür ist es notwendig die Bits &#039;&#039;&#039;GIE&#039;&#039;&#039; und &#039;&#039;&#039;T0IE&#039;&#039;&#039; auf 1 zu setzen. Beide Bits befinden sich im &#039;&#039;&#039;INTCON&#039;&#039;&#039;-Register und sind im Datenblatt auf Seite 38 zu finden.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Im nebenstehendem Diagramm ist der aufbau des Timer0 zusammen mit dem Watchdogtimer dargestellt.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Im Option Register (&#039;&#039;&#039;OPTION&#039;&#039;&#039; Datenblatt Seite 83) kann mit Bit 5 (&#039;&#039;&#039;T0CS&#039;&#039;&#039;) ausgewählt werden ob der interne Takt (0) oder ein externer Takt (1) verwendet wird. Bei einem externen Takt kann mit Bit 4 (&#039;&#039;&#039;T0SE&#039;&#039;&#039;) auswählen ob bei einer steigenden (0) oder bei einer fallenden Flanke (1) das Timer0-Register inkrenemtiert werden soll. Mit Bit 3 (&#039;&#039;&#039;PSA&#039;&#039;&#039;) wird der Prescaler entweder dem Timer (0) &#039;&#039;&#039;oder&#039;&#039;&#039; dem Watchdogtimer (1) zugewiesen. Der Prescaler selbst wird mit den Bits 0 bis 2 (&#039;&#039;&#039;PS0 PS1 PS2&#039;&#039;&#039;) des Option Registers eingestellt.&amp;lt;br/&amp;gt;&lt;br /&gt;
Eine Übersicht der Einstellmöglichkeiten ist auf Seite 83 im Datenblatt einsehbar.&lt;br /&gt;
&lt;br /&gt;
==== Timer0 Codebeispiel mit Verwendung des Programmtaktes Fosc/4 ====&lt;br /&gt;
&#039;&#039;Szenario:&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC verwendet als Taktquelle einen 32,768 kHz Uhrenquarz.&amp;lt;br/&amp;gt;&lt;br /&gt;
An PORTB sind 8 LEDs mit Vorwiderständen gegen Masse verschaltet.&amp;lt;br/&amp;gt;&lt;br /&gt;
Jede Sekunde soll PORTB um den Wert 1 inkrementiert werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
Zu diesem Zweck wird der Timer0 mit Prescaler verwendet.&amp;lt;br/&amp;gt;&lt;br /&gt;
Die Einstellungen des Prescaler errechenen sich wie folgt:&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{Fosc}{4*Prescaler*2^8}= t \,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fosc/4 weil der PIC für eine Anweisung 4 Takte benötigt.&amp;lt;br/&amp;gt;&lt;br /&gt;
Der Prescaler als zusätzlicher Teiler des Timertaktes.&amp;lt;br/&amp;gt;&lt;br /&gt;
2^8 (256) Schritte benötigt der Timer 0 zum Überlauf.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{32768Hz}{4*2^8*32}= \frac {1}{Sek}\,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei einem Prescaler von 1:32 lösen wir somit exakt jede Sekunde einen Interrupt aus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
#include &amp;quot;htc.h&amp;quot;&lt;br /&gt;
__CONFIG (0x30e0);&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
static void interrupt global_int(void)&lt;br /&gt;
{&lt;br /&gt;
	GIE  = 0;		// Alle Interruptquellen ausschalten&lt;br /&gt;
	T0IF = 0;		// Timer0 Interruptflag Löschen&lt;br /&gt;
	PORTB++;		// PORTB inkrementieren&lt;br /&gt;
	GIE  = 1;		// Interrupts wieder einschalten&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void t0_ini ()&lt;br /&gt;
{&lt;br /&gt;
				// Datenblatt Seite 83&lt;br /&gt;
	OPTION 	= 0b11000100;		&lt;br /&gt;
		 // 1-------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // -1------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // --0-----	Internen Takt für Timer0 verwenden&lt;br /&gt;
		 // ---0----	Bei externem Takt an steigender Flanke inkrementieren&lt;br /&gt;
		 // 		(in diesem Fall egal ob 1 oder 0 weil der interne Takt verwendet wird)&lt;br /&gt;
		 // ----0---	Prescaler für Timer0 verwenden&lt;br /&gt;
		 // -----100	Prescaler 1:32&lt;br /&gt;
&lt;br /&gt;
	T0IF	= 0;		// Interruptflag von Timer0 löschen&lt;br /&gt;
	GIE 	= 1;		// Alle nichtmaskierten Interrupts erlauben&lt;br /&gt;
	T0IE 	= 1;		// Timer0 Interrupt erlauben&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
	ANSEL  = 0b00000000;		// Pins als digital I/O &lt;br /&gt;
	ANSELH = 0b00000000;		// Pins als digital I/O&lt;br /&gt;
	PORTA  = 0;			// Latch von Port A,B und C löschen&lt;br /&gt;
	PORTB  = 0;&lt;br /&gt;
	PORTC  = 0;&lt;br /&gt;
	TRISA  = 0b00000000;		// Port A,B und C als Ausgänge schalten&lt;br /&gt;
	TRISB  = 0b00000000;&lt;br /&gt;
	TRISC  = 0b00000000;&lt;br /&gt;
}&lt;br /&gt;
//========================================================================&lt;br /&gt;
void main ()&lt;br /&gt;
{&lt;br /&gt;
	setup();&lt;br /&gt;
	t0_ini();&lt;br /&gt;
&lt;br /&gt;
	while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
==== Timer0 Codebeispiel mit Verwendung eines externen Taktes ====&lt;br /&gt;
Der Code ist fast identisch, es wurden lediglich Änderungen im &#039;&#039;&#039;OPTION&#039;&#039;&#039;-Register vorgenommen und der Pin 17 (RA2) wurde als Eingang definiert. Weiters wurde der interne Oszillator mit 4MHz verwendet. &amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Der externe Takt kann nicht beliebig schnell sein. siehe Datenblatt Kapitel 5.1.5 Seite 82 und Kapitel 17 Seite 243. &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;Szenario&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC verwendet als Taktquelle den internen 4MHz Oszillator.&amp;lt;br/&amp;gt;&lt;br /&gt;
An PORTB sind 8 LEDs mit Vorwiderständen gegen Masse verschaltet.&amp;lt;br/&amp;gt;&lt;br /&gt;
PORTB soll bei jedem Timer0-Überlauf um den Wert 1 inkrementiert werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
Zu diesem Zweck wird der Timer0 mit Prescaler verwendet.&amp;lt;br/&amp;gt;&lt;br /&gt;
Die Einstellungen errechenen sich wie folgt:&amp;lt;br/&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{Takt_{T0CKI}}{Prescaler*2^8}= t \,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Gehen wir mal davon aus, dass der takt an T0CKI 100kHz beträgt und der Prescaler als 1:2 Vorteiler eingestellt ist. Somit läuft der Timer0 alle 512 Takte über.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{100kHz}{2*2^8}= \frac{195,3125}{Sek} \,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Bei diesen Einstellungen bekommen wir 195,3125 Timer0-Überläufe pro Sekunde was wiederum einem Zeitinterwall von 5,12ms entspricht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
#include &amp;quot;htc.h&amp;quot;&lt;br /&gt;
__CONFIG (0x30e4);&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
static void interrupt global_int(void)&lt;br /&gt;
{&lt;br /&gt;
	GIE  = 0;		// Alle Interruptquellen ausschalten&lt;br /&gt;
	T0IF = 0;		// Timer0 Interruptflag Löschen&lt;br /&gt;
	PORTB++;		// PORTB inkrementieren&lt;br /&gt;
	GIE  = 1;		// Interrupts wieder einschalten&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void t0_ini ()&lt;br /&gt;
{&lt;br /&gt;
				// Datenblatt Seite 83&lt;br /&gt;
	OPTION 	= 0b11000100;		&lt;br /&gt;
		 // 1-------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // -1------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // --1-----	Takt an T0CKI für Timer0 verwenden&lt;br /&gt;
		 // ---0----	Bei externem Takt an steigender Flanke inkrementieren&lt;br /&gt;
		 // ----0---	Prescaler für Timer0 verwenden&lt;br /&gt;
		 // -----000	Prescaler 1:2&lt;br /&gt;
&lt;br /&gt;
	T0IF	= 0;		// Interruptflag von Timer0 löschen&lt;br /&gt;
	GIE 	= 1;		// Alle nichtmaskierten Interrupts erlauben&lt;br /&gt;
	T0IE 	= 1;		// Timer0 Interrupt erlauben&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
	ANSEL  = 0b00000000;		// Pins als digital I/O &lt;br /&gt;
	ANSELH = 0b00000000;		// Pins als digital I/O&lt;br /&gt;
	PORTA  = 0;			// Latch von Port A,B und C löschen&lt;br /&gt;
	PORTB  = 0;&lt;br /&gt;
	PORTC  = 0;&lt;br /&gt;
	TRISA  = 0b00000100;		// RA2 als Eingang setzen und restliche Pins als &lt;br /&gt;
					// Ausgang setzen.&lt;br /&gt;
	TRISB  = 0b00000000;&lt;br /&gt;
	TRISC  = 0b00000000;&lt;br /&gt;
}&lt;br /&gt;
//========================================================================&lt;br /&gt;
void main ()&lt;br /&gt;
{&lt;br /&gt;
	setup();&lt;br /&gt;
	t0_ini();&lt;br /&gt;
&lt;br /&gt;
	while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Links zu Application Notes und weiterführenden Informationen zum Timer0 ====&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/51682A.pdf Microchip Timer Tutorial (Part 1)]&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/51702A.pdf Microchip Timer Tutorial (Part 2)]&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/31011a.pdf Microchip Timer0 Manual]&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1824&amp;amp;appnote=en011033 AN592 Frequency Counter Using PIC16C5x]&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1824&amp;amp;appnote=en011031 AN590 A Clock Design Using the PIC16C54 for LED Displays and Switch Inputs]&lt;br /&gt;
* [http://www.sprut.de/electronic/pic/grund/timer/timer.htm#timer0 Erklärung zum Timer0 auf der Homepage von Sprut]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Timer1 ===&lt;br /&gt;
==== Timer1 Hardware ====&lt;br /&gt;
[[Bild:Timer1-PIC16F690.png|right|thumb|Hardware Timer1 im PIC16F690]]&lt;br /&gt;
Der Timer1 ist ein 16-Bit Timer/Zähler. Für den Timer1 gibt es viele Verwendungsmöglichkeiten auf Grund seiner zahlreichen Einstellmöglichkeiten. Man kann Ihn als einfachen Timer verwenden, wofür er eigentlich schon fast zu schade ist, oder als raffinierten Zähler, welcher erst bei einem bestimmten Ereignis wie z.B. dem auslösen des Komparators oder eines bestimmten zustandes am TG1-Pin (RA4/Pin 3) zu zählen beginnt.&amp;lt;br/&amp;gt;&lt;br /&gt;
die 16-Bit des Timers teilen sich auf zwei 8-Bit-Register auf, &#039;&#039;&#039;TMR1H&#039;&#039;&#039; und &#039;&#039;&#039;TMR1L&#039;&#039;&#039;. &#039;&#039;&#039;TMR1H&#039;&#039;&#039; beherbergt die oberen 8 Bit und &#039;&#039;&#039;TMR1L&#039;&#039;&#039; die unteren 8 Bit.&amp;lt;br/&amp;gt;&lt;br /&gt;
Der Timer1 wird zusätzlich noch vom CCP-Modul verwendet, insbesondere vom Capture- und vom Compare-Modul. Für das PWM-Modul wird der Timer2 als Zeitbasis verwendet.&lt;br /&gt;
&lt;br /&gt;
==== Timer1 Codebeispiel mit Verwendung des Programmtaktes Fosc/4 ====&lt;br /&gt;
&#039;&#039;Szenario&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC verwendet als Taktquelle den internen Oszilator mit 8MHz.&amp;lt;br/&amp;gt;&lt;br /&gt;
An PORTB sind 8 LEDs mit Vorwiderständen gegen Masse verschaltet.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
#include &amp;quot;htc.h&amp;quot;&lt;br /&gt;
__CONFIG (0x30e4);&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
static void interrupt global_int(void)&lt;br /&gt;
{&lt;br /&gt;
	GIE    = 0;		// Alle Interruptquellen ausschalten&lt;br /&gt;
	TMR1IF = 0;		// Timer1 Interruptflag Löschen&lt;br /&gt;
	PORTB++;		// PORTB inkrementieren&lt;br /&gt;
	GIE    = 1;		// Interrupts wieder einschalten&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void t1_ini ()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	TMR1IF	= 0;		// Interruptflag von Timer1 löschen+&lt;br /&gt;
&lt;br /&gt;
				// Datenblatt Seite 88&lt;br /&gt;
	T1CON 	= 0b00110000;		&lt;br /&gt;
		 // 0-------	Timer1 Gate-invertier-Bit (in diesem Beispiel uninteressant)&lt;br /&gt;
		 // -0------	Timer1 Gate-enable-Bit (auf 0 gesetzt sodass der timer1 &lt;br /&gt;
		 //		mit dem TMR1ON-Bit direkt ein und ausgeschaltet werden kann&lt;br /&gt;
		 // --11----	Prescaler auf 1:8 einstellen&lt;br /&gt;
		 // ----0---	Low Power Oszillator aus&lt;br /&gt;
		 // -----0--	(in diesem Beispiel uninteressant weil Bit 1 == 0)&lt;br /&gt;
		 // ------0-	interen Takt verwenden&lt;br /&gt;
		 // -------1	Timer1 einschalten&lt;br /&gt;
&lt;br /&gt;
	GIE 	= 1;		// Alle nichtmaskierten Interrupts erlauben&lt;br /&gt;
	PEIE 	= 1;		// Pereferieinterrupt erlauben&lt;br /&gt;
				// Die Bits GIE und PEIE befinden sich in INTCON Register&lt;br /&gt;
				// und sind im Datenblatt auf Seite 38 erläutert.&lt;br /&gt;
	TMR1IE 	= 1;		// Timer1 Interrupt erlauben&lt;br /&gt;
				// Das TMR1IE-Bit ist im ist im PIE1 Register&lt;br /&gt;
				// und im Datenblatt auf Seite 39&lt;br /&gt;
}&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
	OSCCON = 0b01110000;		// 8 MHz Datenblatt Seite 48&lt;br /&gt;
	ANSEL  = 0b00000000;		// Pins als digital I/O &lt;br /&gt;
	ANSELH = 0b00000000;		// Pins als digital I/O&lt;br /&gt;
	PORTA  = 0;			// Latch von Port A,B und C löschen&lt;br /&gt;
	PORTB  = 0;&lt;br /&gt;
	PORTC  = 0;&lt;br /&gt;
	TRISA  = 0b00000000;		// Port A,B und C als Ausgänge schalten&lt;br /&gt;
	TRISB  = 0b00000000;&lt;br /&gt;
	TRISC  = 0b00000000;&lt;br /&gt;
}&lt;br /&gt;
//========================================================================&lt;br /&gt;
void main ()&lt;br /&gt;
{&lt;br /&gt;
	setup();&lt;br /&gt;
	t1_ini();&lt;br /&gt;
&lt;br /&gt;
	while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
=== Timer2 ===&lt;br /&gt;
==== Timer2 Hardware ====&lt;br /&gt;
[[Bild:Timer2-PIC16F690.png|right|thumb|Hardware Timer2 im PIC16F690]]&lt;br /&gt;
Der Timer2 ist ein 8-Bit Timer. Mit dem Timer2 lässt sich nahezu jede Zeitbasis einstellen da er über einen Prescaler von 1:1, 1:4, 1:16 und über einen Postscaler von 1:1 bis 1:16 verfügt. Des Weiteren verfügt der Timer2 über einen Comparator, welcher kontinuirlich den Wert des Timer2-Registers und des PR2-Registers vergleicht und bei Übereinstimmung einen Takt an den Postscaler weiter gibt.&lt;br /&gt;
==== Timer2 Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== AD-Wandler ===&lt;br /&gt;
==== AD-Wandler Hardware ====&lt;br /&gt;
[[Bild:AD-Wandler-PIC16F690.png|right|thumb|Hardware AD-Wandler im PIC16F690]]&lt;br /&gt;
==== AD-Wandler Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== PWM ===&lt;br /&gt;
==== PWM Hardware ====&lt;br /&gt;
[[Bild:PWM-PIC16F690.png|thumb|right|Hardware PWM im PIC16F690]]&lt;br /&gt;
==== PWM Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== EUSART ===&lt;br /&gt;
==== EUSART Hardware ====&lt;br /&gt;
[[Bild:EUSART-TX-PIC16F690.png|thumb|right|Hardware EUSART im PIC16F690]]&lt;br /&gt;
[[Bild:EUSART-RX-PIC16F690.png|thumb|right|Hardware EUSART im PIC16F690]]&lt;br /&gt;
==== EUSART TX Codebeispiel ====&lt;br /&gt;
==== EUSART RX Codebeispiel ====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== SPI ===&lt;br /&gt;
==== SPI Hardware ====&lt;br /&gt;
[[Bild:SPI-PIC16F690.png|thumb|right|Hardware SPI im PIC16F690]]&lt;br /&gt;
==== SPI Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== I2C ===&lt;br /&gt;
==== I2C Hardware ====&lt;br /&gt;
[[Bild:I2C-PIC16F690.png|thumb|right|Hardware I2C im PIC16F690]]&lt;br /&gt;
==== I2C Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.microchip.com Homepage Microchip]&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplgidcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1335&amp;amp;dDocName=en023112 Produktseite PIC16F690]&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/41262E.pdf Datenblatt PIC16F690]&lt;br /&gt;
* [http://www.htsoft.com HiTech Software]&lt;br /&gt;
* [http://www.sprut.de Sprut -&amp;gt; DIE deutschsprachige Seite zum Thema PIC]&lt;br /&gt;
* ...&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
* Den Code auf dieser Seite &amp;quot;einklappbar&amp;quot; machen, sodass nicht ewig weit gescrollt werden muss&lt;br /&gt;
* Die Bilder neu malen wegen eventuellem Copyright-Schnickschnack&lt;br /&gt;
* Timer1&lt;br /&gt;
: Codebeispiel mit externer Taktquelle&lt;br /&gt;
: Codebeispiel mit externem Quarz&lt;br /&gt;
: Codebeispiel mit T1G als Zählbeginn/ende&lt;br /&gt;
: Codebeispiel mit Comparator als Zählbeginn/ende&lt;br /&gt;
: Codebeispiel mit Synchronem Zähler&lt;br /&gt;
* Timer2&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
* AD-Wandler&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
: Codebeispiel mehrere Kanäle&lt;br /&gt;
* PWM&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
* Eusart&lt;br /&gt;
: Erklärung Hardware RX&lt;br /&gt;
: Erklärung Hardware TX&lt;br /&gt;
: Codebeispiel RX&lt;br /&gt;
: Codebeispiel TX&lt;br /&gt;
: Codebeispiel RX-TX&lt;br /&gt;
* Komparator&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
* SPI&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel senden &lt;br /&gt;
: Codebeispiel empfangen&lt;br /&gt;
* I2C&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel senden &lt;br /&gt;
: Codebeispiel empfangen&lt;br /&gt;
* Brown Out Reset&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
* EEPROM&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Wettbewerb|P]]&lt;br /&gt;
[[Category:PIC|P]]&lt;/div&gt;</summary>
		<author><name>Thomas1123</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=PIC_Codebeispiele&amp;diff=28782</id>
		<title>PIC Codebeispiele</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=PIC_Codebeispiele&amp;diff=28782"/>
		<updated>2008-06-28T09:04:27Z</updated>

		<summary type="html">&lt;p&gt;Thomas1123: /* Timer1 Hardware */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt; &#039;&#039;&#039;Diese Seite ist noch in Bearbeitung. Die Codebeispiele sind noch nicht vollständig bzw. korrekt. Ich gelobe jedoch Besserung bis zum 15.8.08&#039;&#039;&#039; &amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;von [[Benutzer:Thomas1123|Thomas1123]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ich persönlich benutze den Hitech PIC-C Lite Compiler für meine Projekte.&amp;lt;br/&amp;gt;&lt;br /&gt;
Hierbei handelt es sich um die abgespeckte Version des Hitech PIC-C Compilers von der Firma HiTech Software.&amp;lt;br/&amp;gt;&lt;br /&gt;
Ich möchte hier eine Sammlung von Codebeispielen beginnen mit der es Einsteigern ermöglicht wird verschiedene interne und externe Pereferie zu initialiesieren und zu benutzen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Da der [http://www.microchip.com/stellent/idcplgidcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1335&amp;amp;dDocName=en023112 PIC16F690] mein persönlicher Liebling ist möchte ich die hier gezeigten Beispiele anhand dieses PICs aufzeigen. Die nachfolgenden Beispiele sind nicht nur für den PIC16F690 vewendbar z.B. sind die Timer0-Module in vielen Pics identisch. Dies trifft auch auf die meisten anderen Module zu jedoch kann ein zusätzlicher Blick in das Datenblatt nich schaden, da eventuell mache Register einen anderen Namen besitzen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Selbstverständlich kann dieser Artikel noch mit Codebeispielen für cc5x und ASM erweitert werden, des Weiteren kann man auch Beispiele für andere PICs der 10er, 12er, und 16er Kategorie einfügen.&lt;br /&gt;
&lt;br /&gt;
== Pinbelegung ==&lt;br /&gt;
[[Bild:PIC16F690-Pins.png|thumb|right|Pinbelegung des PIC16F690]]&lt;br /&gt;
Der PIC16F690 verfügt über eine grosse Anzahl an interner Pereferie beispielsweise 10-Bit AD-Wandler, SPI/I2C Interface, mehrere Timer (2*8-Bit 1*16-Bit), EUSART (RS232 etc.) usw.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
== Codebeispiele ==&lt;br /&gt;
----&lt;br /&gt;
=== Timer0 ===&lt;br /&gt;
==== Timer0 Hardware ====&lt;br /&gt;
[[Bild:Timer0-PIC16F690.png|thumb|right|Hardware Timer0 und WDT im PIC16F690]]&lt;br /&gt;
Der Timer0 ist ein 8-Bit Timer/Zähler, welcher entweder mit dem internen Takt des PIC oder mit einer externen Taktquelle am Pin 17 (RA2/T0CKI) Betrieben werden kann. Beim Betrieb mit einer externen Taktquelle kann man zusätzlich auswählen ob bei einer steigenden oder fallenden Flanke das Timerregister inkrementiert werden soll. Gleich welche Taktquelle gewählt wird, kann bei einem Überlauf des Timerregisters ein Interrupt ausgelöst werden. Hierfür ist es notwendig die Bits &#039;&#039;&#039;GIE&#039;&#039;&#039; und &#039;&#039;&#039;T0IE&#039;&#039;&#039; auf 1 zu setzen. Beide Bits befinden sich im &#039;&#039;&#039;INTCON&#039;&#039;&#039;-Register und sind im Datenblatt auf Seite 38 zu finden.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Im nebenstehendem Diagramm ist der aufbau des Timer0 zusammen mit dem Watchdogtimer dargestellt.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Im Option Register (&#039;&#039;&#039;OPTION&#039;&#039;&#039; Datenblatt Seite 83) kann mit Bit 5 (&#039;&#039;&#039;T0CS&#039;&#039;&#039;) ausgewählt werden ob der interne Takt (0) oder ein externer Takt (1) verwendet wird. Bei einem externen Takt kann mit Bit 4 (&#039;&#039;&#039;T0SE&#039;&#039;&#039;) auswählen ob bei einer steigenden (0) oder bei einer fallenden Flanke (1) das Timer0-Register inkrenemtiert werden soll. Mit Bit 3 (&#039;&#039;&#039;PSA&#039;&#039;&#039;) wird der Prescaler entweder dem Timer (0) &#039;&#039;&#039;oder&#039;&#039;&#039; dem Watchdogtimer (1) zugewiesen. Der Prescaler selbst wird mit den Bits 0 bis 2 (&#039;&#039;&#039;PS0 PS1 PS2&#039;&#039;&#039;) des Option Registers eingestellt.&amp;lt;br/&amp;gt;&lt;br /&gt;
Eine Übersicht der Einstellmöglichkeiten ist auf Seite 83 im Datenblatt einsehbar.&lt;br /&gt;
&lt;br /&gt;
==== Timer0 Codebeispiel mit Verwendung des Programmtaktes Fosc/4 ====&lt;br /&gt;
&#039;&#039;Szenario:&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC verwendet als Taktquelle einen 32,768 kHz Uhrenquarz.&amp;lt;br/&amp;gt;&lt;br /&gt;
An PORTB sind 8 LEDs mit Vorwiderständen gegen Masse verschaltet.&amp;lt;br/&amp;gt;&lt;br /&gt;
Jede Sekunde soll PORTB um den Wert 1 inkrementiert werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
Zu diesem Zweck wird der Timer0 mit Prescaler verwendet.&amp;lt;br/&amp;gt;&lt;br /&gt;
Die Einstellungen des Prescaler errechenen sich wie folgt:&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{Fosc}{4*Prescaler*2^8}= t \,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fosc/4 weil der PIC für eine Anweisung 4 Takte benötigt.&amp;lt;br/&amp;gt;&lt;br /&gt;
Der Prescaler als zusätzlicher Teiler des Timertaktes.&amp;lt;br/&amp;gt;&lt;br /&gt;
2^8 (256) Schritte benötigt der Timer 0 zum Überlauf.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{32768Hz}{4*2^8*32}= \frac {1}{Sek}\,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei einem Prescaler von 1:32 lösen wir somit exakt jede Sekunde einen Interrupt aus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
#include &amp;quot;htc.h&amp;quot;&lt;br /&gt;
__CONFIG (0x30e0);&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
static void interrupt global_int(void)&lt;br /&gt;
{&lt;br /&gt;
	GIE  = 0;		// Alle Interruptquellen ausschalten&lt;br /&gt;
	T0IF = 0;		// Timer0 Interruptflag Löschen&lt;br /&gt;
	PORTB++;		// PORTB inkrementieren&lt;br /&gt;
	GIE  = 1;		// Interrupts wieder einschalten&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void t0_ini ()&lt;br /&gt;
{&lt;br /&gt;
				// Datenblatt Seite 83&lt;br /&gt;
	OPTION 	= 0b11000100;		&lt;br /&gt;
		 // 1-------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // -1------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // --0-----	Internen Takt für Timer0 verwenden&lt;br /&gt;
		 // ---0----	Bei externem Takt an steigender Flanke inkrementieren&lt;br /&gt;
		 // 		(in diesem Fall egal ob 1 oder 0 weil der interne Takt verwendet wird)&lt;br /&gt;
		 // ----0---	Prescaler für Timer0 verwenden&lt;br /&gt;
		 // -----100	Prescaler 1:32&lt;br /&gt;
&lt;br /&gt;
	T0IF	= 0;		// Interruptflag von Timer0 löschen&lt;br /&gt;
	GIE 	= 1;		// Alle nichtmaskierten Interrupts erlauben&lt;br /&gt;
	T0IE 	= 1;		// Timer0 Interrupt erlauben&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
	ANSEL  = 0b00000000;		// Pins als digital I/O &lt;br /&gt;
	ANSELH = 0b00000000;		// Pins als digital I/O&lt;br /&gt;
	PORTA  = 0;			// Latch von Port A,B und C löschen&lt;br /&gt;
	PORTB  = 0;&lt;br /&gt;
	PORTC  = 0;&lt;br /&gt;
	TRISA  = 0b00000000;		// Port A,B und C als Ausgänge schalten&lt;br /&gt;
	TRISB  = 0b00000000;&lt;br /&gt;
	TRISC  = 0b00000000;&lt;br /&gt;
}&lt;br /&gt;
//========================================================================&lt;br /&gt;
void main ()&lt;br /&gt;
{&lt;br /&gt;
	setup();&lt;br /&gt;
	t0_ini();&lt;br /&gt;
&lt;br /&gt;
	while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
==== Timer0 Codebeispiel mit Verwendung eines externen Taktes ====&lt;br /&gt;
Der Code ist fast identisch, es wurden lediglich Änderungen im &#039;&#039;&#039;OPTION&#039;&#039;&#039;-Register vorgenommen und der Pin 17 (RA2) wurde als Eingang definiert. Weiters wurde der interne Oszillator mit 4MHz verwendet. &amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Der externe Takt kann nicht beliebig schnell sein. siehe Datenblatt Kapitel 5.1.5 Seite 82 und Kapitel 17 Seite 243. &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;Szenario&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC verwendet als Taktquelle den internen 4MHz Oszillator.&amp;lt;br/&amp;gt;&lt;br /&gt;
An PORTB sind 8 LEDs mit Vorwiderständen gegen Masse verschaltet.&amp;lt;br/&amp;gt;&lt;br /&gt;
PORTB soll bei jedem Timer0-Überlauf um den Wert 1 inkrementiert werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
Zu diesem Zweck wird der Timer0 mit Prescaler verwendet.&amp;lt;br/&amp;gt;&lt;br /&gt;
Die Einstellungen errechenen sich wie folgt:&amp;lt;br/&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{Takt_{T0CKI}}{Prescaler*2^8}= t \,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Gehen wir mal davon aus, dass der takt an T0CKI 100kHz beträgt und der Prescaler als 1:2 Vorteiler eingestellt ist. Somit läuft der Timer0 alle 512 Takte über.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{100kHz}{2*2^8}= \frac{195,3125}{Sek} \,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Bei diesen Einstellungen bekommen wir 195,3125 Timer0-Überläufe pro Sekunde was wiederum einem Zeitinterwall von 5,12ms entspricht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
#include &amp;quot;htc.h&amp;quot;&lt;br /&gt;
__CONFIG (0x30e4);&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
static void interrupt global_int(void)&lt;br /&gt;
{&lt;br /&gt;
	GIE  = 0;		// Alle Interruptquellen ausschalten&lt;br /&gt;
	T0IF = 0;		// Timer0 Interruptflag Löschen&lt;br /&gt;
	PORTB++;		// PORTB inkrementieren&lt;br /&gt;
	GIE  = 1;		// Interrupts wieder einschalten&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void t0_ini ()&lt;br /&gt;
{&lt;br /&gt;
				// Datenblatt Seite 83&lt;br /&gt;
	OPTION 	= 0b11000100;		&lt;br /&gt;
		 // 1-------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // -1------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // --1-----	Takt an T0CKI für Timer0 verwenden&lt;br /&gt;
		 // ---0----	Bei externem Takt an steigender Flanke inkrementieren&lt;br /&gt;
		 // ----0---	Prescaler für Timer0 verwenden&lt;br /&gt;
		 // -----000	Prescaler 1:2&lt;br /&gt;
&lt;br /&gt;
	T0IF	= 0;		// Interruptflag von Timer0 löschen&lt;br /&gt;
	GIE 	= 1;		// Alle nichtmaskierten Interrupts erlauben&lt;br /&gt;
	T0IE 	= 1;		// Timer0 Interrupt erlauben&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
	ANSEL  = 0b00000000;		// Pins als digital I/O &lt;br /&gt;
	ANSELH = 0b00000000;		// Pins als digital I/O&lt;br /&gt;
	PORTA  = 0;			// Latch von Port A,B und C löschen&lt;br /&gt;
	PORTB  = 0;&lt;br /&gt;
	PORTC  = 0;&lt;br /&gt;
	TRISA  = 0b00000100;		// RA2 als Eingang setzen und restliche Pins als &lt;br /&gt;
					// Ausgang setzen.&lt;br /&gt;
	TRISB  = 0b00000000;&lt;br /&gt;
	TRISC  = 0b00000000;&lt;br /&gt;
}&lt;br /&gt;
//========================================================================&lt;br /&gt;
void main ()&lt;br /&gt;
{&lt;br /&gt;
	setup();&lt;br /&gt;
	t0_ini();&lt;br /&gt;
&lt;br /&gt;
	while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Timer1 ===&lt;br /&gt;
==== Timer1 Hardware ====&lt;br /&gt;
[[Bild:Timer1-PIC16F690.png|right|thumb|Hardware Timer1 im PIC16F690]]&lt;br /&gt;
Der Timer1 ist ein 16-Bit Timer/Zähler. Für den Timer1 gibt es viele Verwendungsmöglichkeiten auf Grund seiner zahlreichen Einstellmöglichkeiten. Man kann Ihn als einfachen Timer verwenden, wofür er eigentlich schon fast zu schade ist, oder als raffinierten Zähler, welcher erst bei einem bestimmten Ereignis wie z.B. dem auslösen des Komparators oder eines bestimmten zustandes am TG1-Pin (RA4/Pin 3) zu zählen beginnt.&amp;lt;br/&amp;gt;&lt;br /&gt;
die 16-Bit des Timers teilen sich auf zwei 8-Bit-Register auf, &#039;&#039;&#039;TMR1H&#039;&#039;&#039; und &#039;&#039;&#039;TMR1L&#039;&#039;&#039;. &#039;&#039;&#039;TMR1H&#039;&#039;&#039; beherbergt die oberen 8 Bit und &#039;&#039;&#039;TMR1L&#039;&#039;&#039; die unteren 8 Bit.&amp;lt;br/&amp;gt;&lt;br /&gt;
Der Timer1 wird zusätzlich noch vom CCP-Modul verwendet, insbesondere vom Capture- und vom Compare-Modul. Für das PWM-Modul wird der Timer2 als Zeitbasis verwendet.&lt;br /&gt;
&lt;br /&gt;
==== Timer1 Codebeispiel mit Verwendung des Programmtaktes Fosc/4 ====&lt;br /&gt;
&#039;&#039;Szenario&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC verwendet als Taktquelle den internen Oszilator mit 8MHz.&amp;lt;br/&amp;gt;&lt;br /&gt;
An PORTB sind 8 LEDs mit Vorwiderständen gegen Masse verschaltet.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
#include &amp;quot;htc.h&amp;quot;&lt;br /&gt;
__CONFIG (0x30e4);&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
static void interrupt global_int(void)&lt;br /&gt;
{&lt;br /&gt;
	GIE    = 0;		// Alle Interruptquellen ausschalten&lt;br /&gt;
	TMR1IF = 0;		// Timer1 Interruptflag Löschen&lt;br /&gt;
	PORTB++;		// PORTB inkrementieren&lt;br /&gt;
	GIE    = 1;		// Interrupts wieder einschalten&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void t1_ini ()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	TMR1IF	= 0;		// Interruptflag von Timer1 löschen+&lt;br /&gt;
&lt;br /&gt;
				// Datenblatt Seite 88&lt;br /&gt;
	T1CON 	= 0b00110000;		&lt;br /&gt;
		 // 0-------	Timer1 Gate-invertier-Bit (in diesem Beispiel uninteressant)&lt;br /&gt;
		 // -0------	Timer1 Gate-enable-Bit (auf 0 gesetzt sodass der timer1 &lt;br /&gt;
		 //		mit dem TMR1ON-Bit direkt ein und ausgeschaltet werden kann&lt;br /&gt;
		 // --11----	Prescaler auf 1:8 einstellen&lt;br /&gt;
		 // ----0---	Low Power Oszillator aus&lt;br /&gt;
		 // -----0--	(in diesem Beispiel uninteressant weil Bit 1 == 0)&lt;br /&gt;
		 // ------0-	interen Takt verwenden&lt;br /&gt;
		 // -------1	Timer1 einschalten&lt;br /&gt;
&lt;br /&gt;
	GIE 	= 1;		// Alle nichtmaskierten Interrupts erlauben&lt;br /&gt;
	PEIE 	= 1;		// Pereferieinterrupt erlauben&lt;br /&gt;
				// Die Bits GIE und PEIE befinden sich in INTCON Register&lt;br /&gt;
				// und sind im Datenblatt auf Seite 38 erläutert.&lt;br /&gt;
	TMR1IE 	= 1;		// Timer1 Interrupt erlauben&lt;br /&gt;
				// Das TMR1IE-Bit ist im ist im PIE1 Register&lt;br /&gt;
				// und im Datenblatt auf Seite 39&lt;br /&gt;
}&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
	OSCCON = 0b01110000;		// 8 MHz Datenblatt Seite 48&lt;br /&gt;
	ANSEL  = 0b00000000;		// Pins als digital I/O &lt;br /&gt;
	ANSELH = 0b00000000;		// Pins als digital I/O&lt;br /&gt;
	PORTA  = 0;			// Latch von Port A,B und C löschen&lt;br /&gt;
	PORTB  = 0;&lt;br /&gt;
	PORTC  = 0;&lt;br /&gt;
	TRISA  = 0b00000000;		// Port A,B und C als Ausgänge schalten&lt;br /&gt;
	TRISB  = 0b00000000;&lt;br /&gt;
	TRISC  = 0b00000000;&lt;br /&gt;
}&lt;br /&gt;
//========================================================================&lt;br /&gt;
void main ()&lt;br /&gt;
{&lt;br /&gt;
	setup();&lt;br /&gt;
	t1_ini();&lt;br /&gt;
&lt;br /&gt;
	while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
=== Timer2 ===&lt;br /&gt;
==== Timer2 Hardware ====&lt;br /&gt;
[[Bild:Timer2-PIC16F690.png|right|thumb|Hardware Timer2 im PIC16F690]]&lt;br /&gt;
Der Timer2 ist ein 8-Bit Timer. Mit dem Timer2 lässt sich nahezu jede Zeitbasis einstellen da er über einen Prescaler von 1:1, 1:4, 1:16 und über einen Postscaler von 1:1 bis 1:16 verfügt. Des Weiteren verfügt der Timer2 über einen Comparator, welcher kontinuirlich den Wert des Timer2-Registers und des PR2-Registers vergleicht und bei Übereinstimmung einen Takt an den Postscaler weiter gibt.&lt;br /&gt;
==== Timer2 Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== AD-Wandler ===&lt;br /&gt;
==== AD-Wandler Hardware ====&lt;br /&gt;
[[Bild:AD-Wandler-PIC16F690.png|right|thumb|Hardware AD-Wandler im PIC16F690]]&lt;br /&gt;
==== AD-Wandler Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== PWM ===&lt;br /&gt;
==== PWM Hardware ====&lt;br /&gt;
[[Bild:PWM-PIC16F690.png|thumb|right|Hardware PWM im PIC16F690]]&lt;br /&gt;
==== PWM Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== EUSART ===&lt;br /&gt;
==== EUSART Hardware ====&lt;br /&gt;
[[Bild:EUSART-TX-PIC16F690.png|thumb|right|Hardware EUSART im PIC16F690]]&lt;br /&gt;
[[Bild:EUSART-RX-PIC16F690.png|thumb|right|Hardware EUSART im PIC16F690]]&lt;br /&gt;
==== EUSART TX Codebeispiel ====&lt;br /&gt;
==== EUSART RX Codebeispiel ====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== SPI ===&lt;br /&gt;
==== SPI Hardware ====&lt;br /&gt;
[[Bild:SPI-PIC16F690.png|thumb|right|Hardware SPI im PIC16F690]]&lt;br /&gt;
==== SPI Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== I2C ===&lt;br /&gt;
==== I2C Hardware ====&lt;br /&gt;
[[Bild:I2C-PIC16F690.png|thumb|right|Hardware I2C im PIC16F690]]&lt;br /&gt;
==== I2C Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.microchip.com Homepage Microchip]&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplgidcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1335&amp;amp;dDocName=en023112 Produktseite PIC16F690]&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/41262E.pdf Datenblatt PIC16F690]&lt;br /&gt;
* [http://www.htsoft.com HiTech Software]&lt;br /&gt;
* [http://www.sprut.de Sprut -&amp;gt; DIE deutschsprachige Seite zum Thema PIC]&lt;br /&gt;
* ...&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
* Den Code auf dieser Seite &amp;quot;einklappbar&amp;quot; machen, sodass nicht ewig weit gescrollt werden muss&lt;br /&gt;
* Die Bilder neu malen wegen eventuellem Copyright-Schnickschnack&lt;br /&gt;
* Timer1&lt;br /&gt;
: Codebeispiel mit externer Taktquelle&lt;br /&gt;
: Codebeispiel mit externem Quarz&lt;br /&gt;
: Codebeispiel mit T1G als Zählbeginn/ende&lt;br /&gt;
: Codebeispiel mit Comparator als Zählbeginn/ende&lt;br /&gt;
: Codebeispiel mit Synchronem Zähler&lt;br /&gt;
* Timer2&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
* AD-Wandler&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
: Codebeispiel mehrere Kanäle&lt;br /&gt;
* PWM&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
* Eusart&lt;br /&gt;
: Erklärung Hardware RX&lt;br /&gt;
: Erklärung Hardware TX&lt;br /&gt;
: Codebeispiel RX&lt;br /&gt;
: Codebeispiel TX&lt;br /&gt;
: Codebeispiel RX-TX&lt;br /&gt;
* Komparator&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
* SPI&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel senden &lt;br /&gt;
: Codebeispiel empfangen&lt;br /&gt;
* I2C&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel senden &lt;br /&gt;
: Codebeispiel empfangen&lt;br /&gt;
* Brown Out Reset&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
* EEPROM&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Wettbewerb|P]]&lt;br /&gt;
[[Category:PIC|P]]&lt;/div&gt;</summary>
		<author><name>Thomas1123</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=PIC_Codebeispiele&amp;diff=28767</id>
		<title>PIC Codebeispiele</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=PIC_Codebeispiele&amp;diff=28767"/>
		<updated>2008-06-27T19:50:41Z</updated>

		<summary type="html">&lt;p&gt;Thomas1123: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt; &#039;&#039;&#039;Diese Seite ist noch in Bearbeitung. Die Codebeispiele sind noch nicht vollständig bzw. korrekt. Ich gelobe jedoch Besserung bis zum 15.8.08&#039;&#039;&#039; &amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;von [[Benutzer:Thomas1123|Thomas1123]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ich persönlich benutze den Hitech PIC-C Lite Compiler für meine Projekte.&amp;lt;br/&amp;gt;&lt;br /&gt;
Hierbei handelt es sich um die abgespeckte Version des Hitech PIC-C Compilers von der Firma HiTech Software.&amp;lt;br/&amp;gt;&lt;br /&gt;
Ich möchte hier eine Sammlung von Codebeispielen beginnen mit der es Einsteigern ermöglicht wird verschiedene interne und externe Pereferie zu initialiesieren und zu benutzen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Da der [http://www.microchip.com/stellent/idcplgidcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1335&amp;amp;dDocName=en023112 PIC16F690] mein persönlicher Liebling ist möchte ich die hier gezeigten Beispiele anhand dieses PICs aufzeigen. Die nachfolgenden Beispiele sind nicht nur für den PIC16F690 vewendbar z.B. sind die Timer0-Module in vielen Pics identisch. Dies trifft auch auf die meisten anderen Module zu jedoch kann ein zusätzlicher Blick in das Datenblatt nich schaden, da eventuell mache Register einen anderen Namen besitzen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Selbstverständlich kann dieser Artikel noch mit Codebeispielen für cc5x und ASM erweitert werden, des Weiteren kann man auch Beispiele für andere PICs der 10er, 12er, und 16er Kategorie einfügen.&lt;br /&gt;
&lt;br /&gt;
== Pinbelegung ==&lt;br /&gt;
[[Bild:PIC16F690-Pins.png|thumb|right|Pinbelegung des PIC16F690]]&lt;br /&gt;
Der PIC16F690 verfügt über eine grosse Anzahl an interner Pereferie beispielsweise 10-Bit AD-Wandler, SPI/I2C Interface, mehrere Timer (2*8-Bit 1*16-Bit), EUSART (RS232 etc.) usw.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
== Codebeispiele ==&lt;br /&gt;
----&lt;br /&gt;
=== Timer0 ===&lt;br /&gt;
==== Timer0 Hardware ====&lt;br /&gt;
[[Bild:Timer0-PIC16F690.png|thumb|right|Hardware Timer0 und WDT im PIC16F690]]&lt;br /&gt;
Der Timer0 ist ein 8-Bit Timer/Zähler, welcher entweder mit dem internen Takt des PIC oder mit einer externen Taktquelle am Pin 17 (RA2/T0CKI) Betrieben werden kann. Beim Betrieb mit einer externen Taktquelle kann man zusätzlich auswählen ob bei einer steigenden oder fallenden Flanke das Timerregister inkrementiert werden soll. Gleich welche Taktquelle gewählt wird, kann bei einem Überlauf des Timerregisters ein Interrupt ausgelöst werden. Hierfür ist es notwendig die Bits &#039;&#039;&#039;GIE&#039;&#039;&#039; und &#039;&#039;&#039;T0IE&#039;&#039;&#039; auf 1 zu setzen. Beide Bits befinden sich im &#039;&#039;&#039;INTCON&#039;&#039;&#039;-Register und sind im Datenblatt auf Seite 38 zu finden.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Im nebenstehendem Diagramm ist der aufbau des Timer0 zusammen mit dem Watchdogtimer dargestellt.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Im Option Register (&#039;&#039;&#039;OPTION&#039;&#039;&#039; Datenblatt Seite 83) kann mit Bit 5 (&#039;&#039;&#039;T0CS&#039;&#039;&#039;) ausgewählt werden ob der interne Takt (0) oder ein externer Takt (1) verwendet wird. Bei einem externen Takt kann mit Bit 4 (&#039;&#039;&#039;T0SE&#039;&#039;&#039;) auswählen ob bei einer steigenden (0) oder bei einer fallenden Flanke (1) das Timer0-Register inkrenemtiert werden soll. Mit Bit 3 (&#039;&#039;&#039;PSA&#039;&#039;&#039;) wird der Prescaler entweder dem Timer (0) &#039;&#039;&#039;oder&#039;&#039;&#039; dem Watchdogtimer (1) zugewiesen. Der Prescaler selbst wird mit den Bits 0 bis 2 (&#039;&#039;&#039;PS0 PS1 PS2&#039;&#039;&#039;) des Option Registers eingestellt.&amp;lt;br/&amp;gt;&lt;br /&gt;
Eine Übersicht der Einstellmöglichkeiten ist auf Seite 83 im Datenblatt einsehbar.&lt;br /&gt;
&lt;br /&gt;
==== Timer0 Codebeispiel mit Verwendung des Programmtaktes Fosc/4 ====&lt;br /&gt;
&#039;&#039;Szenario:&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC verwendet als Taktquelle einen 32,768 kHz Uhrenquarz.&amp;lt;br/&amp;gt;&lt;br /&gt;
An PORTB sind 8 LEDs mit Vorwiderständen gegen Masse verschaltet.&amp;lt;br/&amp;gt;&lt;br /&gt;
Jede Sekunde soll PORTB um den Wert 1 inkrementiert werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
Zu diesem Zweck wird der Timer0 mit Prescaler verwendet.&amp;lt;br/&amp;gt;&lt;br /&gt;
Die Einstellungen des Prescaler errechenen sich wie folgt:&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{Fosc}{4*Prescaler*2^8}= t \,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fosc/4 weil der PIC für eine Anweisung 4 Takte benötigt.&amp;lt;br/&amp;gt;&lt;br /&gt;
Der Prescaler als zusätzlicher Teiler des Timertaktes.&amp;lt;br/&amp;gt;&lt;br /&gt;
2^8 (256) Schritte benötigt der Timer 0 zum Überlauf.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{32768Hz}{4*2^8*32}= \frac {1}{Sek}\,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei einem Prescaler von 1:32 lösen wir somit exakt jede Sekunde einen Interrupt aus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
#include &amp;quot;htc.h&amp;quot;&lt;br /&gt;
__CONFIG (0x30e0);&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
static void interrupt global_int(void)&lt;br /&gt;
{&lt;br /&gt;
	GIE  = 0;		// Alle Interruptquellen ausschalten&lt;br /&gt;
	T0IF = 0;		// Timer0 Interruptflag Löschen&lt;br /&gt;
	PORTB++;		// PORTB inkrementieren&lt;br /&gt;
	GIE  = 1;		// Interrupts wieder einschalten&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void t0_ini ()&lt;br /&gt;
{&lt;br /&gt;
				// Datenblatt Seite 83&lt;br /&gt;
	OPTION 	= 0b11000100;		&lt;br /&gt;
		 // 1-------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // -1------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // --0-----	Internen Takt für Timer0 verwenden&lt;br /&gt;
		 // ---0----	Bei externem Takt an steigender Flanke inkrementieren&lt;br /&gt;
		 // 		(in diesem Fall egal ob 1 oder 0 weil der interne Takt verwendet wird)&lt;br /&gt;
		 // ----0---	Prescaler für Timer0 verwenden&lt;br /&gt;
		 // -----100	Prescaler 1:32&lt;br /&gt;
&lt;br /&gt;
	T0IF	= 0;		// Interruptflag von Timer0 löschen&lt;br /&gt;
	GIE 	= 1;		// Alle nichtmaskierten Interrupts erlauben&lt;br /&gt;
	T0IE 	= 1;		// Timer0 Interrupt erlauben&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
	ANSEL  = 0b00000000;		// Pins als digital I/O &lt;br /&gt;
	ANSELH = 0b00000000;		// Pins als digital I/O&lt;br /&gt;
	PORTA  = 0;			// Latch von Port A,B und C löschen&lt;br /&gt;
	PORTB  = 0;&lt;br /&gt;
	PORTC  = 0;&lt;br /&gt;
	TRISA  = 0b00000000;		// Port A,B und C als Ausgänge schalten&lt;br /&gt;
	TRISB  = 0b00000000;&lt;br /&gt;
	TRISC  = 0b00000000;&lt;br /&gt;
}&lt;br /&gt;
//========================================================================&lt;br /&gt;
void main ()&lt;br /&gt;
{&lt;br /&gt;
	setup();&lt;br /&gt;
	t0_ini();&lt;br /&gt;
&lt;br /&gt;
	while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
==== Timer0 Codebeispiel mit Verwendung eines externen Taktes ====&lt;br /&gt;
Der Code ist fast identisch, es wurden lediglich Änderungen im &#039;&#039;&#039;OPTION&#039;&#039;&#039;-Register vorgenommen und der Pin 17 (RA2) wurde als Eingang definiert. Weiters wurde der interne Oszillator mit 4MHz verwendet. &amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Der externe Takt kann nicht beliebig schnell sein. siehe Datenblatt Kapitel 5.1.5 Seite 82 und Kapitel 17 Seite 243. &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;Szenario&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC verwendet als Taktquelle den internen 4MHz Oszillator.&amp;lt;br/&amp;gt;&lt;br /&gt;
An PORTB sind 8 LEDs mit Vorwiderständen gegen Masse verschaltet.&amp;lt;br/&amp;gt;&lt;br /&gt;
PORTB soll bei jedem Timer0-Überlauf um den Wert 1 inkrementiert werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
Zu diesem Zweck wird der Timer0 mit Prescaler verwendet.&amp;lt;br/&amp;gt;&lt;br /&gt;
Die Einstellungen errechenen sich wie folgt:&amp;lt;br/&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{Takt_{T0CKI}}{Prescaler*2^8}= t \,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Gehen wir mal davon aus, dass der takt an T0CKI 100kHz beträgt und der Prescaler als 1:2 Vorteiler eingestellt ist. Somit läuft der Timer0 alle 512 Takte über.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{100kHz}{2*2^8}= \frac{195,3125}{Sek} \,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Bei diesen Einstellungen bekommen wir 195,3125 Timer0-Überläufe pro Sekunde was wiederum einem Zeitinterwall von 5,12ms entspricht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
#include &amp;quot;htc.h&amp;quot;&lt;br /&gt;
__CONFIG (0x30e4);&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
static void interrupt global_int(void)&lt;br /&gt;
{&lt;br /&gt;
	GIE  = 0;		// Alle Interruptquellen ausschalten&lt;br /&gt;
	T0IF = 0;		// Timer0 Interruptflag Löschen&lt;br /&gt;
	PORTB++;		// PORTB inkrementieren&lt;br /&gt;
	GIE  = 1;		// Interrupts wieder einschalten&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void t0_ini ()&lt;br /&gt;
{&lt;br /&gt;
				// Datenblatt Seite 83&lt;br /&gt;
	OPTION 	= 0b11000100;		&lt;br /&gt;
		 // 1-------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // -1------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // --1-----	Takt an T0CKI für Timer0 verwenden&lt;br /&gt;
		 // ---0----	Bei externem Takt an steigender Flanke inkrementieren&lt;br /&gt;
		 // ----0---	Prescaler für Timer0 verwenden&lt;br /&gt;
		 // -----000	Prescaler 1:2&lt;br /&gt;
&lt;br /&gt;
	T0IF	= 0;		// Interruptflag von Timer0 löschen&lt;br /&gt;
	GIE 	= 1;		// Alle nichtmaskierten Interrupts erlauben&lt;br /&gt;
	T0IE 	= 1;		// Timer0 Interrupt erlauben&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
	ANSEL  = 0b00000000;		// Pins als digital I/O &lt;br /&gt;
	ANSELH = 0b00000000;		// Pins als digital I/O&lt;br /&gt;
	PORTA  = 0;			// Latch von Port A,B und C löschen&lt;br /&gt;
	PORTB  = 0;&lt;br /&gt;
	PORTC  = 0;&lt;br /&gt;
	TRISA  = 0b00000100;		// RA2 als Eingang setzen und restliche Pins als &lt;br /&gt;
					// Ausgang setzen.&lt;br /&gt;
	TRISB  = 0b00000000;&lt;br /&gt;
	TRISC  = 0b00000000;&lt;br /&gt;
}&lt;br /&gt;
//========================================================================&lt;br /&gt;
void main ()&lt;br /&gt;
{&lt;br /&gt;
	setup();&lt;br /&gt;
	t0_ini();&lt;br /&gt;
&lt;br /&gt;
	while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Timer1 ===&lt;br /&gt;
==== Timer1 Hardware ====&lt;br /&gt;
[[Bild:Timer1-PIC16F690.png|right|thumb|Hardware Timer1 im PIC16F690]]&lt;br /&gt;
Der Timer1 ist ein 16-Bit Timer/Zähler. Für den Timer1 gibt es viele Verwendungsmöglichkeiten auf Grund seiner zahlreichen Einstellmöglichkeiten. Man kann Ihn als einfachen Timer verwenden, wofür er eigentlich schon fast zu schade ist, oder als raffinierten Zähler, welcher erst bei einem bestimmten Ereignis wie z.B. dem auslösen des Komparators oder eines bestimmten zustandes am TG1-Pin (RA4/Pin 3) zu zählen beginnt.&amp;lt;br/&amp;gt;&lt;br /&gt;
die 16-Bit des Timers teilen sich auf zwei 8-Bit-Register auf, &#039;&#039;&#039;TMR1H&#039;&#039;&#039; und &#039;&#039;&#039;TMR1L&#039;&#039;&#039;. &#039;&#039;&#039;TMR1H&#039;&#039;&#039; beherbergt die oberen 8 Bit und &#039;&#039;&#039;TMR1L&#039;&#039;&#039; die unteren 8 Bit. &lt;br /&gt;
==== Timer1 Codebeispiel mit Verwendung des Programmtaktes Fosc/4 ====&lt;br /&gt;
&#039;&#039;Szenario&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC verwendet als Taktquelle den internen Oszilator mit 8MHz.&amp;lt;br/&amp;gt;&lt;br /&gt;
An PORTB sind 8 LEDs mit Vorwiderständen gegen Masse verschaltet.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
#include &amp;quot;htc.h&amp;quot;&lt;br /&gt;
__CONFIG (0x30e4);&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
static void interrupt global_int(void)&lt;br /&gt;
{&lt;br /&gt;
	GIE    = 0;		// Alle Interruptquellen ausschalten&lt;br /&gt;
	TMR1IF = 0;		// Timer1 Interruptflag Löschen&lt;br /&gt;
	PORTB++;		// PORTB inkrementieren&lt;br /&gt;
	GIE    = 1;		// Interrupts wieder einschalten&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void t1_ini ()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	TMR1IF	= 0;		// Interruptflag von Timer1 löschen+&lt;br /&gt;
&lt;br /&gt;
				// Datenblatt Seite 88&lt;br /&gt;
	T1CON 	= 0b00110000;		&lt;br /&gt;
		 // 0-------	Timer1 Gate-invertier-Bit (in diesem Beispiel uninteressant)&lt;br /&gt;
		 // -0------	Timer1 Gate-enable-Bit (auf 0 gesetzt sodass der timer1 &lt;br /&gt;
		 //		mit dem TMR1ON-Bit direkt ein und ausgeschaltet werden kann&lt;br /&gt;
		 // --11----	Prescaler auf 1:8 einstellen&lt;br /&gt;
		 // ----0---	Low Power Oszillator aus&lt;br /&gt;
		 // -----0--	(in diesem Beispiel uninteressant weil Bit 1 == 0)&lt;br /&gt;
		 // ------0-	interen Takt verwenden&lt;br /&gt;
		 // -------1	Timer1 einschalten&lt;br /&gt;
&lt;br /&gt;
	GIE 	= 1;		// Alle nichtmaskierten Interrupts erlauben&lt;br /&gt;
	PEIE 	= 1;		// Pereferieinterrupt erlauben&lt;br /&gt;
				// Die Bits GIE und PEIE befinden sich in INTCON Register&lt;br /&gt;
				// und sind im Datenblatt auf Seite 38 erläutert.&lt;br /&gt;
	TMR1IE 	= 1;		// Timer1 Interrupt erlauben&lt;br /&gt;
				// Das TMR1IE-Bit ist im ist im PIE1 Register&lt;br /&gt;
				// und im Datenblatt auf Seite 39&lt;br /&gt;
}&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
	OSCCON = 0b01110000;		// 8 MHz Datenblatt Seite 48&lt;br /&gt;
	ANSEL  = 0b00000000;		// Pins als digital I/O &lt;br /&gt;
	ANSELH = 0b00000000;		// Pins als digital I/O&lt;br /&gt;
	PORTA  = 0;			// Latch von Port A,B und C löschen&lt;br /&gt;
	PORTB  = 0;&lt;br /&gt;
	PORTC  = 0;&lt;br /&gt;
	TRISA  = 0b00000000;		// Port A,B und C als Ausgänge schalten&lt;br /&gt;
	TRISB  = 0b00000000;&lt;br /&gt;
	TRISC  = 0b00000000;&lt;br /&gt;
}&lt;br /&gt;
//========================================================================&lt;br /&gt;
void main ()&lt;br /&gt;
{&lt;br /&gt;
	setup();&lt;br /&gt;
	t1_ini();&lt;br /&gt;
&lt;br /&gt;
	while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
=== Timer2 ===&lt;br /&gt;
==== Timer2 Hardware ====&lt;br /&gt;
[[Bild:Timer2-PIC16F690.png|right|thumb|Hardware Timer2 im PIC16F690]]&lt;br /&gt;
Der Timer2 ist ein 8-Bit Timer. Mit dem Timer2 lässt sich nahezu jede Zeitbasis einstellen da er über einen Prescaler von 1:1, 1:4, 1:16 und über einen Postscaler von 1:1 bis 1:16 verfügt. Des Weiteren verfügt der Timer2 über einen Comparator, welcher kontinuirlich den Wert des Timer2-Registers und des PR2-Registers vergleicht und bei Übereinstimmung einen Takt an den Postscaler weiter gibt.&lt;br /&gt;
==== Timer2 Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== AD-Wandler ===&lt;br /&gt;
==== AD-Wandler Hardware ====&lt;br /&gt;
[[Bild:AD-Wandler-PIC16F690.png|right|thumb|Hardware AD-Wandler im PIC16F690]]&lt;br /&gt;
==== AD-Wandler Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== PWM ===&lt;br /&gt;
==== PWM Hardware ====&lt;br /&gt;
[[Bild:PWM-PIC16F690.png|thumb|right|Hardware PWM im PIC16F690]]&lt;br /&gt;
==== PWM Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== EUSART ===&lt;br /&gt;
==== EUSART Hardware ====&lt;br /&gt;
[[Bild:EUSART-TX-PIC16F690.png|thumb|right|Hardware EUSART im PIC16F690]]&lt;br /&gt;
[[Bild:EUSART-RX-PIC16F690.png|thumb|right|Hardware EUSART im PIC16F690]]&lt;br /&gt;
==== EUSART TX Codebeispiel ====&lt;br /&gt;
==== EUSART RX Codebeispiel ====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== SPI ===&lt;br /&gt;
==== SPI Hardware ====&lt;br /&gt;
[[Bild:SPI-PIC16F690.png|thumb|right|Hardware SPI im PIC16F690]]&lt;br /&gt;
==== SPI Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== I2C ===&lt;br /&gt;
==== I2C Hardware ====&lt;br /&gt;
[[Bild:I2C-PIC16F690.png|thumb|right|Hardware I2C im PIC16F690]]&lt;br /&gt;
==== I2C Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.microchip.com Homepage Microchip]&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplgidcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1335&amp;amp;dDocName=en023112 Produktseite PIC16F690]&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/41262E.pdf Datenblatt PIC16F690]&lt;br /&gt;
* [http://www.htsoft.com HiTech Software]&lt;br /&gt;
* [http://www.sprut.de Sprut -&amp;gt; DIE deutschsprachige Seite zum Thema PIC]&lt;br /&gt;
* ...&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
* Den Code auf dieser Seite &amp;quot;einklappbar&amp;quot; machen, sodass nicht ewig weit gescrollt werden muss&lt;br /&gt;
* Die Bilder neu malen wegen eventuellem Copyright-Schnickschnack&lt;br /&gt;
* Timer1&lt;br /&gt;
: Codebeispiel mit externer Taktquelle&lt;br /&gt;
: Codebeispiel mit externem Quarz&lt;br /&gt;
: Codebeispiel mit T1G als Zählbeginn/ende&lt;br /&gt;
: Codebeispiel mit Comparator als Zählbeginn/ende&lt;br /&gt;
: Codebeispiel mit Synchronem Zähler&lt;br /&gt;
* Timer2&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
* AD-Wandler&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
: Codebeispiel mehrere Kanäle&lt;br /&gt;
* PWM&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
* Eusart&lt;br /&gt;
: Erklärung Hardware RX&lt;br /&gt;
: Erklärung Hardware TX&lt;br /&gt;
: Codebeispiel RX&lt;br /&gt;
: Codebeispiel TX&lt;br /&gt;
: Codebeispiel RX-TX&lt;br /&gt;
* Komparator&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
* SPI&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel senden &lt;br /&gt;
: Codebeispiel empfangen&lt;br /&gt;
* I2C&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel senden &lt;br /&gt;
: Codebeispiel empfangen&lt;br /&gt;
* Brown Out Reset&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
* EEPROM&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Wettbewerb|P]]&lt;br /&gt;
[[Category:PIC|P]]&lt;/div&gt;</summary>
		<author><name>Thomas1123</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=PIC_Codebeispiele&amp;diff=28766</id>
		<title>PIC Codebeispiele</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=PIC_Codebeispiele&amp;diff=28766"/>
		<updated>2008-06-27T19:45:42Z</updated>

		<summary type="html">&lt;p&gt;Thomas1123: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[size 200%]]Diese Seite ist noch in Bearbeitung. Die Codebeispiele sind &#039;&#039;&#039;noch&#039;&#039;&#039; nicht vollständig bzw. korrekt. Ich gelobe jedoch Besserung bis zum 15.8.08[[/size]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;von [[Benutzer:Thomas1123|Thomas1123]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ich persönlich benutze den Hitech PIC-C Lite Compiler für meine Projekte.&amp;lt;br/&amp;gt;&lt;br /&gt;
Hierbei handelt es sich um die abgespeckte Version des Hitech PIC-C Compilers von der Firma HiTech Software.&amp;lt;br/&amp;gt;&lt;br /&gt;
Ich möchte hier eine Sammlung von Codebeispielen beginnen mit der es Einsteigern ermöglicht wird verschiedene interne und externe Pereferie zu initialiesieren und zu benutzen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Da der [http://www.microchip.com/stellent/idcplgidcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1335&amp;amp;dDocName=en023112 PIC16F690] mein persönlicher Liebling ist möchte ich die hier gezeigten Beispiele anhand dieses PICs aufzeigen. Die nachfolgenden Beispiele sind nicht nur für den PIC16F690 vewendbar z.B. sind die Timer0-Module in vielen Pics identisch. Dies trifft auch auf die meisten anderen Module zu jedoch kann ein zusätzlicher Blick in das Datenblatt nich schaden, da eventuell mache Register einen anderen Namen besitzen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Selbstverständlich kann dieser Artikel noch mit Codebeispielen für cc5x und ASM erweitert werden, des Weiteren kann man auch Beispiele für andere PICs der 10er, 12er, und 16er Kategorie einfügen.&lt;br /&gt;
&lt;br /&gt;
== Pinbelegung ==&lt;br /&gt;
[[Bild:PIC16F690-Pins.png|thumb|right|Pinbelegung des PIC16F690]]&lt;br /&gt;
Der PIC16F690 verfügt über eine grosse Anzahl an interner Pereferie beispielsweise 10-Bit AD-Wandler, SPI/I2C Interface, mehrere Timer (2*8-Bit 1*16-Bit), EUSART (RS232 etc.) usw.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
== Codebeispiele ==&lt;br /&gt;
----&lt;br /&gt;
=== Timer0 ===&lt;br /&gt;
==== Timer0 Hardware ====&lt;br /&gt;
[[Bild:Timer0-PIC16F690.png|thumb|right|Hardware Timer0 und WDT im PIC16F690]]&lt;br /&gt;
Der Timer0 ist ein 8-Bit Timer/Zähler, welcher entweder mit dem internen Takt des PIC oder mit einer externen Taktquelle am Pin 17 (RA2/T0CKI) Betrieben werden kann. Beim Betrieb mit einer externen Taktquelle kann man zusätzlich auswählen ob bei einer steigenden oder fallenden Flanke das Timerregister inkrementiert werden soll. Gleich welche Taktquelle gewählt wird, kann bei einem Überlauf des Timerregisters ein Interrupt ausgelöst werden. Hierfür ist es notwendig die Bits &#039;&#039;&#039;GIE&#039;&#039;&#039; und &#039;&#039;&#039;T0IE&#039;&#039;&#039; auf 1 zu setzen. Beide Bits befinden sich im &#039;&#039;&#039;INTCON&#039;&#039;&#039;-Register und sind im Datenblatt auf Seite 38 zu finden.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Im nebenstehendem Diagramm ist der aufbau des Timer0 zusammen mit dem Watchdogtimer dargestellt.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Im Option Register (&#039;&#039;&#039;OPTION&#039;&#039;&#039; Datenblatt Seite 83) kann mit Bit 5 (&#039;&#039;&#039;T0CS&#039;&#039;&#039;) ausgewählt werden ob der interne Takt (0) oder ein externer Takt (1) verwendet wird. Bei einem externen Takt kann mit Bit 4 (&#039;&#039;&#039;T0SE&#039;&#039;&#039;) auswählen ob bei einer steigenden (0) oder bei einer fallenden Flanke (1) das Timer0-Register inkrenemtiert werden soll. Mit Bit 3 (&#039;&#039;&#039;PSA&#039;&#039;&#039;) wird der Prescaler entweder dem Timer (0) &#039;&#039;&#039;oder&#039;&#039;&#039; dem Watchdogtimer (1) zugewiesen. Der Prescaler selbst wird mit den Bits 0 bis 2 (&#039;&#039;&#039;PS0 PS1 PS2&#039;&#039;&#039;) des Option Registers eingestellt.&amp;lt;br/&amp;gt;&lt;br /&gt;
Eine Übersicht der Einstellmöglichkeiten ist auf Seite 83 im Datenblatt einsehbar.&lt;br /&gt;
&lt;br /&gt;
==== Timer0 Codebeispiel mit Verwendung des Programmtaktes Fosc/4 ====&lt;br /&gt;
&#039;&#039;Szenario:&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC verwendet als Taktquelle einen 32,768 kHz Uhrenquarz.&amp;lt;br/&amp;gt;&lt;br /&gt;
An PORTB sind 8 LEDs mit Vorwiderständen gegen Masse verschaltet.&amp;lt;br/&amp;gt;&lt;br /&gt;
Jede Sekunde soll PORTB um den Wert 1 inkrementiert werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
Zu diesem Zweck wird der Timer0 mit Prescaler verwendet.&amp;lt;br/&amp;gt;&lt;br /&gt;
Die Einstellungen des Prescaler errechenen sich wie folgt:&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{Fosc}{4*Prescaler*2^8}= t \,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fosc/4 weil der PIC für eine Anweisung 4 Takte benötigt.&amp;lt;br/&amp;gt;&lt;br /&gt;
Der Prescaler als zusätzlicher Teiler des Timertaktes.&amp;lt;br/&amp;gt;&lt;br /&gt;
2^8 (256) Schritte benötigt der Timer 0 zum Überlauf.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{32768Hz}{4*2^8*32}= \frac {1}{Sek}\,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei einem Prescaler von 1:32 lösen wir somit exakt jede Sekunde einen Interrupt aus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
#include &amp;quot;htc.h&amp;quot;&lt;br /&gt;
__CONFIG (0x30e0);&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
static void interrupt global_int(void)&lt;br /&gt;
{&lt;br /&gt;
	GIE  = 0;		// Alle Interruptquellen ausschalten&lt;br /&gt;
	T0IF = 0;		// Timer0 Interruptflag Löschen&lt;br /&gt;
	PORTB++;		// PORTB inkrementieren&lt;br /&gt;
	GIE  = 1;		// Interrupts wieder einschalten&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void t0_ini ()&lt;br /&gt;
{&lt;br /&gt;
				// Datenblatt Seite 83&lt;br /&gt;
	OPTION 	= 0b11000100;		&lt;br /&gt;
		 // 1-------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // -1------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // --0-----	Internen Takt für Timer0 verwenden&lt;br /&gt;
		 // ---0----	Bei externem Takt an steigender Flanke inkrementieren&lt;br /&gt;
		 // 		(in diesem Fall egal ob 1 oder 0 weil der interne Takt verwendet wird)&lt;br /&gt;
		 // ----0---	Prescaler für Timer0 verwenden&lt;br /&gt;
		 // -----100	Prescaler 1:32&lt;br /&gt;
&lt;br /&gt;
	T0IF	= 0;		// Interruptflag von Timer0 löschen&lt;br /&gt;
	GIE 	= 1;		// Alle nichtmaskierten Interrupts erlauben&lt;br /&gt;
	T0IE 	= 1;		// Timer0 Interrupt erlauben&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
	ANSEL  = 0b00000000;		// Pins als digital I/O &lt;br /&gt;
	ANSELH = 0b00000000;		// Pins als digital I/O&lt;br /&gt;
	PORTA  = 0;			// Latch von Port A,B und C löschen&lt;br /&gt;
	PORTB  = 0;&lt;br /&gt;
	PORTC  = 0;&lt;br /&gt;
	TRISA  = 0b00000000;		// Port A,B und C als Ausgänge schalten&lt;br /&gt;
	TRISB  = 0b00000000;&lt;br /&gt;
	TRISC  = 0b00000000;&lt;br /&gt;
}&lt;br /&gt;
//========================================================================&lt;br /&gt;
void main ()&lt;br /&gt;
{&lt;br /&gt;
	setup();&lt;br /&gt;
	t0_ini();&lt;br /&gt;
&lt;br /&gt;
	while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
==== Timer0 Codebeispiel mit Verwendung eines externen Taktes ====&lt;br /&gt;
Der Code ist fast identisch, es wurden lediglich Änderungen im &#039;&#039;&#039;OPTION&#039;&#039;&#039;-Register vorgenommen und der Pin 17 (RA2) wurde als Eingang definiert. Weiters wurde der interne Oszillator mit 4MHz verwendet. &amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Der externe Takt kann nicht beliebig schnell sein. siehe Datenblatt Kapitel 5.1.5 Seite 82 und Kapitel 17 Seite 243. &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;Szenario&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC verwendet als Taktquelle den internen 4MHz Oszillator.&amp;lt;br/&amp;gt;&lt;br /&gt;
An PORTB sind 8 LEDs mit Vorwiderständen gegen Masse verschaltet.&amp;lt;br/&amp;gt;&lt;br /&gt;
PORTB soll bei jedem Timer0-Überlauf um den Wert 1 inkrementiert werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
Zu diesem Zweck wird der Timer0 mit Prescaler verwendet.&amp;lt;br/&amp;gt;&lt;br /&gt;
Die Einstellungen errechenen sich wie folgt:&amp;lt;br/&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{Takt_{T0CKI}}{Prescaler*2^8}= t \,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Gehen wir mal davon aus, dass der takt an T0CKI 100kHz beträgt und der Prescaler als 1:2 Vorteiler eingestellt ist. Somit läuft der Timer0 alle 512 Takte über.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{100kHz}{2*2^8}= \frac{195,3125}{Sek} \,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Bei diesen Einstellungen bekommen wir 195,3125 Timer0-Überläufe pro Sekunde was wiederum einem Zeitinterwall von 5,12ms entspricht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
#include &amp;quot;htc.h&amp;quot;&lt;br /&gt;
__CONFIG (0x30e4);&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
static void interrupt global_int(void)&lt;br /&gt;
{&lt;br /&gt;
	GIE  = 0;		// Alle Interruptquellen ausschalten&lt;br /&gt;
	T0IF = 0;		// Timer0 Interruptflag Löschen&lt;br /&gt;
	PORTB++;		// PORTB inkrementieren&lt;br /&gt;
	GIE  = 1;		// Interrupts wieder einschalten&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void t0_ini ()&lt;br /&gt;
{&lt;br /&gt;
				// Datenblatt Seite 83&lt;br /&gt;
	OPTION 	= 0b11000100;		&lt;br /&gt;
		 // 1-------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // -1------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // --1-----	Takt an T0CKI für Timer0 verwenden&lt;br /&gt;
		 // ---0----	Bei externem Takt an steigender Flanke inkrementieren&lt;br /&gt;
		 // ----0---	Prescaler für Timer0 verwenden&lt;br /&gt;
		 // -----000	Prescaler 1:2&lt;br /&gt;
&lt;br /&gt;
	T0IF	= 0;		// Interruptflag von Timer0 löschen&lt;br /&gt;
	GIE 	= 1;		// Alle nichtmaskierten Interrupts erlauben&lt;br /&gt;
	T0IE 	= 1;		// Timer0 Interrupt erlauben&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
	ANSEL  = 0b00000000;		// Pins als digital I/O &lt;br /&gt;
	ANSELH = 0b00000000;		// Pins als digital I/O&lt;br /&gt;
	PORTA  = 0;			// Latch von Port A,B und C löschen&lt;br /&gt;
	PORTB  = 0;&lt;br /&gt;
	PORTC  = 0;&lt;br /&gt;
	TRISA  = 0b00000100;		// RA2 als Eingang setzen und restliche Pins als &lt;br /&gt;
					// Ausgang setzen.&lt;br /&gt;
	TRISB  = 0b00000000;&lt;br /&gt;
	TRISC  = 0b00000000;&lt;br /&gt;
}&lt;br /&gt;
//========================================================================&lt;br /&gt;
void main ()&lt;br /&gt;
{&lt;br /&gt;
	setup();&lt;br /&gt;
	t0_ini();&lt;br /&gt;
&lt;br /&gt;
	while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Timer1 ===&lt;br /&gt;
==== Timer1 Hardware ====&lt;br /&gt;
[[Bild:Timer1-PIC16F690.png|right|thumb|Hardware Timer1 im PIC16F690]]&lt;br /&gt;
Der Timer1 ist ein 16-Bit Timer/Zähler. Für den Timer1 gibt es viele Verwendungsmöglichkeiten auf Grund seiner zahlreichen Einstellmöglichkeiten. Man kann Ihn als einfachen Timer verwenden, wofür er eigentlich schon fast zu schade ist, oder als raffinierten Zähler, welcher erst bei einem bestimmten Ereignis wie z.B. dem auslösen des Komparators oder eines bestimmten zustandes am TG1-Pin (RA4/Pin 3) zu zählen beginnt.&amp;lt;br/&amp;gt;&lt;br /&gt;
die 16-Bit des Timers teilen sich auf zwei 8-Bit-Register auf, &#039;&#039;&#039;TMR1H&#039;&#039;&#039; und &#039;&#039;&#039;TMR1L&#039;&#039;&#039;. &#039;&#039;&#039;TMR1H&#039;&#039;&#039; beherbergt die oberen 8 Bit und &#039;&#039;&#039;TMR1L&#039;&#039;&#039; die unteren 8 Bit. &lt;br /&gt;
==== Timer1 Codebeispiel mit Verwendung des Programmtaktes Fosc/4 ====&lt;br /&gt;
&#039;&#039;Szenario&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC verwendet als Taktquelle den internen Oszilator mit 8MHz.&amp;lt;br/&amp;gt;&lt;br /&gt;
An PORTB sind 8 LEDs mit Vorwiderständen gegen Masse verschaltet.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
#include &amp;quot;htc.h&amp;quot;&lt;br /&gt;
__CONFIG (0x30e4);&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
static void interrupt global_int(void)&lt;br /&gt;
{&lt;br /&gt;
	GIE    = 0;		// Alle Interruptquellen ausschalten&lt;br /&gt;
	TMR1IF = 0;		// Timer1 Interruptflag Löschen&lt;br /&gt;
	PORTB++;		// PORTB inkrementieren&lt;br /&gt;
	GIE    = 1;		// Interrupts wieder einschalten&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void t1_ini ()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	TMR1IF	= 0;		// Interruptflag von Timer1 löschen+&lt;br /&gt;
&lt;br /&gt;
				// Datenblatt Seite 88&lt;br /&gt;
	T1CON 	= 0b00110000;		&lt;br /&gt;
		 // 0-------	Timer1 Gate-invertier-Bit (in diesem Beispiel uninteressant)&lt;br /&gt;
		 // -0------	Timer1 Gate-enable-Bit (auf 0 gesetzt sodass der timer1 &lt;br /&gt;
		 //		mit dem TMR1ON-Bit direkt ein und ausgeschaltet werden kann&lt;br /&gt;
		 // --11----	Prescaler auf 1:8 einstellen&lt;br /&gt;
		 // ----0---	Low Power Oszillator aus&lt;br /&gt;
		 // -----0--	(in diesem Beispiel uninteressant weil Bit 1 == 0)&lt;br /&gt;
		 // ------0-	interen Takt verwenden&lt;br /&gt;
		 // -------1	Timer1 einschalten&lt;br /&gt;
&lt;br /&gt;
	GIE 	= 1;		// Alle nichtmaskierten Interrupts erlauben&lt;br /&gt;
	PEIE 	= 1;		// Pereferieinterrupt erlauben&lt;br /&gt;
				// Die Bits GIE und PEIE befinden sich in INTCON Register&lt;br /&gt;
				// und sind im Datenblatt auf Seite 38 erläutert.&lt;br /&gt;
	TMR1IE 	= 1;		// Timer1 Interrupt erlauben&lt;br /&gt;
				// Das TMR1IE-Bit ist im ist im PIE1 Register&lt;br /&gt;
				// und im Datenblatt auf Seite 39&lt;br /&gt;
}&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
	OSCCON = 0b01110000;		// 8 MHz Datenblatt Seite 48&lt;br /&gt;
	ANSEL  = 0b00000000;		// Pins als digital I/O &lt;br /&gt;
	ANSELH = 0b00000000;		// Pins als digital I/O&lt;br /&gt;
	PORTA  = 0;			// Latch von Port A,B und C löschen&lt;br /&gt;
	PORTB  = 0;&lt;br /&gt;
	PORTC  = 0;&lt;br /&gt;
	TRISA  = 0b00000000;		// Port A,B und C als Ausgänge schalten&lt;br /&gt;
	TRISB  = 0b00000000;&lt;br /&gt;
	TRISC  = 0b00000000;&lt;br /&gt;
}&lt;br /&gt;
//========================================================================&lt;br /&gt;
void main ()&lt;br /&gt;
{&lt;br /&gt;
	setup();&lt;br /&gt;
	t1_ini();&lt;br /&gt;
&lt;br /&gt;
	while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
=== Timer2 ===&lt;br /&gt;
==== Timer2 Hardware ====&lt;br /&gt;
[[Bild:Timer2-PIC16F690.png|right|thumb|Hardware Timer2 im PIC16F690]]&lt;br /&gt;
Der Timer2 ist ein 8-Bit Timer. Mit dem Timer2 lässt sich nahezu jede Zeitbasis einstellen da er über einen Prescaler von 1:1, 1:4, 1:16 und über einen Postscaler von 1:1 bis 1:16 verfügt. Des Weiteren verfügt der Timer2 über einen Comparator, welcher kontinuirlich den Wert des Timer2-Registers und des PR2-Registers vergleicht und bei Übereinstimmung einen Takt an den Postscaler weiter gibt.&lt;br /&gt;
==== Timer2 Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== AD-Wandler ===&lt;br /&gt;
==== AD-Wandler Hardware ====&lt;br /&gt;
[[Bild:AD-Wandler-PIC16F690.png|right|thumb|Hardware AD-Wandler im PIC16F690]]&lt;br /&gt;
==== AD-Wandler Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== PWM ===&lt;br /&gt;
==== PWM Hardware ====&lt;br /&gt;
[[Bild:PWM-PIC16F690.png|thumb|right|Hardware PWM im PIC16F690]]&lt;br /&gt;
==== PWM Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== EUSART ===&lt;br /&gt;
==== EUSART Hardware ====&lt;br /&gt;
[[Bild:EUSART-TX-PIC16F690.png|thumb|right|Hardware EUSART im PIC16F690]]&lt;br /&gt;
[[Bild:EUSART-RX-PIC16F690.png|thumb|right|Hardware EUSART im PIC16F690]]&lt;br /&gt;
==== EUSART TX Codebeispiel ====&lt;br /&gt;
==== EUSART RX Codebeispiel ====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== SPI ===&lt;br /&gt;
==== SPI Hardware ====&lt;br /&gt;
[[Bild:SPI-PIC16F690.png|thumb|right|Hardware SPI im PIC16F690]]&lt;br /&gt;
==== SPI Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== I2C ===&lt;br /&gt;
==== I2C Hardware ====&lt;br /&gt;
[[Bild:I2C-PIC16F690.png|thumb|right|Hardware I2C im PIC16F690]]&lt;br /&gt;
==== I2C Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.microchip.com Homepage Microchip]&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplgidcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1335&amp;amp;dDocName=en023112 Produktseite PIC16F690]&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/41262E.pdf Datenblatt PIC16F690]&lt;br /&gt;
* [http://www.htsoft.com HiTech Software]&lt;br /&gt;
* [http://www.sprut.de Sprut -&amp;gt; DIE deutschsprachige Seite zum Thema PIC]&lt;br /&gt;
* ...&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
* Den Code auf dieser Seite &amp;quot;einklappbar&amp;quot; machen, sodass nicht ewig weit gescrollt werden muss&lt;br /&gt;
* Die Bilder neu malen wegen eventuellem Copyright-Schnickschnack&lt;br /&gt;
* Timer1&lt;br /&gt;
: Codebeispiel mit externer Taktquelle&lt;br /&gt;
: Codebeispiel mit externem Quarz&lt;br /&gt;
: Codebeispiel mit T1G als Zählbeginn/ende&lt;br /&gt;
: Codebeispiel mit Comparator als Zählbeginn/ende&lt;br /&gt;
: Codebeispiel mit Synchronem Zähler&lt;br /&gt;
* Timer2&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
* AD-Wandler&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
: Codebeispiel mehrere Kanäle&lt;br /&gt;
* PWM&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
* Eusart&lt;br /&gt;
: Erklärung Hardware RX&lt;br /&gt;
: Erklärung Hardware TX&lt;br /&gt;
: Codebeispiel RX&lt;br /&gt;
: Codebeispiel TX&lt;br /&gt;
: Codebeispiel RX-TX&lt;br /&gt;
* Komparator&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
* SPI&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel senden &lt;br /&gt;
: Codebeispiel empfangen&lt;br /&gt;
* I2C&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel senden &lt;br /&gt;
: Codebeispiel empfangen&lt;br /&gt;
* Brown Out Reset&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
* EEPROM&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Wettbewerb|P]]&lt;br /&gt;
[[Category:PIC|P]]&lt;/div&gt;</summary>
		<author><name>Thomas1123</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=PIC_Codebeispiele&amp;diff=28764</id>
		<title>PIC Codebeispiele</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=PIC_Codebeispiele&amp;diff=28764"/>
		<updated>2008-06-27T18:44:58Z</updated>

		<summary type="html">&lt;p&gt;Thomas1123: /* Timer2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von [[Benutzer:Thomas1123|Thomas1123]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ich persönlich benutze den Hitech PIC-C Lite Compiler für meine Projekte.&amp;lt;br/&amp;gt;&lt;br /&gt;
Hierbei handelt es sich um die abgespeckte Version des Hitech PIC-C Compilers von der Firma HiTech Software.&amp;lt;br/&amp;gt;&lt;br /&gt;
Ich möchte hier eine Sammlung von Codebeispielen beginnen mit der es Einsteigern ermöglicht wird verschiedene interne und externe Pereferie zu initialiesieren und zu benutzen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Da der [http://www.microchip.com/stellent/idcplgidcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1335&amp;amp;dDocName=en023112 PIC16F690] mein persönlicher Liebling ist möchte ich die hier gezeigten Beispiele anhand dieses PICs aufzeigen. Die nachfolgenden Beispiele sind nicht nur für den PIC16F690 vewendbar z.B. sind die Timer0-Module in vielen Pics identisch. Dies trifft auch auf die meisten anderen Module zu jedoch kann ein zusätzlicher Blick in das Datenblatt nich schaden, da eventuell mache Register einen anderen Namen besitzen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Selbstverständlich kann dieser Artikel noch mit Codebeispielen für cc5x und ASM erweitert werden, des Weiteren kann man auch Beispiele für andere PICs der 10er, 12er, und 16er Kategorie einfügen.&lt;br /&gt;
&lt;br /&gt;
== Pinbelegung ==&lt;br /&gt;
[[Bild:PIC16F690-Pins.png|thumb|right|Pinbelegung des PIC16F690]]&lt;br /&gt;
Der PIC16F690 verfügt über eine grosse Anzahl an interner Pereferie beispielsweise 10-Bit AD-Wandler, SPI/I2C Interface, mehrere Timer (2*8-Bit 1*16-Bit), EUSART (RS232 etc.) usw.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
== Codebeispiele ==&lt;br /&gt;
----&lt;br /&gt;
=== Timer0 ===&lt;br /&gt;
==== Timer0 Hardware ====&lt;br /&gt;
[[Bild:Timer0-PIC16F690.png|thumb|right|Hardware Timer0 und WDT im PIC16F690]]&lt;br /&gt;
Der Timer0 ist ein 8-Bit Timer/Zähler, welcher entweder mit dem internen Takt des PIC oder mit einer externen Taktquelle am Pin 17 (RA2/T0CKI) Betrieben werden kann. Beim Betrieb mit einer externen Taktquelle kann man zusätzlich auswählen ob bei einer steigenden oder fallenden Flanke das Timerregister inkrementiert werden soll. Gleich welche Taktquelle gewählt wird, kann bei einem Überlauf des Timerregisters ein Interrupt ausgelöst werden. Hierfür ist es notwendig die Bits &#039;&#039;&#039;GIE&#039;&#039;&#039; und &#039;&#039;&#039;T0IE&#039;&#039;&#039; auf 1 zu setzen. Beide Bits befinden sich im &#039;&#039;&#039;INTCON&#039;&#039;&#039;-Register und sind im Datenblatt auf Seite 38 zu finden.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Im nebenstehendem Diagramm ist der aufbau des Timer0 zusammen mit dem Watchdogtimer dargestellt.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Im Option Register (&#039;&#039;&#039;OPTION&#039;&#039;&#039; Datenblatt Seite 83) kann mit Bit 5 (&#039;&#039;&#039;T0CS&#039;&#039;&#039;) ausgewählt werden ob der interne Takt (0) oder ein externer Takt (1) verwendet wird. Bei einem externen Takt kann mit Bit 4 (&#039;&#039;&#039;T0SE&#039;&#039;&#039;) auswählen ob bei einer steigenden (0) oder bei einer fallenden Flanke (1) das Timer0-Register inkrenemtiert werden soll. Mit Bit 3 (&#039;&#039;&#039;PSA&#039;&#039;&#039;) wird der Prescaler entweder dem Timer (0) &#039;&#039;&#039;oder&#039;&#039;&#039; dem Watchdogtimer (1) zugewiesen. Der Prescaler selbst wird mit den Bits 0 bis 2 (&#039;&#039;&#039;PS0 PS1 PS2&#039;&#039;&#039;) des Option Registers eingestellt.&amp;lt;br/&amp;gt;&lt;br /&gt;
Eine Übersicht der Einstellmöglichkeiten ist auf Seite 83 im Datenblatt einsehbar.&lt;br /&gt;
&lt;br /&gt;
==== Timer0 Codebeispiel mit Verwendung des Programmtaktes Fosc/4 ====&lt;br /&gt;
&#039;&#039;Szenario:&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC verwendet als Taktquelle einen 32,768 kHz Uhrenquarz.&amp;lt;br/&amp;gt;&lt;br /&gt;
An PORTB sind 8 LEDs mit Vorwiderständen gegen Masse verschaltet.&amp;lt;br/&amp;gt;&lt;br /&gt;
Jede Sekunde soll PORTB um den Wert 1 inkrementiert werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
Zu diesem Zweck wird der Timer0 mit Prescaler verwendet.&amp;lt;br/&amp;gt;&lt;br /&gt;
Die Einstellungen des Prescaler errechenen sich wie folgt:&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{Fosc}{4*Prescaler*2^8}= t \,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fosc/4 weil der PIC für eine Anweisung 4 Takte benötigt.&amp;lt;br/&amp;gt;&lt;br /&gt;
Der Prescaler als zusätzlicher Teiler des Timertaktes.&amp;lt;br/&amp;gt;&lt;br /&gt;
2^8 (256) Schritte benötigt der Timer 0 zum Überlauf.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{32768Hz}{4*2^8*32}= \frac {1}{Sek}\,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei einem Prescaler von 1:32 lösen wir somit exakt jede Sekunde einen Interrupt aus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
#include &amp;quot;htc.h&amp;quot;&lt;br /&gt;
__CONFIG (0x30e0);&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
static void interrupt global_int(void)&lt;br /&gt;
{&lt;br /&gt;
	GIE  = 0;		// Alle Interruptquellen ausschalten&lt;br /&gt;
	T0IF = 0;		// Timer0 Interruptflag Löschen&lt;br /&gt;
	PORTB++;		// PORTB inkrementieren&lt;br /&gt;
	GIE  = 1;		// Interrupts wieder einschalten&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void t0_ini ()&lt;br /&gt;
{&lt;br /&gt;
				// Datenblatt Seite 83&lt;br /&gt;
	OPTION 	= 0b11000100;		&lt;br /&gt;
		 // 1-------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // -1------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // --0-----	Internen Takt für Timer0 verwenden&lt;br /&gt;
		 // ---0----	Bei externem Takt an steigender Flanke inkrementieren&lt;br /&gt;
		 // 		(in diesem Fall egal ob 1 oder 0 weil der interne Takt verwendet wird)&lt;br /&gt;
		 // ----0---	Prescaler für Timer0 verwenden&lt;br /&gt;
		 // -----100	Prescaler 1:32&lt;br /&gt;
&lt;br /&gt;
	T0IF	= 0;		// Interruptflag von Timer0 löschen&lt;br /&gt;
	GIE 	= 1;		// Alle nichtmaskierten Interrupts erlauben&lt;br /&gt;
	T0IE 	= 1;		// Timer0 Interrupt erlauben&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
	ANSEL  = 0b00000000;		// Pins als digital I/O &lt;br /&gt;
	ANSELH = 0b00000000;		// Pins als digital I/O&lt;br /&gt;
	PORTA  = 0;			// Latch von Port A,B und C löschen&lt;br /&gt;
	PORTB  = 0;&lt;br /&gt;
	PORTC  = 0;&lt;br /&gt;
	TRISA  = 0b00000000;		// Port A,B und C als Ausgänge schalten&lt;br /&gt;
	TRISB  = 0b00000000;&lt;br /&gt;
	TRISC  = 0b00000000;&lt;br /&gt;
}&lt;br /&gt;
//========================================================================&lt;br /&gt;
void main ()&lt;br /&gt;
{&lt;br /&gt;
	setup();&lt;br /&gt;
	t0_ini();&lt;br /&gt;
&lt;br /&gt;
	while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
==== Timer0 Codebeispiel mit Verwendung eines externen Taktes ====&lt;br /&gt;
Der Code ist fast identisch, es wurden lediglich Änderungen im &#039;&#039;&#039;OPTION&#039;&#039;&#039;-Register vorgenommen und der Pin 17 (RA2) wurde als Eingang definiert. Weiters wurde der interne Oszillator mit 4MHz verwendet. &amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Der externe Takt kann nicht beliebig schnell sein. siehe Datenblatt Kapitel 5.1.5 Seite 82 und Kapitel 17 Seite 243. &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;Szenario&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC verwendet als Taktquelle den internen 4MHz Oszillator.&amp;lt;br/&amp;gt;&lt;br /&gt;
An PORTB sind 8 LEDs mit Vorwiderständen gegen Masse verschaltet.&amp;lt;br/&amp;gt;&lt;br /&gt;
PORTB soll bei jedem Timer0-Überlauf um den Wert 1 inkrementiert werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
Zu diesem Zweck wird der Timer0 mit Prescaler verwendet.&amp;lt;br/&amp;gt;&lt;br /&gt;
Die Einstellungen errechenen sich wie folgt:&amp;lt;br/&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{Takt_{T0CKI}}{Prescaler*2^8}= t \,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Gehen wir mal davon aus, dass der takt an T0CKI 100kHz beträgt und der Prescaler als 1:2 Vorteiler eingestellt ist. Somit läuft der Timer0 alle 512 Takte über.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{100kHz}{2*2^8}= \frac{195,3125}{Sek} \,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Bei diesen Einstellungen bekommen wir 195,3125 Timer0-Überläufe pro Sekunde was wiederum einem Zeitinterwall von 5,12ms entspricht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
#include &amp;quot;htc.h&amp;quot;&lt;br /&gt;
__CONFIG (0x30e4);&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
static void interrupt global_int(void)&lt;br /&gt;
{&lt;br /&gt;
	GIE  = 0;		// Alle Interruptquellen ausschalten&lt;br /&gt;
	T0IF = 0;		// Timer0 Interruptflag Löschen&lt;br /&gt;
	PORTB++;		// PORTB inkrementieren&lt;br /&gt;
	GIE  = 1;		// Interrupts wieder einschalten&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void t0_ini ()&lt;br /&gt;
{&lt;br /&gt;
				// Datenblatt Seite 83&lt;br /&gt;
	OPTION 	= 0b11000100;		&lt;br /&gt;
		 // 1-------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // -1------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // --1-----	Takt an T0CKI für Timer0 verwenden&lt;br /&gt;
		 // ---0----	Bei externem Takt an steigender Flanke inkrementieren&lt;br /&gt;
		 // ----0---	Prescaler für Timer0 verwenden&lt;br /&gt;
		 // -----000	Prescaler 1:2&lt;br /&gt;
&lt;br /&gt;
	T0IF	= 0;		// Interruptflag von Timer0 löschen&lt;br /&gt;
	GIE 	= 1;		// Alle nichtmaskierten Interrupts erlauben&lt;br /&gt;
	T0IE 	= 1;		// Timer0 Interrupt erlauben&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
	ANSEL  = 0b00000000;		// Pins als digital I/O &lt;br /&gt;
	ANSELH = 0b00000000;		// Pins als digital I/O&lt;br /&gt;
	PORTA  = 0;			// Latch von Port A,B und C löschen&lt;br /&gt;
	PORTB  = 0;&lt;br /&gt;
	PORTC  = 0;&lt;br /&gt;
	TRISA  = 0b00000100;		// RA2 als Eingang setzen und restliche Pins als &lt;br /&gt;
					// Ausgang setzen.&lt;br /&gt;
	TRISB  = 0b00000000;&lt;br /&gt;
	TRISC  = 0b00000000;&lt;br /&gt;
}&lt;br /&gt;
//========================================================================&lt;br /&gt;
void main ()&lt;br /&gt;
{&lt;br /&gt;
	setup();&lt;br /&gt;
	t0_ini();&lt;br /&gt;
&lt;br /&gt;
	while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Timer1 ===&lt;br /&gt;
==== Timer1 Hardware ====&lt;br /&gt;
[[Bild:Timer1-PIC16F690.png|right|thumb|Hardware Timer1 im PIC16F690]]&lt;br /&gt;
Der Timer1 ist ein 16-Bit Timer/Zähler. Für den Timer1 gibt es viele Verwendungsmöglichkeiten auf Grund seiner zahlreichen Einstellmöglichkeiten. Man kann Ihn als einfachen Timer verwenden, wofür er eigentlich schon fast zu schade ist, oder als raffinierten Zähler, welcher erst bei einem bestimmten Ereignis wie z.B. dem auslösen des Komparators oder eines bestimmten zustandes am TG1-Pin (RA4/Pin 3) zu zählen beginnt.&amp;lt;br/&amp;gt;&lt;br /&gt;
die 16-Bit des Timers teilen sich auf zwei 8-Bit-Register auf, &#039;&#039;&#039;TMR1H&#039;&#039;&#039; und &#039;&#039;&#039;TMR1L&#039;&#039;&#039;. &#039;&#039;&#039;TMR1H&#039;&#039;&#039; beherbergt die oberen 8 Bit und &#039;&#039;&#039;TMR1L&#039;&#039;&#039; die unteren 8 Bit. &lt;br /&gt;
==== Timer1 Codebeispiel mit Verwendung des Programmtaktes Fosc/4 ====&lt;br /&gt;
&#039;&#039;Szenario&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC verwendet als Taktquelle den internen Oszilator mit 8MHz.&amp;lt;br/&amp;gt;&lt;br /&gt;
An PORTB sind 8 LEDs mit Vorwiderständen gegen Masse verschaltet.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
#include &amp;quot;htc.h&amp;quot;&lt;br /&gt;
__CONFIG (0x30e4);&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
static void interrupt global_int(void)&lt;br /&gt;
{&lt;br /&gt;
	GIE    = 0;		// Alle Interruptquellen ausschalten&lt;br /&gt;
	TMR1IF = 0;		// Timer1 Interruptflag Löschen&lt;br /&gt;
	PORTB++;		// PORTB inkrementieren&lt;br /&gt;
	GIE    = 1;		// Interrupts wieder einschalten&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void t1_ini ()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	TMR1IF	= 0;		// Interruptflag von Timer1 löschen+&lt;br /&gt;
&lt;br /&gt;
				// Datenblatt Seite 88&lt;br /&gt;
	T1CON 	= 0b00110000;		&lt;br /&gt;
		 // 0-------	Timer1 Gate-invertier-Bit (in diesem Beispiel uninteressant)&lt;br /&gt;
		 // -0------	Timer1 Gate-enable-Bit (auf 0 gesetzt sodass der timer1 &lt;br /&gt;
		 //		mit dem TMR1ON-Bit direkt ein und ausgeschaltet werden kann&lt;br /&gt;
		 // --11----	Prescaler auf 1:8 einstellen&lt;br /&gt;
		 // ----0---	Low Power Oszillator aus&lt;br /&gt;
		 // -----0--	(in diesem Beispiel uninteressant weil Bit 1 == 0)&lt;br /&gt;
		 // ------0-	interen Takt verwenden&lt;br /&gt;
		 // -------1	Timer1 einschalten&lt;br /&gt;
&lt;br /&gt;
	GIE 	= 1;		// Alle nichtmaskierten Interrupts erlauben&lt;br /&gt;
	PEIE 	= 1;		// Pereferieinterrupt erlauben&lt;br /&gt;
				// Die Bits GIE und PEIE befinden sich in INTCON Register&lt;br /&gt;
				// und sind im Datenblatt auf Seite 38 erläutert.&lt;br /&gt;
	TMR1IE 	= 1;		// Timer1 Interrupt erlauben&lt;br /&gt;
				// Das TMR1IE-Bit ist im ist im PIE1 Register&lt;br /&gt;
				// und im Datenblatt auf Seite 39&lt;br /&gt;
}&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
	OSCCON = 0b01110000;		// 8 MHz Datenblatt Seite 48&lt;br /&gt;
	ANSEL  = 0b00000000;		// Pins als digital I/O &lt;br /&gt;
	ANSELH = 0b00000000;		// Pins als digital I/O&lt;br /&gt;
	PORTA  = 0;			// Latch von Port A,B und C löschen&lt;br /&gt;
	PORTB  = 0;&lt;br /&gt;
	PORTC  = 0;&lt;br /&gt;
	TRISA  = 0b00000000;		// Port A,B und C als Ausgänge schalten&lt;br /&gt;
	TRISB  = 0b00000000;&lt;br /&gt;
	TRISC  = 0b00000000;&lt;br /&gt;
}&lt;br /&gt;
//========================================================================&lt;br /&gt;
void main ()&lt;br /&gt;
{&lt;br /&gt;
	setup();&lt;br /&gt;
	t1_ini();&lt;br /&gt;
&lt;br /&gt;
	while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
=== Timer2 ===&lt;br /&gt;
==== Timer2 Hardware ====&lt;br /&gt;
[[Bild:Timer2-PIC16F690.png|right|thumb|Hardware Timer2 im PIC16F690]]&lt;br /&gt;
Der Timer2 ist ein 8-Bit Timer. Mit dem Timer2 lässt sich nahezu jede Zeitbasis einstellen da er über einen Prescaler von 1:1, 1:4, 1:16 und über einen Postscaler von 1:1 bis 1:16 verfügt. Des Weiteren verfügt der Timer2 über einen Comparator, welcher kontinuirlich den Wert des Timer2-Registers und des PR2-Registers vergleicht und bei Übereinstimmung einen Takt an den Postscaler weiter gibt.&lt;br /&gt;
==== Timer2 Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== AD-Wandler ===&lt;br /&gt;
==== AD-Wandler Hardware ====&lt;br /&gt;
[[Bild:AD-Wandler-PIC16F690.png|right|thumb|Hardware AD-Wandler im PIC16F690]]&lt;br /&gt;
==== AD-Wandler Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== PWM ===&lt;br /&gt;
==== PWM Hardware ====&lt;br /&gt;
[[Bild:PWM-PIC16F690.png|thumb|right|Hardware PWM im PIC16F690]]&lt;br /&gt;
==== PWM Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== EUSART ===&lt;br /&gt;
==== EUSART Hardware ====&lt;br /&gt;
[[Bild:EUSART-TX-PIC16F690.png|thumb|right|Hardware EUSART im PIC16F690]]&lt;br /&gt;
[[Bild:EUSART-RX-PIC16F690.png|thumb|right|Hardware EUSART im PIC16F690]]&lt;br /&gt;
==== EUSART TX Codebeispiel ====&lt;br /&gt;
==== EUSART RX Codebeispiel ====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== SPI ===&lt;br /&gt;
==== SPI Hardware ====&lt;br /&gt;
[[Bild:SPI-PIC16F690.png|thumb|right|Hardware SPI im PIC16F690]]&lt;br /&gt;
==== SPI Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== I2C ===&lt;br /&gt;
==== I2C Hardware ====&lt;br /&gt;
[[Bild:I2C-PIC16F690.png|thumb|right|Hardware I2C im PIC16F690]]&lt;br /&gt;
==== I2C Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.microchip.com Homepage Microchip]&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplgidcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1335&amp;amp;dDocName=en023112 Produktseite PIC16F690]&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/41262E.pdf Datenblatt PIC16F690]&lt;br /&gt;
* [http://www.htsoft.com HiTech Software]&lt;br /&gt;
* [http://www.sprut.de Sprut -&amp;gt; DIE deutschsprachige Seite zum Thema PIC]&lt;br /&gt;
* ...&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
* Den Code auf dieser Seite &amp;quot;einklappbar&amp;quot; machen, sodass nicht ewig weit gescrollt werden muss&lt;br /&gt;
* Die Bilder neu malen wegen eventuellem Copyright-Schnickschnack&lt;br /&gt;
* Timer1&lt;br /&gt;
: Codebeispiel mit externer Taktquelle&lt;br /&gt;
: Codebeispiel mit externem Quarz&lt;br /&gt;
: Codebeispiel mit T1G als Zählbeginn/ende&lt;br /&gt;
: Codebeispiel mit Comparator als Zählbeginn/ende&lt;br /&gt;
: Codebeispiel mit Synchronem Zähler&lt;br /&gt;
* Timer2&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
* AD-Wandler&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
: Codebeispiel mehrere Kanäle&lt;br /&gt;
* PWM&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
* Eusart&lt;br /&gt;
: Erklärung Hardware RX&lt;br /&gt;
: Erklärung Hardware TX&lt;br /&gt;
: Codebeispiel RX&lt;br /&gt;
: Codebeispiel TX&lt;br /&gt;
: Codebeispiel RX-TX&lt;br /&gt;
* Komparator&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
* SPI&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel senden &lt;br /&gt;
: Codebeispiel empfangen&lt;br /&gt;
* I2C&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel senden &lt;br /&gt;
: Codebeispiel empfangen&lt;br /&gt;
* Brown Out Reset&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
* EEPROM&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Wettbewerb|P]]&lt;br /&gt;
[[Category:PIC|P]]&lt;/div&gt;</summary>
		<author><name>Thomas1123</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=PIC_Codebeispiele&amp;diff=28763</id>
		<title>PIC Codebeispiele</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=PIC_Codebeispiele&amp;diff=28763"/>
		<updated>2008-06-27T18:19:27Z</updated>

		<summary type="html">&lt;p&gt;Thomas1123: /* Timer0 Codebeispiel mit Verwendung eines externen Taktes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von [[Benutzer:Thomas1123|Thomas1123]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ich persönlich benutze den Hitech PIC-C Lite Compiler für meine Projekte.&amp;lt;br/&amp;gt;&lt;br /&gt;
Hierbei handelt es sich um die abgespeckte Version des Hitech PIC-C Compilers von der Firma HiTech Software.&amp;lt;br/&amp;gt;&lt;br /&gt;
Ich möchte hier eine Sammlung von Codebeispielen beginnen mit der es Einsteigern ermöglicht wird verschiedene interne und externe Pereferie zu initialiesieren und zu benutzen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Da der [http://www.microchip.com/stellent/idcplgidcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1335&amp;amp;dDocName=en023112 PIC16F690] mein persönlicher Liebling ist möchte ich die hier gezeigten Beispiele anhand dieses PICs aufzeigen. Die nachfolgenden Beispiele sind nicht nur für den PIC16F690 vewendbar z.B. sind die Timer0-Module in vielen Pics identisch. Dies trifft auch auf die meisten anderen Module zu jedoch kann ein zusätzlicher Blick in das Datenblatt nich schaden, da eventuell mache Register einen anderen Namen besitzen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Selbstverständlich kann dieser Artikel noch mit Codebeispielen für cc5x und ASM erweitert werden, des Weiteren kann man auch Beispiele für andere PICs der 10er, 12er, und 16er Kategorie einfügen.&lt;br /&gt;
&lt;br /&gt;
== Pinbelegung ==&lt;br /&gt;
[[Bild:PIC16F690-Pins.png|thumb|right|Pinbelegung des PIC16F690]]&lt;br /&gt;
Der PIC16F690 verfügt über eine grosse Anzahl an interner Pereferie beispielsweise 10-Bit AD-Wandler, SPI/I2C Interface, mehrere Timer (2*8-Bit 1*16-Bit), EUSART (RS232 etc.) usw.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
== Codebeispiele ==&lt;br /&gt;
----&lt;br /&gt;
=== Timer0 ===&lt;br /&gt;
==== Timer0 Hardware ====&lt;br /&gt;
[[Bild:Timer0-PIC16F690.png|thumb|right|Hardware Timer0 und WDT im PIC16F690]]&lt;br /&gt;
Der Timer0 ist ein 8-Bit Timer/Zähler, welcher entweder mit dem internen Takt des PIC oder mit einer externen Taktquelle am Pin 17 (RA2/T0CKI) Betrieben werden kann. Beim Betrieb mit einer externen Taktquelle kann man zusätzlich auswählen ob bei einer steigenden oder fallenden Flanke das Timerregister inkrementiert werden soll. Gleich welche Taktquelle gewählt wird, kann bei einem Überlauf des Timerregisters ein Interrupt ausgelöst werden. Hierfür ist es notwendig die Bits &#039;&#039;&#039;GIE&#039;&#039;&#039; und &#039;&#039;&#039;T0IE&#039;&#039;&#039; auf 1 zu setzen. Beide Bits befinden sich im &#039;&#039;&#039;INTCON&#039;&#039;&#039;-Register und sind im Datenblatt auf Seite 38 zu finden.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Im nebenstehendem Diagramm ist der aufbau des Timer0 zusammen mit dem Watchdogtimer dargestellt.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Im Option Register (&#039;&#039;&#039;OPTION&#039;&#039;&#039; Datenblatt Seite 83) kann mit Bit 5 (&#039;&#039;&#039;T0CS&#039;&#039;&#039;) ausgewählt werden ob der interne Takt (0) oder ein externer Takt (1) verwendet wird. Bei einem externen Takt kann mit Bit 4 (&#039;&#039;&#039;T0SE&#039;&#039;&#039;) auswählen ob bei einer steigenden (0) oder bei einer fallenden Flanke (1) das Timer0-Register inkrenemtiert werden soll. Mit Bit 3 (&#039;&#039;&#039;PSA&#039;&#039;&#039;) wird der Prescaler entweder dem Timer (0) &#039;&#039;&#039;oder&#039;&#039;&#039; dem Watchdogtimer (1) zugewiesen. Der Prescaler selbst wird mit den Bits 0 bis 2 (&#039;&#039;&#039;PS0 PS1 PS2&#039;&#039;&#039;) des Option Registers eingestellt.&amp;lt;br/&amp;gt;&lt;br /&gt;
Eine Übersicht der Einstellmöglichkeiten ist auf Seite 83 im Datenblatt einsehbar.&lt;br /&gt;
&lt;br /&gt;
==== Timer0 Codebeispiel mit Verwendung des Programmtaktes Fosc/4 ====&lt;br /&gt;
&#039;&#039;Szenario:&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC verwendet als Taktquelle einen 32,768 kHz Uhrenquarz.&amp;lt;br/&amp;gt;&lt;br /&gt;
An PORTB sind 8 LEDs mit Vorwiderständen gegen Masse verschaltet.&amp;lt;br/&amp;gt;&lt;br /&gt;
Jede Sekunde soll PORTB um den Wert 1 inkrementiert werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
Zu diesem Zweck wird der Timer0 mit Prescaler verwendet.&amp;lt;br/&amp;gt;&lt;br /&gt;
Die Einstellungen des Prescaler errechenen sich wie folgt:&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{Fosc}{4*Prescaler*2^8}= t \,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fosc/4 weil der PIC für eine Anweisung 4 Takte benötigt.&amp;lt;br/&amp;gt;&lt;br /&gt;
Der Prescaler als zusätzlicher Teiler des Timertaktes.&amp;lt;br/&amp;gt;&lt;br /&gt;
2^8 (256) Schritte benötigt der Timer 0 zum Überlauf.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{32768Hz}{4*2^8*32}= \frac {1}{Sek}\,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei einem Prescaler von 1:32 lösen wir somit exakt jede Sekunde einen Interrupt aus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
#include &amp;quot;htc.h&amp;quot;&lt;br /&gt;
__CONFIG (0x30e0);&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
static void interrupt global_int(void)&lt;br /&gt;
{&lt;br /&gt;
	GIE  = 0;		// Alle Interruptquellen ausschalten&lt;br /&gt;
	T0IF = 0;		// Timer0 Interruptflag Löschen&lt;br /&gt;
	PORTB++;		// PORTB inkrementieren&lt;br /&gt;
	GIE  = 1;		// Interrupts wieder einschalten&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void t0_ini ()&lt;br /&gt;
{&lt;br /&gt;
				// Datenblatt Seite 83&lt;br /&gt;
	OPTION 	= 0b11000100;		&lt;br /&gt;
		 // 1-------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // -1------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // --0-----	Internen Takt für Timer0 verwenden&lt;br /&gt;
		 // ---0----	Bei externem Takt an steigender Flanke inkrementieren&lt;br /&gt;
		 // 		(in diesem Fall egal ob 1 oder 0 weil der interne Takt verwendet wird)&lt;br /&gt;
		 // ----0---	Prescaler für Timer0 verwenden&lt;br /&gt;
		 // -----100	Prescaler 1:32&lt;br /&gt;
&lt;br /&gt;
	T0IF	= 0;		// Interruptflag von Timer0 löschen&lt;br /&gt;
	GIE 	= 1;		// Alle nichtmaskierten Interrupts erlauben&lt;br /&gt;
	T0IE 	= 1;		// Timer0 Interrupt erlauben&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
	ANSEL  = 0b00000000;		// Pins als digital I/O &lt;br /&gt;
	ANSELH = 0b00000000;		// Pins als digital I/O&lt;br /&gt;
	PORTA  = 0;			// Latch von Port A,B und C löschen&lt;br /&gt;
	PORTB  = 0;&lt;br /&gt;
	PORTC  = 0;&lt;br /&gt;
	TRISA  = 0b00000000;		// Port A,B und C als Ausgänge schalten&lt;br /&gt;
	TRISB  = 0b00000000;&lt;br /&gt;
	TRISC  = 0b00000000;&lt;br /&gt;
}&lt;br /&gt;
//========================================================================&lt;br /&gt;
void main ()&lt;br /&gt;
{&lt;br /&gt;
	setup();&lt;br /&gt;
	t0_ini();&lt;br /&gt;
&lt;br /&gt;
	while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
==== Timer0 Codebeispiel mit Verwendung eines externen Taktes ====&lt;br /&gt;
Der Code ist fast identisch, es wurden lediglich Änderungen im &#039;&#039;&#039;OPTION&#039;&#039;&#039;-Register vorgenommen und der Pin 17 (RA2) wurde als Eingang definiert. Weiters wurde der interne Oszillator mit 4MHz verwendet. &amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Der externe Takt kann nicht beliebig schnell sein. siehe Datenblatt Kapitel 5.1.5 Seite 82 und Kapitel 17 Seite 243. &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;Szenario&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC verwendet als Taktquelle den internen 4MHz Oszillator.&amp;lt;br/&amp;gt;&lt;br /&gt;
An PORTB sind 8 LEDs mit Vorwiderständen gegen Masse verschaltet.&amp;lt;br/&amp;gt;&lt;br /&gt;
PORTB soll bei jedem Timer0-Überlauf um den Wert 1 inkrementiert werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
Zu diesem Zweck wird der Timer0 mit Prescaler verwendet.&amp;lt;br/&amp;gt;&lt;br /&gt;
Die Einstellungen errechenen sich wie folgt:&amp;lt;br/&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{Takt_{T0CKI}}{Prescaler*2^8}= t \,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Gehen wir mal davon aus, dass der takt an T0CKI 100kHz beträgt und der Prescaler als 1:2 Vorteiler eingestellt ist. Somit läuft der Timer0 alle 512 Takte über.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{100kHz}{2*2^8}= \frac{195,3125}{Sek} \,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Bei diesen Einstellungen bekommen wir 195,3125 Timer0-Überläufe pro Sekunde was wiederum einem Zeitinterwall von 5,12ms entspricht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
#include &amp;quot;htc.h&amp;quot;&lt;br /&gt;
__CONFIG (0x30e4);&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
static void interrupt global_int(void)&lt;br /&gt;
{&lt;br /&gt;
	GIE  = 0;		// Alle Interruptquellen ausschalten&lt;br /&gt;
	T0IF = 0;		// Timer0 Interruptflag Löschen&lt;br /&gt;
	PORTB++;		// PORTB inkrementieren&lt;br /&gt;
	GIE  = 1;		// Interrupts wieder einschalten&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void t0_ini ()&lt;br /&gt;
{&lt;br /&gt;
				// Datenblatt Seite 83&lt;br /&gt;
	OPTION 	= 0b11000100;		&lt;br /&gt;
		 // 1-------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // -1------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // --1-----	Takt an T0CKI für Timer0 verwenden&lt;br /&gt;
		 // ---0----	Bei externem Takt an steigender Flanke inkrementieren&lt;br /&gt;
		 // ----0---	Prescaler für Timer0 verwenden&lt;br /&gt;
		 // -----000	Prescaler 1:2&lt;br /&gt;
&lt;br /&gt;
	T0IF	= 0;		// Interruptflag von Timer0 löschen&lt;br /&gt;
	GIE 	= 1;		// Alle nichtmaskierten Interrupts erlauben&lt;br /&gt;
	T0IE 	= 1;		// Timer0 Interrupt erlauben&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
	ANSEL  = 0b00000000;		// Pins als digital I/O &lt;br /&gt;
	ANSELH = 0b00000000;		// Pins als digital I/O&lt;br /&gt;
	PORTA  = 0;			// Latch von Port A,B und C löschen&lt;br /&gt;
	PORTB  = 0;&lt;br /&gt;
	PORTC  = 0;&lt;br /&gt;
	TRISA  = 0b00000100;		// RA2 als Eingang setzen und restliche Pins als &lt;br /&gt;
					// Ausgang setzen.&lt;br /&gt;
	TRISB  = 0b00000000;&lt;br /&gt;
	TRISC  = 0b00000000;&lt;br /&gt;
}&lt;br /&gt;
//========================================================================&lt;br /&gt;
void main ()&lt;br /&gt;
{&lt;br /&gt;
	setup();&lt;br /&gt;
	t0_ini();&lt;br /&gt;
&lt;br /&gt;
	while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Timer1 ===&lt;br /&gt;
==== Timer1 Hardware ====&lt;br /&gt;
[[Bild:Timer1-PIC16F690.png|right|thumb|Hardware Timer1 im PIC16F690]]&lt;br /&gt;
Der Timer1 ist ein 16-Bit Timer/Zähler. Für den Timer1 gibt es viele Verwendungsmöglichkeiten auf Grund seiner zahlreichen Einstellmöglichkeiten. Man kann Ihn als einfachen Timer verwenden, wofür er eigentlich schon fast zu schade ist, oder als raffinierten Zähler, welcher erst bei einem bestimmten Ereignis wie z.B. dem auslösen des Komparators oder eines bestimmten zustandes am TG1-Pin (RA4/Pin 3) zu zählen beginnt.&amp;lt;br/&amp;gt;&lt;br /&gt;
die 16-Bit des Timers teilen sich auf zwei 8-Bit-Register auf, &#039;&#039;&#039;TMR1H&#039;&#039;&#039; und &#039;&#039;&#039;TMR1L&#039;&#039;&#039;. &#039;&#039;&#039;TMR1H&#039;&#039;&#039; beherbergt die oberen 8 Bit und &#039;&#039;&#039;TMR1L&#039;&#039;&#039; die unteren 8 Bit. &lt;br /&gt;
==== Timer1 Codebeispiel mit Verwendung des Programmtaktes Fosc/4 ====&lt;br /&gt;
&#039;&#039;Szenario&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC verwendet als Taktquelle den internen Oszilator mit 8MHz.&amp;lt;br/&amp;gt;&lt;br /&gt;
An PORTB sind 8 LEDs mit Vorwiderständen gegen Masse verschaltet.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
#include &amp;quot;htc.h&amp;quot;&lt;br /&gt;
__CONFIG (0x30e4);&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
static void interrupt global_int(void)&lt;br /&gt;
{&lt;br /&gt;
	GIE    = 0;		// Alle Interruptquellen ausschalten&lt;br /&gt;
	TMR1IF = 0;		// Timer1 Interruptflag Löschen&lt;br /&gt;
	PORTB++;		// PORTB inkrementieren&lt;br /&gt;
	GIE    = 1;		// Interrupts wieder einschalten&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void t1_ini ()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	TMR1IF	= 0;		// Interruptflag von Timer1 löschen+&lt;br /&gt;
&lt;br /&gt;
				// Datenblatt Seite 88&lt;br /&gt;
	T1CON 	= 0b00110000;		&lt;br /&gt;
		 // 0-------	Timer1 Gate-invertier-Bit (in diesem Beispiel uninteressant)&lt;br /&gt;
		 // -0------	Timer1 Gate-enable-Bit (auf 0 gesetzt sodass der timer1 &lt;br /&gt;
		 //		mit dem TMR1ON-Bit direkt ein und ausgeschaltet werden kann&lt;br /&gt;
		 // --11----	Prescaler auf 1:8 einstellen&lt;br /&gt;
		 // ----0---	Low Power Oszillator aus&lt;br /&gt;
		 // -----0--	(in diesem Beispiel uninteressant weil Bit 1 == 0)&lt;br /&gt;
		 // ------0-	interen Takt verwenden&lt;br /&gt;
		 // -------1	Timer1 einschalten&lt;br /&gt;
&lt;br /&gt;
	GIE 	= 1;		// Alle nichtmaskierten Interrupts erlauben&lt;br /&gt;
	PEIE 	= 1;		// Pereferieinterrupt erlauben&lt;br /&gt;
				// Die Bits GIE und PEIE befinden sich in INTCON Register&lt;br /&gt;
				// und sind im Datenblatt auf Seite 38 erläutert.&lt;br /&gt;
	TMR1IE 	= 1;		// Timer1 Interrupt erlauben&lt;br /&gt;
				// Das TMR1IE-Bit ist im ist im PIE1 Register&lt;br /&gt;
				// und im Datenblatt auf Seite 39&lt;br /&gt;
}&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
	OSCCON = 0b01110000;		// 8 MHz Datenblatt Seite 48&lt;br /&gt;
	ANSEL  = 0b00000000;		// Pins als digital I/O &lt;br /&gt;
	ANSELH = 0b00000000;		// Pins als digital I/O&lt;br /&gt;
	PORTA  = 0;			// Latch von Port A,B und C löschen&lt;br /&gt;
	PORTB  = 0;&lt;br /&gt;
	PORTC  = 0;&lt;br /&gt;
	TRISA  = 0b00000000;		// Port A,B und C als Ausgänge schalten&lt;br /&gt;
	TRISB  = 0b00000000;&lt;br /&gt;
	TRISC  = 0b00000000;&lt;br /&gt;
}&lt;br /&gt;
//========================================================================&lt;br /&gt;
void main ()&lt;br /&gt;
{&lt;br /&gt;
	setup();&lt;br /&gt;
	t1_ini();&lt;br /&gt;
&lt;br /&gt;
	while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
=== Timer2 ===&lt;br /&gt;
==== Timer2 Hardware ====&lt;br /&gt;
[[Bild:Timer2-PIC16F690.png|right|thumb|Hardware Timer2 im PIC16F690]]&lt;br /&gt;
==== Timer2 Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== AD-Wandler ===&lt;br /&gt;
==== AD-Wandler Hardware ====&lt;br /&gt;
[[Bild:AD-Wandler-PIC16F690.png|right|thumb|Hardware AD-Wandler im PIC16F690]]&lt;br /&gt;
==== AD-Wandler Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== PWM ===&lt;br /&gt;
==== PWM Hardware ====&lt;br /&gt;
[[Bild:PWM-PIC16F690.png|thumb|right|Hardware PWM im PIC16F690]]&lt;br /&gt;
==== PWM Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== EUSART ===&lt;br /&gt;
==== EUSART Hardware ====&lt;br /&gt;
[[Bild:EUSART-TX-PIC16F690.png|thumb|right|Hardware EUSART im PIC16F690]]&lt;br /&gt;
[[Bild:EUSART-RX-PIC16F690.png|thumb|right|Hardware EUSART im PIC16F690]]&lt;br /&gt;
==== EUSART TX Codebeispiel ====&lt;br /&gt;
==== EUSART RX Codebeispiel ====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== SPI ===&lt;br /&gt;
==== SPI Hardware ====&lt;br /&gt;
[[Bild:SPI-PIC16F690.png|thumb|right|Hardware SPI im PIC16F690]]&lt;br /&gt;
==== SPI Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== I2C ===&lt;br /&gt;
==== I2C Hardware ====&lt;br /&gt;
[[Bild:I2C-PIC16F690.png|thumb|right|Hardware I2C im PIC16F690]]&lt;br /&gt;
==== I2C Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.microchip.com Homepage Microchip]&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplgidcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1335&amp;amp;dDocName=en023112 Produktseite PIC16F690]&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/41262E.pdf Datenblatt PIC16F690]&lt;br /&gt;
* [http://www.htsoft.com HiTech Software]&lt;br /&gt;
* [http://www.sprut.de Sprut -&amp;gt; DIE deutschsprachige Seite zum Thema PIC]&lt;br /&gt;
* ...&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
* Den Code auf dieser Seite &amp;quot;einklappbar&amp;quot; machen, sodass nicht ewig weit gescrollt werden muss&lt;br /&gt;
* Die Bilder neu malen wegen eventuellem Copyright-Schnickschnack&lt;br /&gt;
* Timer1&lt;br /&gt;
: Codebeispiel mit externer Taktquelle&lt;br /&gt;
: Codebeispiel mit externem Quarz&lt;br /&gt;
: Codebeispiel mit T1G als Zählbeginn/ende&lt;br /&gt;
: Codebeispiel mit Comparator als Zählbeginn/ende&lt;br /&gt;
: Codebeispiel mit Synchronem Zähler&lt;br /&gt;
* Timer2&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
* AD-Wandler&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
: Codebeispiel mehrere Kanäle&lt;br /&gt;
* PWM&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
* Eusart&lt;br /&gt;
: Erklärung Hardware RX&lt;br /&gt;
: Erklärung Hardware TX&lt;br /&gt;
: Codebeispiel RX&lt;br /&gt;
: Codebeispiel TX&lt;br /&gt;
: Codebeispiel RX-TX&lt;br /&gt;
* Komparator&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
* SPI&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel senden &lt;br /&gt;
: Codebeispiel empfangen&lt;br /&gt;
* I2C&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel senden &lt;br /&gt;
: Codebeispiel empfangen&lt;br /&gt;
* Brown Out Reset&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
* EEPROM&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Wettbewerb|P]]&lt;br /&gt;
[[Category:PIC|P]]&lt;/div&gt;</summary>
		<author><name>Thomas1123</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=PIC_Codebeispiele&amp;diff=28738</id>
		<title>PIC Codebeispiele</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=PIC_Codebeispiele&amp;diff=28738"/>
		<updated>2008-06-27T11:56:03Z</updated>

		<summary type="html">&lt;p&gt;Thomas1123: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von [[Benutzer:Thomas1123|Thomas1123]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ich persönlich benutze den Hitech PIC-C Lite Compiler für meine Projekte.&amp;lt;br/&amp;gt;&lt;br /&gt;
Hierbei handelt es sich um die abgespeckte Version des Hitech PIC-C Compilers von der Firma HiTech Software.&amp;lt;br/&amp;gt;&lt;br /&gt;
Ich möchte hier eine Sammlung von Codebeispielen beginnen mit der es Einsteigern ermöglicht wird verschiedene interne und externe Pereferie zu initialiesieren und zu benutzen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Da der [http://www.microchip.com/stellent/idcplgidcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1335&amp;amp;dDocName=en023112 PIC16F690] mein persönlicher Liebling ist möchte ich die hier gezeigten Beispiele anhand dieses PICs aufzeigen. Die nachfolgenden Beispiele sind nicht nur für den PIC16F690 vewendbar z.B. sind die Timer0-Module in vielen Pics identisch. Dies trifft auch auf die meisten anderen Module zu jedoch kann ein zusätzlicher Blick in das Datenblatt nich schaden, da eventuell mache Register einen anderen Namen besitzen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Selbstverständlich kann dieser Artikel noch mit Codebeispielen für cc5x und ASM erweitert werden, des Weiteren kann man auch Beispiele für andere PICs der 10er, 12er, und 16er Kategorie einfügen.&lt;br /&gt;
&lt;br /&gt;
== Pinbelegung ==&lt;br /&gt;
[[Bild:PIC16F690-Pins.png|thumb|right|Pinbelegung des PIC16F690]]&lt;br /&gt;
Der PIC16F690 verfügt über eine grosse Anzahl an interner Pereferie beispielsweise 10-Bit AD-Wandler, SPI/I2C Interface, mehrere Timer (2*8-Bit 1*16-Bit), EUSART (RS232 etc.) usw.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
== Codebeispiele ==&lt;br /&gt;
----&lt;br /&gt;
=== Timer0 ===&lt;br /&gt;
==== Timer0 Hardware ====&lt;br /&gt;
[[Bild:Timer0-PIC16F690.png|thumb|right|Hardware Timer0 und WDT im PIC16F690]]&lt;br /&gt;
Der Timer0 ist ein 8-Bit Timer/Zähler, welcher entweder mit dem internen Takt des PIC oder mit einer externen Taktquelle am Pin 17 (RA2/T0CKI) Betrieben werden kann. Beim Betrieb mit einer externen Taktquelle kann man zusätzlich auswählen ob bei einer steigenden oder fallenden Flanke das Timerregister inkrementiert werden soll. Gleich welche Taktquelle gewählt wird, kann bei einem Überlauf des Timerregisters ein Interrupt ausgelöst werden. Hierfür ist es notwendig die Bits &#039;&#039;&#039;GIE&#039;&#039;&#039; und &#039;&#039;&#039;T0IE&#039;&#039;&#039; auf 1 zu setzen. Beide Bits befinden sich im &#039;&#039;&#039;INTCON&#039;&#039;&#039;-Register und sind im Datenblatt auf Seite 38 zu finden.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Im nebenstehendem Diagramm ist der aufbau des Timer0 zusammen mit dem Watchdogtimer dargestellt.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Im Option Register (&#039;&#039;&#039;OPTION&#039;&#039;&#039; Datenblatt Seite 83) kann mit Bit 5 (&#039;&#039;&#039;T0CS&#039;&#039;&#039;) ausgewählt werden ob der interne Takt (0) oder ein externer Takt (1) verwendet wird. Bei einem externen Takt kann mit Bit 4 (&#039;&#039;&#039;T0SE&#039;&#039;&#039;) auswählen ob bei einer steigenden (0) oder bei einer fallenden Flanke (1) das Timer0-Register inkrenemtiert werden soll. Mit Bit 3 (&#039;&#039;&#039;PSA&#039;&#039;&#039;) wird der Prescaler entweder dem Timer (0) &#039;&#039;&#039;oder&#039;&#039;&#039; dem Watchdogtimer (1) zugewiesen. Der Prescaler selbst wird mit den Bits 0 bis 2 (&#039;&#039;&#039;PS0 PS1 PS2&#039;&#039;&#039;) des Option Registers eingestellt.&amp;lt;br/&amp;gt;&lt;br /&gt;
Eine Übersicht der Einstellmöglichkeiten ist auf Seite 83 im Datenblatt einsehbar.&lt;br /&gt;
&lt;br /&gt;
==== Timer0 Codebeispiel mit Verwendung des Programmtaktes Fosc/4 ====&lt;br /&gt;
&#039;&#039;Szenario:&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC verwendet als Taktquelle einen 32,768 kHz Uhrenquarz.&amp;lt;br/&amp;gt;&lt;br /&gt;
An PORTB sind 8 LEDs mit Vorwiderständen gegen Masse verschaltet.&amp;lt;br/&amp;gt;&lt;br /&gt;
Jede Sekunde soll PORTB um den Wert 1 inkrementiert werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
Zu diesem Zweck wird der Timer0 mit Prescaler verwendet.&amp;lt;br/&amp;gt;&lt;br /&gt;
Die Einstellungen des Prescaler errechenen sich wie folgt:&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{Fosc}{4*Prescaler*2^8}= t \,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fosc/4 weil der PIC für eine Anweisung 4 Takte benötigt.&amp;lt;br/&amp;gt;&lt;br /&gt;
Der Prescaler als zusätzlicher Teiler des Timertaktes.&amp;lt;br/&amp;gt;&lt;br /&gt;
2^8 (256) Schritte benötigt der Timer 0 zum Überlauf.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{32768Hz}{4*2^8*32}= \frac {1}{Sek}\,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei einem Prescaler von 1:32 lösen wir somit exakt jede Sekunde einen Interrupt aus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
#include &amp;quot;htc.h&amp;quot;&lt;br /&gt;
__CONFIG (0x30e0);&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
static void interrupt global_int(void)&lt;br /&gt;
{&lt;br /&gt;
	GIE  = 0;		// Alle Interruptquellen ausschalten&lt;br /&gt;
	T0IF = 0;		// Timer0 Interruptflag Löschen&lt;br /&gt;
	PORTB++;		// PORTB inkrementieren&lt;br /&gt;
	GIE  = 1;		// Interrupts wieder einschalten&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void t0_ini ()&lt;br /&gt;
{&lt;br /&gt;
				// Datenblatt Seite 83&lt;br /&gt;
	OPTION 	= 0b11000100;		&lt;br /&gt;
		 // 1-------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // -1------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // --0-----	Internen Takt für Timer0 verwenden&lt;br /&gt;
		 // ---0----	Bei externem Takt an steigender Flanke inkrementieren&lt;br /&gt;
		 // 		(in diesem Fall egal ob 1 oder 0 weil der interne Takt verwendet wird)&lt;br /&gt;
		 // ----0---	Prescaler für Timer0 verwenden&lt;br /&gt;
		 // -----100	Prescaler 1:32&lt;br /&gt;
&lt;br /&gt;
	T0IF	= 0;		// Interruptflag von Timer0 löschen&lt;br /&gt;
	GIE 	= 1;		// Alle nichtmaskierten Interrupts erlauben&lt;br /&gt;
	T0IE 	= 1;		// Timer0 Interrupt erlauben&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
	ANSEL  = 0b00000000;		// Pins als digital I/O &lt;br /&gt;
	ANSELH = 0b00000000;		// Pins als digital I/O&lt;br /&gt;
	PORTA  = 0;			// Latch von Port A,B und C löschen&lt;br /&gt;
	PORTB  = 0;&lt;br /&gt;
	PORTC  = 0;&lt;br /&gt;
	TRISA  = 0b00000000;		// Port A,B und C als Ausgänge schalten&lt;br /&gt;
	TRISB  = 0b00000000;&lt;br /&gt;
	TRISC  = 0b00000000;&lt;br /&gt;
}&lt;br /&gt;
//========================================================================&lt;br /&gt;
void main ()&lt;br /&gt;
{&lt;br /&gt;
	setup();&lt;br /&gt;
	t0_ini();&lt;br /&gt;
&lt;br /&gt;
	while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
==== Timer0 Codebeispiel mit Verwendung eines externen Taktes ====&lt;br /&gt;
Der Code ist fast identisch, es wurden lediglich Änderungen im &#039;&#039;&#039;OPTION&#039;&#039;&#039;-Register vorgenommen und der Pin 17 (RA2) wurde als Eingang definiert. Weiters wurde der interne Oscillator mit 4MHz verwendet. &amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Der externe Takt kann nicht beliebig schnell sein. siehe Datenblatt Kapitel 5.1.5 Seite 82 und Kapitel 17 Seite 243. &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;Szenario&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC verwendet als Taktquelle den internen 4MHz Oszillator.&amp;lt;br/&amp;gt;&lt;br /&gt;
An PORTB sind 8 LEDs mit Vorwiderständen gegen Masse verschaltet.&amp;lt;br/&amp;gt;&lt;br /&gt;
PORTB soll bei jedem Timer0-Überlauf um den Wert 1 inkrementiert werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
Zu diesem Zweck wird der Timer0 mit Prescaler verwendet.&amp;lt;br/&amp;gt;&lt;br /&gt;
Die Einstellungen errechenen sich wie folgt:&amp;lt;br/&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{Takt_{T0CKI}}{Prescaler*2^8}= t \,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Gehen wir mal davon aus, dass der takt an T0CKI 100kHz beträgt und der Prescaler als 1:2 Vorteiler eingestellt ist. Somit läuft der Timer0 alle 512 Takte über.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{100kHz}{2*2^8}= \frac{195,3125}{Sek} \,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Bei diesen Einstellungen bekommen wir 195,3125 Timer0-Überläufe pro Sekunde was wiederum einem Zeitinterwall von 5,12ms entspricht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
#include &amp;quot;htc.h&amp;quot;&lt;br /&gt;
__CONFIG (0x30e4);&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
static void interrupt global_int(void)&lt;br /&gt;
{&lt;br /&gt;
	GIE  = 0;		// Alle Interruptquellen ausschalten&lt;br /&gt;
	T0IF = 0;		// Timer0 Interruptflag Löschen&lt;br /&gt;
	PORTB++;		// PORTB inkrementieren&lt;br /&gt;
	GIE  = 1;		// Interrupts wieder einschalten&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void t0_ini ()&lt;br /&gt;
{&lt;br /&gt;
				// Datenblatt Seite 83&lt;br /&gt;
	OPTION 	= 0b11000100;		&lt;br /&gt;
		 // 1-------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // -1------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // --1-----	Takt an T0CKI für Timer0 verwenden&lt;br /&gt;
		 // ---0----	Bei externem Takt an steigender Flanke inkrementieren&lt;br /&gt;
		 // ----0---	Prescaler für Timer0 verwenden&lt;br /&gt;
		 // -----000	Prescaler 1:2&lt;br /&gt;
&lt;br /&gt;
	T0IF	= 0;		// Interruptflag von Timer0 löschen&lt;br /&gt;
	GIE 	= 1;		// Alle nichtmaskierten Interrupts erlauben&lt;br /&gt;
	T0IE 	= 1;		// Timer0 Interrupt erlauben&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
	ANSEL  = 0b00000000;		// Pins als digital I/O &lt;br /&gt;
	ANSELH = 0b00000000;		// Pins als digital I/O&lt;br /&gt;
	PORTA  = 0;			// Latch von Port A,B und C löschen&lt;br /&gt;
	PORTB  = 0;&lt;br /&gt;
	PORTC  = 0;&lt;br /&gt;
	TRISA  = 0b00000100;		// RA2 als Eingang setzen und restliche Pins als &lt;br /&gt;
					// Ausgang setzen.&lt;br /&gt;
	TRISB  = 0b00000000;&lt;br /&gt;
	TRISC  = 0b00000000;&lt;br /&gt;
}&lt;br /&gt;
//========================================================================&lt;br /&gt;
void main ()&lt;br /&gt;
{&lt;br /&gt;
	setup();&lt;br /&gt;
	t0_ini();&lt;br /&gt;
&lt;br /&gt;
	while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
=== Timer1 ===&lt;br /&gt;
==== Timer1 Hardware ====&lt;br /&gt;
[[Bild:Timer1-PIC16F690.png|right|thumb|Hardware Timer1 im PIC16F690]]&lt;br /&gt;
Der Timer1 ist ein 16-Bit Timer/Zähler. Für den Timer1 gibt es viele Verwendungsmöglichkeiten auf Grund seiner zahlreichen Einstellmöglichkeiten. Man kann Ihn als einfachen Timer verwenden, wofür er eigentlich schon fast zu schade ist, oder als raffinierten Zähler, welcher erst bei einem bestimmten Ereignis wie z.B. dem auslösen des Komparators oder eines bestimmten zustandes am TG1-Pin (RA4/Pin 3) zu zählen beginnt.&amp;lt;br/&amp;gt;&lt;br /&gt;
die 16-Bit des Timers teilen sich auf zwei 8-Bit-Register auf, &#039;&#039;&#039;TMR1H&#039;&#039;&#039; und &#039;&#039;&#039;TMR1L&#039;&#039;&#039;. &#039;&#039;&#039;TMR1H&#039;&#039;&#039; beherbergt die oberen 8 Bit und &#039;&#039;&#039;TMR1L&#039;&#039;&#039; die unteren 8 Bit. &lt;br /&gt;
==== Timer1 Codebeispiel mit Verwendung des Programmtaktes Fosc/4 ====&lt;br /&gt;
&#039;&#039;Szenario&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC verwendet als Taktquelle den internen Oszilator mit 8MHz.&amp;lt;br/&amp;gt;&lt;br /&gt;
An PORTB sind 8 LEDs mit Vorwiderständen gegen Masse verschaltet.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
#include &amp;quot;htc.h&amp;quot;&lt;br /&gt;
__CONFIG (0x30e4);&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
static void interrupt global_int(void)&lt;br /&gt;
{&lt;br /&gt;
	GIE    = 0;		// Alle Interruptquellen ausschalten&lt;br /&gt;
	TMR1IF = 0;		// Timer1 Interruptflag Löschen&lt;br /&gt;
	PORTB++;		// PORTB inkrementieren&lt;br /&gt;
	GIE    = 1;		// Interrupts wieder einschalten&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void t1_ini ()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	TMR1IF	= 0;		// Interruptflag von Timer1 löschen+&lt;br /&gt;
&lt;br /&gt;
				// Datenblatt Seite 88&lt;br /&gt;
	T1CON 	= 0b00110000;		&lt;br /&gt;
		 // 0-------	Timer1 Gate-invertier-Bit (in diesem Beispiel uninteressant)&lt;br /&gt;
		 // -0------	Timer1 Gate-enable-Bit (auf 0 gesetzt sodass der timer1 &lt;br /&gt;
		 //		mit dem TMR1ON-Bit direkt ein und ausgeschaltet werden kann&lt;br /&gt;
		 // --11----	Prescaler auf 1:8 einstellen&lt;br /&gt;
		 // ----0---	Low Power Oszillator aus&lt;br /&gt;
		 // -----0--	(in diesem Beispiel uninteressant weil Bit 1 == 0)&lt;br /&gt;
		 // ------0-	interen Takt verwenden&lt;br /&gt;
		 // -------1	Timer1 einschalten&lt;br /&gt;
&lt;br /&gt;
	GIE 	= 1;		// Alle nichtmaskierten Interrupts erlauben&lt;br /&gt;
	PEIE 	= 1;		// Pereferieinterrupt erlauben&lt;br /&gt;
				// Die Bits GIE und PEIE befinden sich in INTCON Register&lt;br /&gt;
				// und sind im Datenblatt auf Seite 38 erläutert.&lt;br /&gt;
	TMR1IE 	= 1;		// Timer1 Interrupt erlauben&lt;br /&gt;
				// Das TMR1IE-Bit ist im ist im PIE1 Register&lt;br /&gt;
				// und im Datenblatt auf Seite 39&lt;br /&gt;
}&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
	OSCCON = 0b01110000;		// 8 MHz Datenblatt Seite 48&lt;br /&gt;
	ANSEL  = 0b00000000;		// Pins als digital I/O &lt;br /&gt;
	ANSELH = 0b00000000;		// Pins als digital I/O&lt;br /&gt;
	PORTA  = 0;			// Latch von Port A,B und C löschen&lt;br /&gt;
	PORTB  = 0;&lt;br /&gt;
	PORTC  = 0;&lt;br /&gt;
	TRISA  = 0b00000000;		// Port A,B und C als Ausgänge schalten&lt;br /&gt;
	TRISB  = 0b00000000;&lt;br /&gt;
	TRISC  = 0b00000000;&lt;br /&gt;
}&lt;br /&gt;
//========================================================================&lt;br /&gt;
void main ()&lt;br /&gt;
{&lt;br /&gt;
	setup();&lt;br /&gt;
	t1_ini();&lt;br /&gt;
&lt;br /&gt;
	while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
=== Timer2 ===&lt;br /&gt;
==== Timer2 Hardware ====&lt;br /&gt;
[[Bild:Timer2-PIC16F690.png|right|thumb|Hardware Timer2 im PIC16F690]]&lt;br /&gt;
==== Timer2 Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== AD-Wandler ===&lt;br /&gt;
==== AD-Wandler Hardware ====&lt;br /&gt;
[[Bild:AD-Wandler-PIC16F690.png|right|thumb|Hardware AD-Wandler im PIC16F690]]&lt;br /&gt;
==== AD-Wandler Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== PWM ===&lt;br /&gt;
==== PWM Hardware ====&lt;br /&gt;
[[Bild:PWM-PIC16F690.png|thumb|right|Hardware PWM im PIC16F690]]&lt;br /&gt;
==== PWM Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== EUSART ===&lt;br /&gt;
==== EUSART Hardware ====&lt;br /&gt;
[[Bild:EUSART-TX-PIC16F690.png|thumb|right|Hardware EUSART im PIC16F690]]&lt;br /&gt;
[[Bild:EUSART-RX-PIC16F690.png|thumb|right|Hardware EUSART im PIC16F690]]&lt;br /&gt;
==== EUSART TX Codebeispiel ====&lt;br /&gt;
==== EUSART RX Codebeispiel ====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== SPI ===&lt;br /&gt;
==== SPI Hardware ====&lt;br /&gt;
[[Bild:SPI-PIC16F690.png|thumb|right|Hardware SPI im PIC16F690]]&lt;br /&gt;
==== SPI Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== I2C ===&lt;br /&gt;
==== I2C Hardware ====&lt;br /&gt;
[[Bild:I2C-PIC16F690.png|thumb|right|Hardware I2C im PIC16F690]]&lt;br /&gt;
==== I2C Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.microchip.com Homepage Microchip]&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplgidcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1335&amp;amp;dDocName=en023112 Produktseite PIC16F690]&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/41262E.pdf Datenblatt PIC16F690]&lt;br /&gt;
* [http://www.htsoft.com HiTech Software]&lt;br /&gt;
* [http://www.sprut.de Sprut -&amp;gt; DIE deutschsprachige Seite zum Thema PIC]&lt;br /&gt;
* ...&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
* Den Code auf dieser Seite &amp;quot;einklappbar&amp;quot; machen, sodass nicht ewig weit gescrollt werden muss&lt;br /&gt;
* Die Bilder neu malen wegen eventuellem Copyright-Schnickschnack&lt;br /&gt;
* Timer1&lt;br /&gt;
: Codebeispiel mit externer Taktquelle&lt;br /&gt;
: Codebeispiel mit externem Quarz&lt;br /&gt;
: Codebeispiel mit T1G als Zählbeginn/ende&lt;br /&gt;
: Codebeispiel mit Comparator als Zählbeginn/ende&lt;br /&gt;
: Codebeispiel mit Synchronem Zähler&lt;br /&gt;
* Timer2&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
* AD-Wandler&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
: Codebeispiel mehrere Kanäle&lt;br /&gt;
* PWM&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
* Eusart&lt;br /&gt;
: Erklärung Hardware RX&lt;br /&gt;
: Erklärung Hardware TX&lt;br /&gt;
: Codebeispiel RX&lt;br /&gt;
: Codebeispiel TX&lt;br /&gt;
: Codebeispiel RX-TX&lt;br /&gt;
* Komparator&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
* SPI&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel senden &lt;br /&gt;
: Codebeispiel empfangen&lt;br /&gt;
* I2C&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel senden &lt;br /&gt;
: Codebeispiel empfangen&lt;br /&gt;
* Brown Out Reset&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
* EEPROM&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Wettbewerb|P]]&lt;br /&gt;
[[Category:PIC|P]]&lt;/div&gt;</summary>
		<author><name>Thomas1123</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=PIC_Codebeispiele&amp;diff=28735</id>
		<title>PIC Codebeispiele</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=PIC_Codebeispiele&amp;diff=28735"/>
		<updated>2008-06-27T11:38:36Z</updated>

		<summary type="html">&lt;p&gt;Thomas1123: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von [[Benutzer:Thomas1123|Thomas1123]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ich persönlich benutze den Hitech PIC-C Lite Compiler für meine Projekte.&amp;lt;br/&amp;gt;&lt;br /&gt;
Hierbei handelt es sich um die abgespeckte Version des Hitech PIC-C Compilers von der Firma HiTech Software.&amp;lt;br/&amp;gt;&lt;br /&gt;
Ich möchte hier eine Sammlung von Codebeispielen beginnen mit der es Einsteigern ermöglicht wird verschiedene interne und externe Pereferie zu initialiesieren und zu benutzen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Da der [http://www.microchip.com/stellent/idcplgidcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1335&amp;amp;dDocName=en023112 PIC16F690] mein persönlicher Liebling ist möchte ich die hier gezeigten Beispiele anhand dieses PICs aufzeigen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Selbstverständlich kann dieser Artikel noch mit Codebeispielen für cc5x und ASM erweitert werden, des Weiteren kann man auch Beispiele für andere PICs der 10er, 12er, und 16er Kategorie einfügen.&lt;br /&gt;
&lt;br /&gt;
== Pinbelegung ==&lt;br /&gt;
[[Bild:PIC16F690-Pins.png|thumb|right|Pinbelegung des PIC16F690]]&lt;br /&gt;
Der PIC16F690 verfügt über eine grosse Anzahl an interner Pereferie beispielsweise 10-Bit AD-Wandler, SPI/I2C Interface, mehrere Timer (2*8-Bit 1*16-Bit), EUSART (RS232 etc.) usw.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
== Codebeispiele ==&lt;br /&gt;
----&lt;br /&gt;
=== Timer0 ===&lt;br /&gt;
==== Timer0 Hardware ====&lt;br /&gt;
[[Bild:Timer0-PIC16F690.png|thumb|right|Hardware Timer0 und WDT im PIC16F690]]&lt;br /&gt;
Der Timer0 ist ein 8-Bit Timer/Zähler, welcher entweder mit dem internen Takt des PIC oder mit einer externen Taktquelle am Pin 17 (RA2/T0CKI) Betrieben werden kann. Beim Betrieb mit einer externen Taktquelle kann man zusätzlich auswählen ob bei einer steigenden oder fallenden Flanke das Timerregister inkrementiert werden soll. Gleich welche Taktquelle gewählt wird, kann bei einem Überlauf des Timerregisters ein Interrupt ausgelöst werden. Hierfür ist es notwendig die Bits &#039;&#039;&#039;GIE&#039;&#039;&#039; und &#039;&#039;&#039;T0IE&#039;&#039;&#039; auf 1 zu setzen. Beide Bits befinden sich im &#039;&#039;&#039;INTCON&#039;&#039;&#039;-Register und sind im Datenblatt auf Seite 38 zu finden.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Im nebenstehendem Diagramm ist der aufbau des Timer0 zusammen mit dem Watchdogtimer dargestellt.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Im Option Register (&#039;&#039;&#039;OPTION&#039;&#039;&#039; Datenblatt Seite 83) kann mit Bit 5 (&#039;&#039;&#039;T0CS&#039;&#039;&#039;) ausgewählt werden ob der interne Takt (0) oder ein externer Takt (1) verwendet wird. Bei einem externen Takt kann mit Bit 4 (&#039;&#039;&#039;T0SE&#039;&#039;&#039;) auswählen ob bei einer steigenden (0) oder bei einer fallenden Flanke (1) das Timer0-Register inkrenemtiert werden soll. Mit Bit 3 (&#039;&#039;&#039;PSA&#039;&#039;&#039;) wird der Prescaler entweder dem Timer (0) &#039;&#039;&#039;oder&#039;&#039;&#039; dem Watchdogtimer (1) zugewiesen. Der Prescaler selbst wird mit den Bits 0 bis 2 (&#039;&#039;&#039;PS0 PS1 PS2&#039;&#039;&#039;) des Option Registers eingestellt.&amp;lt;br/&amp;gt;&lt;br /&gt;
Eine Übersicht der Einstellmöglichkeiten ist auf Seite 83 im Datenblatt einsehbar.&lt;br /&gt;
&lt;br /&gt;
==== Timer0 Codebeispiel mit Verwendung des Programmtaktes Fosc/4 ====&lt;br /&gt;
&#039;&#039;Szenario:&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC verwendet als Taktquelle einen 32,768 kHz Uhrenquarz.&amp;lt;br/&amp;gt;&lt;br /&gt;
An PORTB sind 8 LEDs mit Vorwiderständen gegen Masse verschaltet.&amp;lt;br/&amp;gt;&lt;br /&gt;
Jede Sekunde soll PORTB um den Wert 1 inkrementiert werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
Zu diesem Zweck wird der Timer0 mit Prescaler verwendet.&amp;lt;br/&amp;gt;&lt;br /&gt;
Die Einstellungen des Prescaler errechenen sich wie folgt:&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{Fosc}{4*Prescaler*2^8}= t \,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fosc/4 weil der PIC für eine Anweisung 4 Takte benötigt.&amp;lt;br/&amp;gt;&lt;br /&gt;
Der Prescaler als zusätzlicher Teiler des Timertaktes.&amp;lt;br/&amp;gt;&lt;br /&gt;
2^8 (256) Schritte benötigt der Timer 0 zum Überlauf.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{32768Hz}{4*2^8*32}= \frac {1}{Sek}\,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei einem Prescaler von 1:32 lösen wir somit exakt jede Sekunde einen Interrupt aus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
#include &amp;quot;htc.h&amp;quot;&lt;br /&gt;
__CONFIG (0x30e0);&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
static void interrupt global_int(void)&lt;br /&gt;
{&lt;br /&gt;
	GIE  = 0;		// Alle Interruptquellen ausschalten&lt;br /&gt;
	T0IF = 0;		// Timer0 Interruptflag Löschen&lt;br /&gt;
	PORTB++;		// PORTB inkrementieren&lt;br /&gt;
	GIE  = 1;		// Interrupts wieder einschalten&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void t0_ini ()&lt;br /&gt;
{&lt;br /&gt;
				// Datenblatt Seite 83&lt;br /&gt;
	OPTION 	= 0b11000100;		&lt;br /&gt;
		 // 1-------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // -1------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // --0-----	Internen Takt für Timer0 verwenden&lt;br /&gt;
		 // ---0----	Bei externem Takt an steigender Flanke inkrementieren&lt;br /&gt;
		 // 		(in diesem Fall egal ob 1 oder 0 weil der interne Takt verwendet wird)&lt;br /&gt;
		 // ----0---	Prescaler für Timer0 verwenden&lt;br /&gt;
		 // -----100	Prescaler 1:32&lt;br /&gt;
&lt;br /&gt;
	T0IF	= 0;		// Interruptflag von Timer0 löschen&lt;br /&gt;
	GIE 	= 1;		// Alle nichtmaskierten Interrupts erlauben&lt;br /&gt;
	T0IE 	= 1;		// Timer0 Interrupt erlauben&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
	ANSEL  = 0b00000000;		// Pins als digital I/O &lt;br /&gt;
	ANSELH = 0b00000000;		// Pins als digital I/O&lt;br /&gt;
	PORTA  = 0;			// Latch von Port A,B und C löschen&lt;br /&gt;
	PORTB  = 0;&lt;br /&gt;
	PORTC  = 0;&lt;br /&gt;
	TRISA  = 0b00000000;		// Port A,B und C als Ausgänge schalten&lt;br /&gt;
	TRISB  = 0b00000000;&lt;br /&gt;
	TRISC  = 0b00000000;&lt;br /&gt;
}&lt;br /&gt;
//========================================================================&lt;br /&gt;
void main ()&lt;br /&gt;
{&lt;br /&gt;
	setup();&lt;br /&gt;
	t0_ini();&lt;br /&gt;
&lt;br /&gt;
	while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
==== Timer0 Codebeispiel mit Verwendung eines externen Taktes ====&lt;br /&gt;
Der Code ist fast identisch, es wurden lediglich Änderungen im &#039;&#039;&#039;OPTION&#039;&#039;&#039;-Register vorgenommen und der Pin 17 (RA2) wurde als Eingang definiert. Weiters wurde der interne Oscillator mit 4MHz verwendet. &amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Wichtig:&#039;&#039;&#039; Der externe Takt kann nicht beliebig schnell sein. siehe Datenblatt Kapitel 5.1.5 Seite 82 und Kapitel 17 Seite 243. &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;Szenario&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC verwendet als Taktquelle den internen 4MHz Oszillator.&amp;lt;br/&amp;gt;&lt;br /&gt;
An PORTB sind 8 LEDs mit Vorwiderständen gegen Masse verschaltet.&amp;lt;br/&amp;gt;&lt;br /&gt;
PORTB soll bei jedem Timer0-Überlauf um den Wert 1 inkrementiert werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
Zu diesem Zweck wird der Timer0 mit Prescaler verwendet.&amp;lt;br/&amp;gt;&lt;br /&gt;
Die Einstellungen errechenen sich wie folgt:&amp;lt;br/&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{Takt_{T0CKI}}{Prescaler*2^8}= t \,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Gehen wir mal davon aus, dass der takt an T0CKI 100kHz beträgt und der Prescaler als 1:2 Vorteiler eingestellt ist. Somit inkrementiert der Timer0 alle 512 Takte.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{100kHz}{2*2^8}= \frac{195,3125}{Sek} \,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Bei diesen Einstellungen bekommen wir 195,3125 Timer0-Überläufe pro Sekunde was wiederum einem Zeitinterwall von 5,12ms entspricht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
#include &amp;quot;htc.h&amp;quot;&lt;br /&gt;
__CONFIG (0x30e4);&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
static void interrupt global_int(void)&lt;br /&gt;
{&lt;br /&gt;
	GIE  = 0;		// Alle Interruptquellen ausschalten&lt;br /&gt;
	T0IF = 0;		// Timer0 Interruptflag Löschen&lt;br /&gt;
	PORTB++;		// PORTB inkrementieren&lt;br /&gt;
	GIE  = 1;		// Interrupts wieder einschalten&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void t0_ini ()&lt;br /&gt;
{&lt;br /&gt;
				// Datenblatt Seite 83&lt;br /&gt;
	OPTION 	= 0b11000100;		&lt;br /&gt;
		 // 1-------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // -1------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // --1-----	Takt an T0CKI für Timer0 verwenden&lt;br /&gt;
		 // ---0----	Bei externem Takt an steigender Flanke inkrementieren&lt;br /&gt;
		 // ----0---	Prescaler für Timer0 verwenden&lt;br /&gt;
		 // -----000	Prescaler 1:2&lt;br /&gt;
&lt;br /&gt;
	T0IF	= 0;		// Interruptflag von Timer0 löschen&lt;br /&gt;
	GIE 	= 1;		// Alle nichtmaskierten Interrupts erlauben&lt;br /&gt;
	T0IE 	= 1;		// Timer0 Interrupt erlauben&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
	ANSEL  = 0b00000000;		// Pins als digital I/O &lt;br /&gt;
	ANSELH = 0b00000000;		// Pins als digital I/O&lt;br /&gt;
	PORTA  = 0;			// Latch von Port A,B und C löschen&lt;br /&gt;
	PORTB  = 0;&lt;br /&gt;
	PORTC  = 0;&lt;br /&gt;
	TRISA  = 0b00000100;		// RA2 als Eingang setzen und restliche Pins als &lt;br /&gt;
					// Ausgang setzen.&lt;br /&gt;
	TRISB  = 0b00000000;&lt;br /&gt;
	TRISC  = 0b00000000;&lt;br /&gt;
}&lt;br /&gt;
//========================================================================&lt;br /&gt;
void main ()&lt;br /&gt;
{&lt;br /&gt;
	setup();&lt;br /&gt;
	t0_ini();&lt;br /&gt;
&lt;br /&gt;
	while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
=== Timer1 ===&lt;br /&gt;
==== Timer1 Hardware ====&lt;br /&gt;
[[Bild:Timer1-PIC16F690.png|right|thumb|Hardware Timer1 im PIC16F690]]&lt;br /&gt;
Der Timer1 ist ein 16-Bit Timer/Zähler. Für den Timer1 gibt es viele Verwendungsmöglichkeiten auf Grund seiner zahlreichen Einstellmöglichkeiten. Man kann Ihn als einfachen Timer verwenden, wofür er eigentlich schon fast zu schade ist, oder als raffinierten Zähler, welcher erst bei einem bestimmten Ereignis wie z.B. dem auslösen des Komparators oder eines bestimmten zustandes am TG1-Pin (RA4/Pin 3) zu zählen beginnt.&amp;lt;br/&amp;gt;&lt;br /&gt;
die 16-Bit des Timers teilen sich auf zwei 8-Bit-Register auf, &#039;&#039;&#039;TMR1H&#039;&#039;&#039; und &#039;&#039;&#039;TMR1L&#039;&#039;&#039;. &#039;&#039;&#039;TMR1H&#039;&#039;&#039; beherbergt die oberen 8 Bit und &#039;&#039;&#039;TMR1L&#039;&#039;&#039; die unteren 8 Bit. &lt;br /&gt;
==== Timer1 Codebeispiel ====&lt;br /&gt;
&#039;&#039;Szenario&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC verwendet als Taktquelle den internen Oszilator mit 8MHz.&amp;lt;br/&amp;gt;&lt;br /&gt;
An PORTB sind 8 LEDs mit Vorwiderständen gegen Masse verschaltet.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
#include &amp;quot;htc.h&amp;quot;&lt;br /&gt;
__CONFIG (0x30e4);&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
static void interrupt global_int(void)&lt;br /&gt;
{&lt;br /&gt;
	GIE    = 0;		// Alle Interruptquellen ausschalten&lt;br /&gt;
	TMR1IF = 0;		// Timer1 Interruptflag Löschen&lt;br /&gt;
	PORTB++;		// PORTB inkrementieren&lt;br /&gt;
	GIE    = 1;		// Interrupts wieder einschalten&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void t1_ini ()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	TMR1IF	= 0;		// Interruptflag von Timer1 löschen+&lt;br /&gt;
&lt;br /&gt;
				// Datenblatt Seite 88&lt;br /&gt;
	T1CON 	= 0b00110000;		&lt;br /&gt;
		 // 0-------	Timer1 Gate-invertier-Bit (in diesem Beispiel uninteressant)&lt;br /&gt;
		 // -0------	Timer1 Gate-enable-Bit (auf 0 gesetzt sodass der timer1 &lt;br /&gt;
		 //		mit dem TMR1ON-Bit direkt ein und ausgeschaltet werden kann&lt;br /&gt;
		 // --11----	Prescaler auf 1:8 einstellen&lt;br /&gt;
		 // ----0---	Low Power Oszillator aus&lt;br /&gt;
		 // -----0--	(in diesem Beispiel uninteressant weil Bit 1 == 0)&lt;br /&gt;
		 // ------0-	interen Takt verwenden&lt;br /&gt;
		 // -------1	Timer1 einschalten&lt;br /&gt;
&lt;br /&gt;
	GIE 	= 1;		// Alle nichtmaskierten Interrupts erlauben&lt;br /&gt;
	PEIE 	= 1;		// Pereferieinterrupt erlauben&lt;br /&gt;
				// Die Bits GIE und PEIE befinden sich in INTCON Register&lt;br /&gt;
				// und sind im Datenblatt auf Seite 38 erläutert.&lt;br /&gt;
	TMR1IE 	= 1;		// Timer1 Interrupt erlauben&lt;br /&gt;
				// Das TMR1IE-Bit ist im ist im PIE1 Register&lt;br /&gt;
				// und im Datenblatt auf Seite 39&lt;br /&gt;
}&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
	OSCCON = 0b01110000;		// 8 MHz Datenblatt Seite 48&lt;br /&gt;
	ANSEL  = 0b00000000;		// Pins als digital I/O &lt;br /&gt;
	ANSELH = 0b00000000;		// Pins als digital I/O&lt;br /&gt;
	PORTA  = 0;			// Latch von Port A,B und C löschen&lt;br /&gt;
	PORTB  = 0;&lt;br /&gt;
	PORTC  = 0;&lt;br /&gt;
	TRISA  = 0b00000000;		// Port A,B und C als Ausgänge schalten&lt;br /&gt;
	TRISB  = 0b00000000;&lt;br /&gt;
	TRISC  = 0b00000000;&lt;br /&gt;
}&lt;br /&gt;
//========================================================================&lt;br /&gt;
void main ()&lt;br /&gt;
{&lt;br /&gt;
	setup();&lt;br /&gt;
	t1_ini();&lt;br /&gt;
&lt;br /&gt;
	while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
=== Timer2 ===&lt;br /&gt;
==== Timer2 Hardware ====&lt;br /&gt;
[[Bild:Timer2-PIC16F690.png|right|thumb|Hardware Timer2 im PIC16F690]]&lt;br /&gt;
==== Timer2 Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== AD-Wandler ===&lt;br /&gt;
==== AD-Wandler Hardware ====&lt;br /&gt;
[[Bild:AD-Wandler-PIC16F690.png|right|thumb|Hardware AD-Wandler im PIC16F690]]&lt;br /&gt;
==== AD-Wandler Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== PWM ===&lt;br /&gt;
==== PWM Hardware ====&lt;br /&gt;
[[Bild:PWM-PIC16F690.png|thumb|right|Hardware PWM im PIC16F690]]&lt;br /&gt;
==== PWM Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== EUSART ===&lt;br /&gt;
==== EUSART Hardware ====&lt;br /&gt;
[[Bild:EUSART-TX-PIC16F690.png|thumb|right|Hardware EUSART im PIC16F690]]&lt;br /&gt;
[[Bild:EUSART-RX-PIC16F690.png|thumb|right|Hardware EUSART im PIC16F690]]&lt;br /&gt;
==== EUSART TX Codebeispiel ====&lt;br /&gt;
==== EUSART RX Codebeispiel ====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== SPI ===&lt;br /&gt;
==== SPI Hardware ====&lt;br /&gt;
[[Bild:SPI-PIC16F690.png|thumb|right|Hardware SPI im PIC16F690]]&lt;br /&gt;
==== SPI Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== I2C ===&lt;br /&gt;
==== I2C Hardware ====&lt;br /&gt;
[[Bild:I2C-PIC16F690.png|thumb|right|Hardware I2C im PIC16F690]]&lt;br /&gt;
==== I2C Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.microchip.com Homepage Microchip]&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplgidcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1335&amp;amp;dDocName=en023112 Produktseite PIC16F690]&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/41262E.pdf Datenblatt PIC16F690]&lt;br /&gt;
* [http://www.htsoft.com HiTech Software]&lt;br /&gt;
* [http://www.sprut.de Sprut -&amp;gt; DIE deutschsprachige Seite zum Thema PIC]&lt;br /&gt;
* ...&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
* Den Code auf dieser Seite &amp;quot;einklappbar&amp;quot; machen, sodass nicht ewig weit gescrollt werden muss&lt;br /&gt;
* Die Bilder neu malen wegen eventuellem Copyright-Schnickschnack&lt;br /&gt;
* Timer1&lt;br /&gt;
: Codebeispiel mit externer Taktquelle&lt;br /&gt;
: Codebeispiel mit externem Quarz&lt;br /&gt;
: Codebeispiel mit T1G als Zählbeginn/ende&lt;br /&gt;
: Codebeispiel mit Comparator als Zählbeginn/ende&lt;br /&gt;
: Codebeispiel mit Synchronem Zähler&lt;br /&gt;
* Timer2&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
* AD-Wandler&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
: Codebeispiel mehrere Kanäle&lt;br /&gt;
* PWM&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
* Eusart&lt;br /&gt;
: Erklärung Hardware RX&lt;br /&gt;
: Erklärung Hardware TX&lt;br /&gt;
: Codebeispiel RX&lt;br /&gt;
: Codebeispiel TX&lt;br /&gt;
: Codebeispiel RX-TX&lt;br /&gt;
* Komparator&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
* SPI&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel senden &lt;br /&gt;
: Codebeispiel empfangen&lt;br /&gt;
* I2C&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel senden &lt;br /&gt;
: Codebeispiel empfangen&lt;br /&gt;
* Brown Out Reset&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
* EEPROM&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Wettbewerb|P]]&lt;br /&gt;
[[Category:PIC|P]]&lt;/div&gt;</summary>
		<author><name>Thomas1123</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=PIC_Codebeispiele&amp;diff=28731</id>
		<title>PIC Codebeispiele</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=PIC_Codebeispiele&amp;diff=28731"/>
		<updated>2008-06-27T10:39:01Z</updated>

		<summary type="html">&lt;p&gt;Thomas1123: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von [[Benutzer:Thomas1123|Thomas1123]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ich persönlich benutze den Hitech PIC-C Lite Compiler für meine Projekte.&amp;lt;br/&amp;gt;&lt;br /&gt;
Hierbei handelt es sich um die abgespeckte Version des Hitech PIC-C Compilers von der Firma HiTech Software.&amp;lt;br/&amp;gt;&lt;br /&gt;
Ich möchte hier eine Sammlung von Codebeispielen beginnen mit der es Einsteigern ermöglicht wird verschiedene interne und externe Pereferie zu initialiesieren und zu benutzen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Da der [http://www.microchip.com/stellent/idcplgidcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1335&amp;amp;dDocName=en023112 PIC16F690] mein persönlicher Liebling ist möchte ich die hier gezeigten Beispiele anhand dieses PICs aufzeigen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Selbstverständlich kann dieser Artikel noch mit Codebeispielen für cc5x und ASM erweitert werden, des Weiteren kann man auch Beispiele für andere PICs der 10er, 12er, und 16er Kategorie einfügen.&lt;br /&gt;
&lt;br /&gt;
== Pinbelegung ==&lt;br /&gt;
[[Bild:PIC16F690-Pins.png|thumb|right|Pinbelegung des PIC16F690]]&lt;br /&gt;
Der PIC16F690 verfügt über eine grosse Anzahl an interner Pereferie beispielsweise 10-Bit AD-Wandler, SPI/I2C Interface, mehrere Timer (2*8-Bit 1*16-Bit), EUSART (RS232 etc.) usw.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
== Codebeispiele ==&lt;br /&gt;
----&lt;br /&gt;
=== Timer0 ===&lt;br /&gt;
==== Timer0 Hardware ====&lt;br /&gt;
[[Bild:Timer0-PIC16F690.png|thumb|right|Hardware Timer0 und WDT im PIC16F690]]&lt;br /&gt;
Der Timer0 ist ein 8-Bit Timer/Zähler, welcher entweder mit dem internen Takt des PIC oder mit einer externen Taktquelle am Pin 17 (RA2/T0CKI) Betrieben werden kann. Beim Betrieb mit einer externen Taktquelle kann man zusätzlich auswählen ob bei einer steigenden oder fallenden Flanke das Timerregister inkrementiert werden soll. Gleich welche Taktquelle gewählt wird, kann bei einem Überlauf des Timerregisters ein Interrupt ausgelöst werden. Hierfür ist es notwendig die Bits &#039;&#039;&#039;GIE&#039;&#039;&#039; und &#039;&#039;&#039;T0IE&#039;&#039;&#039; auf 1 zu setzen. Beide Bits befinden sich im &#039;&#039;&#039;INTCON&#039;&#039;&#039;-Register und sind im Datenblatt auf Seite 38 zu finden.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Im nebenstehendem Diagramm ist der aufbau des Timer0 zusammen mit dem Watchdogtimer dargestellt.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Im Option Register (&#039;&#039;&#039;OPTION&#039;&#039;&#039; Datenblatt Seite 83) kann mit Bit 5 (&#039;&#039;&#039;T0CS&#039;&#039;&#039;) ausgewählt werden ob der interne Takt (0) oder ein externer Takt (1) verwendet wird. Bei einem externen Takt kann mit Bit 4 (&#039;&#039;&#039;T0SE&#039;&#039;&#039;) auswählen ob bei einer steigenden (0) oder bei einer fallenden Flanke (1) das Timer0-Register inkrenemtiert werden soll. Mit Bit 3 (&#039;&#039;&#039;PSA&#039;&#039;&#039;) wird der Prescaler entweder dem Timer (0) &#039;&#039;&#039;oder&#039;&#039;&#039; dem Watchdogtimer (1) zugewiesen. Der Prescaler selbst wird mit den Bits 0 bis 2 (&#039;&#039;&#039;PS0 PS1 PS2&#039;&#039;&#039;) des Option Registers eingestellt.&amp;lt;br/&amp;gt;&lt;br /&gt;
Eine Übersicht der Einstellmöglichkeiten ist auf Seite 83 im Datenblatt einsehbar.&lt;br /&gt;
&lt;br /&gt;
==== Timer0 Codebeispiel ====&lt;br /&gt;
&#039;&#039;Szenario:&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC verwendet als externe Taktquelle einen 32,768 kHz Uhrenquarz.&amp;lt;br/&amp;gt;&lt;br /&gt;
An PORTB sind 8 LEDs mit Vorwiderständen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Jede Sekunde soll PORTB um den Wert 1 inkrementiert werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
Zu diesem Zweck wird der Timer0 mit Prescaler verwendet.&amp;lt;br/&amp;gt;&lt;br /&gt;
Die Einstellungen des Prescaler errechenen sich wie folgt:&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{Fosc}{4*Prescaler*2^8}= t \,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fosc/4 weil der PIC für eine Anweisung 4 Takte benötigt.&amp;lt;br/&amp;gt;&lt;br /&gt;
Der Prescaler als zusätzlicher Teiler des Timertaktes.&amp;lt;br/&amp;gt;&lt;br /&gt;
2^8 (256) Schritte benötigt der Timer 0 zum Überlauf.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{32768Hz}{4*2^8*32}= \frac {1}{Sek}\,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei einem Prescaler von 1:32 lösen wir somit exakt jede Sekunde einen Interrupt aus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
#include &amp;quot;htc.h&amp;quot;&lt;br /&gt;
__CONFIG (0x30e4);&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
static void interrupt global_int(void)&lt;br /&gt;
{&lt;br /&gt;
	GIE  = 0;		// Alle Interruptquellen ausschalten&lt;br /&gt;
	T0IF = 0;		// Timer0 Interruptflag Löschen&lt;br /&gt;
	PORTB++;		// PORTB inkrementieren&lt;br /&gt;
	GIE  = 1;		// Interrupts wieder einschalten&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void t0_ini ()&lt;br /&gt;
{&lt;br /&gt;
				// Datenblatt Seite 83&lt;br /&gt;
	OPTION 	= 0b11000100;		&lt;br /&gt;
		 // 1-------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // -1------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // --0-----	Internen Takt für Timer0 verwenden&lt;br /&gt;
		 // ---0----	Bei externem Takt an steigender Flanke inkrementieren&lt;br /&gt;
		 // 		(in diesem Fall egal ob 1 oder 0 weil der interne Takt verwendet wird)&lt;br /&gt;
		 // ----0---	Prescaler für Timer0 verwenden&lt;br /&gt;
		 // -----100	Prescaler 1:32&lt;br /&gt;
&lt;br /&gt;
	T0IF	= 0;		// Interruptflag von Timer0 löschen&lt;br /&gt;
	GIE 	= 1;		// Alle nichtmaskierten Interrupts erlauben&lt;br /&gt;
	T0IE 	= 1;		// Timer0 Interrupt erlauben&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
	ANSEL  = 0b00000000;		// Pins als digital I/O &lt;br /&gt;
	ANSELH = 0b00000000;		// Pins als digital I/O&lt;br /&gt;
	PORTA  = 0;			// Latch von Port A,B und C löschen&lt;br /&gt;
	PORTB  = 0;&lt;br /&gt;
	PORTC  = 0;&lt;br /&gt;
	TRISA  = 0b00000000;		// Port A,B und C als Ausgänge schalten&lt;br /&gt;
	TRISB  = 0b00000000;&lt;br /&gt;
	TRISC  = 0b00000000;&lt;br /&gt;
}&lt;br /&gt;
//========================================================================&lt;br /&gt;
void main ()&lt;br /&gt;
{&lt;br /&gt;
	setup();&lt;br /&gt;
	t0_ini();&lt;br /&gt;
&lt;br /&gt;
	while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
=== Timer1 ===&lt;br /&gt;
==== Timer1 Hardware ====&lt;br /&gt;
[[Bild:Timer1-PIC16F690.png|right|thumb|Hardware Timer1 im PIC16F690]]&lt;br /&gt;
Der Timer1 ist ein 16-Bit Timer/Zähler. Für den Timer1 gibt es viele Verwendungsmöglichkeiten auf Grund seiner zahlreichen Einstellmöglichkeiten. Man kann Ihn als einfachen Timer verwenden, wofür er eigentlich schon fast zu schade ist, oder als raffinierten Zähler, welcher erst bei einem bestimmten Ereignis wie z.B. dem auslösen des Komparators oder eines bestimmten zustandes am TG1-Pin (RA4/Pin 3) zu zählen beginnt.&amp;lt;br/&amp;gt;&lt;br /&gt;
die 16-Bit des Timers teilen sich auf zwei 8-Bit-Register auf, &#039;&#039;&#039;TMR1H&#039;&#039;&#039; und &#039;&#039;&#039;TMR1L&#039;&#039;&#039;. &#039;&#039;&#039;TMR1H&#039;&#039;&#039; beherbergt die oberen 8 Bit und &#039;&#039;&#039;TMR1L&#039;&#039;&#039; die unteren 8 Bit. &lt;br /&gt;
==== Timer1 Codebeispiel ====&lt;br /&gt;
&#039;&#039;Szenario 1&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC verwendet als Taktquelle den internen Oszilator mit 8MHz.&amp;lt;br/&amp;gt;&lt;br /&gt;
An PORTB sind 8 LEDs mit Vorwiderständen.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
#include &amp;quot;htc.h&amp;quot;&lt;br /&gt;
__CONFIG (0x30e4);&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
static void interrupt global_int(void)&lt;br /&gt;
{&lt;br /&gt;
	GIE    = 0;		// Alle Interruptquellen ausschalten&lt;br /&gt;
	TMR1IF = 0;		// Timer1 Interruptflag Löschen&lt;br /&gt;
	PORTB++;		// PORTB inkrementieren&lt;br /&gt;
	GIE    = 1;		// Interrupts wieder einschalten&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void t1_ini ()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	TMR1IF	= 0;		// Interruptflag von Timer1 löschen+&lt;br /&gt;
&lt;br /&gt;
				// Datenblatt Seite 88&lt;br /&gt;
	T1CON 	= 0b00110000;		&lt;br /&gt;
		 // 0-------	Timer1 Gate-invertier-Bit (in diesem Beispiel uninteressant)&lt;br /&gt;
		 // -0------	Timer1 Gate-enable-Bit (auf 0 gesetzt sodass der timer1 &lt;br /&gt;
		 //		mit dem TMR1ON-Bit direkt ein und ausgeschaltet werden kann&lt;br /&gt;
		 // --11----	Prescaler auf 1:8 einstellen&lt;br /&gt;
		 // ----0---	Low Power Oszillator aus&lt;br /&gt;
		 // -----0--	(in diesem Beispiel uninteressant weil Bit 1 == 0)&lt;br /&gt;
		 // ------0-	interen Takt verwenden&lt;br /&gt;
		 // -------1	Timer1 einschalten&lt;br /&gt;
&lt;br /&gt;
	GIE 	= 1;		// Alle nichtmaskierten Interrupts erlauben&lt;br /&gt;
	PEIE 	= 1;		// Pereferieinterrupt erlauben&lt;br /&gt;
				// Die Bits GIE und PEIE befinden sich in INTCON Register&lt;br /&gt;
				// und sind im Datenblatt auf Seite 38 erläutert.&lt;br /&gt;
	TMR1IE 	= 1;		// Timer1 Interrupt erlauben&lt;br /&gt;
				// Das TMR1IE-Bit ist im ist im PIE1 Register&lt;br /&gt;
				// und im Datenblatt auf Seite 39&lt;br /&gt;
}&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
	OSCCON = 0b01110000;		// 8 MHz Datenblatt Seite 48&lt;br /&gt;
	ANSEL  = 0b00000000;		// Pins als digital I/O &lt;br /&gt;
	ANSELH = 0b00000000;		// Pins als digital I/O&lt;br /&gt;
	PORTA  = 0;			// Latch von Port A,B und C löschen&lt;br /&gt;
	PORTB  = 0;&lt;br /&gt;
	PORTC  = 0;&lt;br /&gt;
	TRISA  = 0b00000000;		// Port A,B und C als Ausgänge schalten&lt;br /&gt;
	TRISB  = 0b00000000;&lt;br /&gt;
	TRISC  = 0b00000000;&lt;br /&gt;
}&lt;br /&gt;
//========================================================================&lt;br /&gt;
void main ()&lt;br /&gt;
{&lt;br /&gt;
	setup();&lt;br /&gt;
	t1_ini();&lt;br /&gt;
&lt;br /&gt;
	while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
=== Timer2 ===&lt;br /&gt;
==== Timer2 Hardware ====&lt;br /&gt;
[[Bild:Timer2-PIC16F690.png|right|thumb|Hardware Timer2 im PIC16F690]]&lt;br /&gt;
==== Timer2 Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== AD-Wandler ===&lt;br /&gt;
==== Hardware AD-Wandler ====&lt;br /&gt;
[[Bild:AD-Wandler-PIC16F690.png|right|thumb|Hardware AD-Wandler im PIC16F690]]&lt;br /&gt;
==== AD-Wandler Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== PWM ===&lt;br /&gt;
==== PWM Hardware ====&lt;br /&gt;
[[Bild:PWM-PIC16F690.png|thumb|right|Hardware PWM im PIC16F690]]&lt;br /&gt;
==== PWM Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== EUSART ===&lt;br /&gt;
==== EUSART Hardware ====&lt;br /&gt;
[[Bild:EUSART-TX-PIC16F690.png|thumb|right|Hardware EUSART im PIC16F690]]&lt;br /&gt;
[[Bild:EUSART-RX-PIC16F690.png|thumb|right|Hardware EUSART im PIC16F690]]&lt;br /&gt;
==== EUSART TX Codebeispiel ====&lt;br /&gt;
==== EUSART RX Codebeispiel ====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== SPI ===&lt;br /&gt;
==== SPI Hardware ====&lt;br /&gt;
[[Bild:SPI-PIC16F690.png|thumb|right|Hardware SPI im PIC16F690]]&lt;br /&gt;
==== SPI Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== I2C ===&lt;br /&gt;
==== I2C Hardware ====&lt;br /&gt;
[[Bild:I2C-PIC16F690.png|thumb|right|Hardware I2C im PIC16F690]]&lt;br /&gt;
==== I2C Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.microchip.com Homepage Microchip]&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplgidcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1335&amp;amp;dDocName=en023112 Produktseite PIC16F690]&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/41262E.pdf Datenblatt PIC16F690]&lt;br /&gt;
* [http://www.htsoft.com HiTech Software]&lt;br /&gt;
* [http://www.sprut.de Sprut -&amp;gt; DIE deutschsprachige Seite zum Thema PIC]&lt;br /&gt;
* ...&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
* Den Code auf dieser Seite &amp;quot;einklappbar&amp;quot; machen, sodass nicht ewig weit gescrollt werden muss&lt;br /&gt;
* Die Bilder neu malen wegen eventuellem Copyright-Schnickschnack&lt;br /&gt;
* Timer0&lt;br /&gt;
: Codebeispiel mit externer Taktquelle&lt;br /&gt;
* Timer1&lt;br /&gt;
: Codebeispiel mit externer Taktquelle&lt;br /&gt;
: Codebeispiel mit externem Quarz&lt;br /&gt;
: Codebeispiel mit T1G als Zählbeginn/ende&lt;br /&gt;
: Codebeispiel mit Comparator als Zählbeginn/ende&lt;br /&gt;
: Codebeispiel mit Synchronem Zähler&lt;br /&gt;
* Timer2&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
* AD-Wandler&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
: Codebeispiel mehrere Kanäle&lt;br /&gt;
* PWM&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
* Eusart&lt;br /&gt;
: Erklärung Hardware RX&lt;br /&gt;
: Erklärung Hardware TX&lt;br /&gt;
: Codebeispiel RX&lt;br /&gt;
: Codebeispiel TX&lt;br /&gt;
: Codebeispiel RX-TX&lt;br /&gt;
* Komparator&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
* SPI&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel senden &lt;br /&gt;
: Codebeispiel empfangen&lt;br /&gt;
* I2C&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel senden &lt;br /&gt;
: Codebeispiel empfangen&lt;br /&gt;
* Brown Out Reset&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
* EEPROM&lt;br /&gt;
: Erklärung Hardware&lt;br /&gt;
: Codebeispiel&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Wettbewerb|P]]&lt;br /&gt;
[[Category:PIC|P]]&lt;/div&gt;</summary>
		<author><name>Thomas1123</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=PIC_Codebeispiele&amp;diff=28730</id>
		<title>PIC Codebeispiele</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=PIC_Codebeispiele&amp;diff=28730"/>
		<updated>2008-06-27T10:06:59Z</updated>

		<summary type="html">&lt;p&gt;Thomas1123: /* Timer1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von [[Benutzer:Thomas1123|Thomas1123]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ich persönlich benutze den Hitech PIC-C Lite Compiler für meine Projekte.&amp;lt;br/&amp;gt;&lt;br /&gt;
Hierbei handelt es sich um die abgespeckte Version des Hitech PIC-C Compilers von der Firma HiTech Software.&amp;lt;br/&amp;gt;&lt;br /&gt;
Ich möchte hier eine Sammlung von Codebeispielen beginnen mit der es Einsteigern ermöglicht wird verschiedene interne und externe Pereferie zu initialiesieren und zu benutzen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Da der [http://www.microchip.com/stellent/idcplgidcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1335&amp;amp;dDocName=en023112 PIC16F690] mein persönlicher Liebling ist möchte ich die hier gezeigten Beispiele anhand dieses PICs aufzeigen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Selbstverständlich kann dieser Artikel noch mit Codebeispielen für cc5x und ASM erweitert werden, des Weiteren kann man auch Beispiele für andere PICs der 10er, 12er, und 16er Kategorie einfügen.&lt;br /&gt;
&lt;br /&gt;
== Pinbelegung ==&lt;br /&gt;
[[Bild:PIC16F690-Pins.png|center|Pinbelegung des PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC16F690 verfügt über eine grosse Anzahl an interner Pereferie beispielsweise 10-Bit AD-Wandler, SPI/I2C Interface, mehrere Timer (2*8-Bit 1*16-Bit), EUSART (RS232 etc.) usw.&lt;br /&gt;
&lt;br /&gt;
== Codebeispiele ==&lt;br /&gt;
----&lt;br /&gt;
=== Timer0 ===&lt;br /&gt;
==== Timer0 Hardware ====&lt;br /&gt;
[[Bild:Timer0-PIC16F690.png|thumb|right|Hardware Timer0 und WDT im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
Der Timer0 ist ein 8-Bit Timer/Zähler, welcher entweder mit dem internen Takt des PIC oder mit einer externen Taktquelle am Pin 17 (RA2/T0CKI) Betrieben werden kann. Beim Betrieb mit einer externen Taktquelle kann man zusätzlich auswählen ob bei einer steigenden oder fallenden Flanke das Timerregister inkrementiert werden soll. Gleich welche Taktquelle gewählt wird, kann bei einem Überlauf des Timerregisters ein Interrupt ausgelöst werden. Hierfür ist es notwendig die Bits &#039;&#039;&#039;GIE&#039;&#039;&#039; und &#039;&#039;&#039;T0IE&#039;&#039;&#039; auf 1 zu setzen. Beide Bits befinden sich im &#039;&#039;&#039;INTCON&#039;&#039;&#039;-Register und sind im Datenblatt auf Seite 38 zu finden.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Im nebenstehendem Diagramm ist der aufbau des Timer0 zusammen mit dem Watchdogtimer dargestellt.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Im Option Register (&#039;&#039;&#039;OPTION&#039;&#039;&#039; Datenblatt Seite 83) kann mit Bit 5 (&#039;&#039;&#039;T0CS&#039;&#039;&#039;) ausgewählt werden ob der interne Takt (0) oder ein externer Takt (1) verwendet wird. Bei einem externen Takt kann mit Bit 4 (&#039;&#039;&#039;T0SE&#039;&#039;&#039;) auswählen ob bei einer steigenden (0) oder bei einer fallenden Flanke (1) das Timer0-Register inkrenemtiert werden soll. Mit Bit 3 (&#039;&#039;&#039;PSA&#039;&#039;&#039;) wird der Prescaler entweder dem Timer (0) &#039;&#039;&#039;oder&#039;&#039;&#039; dem Watchdogtimer (1) zugewiesen. Der Prescaler selbst wird mit den Bits 0 bis 2 (&#039;&#039;&#039;PS0 PS1 PS2&#039;&#039;&#039;) des Option Registers eingestellt.&amp;lt;br/&amp;gt;&lt;br /&gt;
Eine Übersicht der Einstellmöglichkeiten ist auf Seite 83 im Datenblatt einsehbar.&lt;br /&gt;
&lt;br /&gt;
==== Timer0 Codebeispiel ====&lt;br /&gt;
&#039;&#039;Szenario:&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC verwendet als externe Taktquelle einen 32,768 kHz Uhrenquarz.&amp;lt;br/&amp;gt;&lt;br /&gt;
An PORTB sind 8 LEDs mit Vorwiderständen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Jede Sekunde soll PORTB um den Wert 1 inkrementiert werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
Zu diesem Zweck wird der Timer0 mit Prescaler verwendet.&amp;lt;br/&amp;gt;&lt;br /&gt;
Die Einstellungen des Prescaler errechenen sich wie folgt:&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{Fosc}{4*Prescaler*2^8}= t \,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fosc/4 weil der PIC für eine Anweisung 4 Takte benötigt.&amp;lt;br/&amp;gt;&lt;br /&gt;
Der Prescaler als zusätzlicher Teiler des Timertaktes.&amp;lt;br/&amp;gt;&lt;br /&gt;
2^8 (256) Schritte benötigt der Timer 0 zum Überlauf.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{32768Hz}{4*2^8*32}= \frac {1}{Sek}\,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei einem Prescaler von 1:32 lösen wir somit exakt jede Sekunde einen Interrupt aus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
#include &amp;quot;htc.h&amp;quot;&lt;br /&gt;
__CONFIG (0x30e4);&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
static void interrupt global_int(void)&lt;br /&gt;
{&lt;br /&gt;
	GIE  = 0;		// Alle Interruptquellen ausschalten&lt;br /&gt;
	T0IF = 0;		// Timer0 Interruptflag Löschen&lt;br /&gt;
	PORTB++;		// PORTB inkrementieren&lt;br /&gt;
	GIE  = 1;		// Interrupts wieder einschalten&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void t0_ini ()&lt;br /&gt;
{&lt;br /&gt;
				// Datenblatt Seite 83&lt;br /&gt;
	OPTION 	= 0b11000100;		&lt;br /&gt;
		 // 1-------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // -1------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // --0-----	Internen Takt für Timer0 verwenden&lt;br /&gt;
		 // ---0----	Bei externem Takt an steigender Flanke inkrementieren&lt;br /&gt;
		 // 		(in diesem Fall egal ob 1 oder 0 weil der interne Takt verwendet wird)&lt;br /&gt;
		 // ----0---	Prescaler für Timer0 verwenden&lt;br /&gt;
		 // -----100	Prescaler 1:32&lt;br /&gt;
&lt;br /&gt;
	T0IF	= 0;		// Interruptflag von Timer0 löschen&lt;br /&gt;
	GIE 	= 1;		// Alle nichtmaskierten Interrupts erlauben&lt;br /&gt;
	T0IE 	= 1;		// Timer0 Interrupt erlauben&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
	ANSEL  = 0b00000000;		// Pins als digital I/O &lt;br /&gt;
	ANSELH = 0b00000000;		// Pins als digital I/O&lt;br /&gt;
	PORTA  = 0;			// Latch von Port A,B und C löschen&lt;br /&gt;
	PORTB  = 0;&lt;br /&gt;
	PORTC  = 0;&lt;br /&gt;
	TRISA  = 0b00000000;		// Port A,B und C als Ausgänge schalten&lt;br /&gt;
	TRISB  = 0b00000000;&lt;br /&gt;
	TRISC  = 0b00000000;&lt;br /&gt;
}&lt;br /&gt;
//========================================================================&lt;br /&gt;
void main ()&lt;br /&gt;
{&lt;br /&gt;
	setup();&lt;br /&gt;
	t0_ini();&lt;br /&gt;
&lt;br /&gt;
	while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
[[Bild:Timer1-PIC16F690.png|right|thumb|Hardware Timer1 im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Timer1 ===&lt;br /&gt;
==== Timer1 Hardware ====&lt;br /&gt;
Der Timer1 ist ein 16-Bit Timer/Zähler. Für den Timer1 gibt es viele Verwendungsmöglichkeiten auf Grund seiner zahlreichen Einstellmöglichkeiten. Man kann Ihn als einfachen Timer verwenden, wofür er eigentlich schon fast zu schade ist, oder als raffinierten Zähler, welcher erst bei einem bestimmten Ereignis wie z.B. dem auslösen des Komparators oder eines bestimmten zustandes am TG1-Pin (RA4/Pin 3) zu zählen beginnt.&amp;lt;br/&amp;gt;&lt;br /&gt;
die 16-Bit des Timers teilen sich auf zwei 8-Bit-Register auf, &#039;&#039;&#039;TMR1H&#039;&#039;&#039; und &#039;&#039;&#039;TMR1L&#039;&#039;&#039;.&lt;br /&gt;
==== Timer1 Codebeispiel ====&lt;br /&gt;
&#039;&#039;Szenario 1&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC verwendet als Taktquelle den internen Oszilator mit 8MHz.&amp;lt;br/&amp;gt;&lt;br /&gt;
An PORTB sind 8 LEDs mit Vorwiderständen.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Nachfolgenden Code noch nicht verwenden, ist noch in Bearbeitung&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
#include &amp;quot;htc.h&amp;quot;&lt;br /&gt;
__CONFIG (0x30e4);&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
static void interrupt global_int(void)&lt;br /&gt;
{&lt;br /&gt;
	GIE    = 0;		// Alle Interruptquellen ausschalten&lt;br /&gt;
	TMR1IF = 0;		// Timer1 Interruptflag Löschen&lt;br /&gt;
	PORTB++;		// PORTB inkrementieren&lt;br /&gt;
	GIE    = 1;		// Interrupts wieder einschalten&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void t1_ini ()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	TMR1IF	= 0;		// Interruptflag von Timer1 löschen+&lt;br /&gt;
&lt;br /&gt;
				// Datenblatt Seite 88&lt;br /&gt;
	T1CON 	= 0b00110000;		&lt;br /&gt;
		 // 0-------	Timer1 Gate-invertier-Bit (in diesem Beispiel uninteressant)&lt;br /&gt;
		 // -0------	Timer1 Gate-enable-Bit (auf 0 gesetzt sodass der timer1 &lt;br /&gt;
		 //		mit dem TMR1ON-Bit direkt ein und ausgeschaltet werden kann&lt;br /&gt;
		 // --11----	Prescaler auf 1:8 einstellen&lt;br /&gt;
		 // ----0---	Low Power Oszillator aus&lt;br /&gt;
		 // -----0--	(in diesem Beispiel uninteressant weil Bit 1 == 0)&lt;br /&gt;
		 // ------0-	interen Takt verwenden&lt;br /&gt;
		 // -------1	Timer1 einschalten&lt;br /&gt;
&lt;br /&gt;
	GIE 	= 1;		// Alle nichtmaskierten Interrupts erlauben&lt;br /&gt;
	PEIE 	= 1;		// Pereferieinterrupt erlauben&lt;br /&gt;
				// Die Bits GIE und PEIE befinden sich in INTCON Register&lt;br /&gt;
				// und sind im Datenblatt auf Seite 38 erläutert.&lt;br /&gt;
	TMR1IE 	= 1;		// Timer1 Interrupt erlauben&lt;br /&gt;
				// Das TMR1IE-Bit ist im ist im PIE1 Register&lt;br /&gt;
				// und im Datenblatt auf Seite 39&lt;br /&gt;
}&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
	OSCCON = 0b01110000;		// 8 MHz Datenblatt Seite 48&lt;br /&gt;
	ANSEL  = 0b00000000;		// Pins als digital I/O &lt;br /&gt;
	ANSELH = 0b00000000;		// Pins als digital I/O&lt;br /&gt;
	PORTA  = 0;			// Latch von Port A,B und C löschen&lt;br /&gt;
	PORTB  = 0;&lt;br /&gt;
	PORTC  = 0;&lt;br /&gt;
	TRISA  = 0b00000000;		// Port A,B und C als Ausgänge schalten&lt;br /&gt;
	TRISB  = 0b00000000;&lt;br /&gt;
	TRISC  = 0b00000000;&lt;br /&gt;
}&lt;br /&gt;
//========================================================================&lt;br /&gt;
void main ()&lt;br /&gt;
{&lt;br /&gt;
	setup();&lt;br /&gt;
	t1_ini();&lt;br /&gt;
&lt;br /&gt;
	while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
[[Bild:Timer2-PIC16F690.png|right|thumb|Hardware Timer2 im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Timer2 ===&lt;br /&gt;
==== Timer2 Hardware ====&lt;br /&gt;
==== Timer2 Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
[[Bild:AD-Wandler-PIC16F690.png|right|thumb|Hardware AD-Wandler im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== AD-Wandler ===&lt;br /&gt;
==== Hardware AD-Wandler ====&lt;br /&gt;
==== AD-Wandler Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
[[Bild:PWM-PIC16F690.png|thumb|right|Hardware PWM im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== PWM ===&lt;br /&gt;
==== PWM Hardware ====&lt;br /&gt;
==== PWM Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
[[Bild:EUSART-TX-PIC16F690.png|thumb|right|Hardware EUSART im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Bild:EUSART-RX-PIC16F690.png|thumb|right|Hardware EUSART im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== EUSART ===&lt;br /&gt;
==== EUSART Hardware ====&lt;br /&gt;
==== EUSART TX Codebeispiel ====&lt;br /&gt;
==== EUSART RX Codebeispiel ====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Bild:SPI-PIC16F690.png|thumb|right|Hardware SPI im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== SPI ===&lt;br /&gt;
==== SPI Hardware ====&lt;br /&gt;
==== SPI Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
[[Bild:I2C-PIC16F690.png|thumb|right|Hardware I2C im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== I2C ===&lt;br /&gt;
==== I2C Hardware ====&lt;br /&gt;
==== I2C Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.microchip.com Homepage Microchip]&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplgidcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1335&amp;amp;dDocName=en023112 Produktseite PIC16F690]&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/41262E.pdf Datenblatt PIC16F690]&lt;br /&gt;
* [http://www.htsoft.com HiTech Software]&lt;br /&gt;
* [http://www.sprut.de Sprut -&amp;gt; DIE deutschsprachige Seite zum Thema PIC]&lt;br /&gt;
* ...&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
* Timer0, Timer1, Timer2&lt;br /&gt;
* AD-Wandler&lt;br /&gt;
* PWM&lt;br /&gt;
* Eusart&lt;br /&gt;
* Komparator&lt;br /&gt;
* SPI&lt;br /&gt;
* I2C&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Wettbewerb|P]]&lt;br /&gt;
[[Category:PIC|P]]&lt;/div&gt;</summary>
		<author><name>Thomas1123</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=PIC_Codebeispiele&amp;diff=28729</id>
		<title>PIC Codebeispiele</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=PIC_Codebeispiele&amp;diff=28729"/>
		<updated>2008-06-27T09:41:08Z</updated>

		<summary type="html">&lt;p&gt;Thomas1123: /* Timer1 Codebeispiel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von [[Benutzer:Thomas1123|Thomas1123]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ich persönlich benutze den Hitech PIC-C Lite Compiler für meine Projekte.&amp;lt;br/&amp;gt;&lt;br /&gt;
Hierbei handelt es sich um die abgespeckte Version des Hitech PIC-C Compilers von der Firma HiTech Software.&amp;lt;br/&amp;gt;&lt;br /&gt;
Ich möchte hier eine Sammlung von Codebeispielen beginnen mit der es Einsteigern ermöglicht wird verschiedene interne und externe Pereferie zu initialiesieren und zu benutzen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Da der [http://www.microchip.com/stellent/idcplgidcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1335&amp;amp;dDocName=en023112 PIC16F690] mein persönlicher Liebling ist möchte ich die hier gezeigten Beispiele anhand dieses PICs aufzeigen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Selbstverständlich kann dieser Artikel noch mit Codebeispielen für cc5x und ASM erweitert werden, des Weiteren kann man auch Beispiele für andere PICs der 10er, 12er, und 16er Kategorie einfügen.&lt;br /&gt;
&lt;br /&gt;
== Pinbelegung ==&lt;br /&gt;
[[Bild:PIC16F690-Pins.png|center|Pinbelegung des PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC16F690 verfügt über eine grosse Anzahl an interner Pereferie beispielsweise 10-Bit AD-Wandler, SPI/I2C Interface, mehrere Timer (2*8-Bit 1*16-Bit), EUSART (RS232 etc.) usw.&lt;br /&gt;
&lt;br /&gt;
== Codebeispiele ==&lt;br /&gt;
----&lt;br /&gt;
=== Timer0 ===&lt;br /&gt;
==== Timer0 Hardware ====&lt;br /&gt;
[[Bild:Timer0-PIC16F690.png|thumb|right|Hardware Timer0 und WDT im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
Der Timer0 ist ein 8-Bit Timer/Zähler, welcher entweder mit dem internen Takt des PIC oder mit einer externen Taktquelle am Pin 17 (RA2/T0CKI) Betrieben werden kann. Beim Betrieb mit einer externen Taktquelle kann man zusätzlich auswählen ob bei einer steigenden oder fallenden Flanke das Timerregister inkrementiert werden soll. Gleich welche Taktquelle gewählt wird, kann bei einem Überlauf des Timerregisters ein Interrupt ausgelöst werden. Hierfür ist es notwendig die Bits &#039;&#039;&#039;GIE&#039;&#039;&#039; und &#039;&#039;&#039;T0IE&#039;&#039;&#039; auf 1 zu setzen. Beide Bits befinden sich im &#039;&#039;&#039;INTCON&#039;&#039;&#039;-Register und sind im Datenblatt auf Seite 38 zu finden.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Im nebenstehendem Diagramm ist der aufbau des Timer0 zusammen mit dem Watchdogtimer dargestellt.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Im Option Register (&#039;&#039;&#039;OPTION&#039;&#039;&#039; Datenblatt Seite 83) kann mit Bit 5 (&#039;&#039;&#039;T0CS&#039;&#039;&#039;) ausgewählt werden ob der interne Takt (0) oder ein externer Takt (1) verwendet wird. Bei einem externen Takt kann mit Bit 4 (&#039;&#039;&#039;T0SE&#039;&#039;&#039;) auswählen ob bei einer steigenden (0) oder bei einer fallenden Flanke (1) das Timer0-Register inkrenemtiert werden soll. Mit Bit 3 (&#039;&#039;&#039;PSA&#039;&#039;&#039;) wird der Prescaler entweder dem Timer (0) &#039;&#039;&#039;oder&#039;&#039;&#039; dem Watchdogtimer (1) zugewiesen. Der Prescaler selbst wird mit den Bits 0 bis 2 (&#039;&#039;&#039;PS0 PS1 PS2&#039;&#039;&#039;) des Option Registers eingestellt.&amp;lt;br/&amp;gt;&lt;br /&gt;
Eine Übersicht der Einstellmöglichkeiten ist auf Seite 83 im Datenblatt einsehbar.&lt;br /&gt;
&lt;br /&gt;
==== Timer0 Codebeispiel ====&lt;br /&gt;
&#039;&#039;Szenario:&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC verwendet als externe Taktquelle einen 32,768 kHz Uhrenquarz.&amp;lt;br/&amp;gt;&lt;br /&gt;
An PORTB sind 8 LEDs mit Vorwiderständen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Jede Sekunde soll PORTB um den Wert 1 inkrementiert werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
Zu diesem Zweck wird der Timer0 mit Prescaler verwendet.&amp;lt;br/&amp;gt;&lt;br /&gt;
Die Einstellungen des Prescaler errechenen sich wie folgt:&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{Fosc}{4*Prescaler*2^8}= t \,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fosc/4 weil der PIC für eine Anweisung 4 Takte benötigt.&amp;lt;br/&amp;gt;&lt;br /&gt;
Der Prescaler als zusätzlicher Teiler des Timertaktes.&amp;lt;br/&amp;gt;&lt;br /&gt;
2^8 (256) Schritte benötigt der Timer 0 zum Überlauf.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{32768Hz}{4*2^8*32}= \frac {1}{Sek}\,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei einem Prescaler von 1:32 lösen wir somit exakt jede Sekunde einen Interrupt aus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
#include &amp;quot;htc.h&amp;quot;&lt;br /&gt;
__CONFIG (0x30e4);&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
static void interrupt global_int(void)&lt;br /&gt;
{&lt;br /&gt;
	GIE  = 0;		// Alle Interruptquellen ausschalten&lt;br /&gt;
	T0IF = 0;		// Timer0 Interruptflag Löschen&lt;br /&gt;
	PORTB++;		// PORTB inkrementieren&lt;br /&gt;
	GIE  = 1;		// Interrupts wieder einschalten&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void t0_ini ()&lt;br /&gt;
{&lt;br /&gt;
				// Datenblatt Seite 83&lt;br /&gt;
	OPTION 	= 0b11000100;		&lt;br /&gt;
		 // 1-------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // -1------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // --0-----	Internen Takt für Timer0 verwenden&lt;br /&gt;
		 // ---0----	Bei externem Takt an steigender Flanke inkrementieren&lt;br /&gt;
		 // 		(in diesem Fall egal ob 1 oder 0 weil der interne Takt verwendet wird)&lt;br /&gt;
		 // ----0---	Prescaler für Timer0 verwenden&lt;br /&gt;
		 // -----100	Prescaler 1:32&lt;br /&gt;
&lt;br /&gt;
	T0IF	= 0;		// Interruptflag von Timer0 löschen&lt;br /&gt;
	GIE 	= 1;		// Alle nichtmaskierten Interrupts erlauben&lt;br /&gt;
	T0IE 	= 1;		// Timer0 Interrupt erlauben&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
	ANSEL  = 0b00000000;		// Pins als digital I/O &lt;br /&gt;
	ANSELH = 0b00000000;		// Pins als digital I/O&lt;br /&gt;
	PORTA  = 0;			// Latch von Port A,B und C löschen&lt;br /&gt;
	PORTB  = 0;&lt;br /&gt;
	PORTC  = 0;&lt;br /&gt;
	TRISA  = 0b00000000;		// Port A,B und C als Ausgänge schalten&lt;br /&gt;
	TRISB  = 0b00000000;&lt;br /&gt;
	TRISC  = 0b00000000;&lt;br /&gt;
}&lt;br /&gt;
//========================================================================&lt;br /&gt;
void main ()&lt;br /&gt;
{&lt;br /&gt;
	setup();&lt;br /&gt;
	t0_ini();&lt;br /&gt;
&lt;br /&gt;
	while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
[[Bild:Timer1-PIC16F690.png|right|thumb|Hardware Timer1 im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Timer1 ===&lt;br /&gt;
==== Timer1 Hardware ====&lt;br /&gt;
Der Timer1 ist ein 16-Bit Timer/Zähler, welcher entweder mit dem internen Takt des PIC, einer externen Taktquelle am Pin 2 (RA5/T1CKI) oder mit einem Low Power Quarz zwischen Pin 2 (RA5/T1CKI) und Pin 3 (RA4/T1G) Betrieben werden kann. Latztere sind nur möglich wenn der Programmtakt des Pic mit dem internen Oszilator erzeugt wird.&lt;br /&gt;
==== Timer1 Codebeispiel ====&lt;br /&gt;
&#039;&#039;Szenario 1&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC verwendet als Taktquelle den internen Oszilator mit 8MHz.&amp;lt;br/&amp;gt;&lt;br /&gt;
An PORTB sind 8 LEDs mit Vorwiderständen.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Nachfolgenden Code noch nicht verwenden, ist noch in Bearbeitung&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
#include &amp;quot;htc.h&amp;quot;&lt;br /&gt;
__CONFIG (0x30e4);&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
static void interrupt global_int(void)&lt;br /&gt;
{&lt;br /&gt;
	GIE    = 0;		// Alle Interruptquellen ausschalten&lt;br /&gt;
	TMR1IF = 0;		// Timer1 Interruptflag Löschen&lt;br /&gt;
	PORTB++;		// PORTB inkrementieren&lt;br /&gt;
	GIE    = 1;		// Interrupts wieder einschalten&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void t1_ini ()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	TMR1IF	= 0;		// Interruptflag von Timer1 löschen+&lt;br /&gt;
&lt;br /&gt;
				// Datenblatt Seite 88&lt;br /&gt;
	T1CON 	= 0b00110000;		&lt;br /&gt;
		 // 0-------	Timer1 Gate-invertier-Bit (in diesem Beispiel uninteressant)&lt;br /&gt;
		 // -0------	Timer1 Gate-enable-Bit (auf 0 gesetzt sodass der timer1 &lt;br /&gt;
		 //		mit dem TMR1ON-Bit direkt ein und ausgeschaltet werden kann&lt;br /&gt;
		 // --11----	Prescaler auf 1:8 einstellen&lt;br /&gt;
		 // ----0---	Low Power Oszillator aus&lt;br /&gt;
		 // -----0--	(in diesem Beispiel uninteressant weil Bit 1 == 0)&lt;br /&gt;
		 // ------0-	interen Takt verwenden&lt;br /&gt;
		 // -------1	Timer1 einschalten&lt;br /&gt;
&lt;br /&gt;
	GIE 	= 1;		// Alle nichtmaskierten Interrupts erlauben&lt;br /&gt;
	PEIE 	= 1;		// Pereferieinterrupt erlauben&lt;br /&gt;
				// Die Bits GIE und PEIE befinden sich in INTCON Register&lt;br /&gt;
				// und sind im Datenblatt auf Seite 38 erläutert.&lt;br /&gt;
	TMR1IE 	= 1;		// Timer1 Interrupt erlauben&lt;br /&gt;
				// Das TMR1IE-Bit ist im ist im PIE1 Register&lt;br /&gt;
				// und im Datenblatt auf Seite 39&lt;br /&gt;
}&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
	OSCCON = 0b01110000;		// 8 MHz Datenblatt Seite 48&lt;br /&gt;
	ANSEL  = 0b00000000;		// Pins als digital I/O &lt;br /&gt;
	ANSELH = 0b00000000;		// Pins als digital I/O&lt;br /&gt;
	PORTA  = 0;			// Latch von Port A,B und C löschen&lt;br /&gt;
	PORTB  = 0;&lt;br /&gt;
	PORTC  = 0;&lt;br /&gt;
	TRISA  = 0b00000000;		// Port A,B und C als Ausgänge schalten&lt;br /&gt;
	TRISB  = 0b00000000;&lt;br /&gt;
	TRISC  = 0b00000000;&lt;br /&gt;
}&lt;br /&gt;
//========================================================================&lt;br /&gt;
void main ()&lt;br /&gt;
{&lt;br /&gt;
	setup();&lt;br /&gt;
	t1_ini();&lt;br /&gt;
&lt;br /&gt;
	while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
[[Bild:Timer2-PIC16F690.png|right|thumb|Hardware Timer2 im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Timer2 ===&lt;br /&gt;
==== Timer2 Hardware ====&lt;br /&gt;
==== Timer2 Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
[[Bild:AD-Wandler-PIC16F690.png|right|thumb|Hardware AD-Wandler im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== AD-Wandler ===&lt;br /&gt;
==== Hardware AD-Wandler ====&lt;br /&gt;
==== AD-Wandler Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
[[Bild:PWM-PIC16F690.png|thumb|right|Hardware PWM im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== PWM ===&lt;br /&gt;
==== PWM Hardware ====&lt;br /&gt;
==== PWM Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
[[Bild:EUSART-TX-PIC16F690.png|thumb|right|Hardware EUSART im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Bild:EUSART-RX-PIC16F690.png|thumb|right|Hardware EUSART im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== EUSART ===&lt;br /&gt;
==== EUSART Hardware ====&lt;br /&gt;
==== EUSART TX Codebeispiel ====&lt;br /&gt;
==== EUSART RX Codebeispiel ====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Bild:SPI-PIC16F690.png|thumb|right|Hardware SPI im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== SPI ===&lt;br /&gt;
==== SPI Hardware ====&lt;br /&gt;
==== SPI Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
[[Bild:I2C-PIC16F690.png|thumb|right|Hardware I2C im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== I2C ===&lt;br /&gt;
==== I2C Hardware ====&lt;br /&gt;
==== I2C Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.microchip.com Homepage Microchip]&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplgidcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1335&amp;amp;dDocName=en023112 Produktseite PIC16F690]&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/41262E.pdf Datenblatt PIC16F690]&lt;br /&gt;
* [http://www.htsoft.com HiTech Software]&lt;br /&gt;
* [http://www.sprut.de Sprut -&amp;gt; DIE deutschsprachige Seite zum Thema PIC]&lt;br /&gt;
* ...&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
* Timer0, Timer1, Timer2&lt;br /&gt;
* AD-Wandler&lt;br /&gt;
* PWM&lt;br /&gt;
* Eusart&lt;br /&gt;
* Komparator&lt;br /&gt;
* SPI&lt;br /&gt;
* I2C&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Wettbewerb|P]]&lt;br /&gt;
[[Category:PIC|P]]&lt;/div&gt;</summary>
		<author><name>Thomas1123</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=PIC_Codebeispiele&amp;diff=28727</id>
		<title>PIC Codebeispiele</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=PIC_Codebeispiele&amp;diff=28727"/>
		<updated>2008-06-27T01:53:01Z</updated>

		<summary type="html">&lt;p&gt;Thomas1123: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von [[Benutzer:Thomas1123|Thomas1123]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ich persönlich benutze den Hitech PIC-C Lite Compiler für meine Projekte.&amp;lt;br/&amp;gt;&lt;br /&gt;
Hierbei handelt es sich um die abgespeckte Version des Hitech PIC-C Compilers von der Firma HiTech Software.&amp;lt;br/&amp;gt;&lt;br /&gt;
Ich möchte hier eine Sammlung von Codebeispielen beginnen mit der es Einsteigern ermöglicht wird verschiedene interne und externe Pereferie zu initialiesieren und zu benutzen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Da der [http://www.microchip.com/stellent/idcplgidcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1335&amp;amp;dDocName=en023112 PIC16F690] mein persönlicher Liebling ist möchte ich die hier gezeigten Beispiele anhand dieses PICs aufzeigen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Selbstverständlich kann dieser Artikel noch mit Codebeispielen für cc5x und ASM erweitert werden, des Weiteren kann man auch Beispiele für andere PICs der 10er, 12er, und 16er Kategorie einfügen.&lt;br /&gt;
&lt;br /&gt;
== Pinbelegung ==&lt;br /&gt;
[[Bild:PIC16F690-Pins.png|center|Pinbelegung des PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC16F690 verfügt über eine grosse Anzahl an interner Pereferie beispielsweise 10-Bit AD-Wandler, SPI/I2C Interface, mehrere Timer (2*8-Bit 1*16-Bit), EUSART (RS232 etc.) usw.&lt;br /&gt;
&lt;br /&gt;
== Codebeispiele ==&lt;br /&gt;
----&lt;br /&gt;
=== Timer0 ===&lt;br /&gt;
==== Timer0 Hardware ====&lt;br /&gt;
[[Bild:Timer0-PIC16F690.png|thumb|right|Hardware Timer0 und WDT im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
Der Timer0 ist ein 8-Bit Timer/Zähler, welcher entweder mit dem internen Takt des PIC oder mit einer externen Taktquelle am Pin 17 (RA2/T0CKI) Betrieben werden kann. Beim Betrieb mit einer externen Taktquelle kann man zusätzlich auswählen ob bei einer steigenden oder fallenden Flanke das Timerregister inkrementiert werden soll. Gleich welche Taktquelle gewählt wird, kann bei einem Überlauf des Timerregisters ein Interrupt ausgelöst werden. Hierfür ist es notwendig die Bits &#039;&#039;&#039;GIE&#039;&#039;&#039; und &#039;&#039;&#039;T0IE&#039;&#039;&#039; auf 1 zu setzen. Beide Bits befinden sich im &#039;&#039;&#039;INTCON&#039;&#039;&#039;-Register und sind im Datenblatt auf Seite 38 zu finden.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Im nebenstehendem Diagramm ist der aufbau des Timer0 zusammen mit dem Watchdogtimer dargestellt.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Im Option Register (&#039;&#039;&#039;OPTION&#039;&#039;&#039; Datenblatt Seite 83) kann mit Bit 5 (&#039;&#039;&#039;T0CS&#039;&#039;&#039;) ausgewählt werden ob der interne Takt (0) oder ein externer Takt (1) verwendet wird. Bei einem externen Takt kann mit Bit 4 (&#039;&#039;&#039;T0SE&#039;&#039;&#039;) auswählen ob bei einer steigenden (0) oder bei einer fallenden Flanke (1) das Timer0-Register inkrenemtiert werden soll. Mit Bit 3 (&#039;&#039;&#039;PSA&#039;&#039;&#039;) wird der Prescaler entweder dem Timer (0) &#039;&#039;&#039;oder&#039;&#039;&#039; dem Watchdogtimer (1) zugewiesen. Der Prescaler selbst wird mit den Bits 0 bis 2 (&#039;&#039;&#039;PS0 PS1 PS2&#039;&#039;&#039;) des Option Registers eingestellt.&amp;lt;br/&amp;gt;&lt;br /&gt;
Eine Übersicht der Einstellmöglichkeiten ist auf Seite 83 im Datenblatt einsehbar.&lt;br /&gt;
&lt;br /&gt;
==== Timer0 Codebeispiel ====&lt;br /&gt;
&#039;&#039;Szenario:&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC verwendet als externe Taktquelle einen 32,768 kHz Uhrenquarz.&amp;lt;br/&amp;gt;&lt;br /&gt;
An PORTB sind 8 LEDs mit Vorwiderständen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Jede Sekunde soll PORTB um den Wert 1 inkrementiert werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
Zu diesem Zweck wird der Timer0 mit Prescaler verwendet.&amp;lt;br/&amp;gt;&lt;br /&gt;
Die Einstellungen des Prescaler errechenen sich wie folgt:&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{Fosc}{4*Prescaler*2^8}= t \,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fosc/4 weil der PIC für eine Anweisung 4 Takte benötigt.&amp;lt;br/&amp;gt;&lt;br /&gt;
Der Prescaler als zusätzlicher Teiler des Timertaktes.&amp;lt;br/&amp;gt;&lt;br /&gt;
2^8 (256) Schritte benötigt der Timer 0 zum Überlauf.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{32768Hz}{4*2^8*32}= \frac {1}{Sek}\,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei einem Prescaler von 1:32 lösen wir somit exakt jede Sekunde einen Interrupt aus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
#include &amp;quot;htc.h&amp;quot;&lt;br /&gt;
__CONFIG (0x30e4);&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
static void interrupt global_int(void)&lt;br /&gt;
{&lt;br /&gt;
	GIE  = 0;		// Alle Interruptquellen ausschalten&lt;br /&gt;
	T0IF = 0;		// Timer0 Interruptflag Löschen&lt;br /&gt;
	PORTB++;		// PORTB inkrementieren&lt;br /&gt;
	GIE  = 1;		// Interrupts wieder einschalten&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void t0_ini ()&lt;br /&gt;
{&lt;br /&gt;
				// Datenblatt Seite 83&lt;br /&gt;
	OPTION 	= 0b11000100;		&lt;br /&gt;
		 // 1-------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // -1------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // --0-----	Internen Takt für Timer0 verwenden&lt;br /&gt;
		 // ---0----	Bei externem Takt an steigender Flanke inkrementieren&lt;br /&gt;
		 // 		(in diesem Fall egal ob 1 oder 0 weil der interne Takt verwendet wird)&lt;br /&gt;
		 // ----0---	Prescaler für Timer0 verwenden&lt;br /&gt;
		 // -----100	Prescaler 1:32&lt;br /&gt;
&lt;br /&gt;
	T0IF	= 0;		// Interruptflag von Timer0 löschen&lt;br /&gt;
	GIE 	= 1;		// Alle nichtmaskierten Interrupts erlauben&lt;br /&gt;
	T0IE 	= 1;		// Timer0 Interrupt erlauben&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
	ANSEL  = 0b00000000;		// Pins als digital I/O &lt;br /&gt;
	ANSELH = 0b00000000;		// Pins als digital I/O&lt;br /&gt;
	PORTA  = 0;			// Latch von Port A,B und C löschen&lt;br /&gt;
	PORTB  = 0;&lt;br /&gt;
	PORTC  = 0;&lt;br /&gt;
	TRISA  = 0b00000000;		// Port A,B und C als Ausgänge schalten&lt;br /&gt;
	TRISB  = 0b00000000;&lt;br /&gt;
	TRISC  = 0b00000000;&lt;br /&gt;
}&lt;br /&gt;
//========================================================================&lt;br /&gt;
void main ()&lt;br /&gt;
{&lt;br /&gt;
	setup();&lt;br /&gt;
	t0_ini();&lt;br /&gt;
&lt;br /&gt;
	while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
[[Bild:Timer1-PIC16F690.png|right|thumb|Hardware Timer1 im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Timer1 ===&lt;br /&gt;
==== Timer1 Hardware ====&lt;br /&gt;
Der Timer1 ist ein 16-Bit Timer/Zähler, welcher entweder mit dem internen Takt des PIC, einer externen Taktquelle am Pin 2 (RA5/T1CKI) oder mit einem Low Power Quarz zwischen Pin 2 (RA5/T1CKI) und Pin 3 (RA4/T1G) Betrieben werden kann. Latztere sind nur möglich wenn der Programmtakt des Pic mit dem internen Oszilator erzeugt wird.&lt;br /&gt;
==== Timer1 Codebeispiel ====&lt;br /&gt;
&#039;&#039;Szenario 1&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC verwendet als Taktquelle den internen Oszilator mit 8MHz.&amp;lt;br/&amp;gt;&lt;br /&gt;
An PORTB sind 8 LEDs mit Vorwiderständen.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Nachfolgenden Code noch nicht verwenden, ist noch in Bearbeitung&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
#include &amp;quot;htc.h&amp;quot;&lt;br /&gt;
__CONFIG (0x30e4);&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
static void interrupt global_int(void)&lt;br /&gt;
{&lt;br /&gt;
	GIE    = 0;		// Alle Interruptquellen ausschalten&lt;br /&gt;
	TMR1IF = 0;		// Timer1 Interruptflag Löschen&lt;br /&gt;
	PORTB++;		// PORTB inkrementieren&lt;br /&gt;
	GIE    = 1;		// Interrupts wieder einschalten&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void t1_ini ()&lt;br /&gt;
{&lt;br /&gt;
				// Datenblatt Seite 88&lt;br /&gt;
	T1CON 	= 0b00000000;		&lt;br /&gt;
		 // 0-------	&lt;br /&gt;
		 // -0------	&lt;br /&gt;
		 // --0-----	&lt;br /&gt;
		 // ---0----	&lt;br /&gt;
		 // ----0---	&lt;br /&gt;
		 // -----000	&lt;br /&gt;
	TMR1IF	= 0;			// Interruptflag von Timer1 löschen&lt;br /&gt;
	GIE 	= 1;			// Alle nichtmaskierten Interrupts erlauben&lt;br /&gt;
	PEIE 	= 1;			// Pereferieinterrupt erlauben&lt;br /&gt;
	TMR1IE 	= 1;			// Timer1 Interrupt erlauben&lt;br /&gt;
	T1OSCEN	= 1;			// Externen Oszillator für Timer1 einschalten&lt;br /&gt;
	T1CON 	= 0b00000001;	// Prescale 1:1 &amp;amp; intosc &amp;amp; t1on s. 90&lt;br /&gt;
}&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
	OSCCON = 0b01110000;		// 8 MHz Datenblatt Seite 48&lt;br /&gt;
	ANSEL  = 0b00000000;		// Pins als digital I/O &lt;br /&gt;
	ANSELH = 0b00000000;		// Pins als digital I/O&lt;br /&gt;
	PORTA  = 0;			// Latch von Port A,B und C löschen&lt;br /&gt;
	PORTB  = 0;&lt;br /&gt;
	PORTC  = 0;&lt;br /&gt;
	TRISA  = 0b00000000;		// Port A,B und C als Ausgänge schalten&lt;br /&gt;
	TRISB  = 0b00000000;&lt;br /&gt;
	TRISC  = 0b00000000;&lt;br /&gt;
}&lt;br /&gt;
//========================================================================&lt;br /&gt;
void main ()&lt;br /&gt;
{&lt;br /&gt;
	setup();&lt;br /&gt;
	t1_ini();&lt;br /&gt;
&lt;br /&gt;
	while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
[[Bild:Timer2-PIC16F690.png|right|thumb|Hardware Timer2 im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== Timer2 ===&lt;br /&gt;
==== Timer2 Hardware ====&lt;br /&gt;
==== Timer2 Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
[[Bild:AD-Wandler-PIC16F690.png|right|thumb|Hardware AD-Wandler im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== AD-Wandler ===&lt;br /&gt;
==== Hardware AD-Wandler ====&lt;br /&gt;
==== AD-Wandler Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
[[Bild:PWM-PIC16F690.png|thumb|right|Hardware PWM im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== PWM ===&lt;br /&gt;
==== PWM Hardware ====&lt;br /&gt;
==== PWM Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
[[Bild:EUSART-TX-PIC16F690.png|thumb|right|Hardware EUSART im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Bild:EUSART-RX-PIC16F690.png|thumb|right|Hardware EUSART im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== EUSART ===&lt;br /&gt;
==== EUSART Hardware ====&lt;br /&gt;
==== EUSART TX Codebeispiel ====&lt;br /&gt;
==== EUSART RX Codebeispiel ====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Bild:SPI-PIC16F690.png|thumb|right|Hardware SPI im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== SPI ===&lt;br /&gt;
==== SPI Hardware ====&lt;br /&gt;
==== SPI Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
[[Bild:I2C-PIC16F690.png|thumb|right|Hardware I2C im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== I2C ===&lt;br /&gt;
==== I2C Hardware ====&lt;br /&gt;
==== I2C Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.microchip.com Homepage Microchip]&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplgidcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1335&amp;amp;dDocName=en023112 Produktseite PIC16F690]&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/41262E.pdf Datenblatt PIC16F690]&lt;br /&gt;
* [http://www.htsoft.com HiTech Software]&lt;br /&gt;
* [http://www.sprut.de Sprut -&amp;gt; DIE deutschsprachige Seite zum Thema PIC]&lt;br /&gt;
* ...&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
* Timer0, Timer1, Timer2&lt;br /&gt;
* AD-Wandler&lt;br /&gt;
* PWM&lt;br /&gt;
* Eusart&lt;br /&gt;
* Komparator&lt;br /&gt;
* SPI&lt;br /&gt;
* I2C&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Wettbewerb|P]]&lt;br /&gt;
[[Category:PIC|P]]&lt;/div&gt;</summary>
		<author><name>Thomas1123</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=PIC_Codebeispiele&amp;diff=28726</id>
		<title>PIC Codebeispiele</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=PIC_Codebeispiele&amp;diff=28726"/>
		<updated>2008-06-27T01:20:05Z</updated>

		<summary type="html">&lt;p&gt;Thomas1123: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von [[Benutzer:Thomas1123|Thomas1123]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ich persönlich benutze den Hitech PIC-C Lite Compiler für meine Projekte.&amp;lt;br/&amp;gt;&lt;br /&gt;
Hierbei handelt es sich um die abgespeckte Version des Hitech PIC-C Compilers von der Firma HiTech Software.&amp;lt;br/&amp;gt;&lt;br /&gt;
Ich möchte hier eine Sammlung von Codebeispielen beginnen mit der es Einsteigern ermöglicht wird verschiedene interne und externe Pereferie zu initialiesieren und zu benutzen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Da der [http://www.microchip.com/stellent/idcplgidcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1335&amp;amp;dDocName=en023112 PIC16F690] mein persönlicher Liebling ist möchte ich die hier gezeigten Beispiele anhand dieses PICs aufzeigen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Selbstverständlich kann dieser Artikel noch mit Codebeispielen für cc5x und ASM erweitert werden, des Weiteren kann man auch Beispiele für andere PICs der 10er, 12er, und 16er Kategorie einfügen.&lt;br /&gt;
&lt;br /&gt;
== Pinbelegung ==&lt;br /&gt;
[[Bild:PIC16F690-Pins.png|center|Pinbelegung des PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC16F690 verfügt über eine grosse Anzahl an interner Pereferie beispielsweise 10-Bit AD-Wandler, SPI/I2C Interface, mehrere Timer (2*8-Bit 1*16-Bit), EUSART (RS232 etc.) usw.&lt;br /&gt;
&lt;br /&gt;
== Codebeispiele ==&lt;br /&gt;
----&lt;br /&gt;
=== Timer0 ===&lt;br /&gt;
==== Timer0 Hardware ====&lt;br /&gt;
[[Bild:Timer0-PIC16F690.png|thumb|right|Hardware Timer0 und WDT im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
Der Timer0 ist ein 8-Bit Timer/Zähler, welcher entweder mit dem internen Takt des PIC oder mit einer externen Taktquelle am Pin 17 (RA2/T0CKI) Betrieben werden kann. Beim Betrieb mit einer externen Taktquelle kann man zusätzlich auswählen ob bei einer steigenden oder fallenden Flanke das Timerregister inkrementiert werden soll. Gleich welche Taktquelle gewählt wird, kann bei einem Überlauf des Timerregisters ein Interrupt ausgelöst werden. Hierfür ist es notwendig die Bits &#039;&#039;&#039;GIE&#039;&#039;&#039; und &#039;&#039;&#039;T0IE&#039;&#039;&#039; auf 1 zu setzen. Beide Bits befinden sich im &#039;&#039;&#039;INTCON&#039;&#039;&#039;-Register und sind im Datenblatt auf Seite 38 zu finden.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Im nebenstehendem Diagramm ist der aufbau des Timer0 zusammen mit dem Watchdogtimer dargestellt.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Im Option Register (&#039;&#039;&#039;OPTION&#039;&#039;&#039; Datenblatt Seite 83) kann mit Bit 5 (&#039;&#039;&#039;T0CS&#039;&#039;&#039;) ausgewählt werden ob der interne Takt (0) oder ein externer Takt (1) verwendet wird. Bei einem externen Takt kann mit Bit 4 (&#039;&#039;&#039;T0SE&#039;&#039;&#039;) auswählen ob bei einer steigenden (0) oder bei einer fallenden Flanke (1) das Timer0-Register inkrenemtiert werden soll. Mit Bit 3 (&#039;&#039;&#039;PSA&#039;&#039;&#039;) wird der Prescaler entweder dem Timer (0) &#039;&#039;&#039;oder&#039;&#039;&#039; dem Watchdogtimer (1) zugewiesen. Der Prescaler selbst wird mit den Bits 0 bis 2 (&#039;&#039;&#039;PS0 PS1 PS2&#039;&#039;&#039;) des Option Registers eingestellt.&amp;lt;br/&amp;gt;&lt;br /&gt;
Eine Übersicht der Einstellmöglichkeiten ist auf Seite 83 im Datenblatt einsehbar.&lt;br /&gt;
&lt;br /&gt;
==== Timer0 Codebeispiel ====&lt;br /&gt;
&#039;&#039;Szenario:&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC verwendet als externe Taktquelle einen 32,768 kHz Uhrenquarz.&amp;lt;br/&amp;gt;&lt;br /&gt;
An PORTB sind 8 LEDs mit Vorwiederständen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Jede Sekunde soll PORTB um den Wert 1 inkrementiert werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
Zu diesem Zweck wird der Timer0 mit Prescaler verwendet.&amp;lt;br/&amp;gt;&lt;br /&gt;
Die Einstellungen des Prescaler errechenen sich wie folgt:&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{Fosc}{4*Prescaler*2^8}= t \,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fosc/4 weil der PIC für eine Anweisung 4 Takte benötigt.&amp;lt;br/&amp;gt;&lt;br /&gt;
Der Prescaler als zusätzlicher Teiler des Timertaktes.&amp;lt;br/&amp;gt;&lt;br /&gt;
2^8 (256) Schritte benötigt der Timer 0 zum Überlauf.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{32768Hz}{4*2^8*32}= \frac {1}{Sek}\,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei einem Prescaler von 1:32 lösen wir somit exakt jede Sekunde einen Interrupt aus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
#include &amp;quot;htc.h&amp;quot;&lt;br /&gt;
__CONFIG (0x30e4);&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
static void interrupt global_int(void)&lt;br /&gt;
{&lt;br /&gt;
	GIE = 0;		// Alle Interruptquellen ausschalten&lt;br /&gt;
	T0IF = 0;		// Timer1 Interruptflag Löschen&lt;br /&gt;
	PORTB++;		// PORTB inkrementieren&lt;br /&gt;
	GIE = 1;		// Interrupts wieder einschalten&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void t0_ini ()&lt;br /&gt;
{&lt;br /&gt;
				// Datenblatt Seite 83&lt;br /&gt;
	OPTION 	= 0b11000100;		&lt;br /&gt;
		 // 1-------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // -1------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // --0-----	Internen Takt für Timer0 verwenden&lt;br /&gt;
		 // ---0----	Bei externem Takt an steigender Flanke inkrementieren&lt;br /&gt;
		 // 		(in diesem Fall egal ob 1 oder 0 weil der interne Takt verwendet wird)&lt;br /&gt;
		 // ----0---	Prescaler für Timer0 verwenden&lt;br /&gt;
		 // -----100	Prescaler 1:32&lt;br /&gt;
&lt;br /&gt;
	T0IF	= 0;		// Interruptflag von Timer0 löschen&lt;br /&gt;
	GIE 	= 1;		// Alle nichtmaskierten Interrupts erlauben&lt;br /&gt;
	T0IE 	= 1;		// Timer0 Interrupt erlauben&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
	ANSEL = 0b00000000;		// Pins als digital I/O &lt;br /&gt;
	ANSELH = 0b00000000;		// Pins als digital I/O&lt;br /&gt;
	PORTA = 0;			// Latch von Port A,B und C löschen&lt;br /&gt;
	PORTB = 0;&lt;br /&gt;
	PORTC = 0;&lt;br /&gt;
	TRISA = 0b00000000;		// Port A,B und C als Ausgänge schalten&lt;br /&gt;
	TRISB = 0b00000000;&lt;br /&gt;
	TRISC = 0b00000000;&lt;br /&gt;
}&lt;br /&gt;
//========================================================================&lt;br /&gt;
void main ()&lt;br /&gt;
{&lt;br /&gt;
	setup();&lt;br /&gt;
	t0_ini();&lt;br /&gt;
&lt;br /&gt;
	while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
[[Bild:Timer1-PIC16F690.png|right|thumb|Hardware Timer1 im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Timer1 ===&lt;br /&gt;
==== Timer1 Hardware ====&lt;br /&gt;
Der Timer1 ist ein 16-Bit Timer/Zähler, welcher entweder mit dem internen Takt des PIC, einer externen Taktquelle am Pin 2 (RA5/T1CKI) oder mit einem Low Power Quarz zwischen Pin 2 (RA5/T1CKI) und Pin 3 (RA4/T1G) Betrieben werden kann. Latztere sind nur möglich wenn der Programmtakt des Pic mit dem internen Oszilator erzeugt wird.&lt;br /&gt;
==== Timer1 Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
[[Bild:Timer2-PIC16F690.png|right|thumb|Hardware Timer2 im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== Timer2 ===&lt;br /&gt;
==== Timer2 Hardware ====&lt;br /&gt;
==== Timer2 Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
[[Bild:AD-Wandler-PIC16F690.png|right|thumb|Hardware AD-Wandler im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== AD-Wandler ===&lt;br /&gt;
==== Hardware AD-Wandler ====&lt;br /&gt;
==== AD-Wandler Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
[[Bild:PWM-PIC16F690.png|thumb|right|Hardware PWM im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== PWM ===&lt;br /&gt;
==== PWM Hardware ====&lt;br /&gt;
==== PWM Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
[[Bild:EUSART-TX-PIC16F690.png|thumb|right|Hardware EUSART im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Bild:EUSART-RX-PIC16F690.png|thumb|right|Hardware EUSART im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== EUSART ===&lt;br /&gt;
==== EUSART Hardware ====&lt;br /&gt;
==== EUSART TX Codebeispiel ====&lt;br /&gt;
==== EUSART RX Codebeispiel ====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Bild:SPI-PIC16F690.png|thumb|right|Hardware SPI im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== SPI ===&lt;br /&gt;
==== SPI Hardware ====&lt;br /&gt;
==== SPI Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
[[Bild:I2C-PIC16F690.png|thumb|right|Hardware I2C im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== I2C ===&lt;br /&gt;
==== I2C Hardware ====&lt;br /&gt;
==== I2C Codebeispiel ====&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.microchip.com Homepage Microchip]&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplgidcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1335&amp;amp;dDocName=en023112 Produktseite PIC16F690]&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/41262E.pdf Datenblatt PIC16F690]&lt;br /&gt;
* [http://www.htsoft.com HiTech Software]&lt;br /&gt;
* [http://www.sprut.de Sprut -&amp;gt; DIE deutschsprachige Seite zum Thema PIC]&lt;br /&gt;
* ...&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
* Timer0, Timer1, Timer2&lt;br /&gt;
* AD-Wandler&lt;br /&gt;
* PWM&lt;br /&gt;
* Eusart&lt;br /&gt;
* Komparator&lt;br /&gt;
* SPI&lt;br /&gt;
* I2C&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Wettbewerb|P]]&lt;br /&gt;
[[Category:PIC|P]]&lt;/div&gt;</summary>
		<author><name>Thomas1123</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=PIC_Codebeispiele&amp;diff=28725</id>
		<title>PIC Codebeispiele</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=PIC_Codebeispiele&amp;diff=28725"/>
		<updated>2008-06-27T00:52:59Z</updated>

		<summary type="html">&lt;p&gt;Thomas1123: /* Timer0 Codebeispiel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von [[Benutzer:Thomas1123|Thomas1123]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ich persönlich benutze den Hitech PIC-C Lite Compiler für meine Projekte.&amp;lt;br/&amp;gt;&lt;br /&gt;
Hierbei handelt es sich um die abgespeckte Version des Hitech PIC-C Compilers von der Firma HiTech Software.&amp;lt;br/&amp;gt;&lt;br /&gt;
Ich möchte hier eine Sammlung von Codebeispielen beginnen mit der es Einsteigern ermöglicht wird verschiedene interne und externe Pereferie zu initialiesieren und zu benutzen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Da der [http://www.microchip.com/stellent/idcplgidcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1335&amp;amp;dDocName=en023112 PIC16F690] mein persönlicher Liebling ist möchte ich die hier gezeigten Beispiele anhand dieses PICs aufzeigen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Selbstverständlich kann dieser Artikel noch mit Codebeispielen für cc5x und ASM erweitert werden, des Weiteren kann man auch Beispiele für andere PICs der 10er, 12er, und 16er Kategorie einfügen.&lt;br /&gt;
&lt;br /&gt;
== Pinbelegung ==&lt;br /&gt;
[[Bild:PIC16F690-Pins.png|center|Pinbelegung des PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC16F690 verfügt über eine grosse Anzahl an interner Pereferie beispielsweise 10-Bit AD-Wandler, SPI/I2C Interface, mehrere Timer (2*8-Bit 1*16-Bit), EUSART (RS232 etc.) usw.&lt;br /&gt;
&lt;br /&gt;
== Codebeispiele ==&lt;br /&gt;
----&lt;br /&gt;
=== Timer0 ===&lt;br /&gt;
==== Timer0 Hardware ====&lt;br /&gt;
[[Bild:Timer0-PIC16F690.png|thumb|right|Hardware Timer0 und WDT im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
Der Timer0 ist ein 8-Bit Timer/Zähler, welcher entweder mit dem internen Takt des PIC oder mit einer externen Taktquelle am Pin 17 (RA2/T0CKI) Betrieben werden kann. Beim Betrieb mit einer externen Taktquelle kann man zusätzlich auswählen ob bei einer steigenden oder fallenden Flanke das Timerregister inkrementiert werden soll. Gleich welche Taktquelle gewählt wird, kann bei einem Überlauf des Timerregisters ein Interrupt ausgelöst werden. Hierfür ist es notwendig die Bits &#039;&#039;&#039;GIE&#039;&#039;&#039; und &#039;&#039;&#039;T0IE&#039;&#039;&#039; auf 1 zu setzen. Beide Bits befinden sich im &#039;&#039;&#039;INTCON&#039;&#039;&#039;-Register und sind im Datenblatt auf Seite 38 zu finden.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Im nebenstehendem Diagramm ist der aufbau des Timer0 zusammen mit dem Watchdogtimer dargestellt.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Im Option Register (&#039;&#039;&#039;OPTION&#039;&#039;&#039; Datenblatt Seite 83) kann mit Bit 5 (&#039;&#039;&#039;T0CS&#039;&#039;&#039;) ausgewählt werden ob der interne Takt (0) oder ein externer Takt (1) verwendet wird. Bei einem externen Takt kann mit Bit 4 (&#039;&#039;&#039;T0SE&#039;&#039;&#039;) auswählen ob bei einer steigenden (0) oder bei einer fallenden Flanke (1) das Timer0-Register inkrenemtiert werden soll. Mit Bit 3 (&#039;&#039;&#039;PSA&#039;&#039;&#039;) wird der Prescaler entweder dem Timer (0) &#039;&#039;&#039;oder&#039;&#039;&#039; dem Watchdogtimer (1) zugewiesen. Der Prescaler selbst wird mit den Bits 0 bis 2 (&#039;&#039;&#039;PS0 PS1 PS2&#039;&#039;&#039;) des Option Registers eingestellt.&amp;lt;br/&amp;gt;&lt;br /&gt;
Eine Übersicht der Einstellmöglichkeiten ist auf Seite 83 im Datenblatt einsehbar.&lt;br /&gt;
&lt;br /&gt;
==== Timer0 Codebeispiel ====&lt;br /&gt;
&#039;&#039;Szenario:&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC verwendet als externe Taktquelle einen 32,768 kHz Uhrenquarz.&amp;lt;br/&amp;gt;&lt;br /&gt;
An PORTB sind 8 LEDs mit Vorwiederständen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Jede Sekunde soll PORTB um den Wert 1 inkrementiert werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
Zu diesem Zweck wird der Timer0 mit Prescaler verwendet.&amp;lt;br/&amp;gt;&lt;br /&gt;
Die Einstellungen des Prescaler errechenen sich wie folgt:&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{Fosc}{4*Prescaler*2^8}= t \,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fosc/4 weil der PIC für eine Anweisung 4 Takte benötigt.&amp;lt;br/&amp;gt;&lt;br /&gt;
Der Prescaler als zusätzlicher Teiler des Timertaktes.&amp;lt;br/&amp;gt;&lt;br /&gt;
2^8 (256) Schritte benötigt der Timer 0 zum Überlauf.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{32768Hz}{4*2^8*32}= \frac {1}{Sek}\,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei einem Prescaler von 1:32 lösen wir somit exakt jede Sekunde einen Interrupt aus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
#include &amp;quot;htc.h&amp;quot;&lt;br /&gt;
__CONFIG (0x30e4);&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
static void interrupt global_int(void)&lt;br /&gt;
{&lt;br /&gt;
	GIE = 0;		// Alle Interruptquellen ausschalten&lt;br /&gt;
	T0IF = 0;		// Timer1 Interruptflag Löschen&lt;br /&gt;
	PORTB++;		// PORTB inkrementieren&lt;br /&gt;
	GIE = 1;		// Interrupts wieder einschalten&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void t0_ini ()&lt;br /&gt;
{&lt;br /&gt;
				// Datenblatt Seite 83&lt;br /&gt;
	OPTION 	= 0b11000100;		&lt;br /&gt;
		 // 1-------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // -1------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // --0-----	Internen Takt für Timer0 verwenden&lt;br /&gt;
		 // ---0----	Bei externem Takt an steigender Flanke inkrementieren&lt;br /&gt;
		 // 		(in diesem Fall egal ob 1 oder 0 weil der interne Takt verwendet wird)&lt;br /&gt;
		 // ----0---	Prescaler für Timer0 verwenden&lt;br /&gt;
		 // -----100	Prescaler 1:32&lt;br /&gt;
&lt;br /&gt;
	T0IF	= 0;		// Interruptflag von Timer0 löschen&lt;br /&gt;
	GIE 	= 1;		// Alle nichtmaskierten Interrupts erlauben&lt;br /&gt;
	T0IE 	= 1;		// Timer0 Interrupt erlauben&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
	ANSEL = 0b00000000;		// Pins als digital I/O &lt;br /&gt;
	ANSELH = 0b00000000;		// Pins als digital I/O&lt;br /&gt;
	PORTA = 0;			// Latch von Port A,B und C löschen&lt;br /&gt;
	PORTB = 0;&lt;br /&gt;
	PORTC = 0;&lt;br /&gt;
	TRISA = 0b00000000;		// Port A,B und C als Ausgänge schalten&lt;br /&gt;
	TRISB = 0b00000000;&lt;br /&gt;
	TRISC = 0b00000000;&lt;br /&gt;
}&lt;br /&gt;
//========================================================================&lt;br /&gt;
void main ()&lt;br /&gt;
{&lt;br /&gt;
	setup();&lt;br /&gt;
	t0_ini();&lt;br /&gt;
&lt;br /&gt;
	while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
[[Bild:Timer1-PIC16F690.png|right|thumb|Hardware Timer1 im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Timer1 ===&lt;br /&gt;
==== Timer1 Hardware ====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Bild:Timer2-PIC16F690.png|right|thumb|Hardware Timer2 im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== Timer2 ===&lt;br /&gt;
==== Timer2 Hardware ====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Bild:AD-Wandler-PIC16F690.png|right|thumb|Hardware AD-Wandler im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== AD-Wandler ===&lt;br /&gt;
==== Hardware AD-Wandler ====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Bild:PWM-PIC16F690.png|thumb|right|Hardware PWM im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== PWM ===&lt;br /&gt;
==== PWM Hardware ====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Bild:EUSART-TX-PIC16F690.png|thumb|right|Hardware EUSART im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Bild:EUSART-RX-PIC16F690.png|thumb|right|Hardware EUSART im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== EUSART ===&lt;br /&gt;
==== EUSART Hardware ====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Bild:SPI-PIC16F690.png|thumb|right|Hardware SPI im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== SPI ===&lt;br /&gt;
==== SPI Hardware ====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Bild:I2C-PIC16F690.png|thumb|right|Hardware I2C im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== I2C ===&lt;br /&gt;
==== I2C Hardware ====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.microchip.com Homepage Microchip]&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplgidcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1335&amp;amp;dDocName=en023112 Produktseite PIC16F690]&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/41262E.pdf Datenblatt PIC16F690]&lt;br /&gt;
* [http://www.htsoft.com HiTech Software]&lt;br /&gt;
* [http://www.sprut.de Sprut -&amp;gt; DIE deutschsprachige Seite zum Thema PIC]&lt;br /&gt;
* ...&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
* Timer0, Timer1, Timer2&lt;br /&gt;
* AD-Wandler&lt;br /&gt;
* PWM&lt;br /&gt;
* Eusart&lt;br /&gt;
* Komparator&lt;br /&gt;
* SPI&lt;br /&gt;
* I2C&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Wettbewerb|P]]&lt;br /&gt;
[[Category:PIC|P]]&lt;/div&gt;</summary>
		<author><name>Thomas1123</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=PIC_Codebeispiele&amp;diff=28724</id>
		<title>PIC Codebeispiele</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=PIC_Codebeispiele&amp;diff=28724"/>
		<updated>2008-06-27T00:50:40Z</updated>

		<summary type="html">&lt;p&gt;Thomas1123: /* Timer0 Hardware */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von [[Benutzer:Thomas1123|Thomas1123]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ich persönlich benutze den Hitech PIC-C Lite Compiler für meine Projekte.&amp;lt;br/&amp;gt;&lt;br /&gt;
Hierbei handelt es sich um die abgespeckte Version des Hitech PIC-C Compilers von der Firma HiTech Software.&amp;lt;br/&amp;gt;&lt;br /&gt;
Ich möchte hier eine Sammlung von Codebeispielen beginnen mit der es Einsteigern ermöglicht wird verschiedene interne und externe Pereferie zu initialiesieren und zu benutzen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Da der [http://www.microchip.com/stellent/idcplgidcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1335&amp;amp;dDocName=en023112 PIC16F690] mein persönlicher Liebling ist möchte ich die hier gezeigten Beispiele anhand dieses PICs aufzeigen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Selbstverständlich kann dieser Artikel noch mit Codebeispielen für cc5x und ASM erweitert werden, des Weiteren kann man auch Beispiele für andere PICs der 10er, 12er, und 16er Kategorie einfügen.&lt;br /&gt;
&lt;br /&gt;
== Pinbelegung ==&lt;br /&gt;
[[Bild:PIC16F690-Pins.png|center|Pinbelegung des PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC16F690 verfügt über eine grosse Anzahl an interner Pereferie beispielsweise 10-Bit AD-Wandler, SPI/I2C Interface, mehrere Timer (2*8-Bit 1*16-Bit), EUSART (RS232 etc.) usw.&lt;br /&gt;
&lt;br /&gt;
== Codebeispiele ==&lt;br /&gt;
----&lt;br /&gt;
=== Timer0 ===&lt;br /&gt;
==== Timer0 Hardware ====&lt;br /&gt;
[[Bild:Timer0-PIC16F690.png|thumb|right|Hardware Timer0 und WDT im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
Der Timer0 ist ein 8-Bit Timer/Zähler, welcher entweder mit dem internen Takt des PIC oder mit einer externen Taktquelle am Pin 17 (RA2/T0CKI) Betrieben werden kann. Beim Betrieb mit einer externen Taktquelle kann man zusätzlich auswählen ob bei einer steigenden oder fallenden Flanke das Timerregister inkrementiert werden soll. Gleich welche Taktquelle gewählt wird, kann bei einem Überlauf des Timerregisters ein Interrupt ausgelöst werden. Hierfür ist es notwendig die Bits &#039;&#039;&#039;GIE&#039;&#039;&#039; und &#039;&#039;&#039;T0IE&#039;&#039;&#039; auf 1 zu setzen. Beide Bits befinden sich im &#039;&#039;&#039;INTCON&#039;&#039;&#039;-Register und sind im Datenblatt auf Seite 38 zu finden.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Im nebenstehendem Diagramm ist der aufbau des Timer0 zusammen mit dem Watchdogtimer dargestellt.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Im Option Register (&#039;&#039;&#039;OPTION&#039;&#039;&#039; Datenblatt Seite 83) kann mit Bit 5 (&#039;&#039;&#039;T0CS&#039;&#039;&#039;) ausgewählt werden ob der interne Takt (0) oder ein externer Takt (1) verwendet wird. Bei einem externen Takt kann mit Bit 4 (&#039;&#039;&#039;T0SE&#039;&#039;&#039;) auswählen ob bei einer steigenden (0) oder bei einer fallenden Flanke (1) das Timer0-Register inkrenemtiert werden soll. Mit Bit 3 (&#039;&#039;&#039;PSA&#039;&#039;&#039;) wird der Prescaler entweder dem Timer (0) &#039;&#039;&#039;oder&#039;&#039;&#039; dem Watchdogtimer (1) zugewiesen. Der Prescaler selbst wird mit den Bits 0 bis 2 (&#039;&#039;&#039;PS0 PS1 PS2&#039;&#039;&#039;) des Option Registers eingestellt.&amp;lt;br/&amp;gt;&lt;br /&gt;
Eine Übersicht der Einstellmöglichkeiten ist auf Seite 83 im Datenblatt einsehbar.&lt;br /&gt;
&lt;br /&gt;
==== Timer0 Codebeispiel ====&lt;br /&gt;
&#039;&#039;Szenario:&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC verwendet als externe Taktquelle einen 32,768 kHz Uhrenquarz.&amp;lt;br/&amp;gt;&lt;br /&gt;
An PORTB sind 8 LEDs mit Vorwiederständen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Jede Sekunde soll PORTB um den Wert 1 inkrementiert werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
Zu diesem Zweck wird der Timer0 mit Prescaler verwendet.&amp;lt;br/&amp;gt;&lt;br /&gt;
Die Einstellungen des Prescaler errechenen sich wie folgt:&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{Fosc}{4*Prescaler*2^8}= t \,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fosc/4 weil der PIC für eine Anweisung 4 Takte benötigt.&amp;lt;br/&amp;gt;&lt;br /&gt;
Der Prescaler als zusätzlicher Teiler des Timertaktes.&amp;lt;br/&amp;gt;&lt;br /&gt;
2^8 (256) Schritte benötigt der Timer 0 zum Überlauf.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{32768Hz}{4*2^8*32}= \frac {1}{Sek}\,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei einem Prescaler von 1:32 lösen wir somit exakt jede Sekunde einen Interrupt aus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
static void interrupt global_int(void)&lt;br /&gt;
{&lt;br /&gt;
	GIE = 0;		// Alle Interruptquellen ausschalten&lt;br /&gt;
	T0IF = 0;		// Timer1 Interruptflag Löschen&lt;br /&gt;
	PORTB++;		// PORTB inkrementieren&lt;br /&gt;
	GIE = 1;		// Interrupts wieder einschalten&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void t0_ini ()&lt;br /&gt;
{&lt;br /&gt;
				// Datenblatt Seite 83&lt;br /&gt;
	OPTION 	= 0b11000100;		&lt;br /&gt;
		 // 1-------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // -1------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // --0-----	Internen Takt für Timer0 verwenden&lt;br /&gt;
		 // ---0----	Bei externem Takt an steigender Flanke inkrementieren&lt;br /&gt;
		 // 		(in diesem Fall egal ob 1 oder 0 weil der interne Takt verwendet wird)&lt;br /&gt;
		 // ----0---	Prescaler für Timer0 verwenden&lt;br /&gt;
		 // -----100	Prescaler 1:32&lt;br /&gt;
&lt;br /&gt;
	T0IF	= 0;		// Interruptflag von Timer0 löschen&lt;br /&gt;
	GIE 	= 1;		// Alle nichtmaskierten Interrupts erlauben&lt;br /&gt;
	T0IE 	= 1;		// Timer0 Interrupt erlauben&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
	ANSEL = 0b00000000;		// Pins als digital I/O &lt;br /&gt;
	ANSELH = 0b00000000;		// Pins als digital I/O&lt;br /&gt;
	PORTA = 0;			// Latch von Port A,B und C löschen&lt;br /&gt;
	PORTB = 0;&lt;br /&gt;
	PORTC = 0;&lt;br /&gt;
	TRISA = 0b00000000;		// Port A,B und C als Ausgänge schalten&lt;br /&gt;
	TRISB = 0b00000000;&lt;br /&gt;
	TRISC = 0b00000000;&lt;br /&gt;
}&lt;br /&gt;
//========================================================================&lt;br /&gt;
void main ()&lt;br /&gt;
{&lt;br /&gt;
	setup();&lt;br /&gt;
	t0_ini();&lt;br /&gt;
&lt;br /&gt;
	while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
[[Bild:Timer1-PIC16F690.png|right|thumb|Hardware Timer1 im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Timer1 ===&lt;br /&gt;
==== Timer1 Hardware ====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Bild:Timer2-PIC16F690.png|right|thumb|Hardware Timer2 im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== Timer2 ===&lt;br /&gt;
==== Timer2 Hardware ====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Bild:AD-Wandler-PIC16F690.png|right|thumb|Hardware AD-Wandler im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== AD-Wandler ===&lt;br /&gt;
==== Hardware AD-Wandler ====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Bild:PWM-PIC16F690.png|thumb|right|Hardware PWM im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== PWM ===&lt;br /&gt;
==== PWM Hardware ====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Bild:EUSART-TX-PIC16F690.png|thumb|right|Hardware EUSART im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Bild:EUSART-RX-PIC16F690.png|thumb|right|Hardware EUSART im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== EUSART ===&lt;br /&gt;
==== EUSART Hardware ====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Bild:SPI-PIC16F690.png|thumb|right|Hardware SPI im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== SPI ===&lt;br /&gt;
==== SPI Hardware ====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Bild:I2C-PIC16F690.png|thumb|right|Hardware I2C im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== I2C ===&lt;br /&gt;
==== I2C Hardware ====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.microchip.com Homepage Microchip]&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplgidcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1335&amp;amp;dDocName=en023112 Produktseite PIC16F690]&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/41262E.pdf Datenblatt PIC16F690]&lt;br /&gt;
* [http://www.htsoft.com HiTech Software]&lt;br /&gt;
* [http://www.sprut.de Sprut -&amp;gt; DIE deutschsprachige Seite zum Thema PIC]&lt;br /&gt;
* ...&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
* Timer0, Timer1, Timer2&lt;br /&gt;
* AD-Wandler&lt;br /&gt;
* PWM&lt;br /&gt;
* Eusart&lt;br /&gt;
* Komparator&lt;br /&gt;
* SPI&lt;br /&gt;
* I2C&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Wettbewerb|P]]&lt;br /&gt;
[[Category:PIC|P]]&lt;/div&gt;</summary>
		<author><name>Thomas1123</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=PIC_Codebeispiele&amp;diff=28723</id>
		<title>PIC Codebeispiele</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=PIC_Codebeispiele&amp;diff=28723"/>
		<updated>2008-06-27T00:39:09Z</updated>

		<summary type="html">&lt;p&gt;Thomas1123: /* Timer0 Codebeispiel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von [[Benutzer:Thomas1123|Thomas1123]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ich persönlich benutze den Hitech PIC-C Lite Compiler für meine Projekte.&amp;lt;br/&amp;gt;&lt;br /&gt;
Hierbei handelt es sich um die abgespeckte Version des Hitech PIC-C Compilers von der Firma HiTech Software.&amp;lt;br/&amp;gt;&lt;br /&gt;
Ich möchte hier eine Sammlung von Codebeispielen beginnen mit der es Einsteigern ermöglicht wird verschiedene interne und externe Pereferie zu initialiesieren und zu benutzen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Da der [http://www.microchip.com/stellent/idcplgidcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1335&amp;amp;dDocName=en023112 PIC16F690] mein persönlicher Liebling ist möchte ich die hier gezeigten Beispiele anhand dieses PICs aufzeigen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Selbstverständlich kann dieser Artikel noch mit Codebeispielen für cc5x und ASM erweitert werden, des Weiteren kann man auch Beispiele für andere PICs der 10er, 12er, und 16er Kategorie einfügen.&lt;br /&gt;
&lt;br /&gt;
== Pinbelegung ==&lt;br /&gt;
[[Bild:PIC16F690-Pins.png|center|Pinbelegung des PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC16F690 verfügt über eine grosse Anzahl an interner Pereferie beispielsweise 10-Bit AD-Wandler, SPI/I2C Interface, mehrere Timer (2*8-Bit 1*16-Bit), EUSART (RS232 etc.) usw.&lt;br /&gt;
&lt;br /&gt;
== Codebeispiele ==&lt;br /&gt;
----&lt;br /&gt;
=== Timer0 ===&lt;br /&gt;
==== Timer0 Hardware ====&lt;br /&gt;
[[Bild:Timer0-PIC16F690.png|thumb|right|Hardware Timer0 und WDT im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
Der Timer0 ist ein 8-Bit Timer/Zähler, welcher entweder mit dem internen Takt des PIC oder mit einer externen Taktquelle am Pin 17 (RA2/T0CKI) Betrieben werden kann. Beim Betrieb mit einer externen Taktquelle kann man zusätzlich auswählen ob bei einer steigenden oder fallenden Flanke das Timerregister inkrementiert werden soll. Gleich welche Taktquelle gewählt wird, kann bei einem Überlauf des Timerregisters ein Interrupt ausgelöst werden. Hierfür ist es notwendig die Bits &#039;&#039;&#039;GIE&#039;&#039;&#039; und &#039;&#039;&#039;T0IE&#039;&#039;&#039; auf 1 zu setzen. Beide Bits befinden sich im &#039;&#039;&#039;INTCON&#039;&#039;&#039;-Register und sind im Datenblatt auf Seite 38 zu finden.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Im nebenstehendem Diagramm ist der aufbau des Timer0 zusammen mit dem Watchdogtimer dargestellt.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Im Option Register (&#039;&#039;&#039;OPTION&#039;&#039;&#039; Datenblatt Seite 83) kann mit Bit 5 (&#039;&#039;&#039;T0CS&#039;&#039;&#039;) ausgewählt werden ob der interne Takt (0) oder ein externer Takt (1) verwendet wird. Bei einem externen Takt kann mit Bit 4 (&#039;&#039;&#039;T0SE&#039;&#039;&#039;) auswählen ob bei einer steigenden (0) oder bei einer fallenden Flanke (1) das Timer0-Register inkrenemtiert werden soll. Mit Bit 3 (&#039;&#039;&#039;PSA&#039;&#039;&#039;) wird der Prescaler entweder dem Timer (0) oder dem Watchdogtimer (1) zugewiesen. Der Prescaler selbst wird mit den Bits 0 bis 2 (&#039;&#039;&#039;PS0 PS1 PS2&#039;&#039;&#039;) des Option Registers eingestellt.&amp;lt;br/&amp;gt;&lt;br /&gt;
Eine Übersicht der Einstellmöglichkeiten ist auf Seite 83 im Datenblatt einsehbar.&lt;br /&gt;
&lt;br /&gt;
==== Timer0 Codebeispiel ====&lt;br /&gt;
&#039;&#039;Szenario:&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC verwendet als externe Taktquelle einen 32,768 kHz Uhrenquarz.&amp;lt;br/&amp;gt;&lt;br /&gt;
An PORTB sind 8 LEDs mit Vorwiederständen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Jede Sekunde soll PORTB um den Wert 1 inkrementiert werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
Zu diesem Zweck wird der Timer0 mit Prescaler verwendet.&amp;lt;br/&amp;gt;&lt;br /&gt;
Die Einstellungen des Prescaler errechenen sich wie folgt:&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{Fosc}{4*Prescaler*2^8}= t \,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fosc/4 weil der PIC für eine Anweisung 4 Takte benötigt.&amp;lt;br/&amp;gt;&lt;br /&gt;
Der Prescaler als zusätzlicher Teiler des Timertaktes.&amp;lt;br/&amp;gt;&lt;br /&gt;
2^8 (256) Schritte benötigt der Timer 0 zum Überlauf.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{32768Hz}{4*2^8*32}= \frac {1}{Sek}\,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei einem Prescaler von 1:32 lösen wir somit exakt jede Sekunde einen Interrupt aus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
static void interrupt global_int(void)&lt;br /&gt;
{&lt;br /&gt;
	GIE = 0;		// Alle Interruptquellen ausschalten&lt;br /&gt;
	T0IF = 0;		// Timer1 Interruptflag Löschen&lt;br /&gt;
	PORTB++;		// PORTB inkrementieren&lt;br /&gt;
	GIE = 1;		// Interrupts wieder einschalten&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void t0_ini ()&lt;br /&gt;
{&lt;br /&gt;
				// Datenblatt Seite 83&lt;br /&gt;
	OPTION 	= 0b11000100;		&lt;br /&gt;
		 // 1-------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // -1------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // --0-----	Internen Takt für Timer0 verwenden&lt;br /&gt;
		 // ---0----	Bei externem Takt an steigender Flanke inkrementieren&lt;br /&gt;
		 // 		(in diesem Fall egal ob 1 oder 0 weil der interne Takt verwendet wird)&lt;br /&gt;
		 // ----0---	Prescaler für Timer0 verwenden&lt;br /&gt;
		 // -----100	Prescaler 1:32&lt;br /&gt;
&lt;br /&gt;
	T0IF	= 0;		// Interruptflag von Timer0 löschen&lt;br /&gt;
	GIE 	= 1;		// Alle nichtmaskierten Interrupts erlauben&lt;br /&gt;
	T0IE 	= 1;		// Timer0 Interrupt erlauben&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
	ANSEL = 0b00000000;		// Pins als digital I/O &lt;br /&gt;
	ANSELH = 0b00000000;		// Pins als digital I/O&lt;br /&gt;
	PORTA = 0;			// Latch von Port A,B und C löschen&lt;br /&gt;
	PORTB = 0;&lt;br /&gt;
	PORTC = 0;&lt;br /&gt;
	TRISA = 0b00000000;		// Port A,B und C als Ausgänge schalten&lt;br /&gt;
	TRISB = 0b00000000;&lt;br /&gt;
	TRISC = 0b00000000;&lt;br /&gt;
}&lt;br /&gt;
//========================================================================&lt;br /&gt;
void main ()&lt;br /&gt;
{&lt;br /&gt;
	setup();&lt;br /&gt;
	t0_ini();&lt;br /&gt;
&lt;br /&gt;
	while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
[[Bild:Timer1-PIC16F690.png|right|thumb|Hardware Timer1 im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Timer1 ===&lt;br /&gt;
==== Timer1 Hardware ====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Bild:Timer2-PIC16F690.png|right|thumb|Hardware Timer2 im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== Timer2 ===&lt;br /&gt;
==== Timer2 Hardware ====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Bild:AD-Wandler-PIC16F690.png|right|thumb|Hardware AD-Wandler im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== AD-Wandler ===&lt;br /&gt;
==== Hardware AD-Wandler ====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Bild:PWM-PIC16F690.png|thumb|right|Hardware PWM im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== PWM ===&lt;br /&gt;
==== PWM Hardware ====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Bild:EUSART-TX-PIC16F690.png|thumb|right|Hardware EUSART im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Bild:EUSART-RX-PIC16F690.png|thumb|right|Hardware EUSART im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== EUSART ===&lt;br /&gt;
==== EUSART Hardware ====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Bild:SPI-PIC16F690.png|thumb|right|Hardware SPI im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== SPI ===&lt;br /&gt;
==== SPI Hardware ====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Bild:I2C-PIC16F690.png|thumb|right|Hardware I2C im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== I2C ===&lt;br /&gt;
==== I2C Hardware ====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.microchip.com Homepage Microchip]&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplgidcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1335&amp;amp;dDocName=en023112 Produktseite PIC16F690]&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/41262E.pdf Datenblatt PIC16F690]&lt;br /&gt;
* [http://www.htsoft.com HiTech Software]&lt;br /&gt;
* [http://www.sprut.de Sprut -&amp;gt; DIE deutschsprachige Seite zum Thema PIC]&lt;br /&gt;
* ...&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
* Timer0, Timer1, Timer2&lt;br /&gt;
* AD-Wandler&lt;br /&gt;
* PWM&lt;br /&gt;
* Eusart&lt;br /&gt;
* Komparator&lt;br /&gt;
* SPI&lt;br /&gt;
* I2C&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Wettbewerb|P]]&lt;br /&gt;
[[Category:PIC|P]]&lt;/div&gt;</summary>
		<author><name>Thomas1123</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Kategorie:PIC&amp;diff=28722</id>
		<title>Kategorie:PIC</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Kategorie:PIC&amp;diff=28722"/>
		<updated>2008-06-27T00:36:17Z</updated>

		<summary type="html">&lt;p&gt;Thomas1123: Die Seite wurde neu angelegt: Artikel mit Bezug auf PIC-Mikrokontroller&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Artikel mit Bezug auf PIC-Mikrokontroller&lt;/div&gt;</summary>
		<author><name>Thomas1123</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=PIC_Codebeispiele&amp;diff=28721</id>
		<title>PIC Codebeispiele</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=PIC_Codebeispiele&amp;diff=28721"/>
		<updated>2008-06-27T00:28:46Z</updated>

		<summary type="html">&lt;p&gt;Thomas1123: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von [[Benutzer:Thomas1123|Thomas1123]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ich persönlich benutze den Hitech PIC-C Lite Compiler für meine Projekte.&amp;lt;br/&amp;gt;&lt;br /&gt;
Hierbei handelt es sich um die abgespeckte Version des Hitech PIC-C Compilers von der Firma HiTech Software.&amp;lt;br/&amp;gt;&lt;br /&gt;
Ich möchte hier eine Sammlung von Codebeispielen beginnen mit der es Einsteigern ermöglicht wird verschiedene interne und externe Pereferie zu initialiesieren und zu benutzen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Da der [http://www.microchip.com/stellent/idcplgidcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1335&amp;amp;dDocName=en023112 PIC16F690] mein persönlicher Liebling ist möchte ich die hier gezeigten Beispiele anhand dieses PICs aufzeigen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Selbstverständlich kann dieser Artikel noch mit Codebeispielen für cc5x und ASM erweitert werden, des Weiteren kann man auch Beispiele für andere PICs der 10er, 12er, und 16er Kategorie einfügen.&lt;br /&gt;
&lt;br /&gt;
== Pinbelegung ==&lt;br /&gt;
[[Bild:PIC16F690-Pins.png|center|Pinbelegung des PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC16F690 verfügt über eine grosse Anzahl an interner Pereferie beispielsweise 10-Bit AD-Wandler, SPI/I2C Interface, mehrere Timer (2*8-Bit 1*16-Bit), EUSART (RS232 etc.) usw.&lt;br /&gt;
&lt;br /&gt;
== Codebeispiele ==&lt;br /&gt;
----&lt;br /&gt;
=== Timer0 ===&lt;br /&gt;
==== Timer0 Hardware ====&lt;br /&gt;
[[Bild:Timer0-PIC16F690.png|thumb|right|Hardware Timer0 und WDT im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
Der Timer0 ist ein 8-Bit Timer/Zähler, welcher entweder mit dem internen Takt des PIC oder mit einer externen Taktquelle am Pin 17 (RA2/T0CKI) Betrieben werden kann. Beim Betrieb mit einer externen Taktquelle kann man zusätzlich auswählen ob bei einer steigenden oder fallenden Flanke das Timerregister inkrementiert werden soll. Gleich welche Taktquelle gewählt wird, kann bei einem Überlauf des Timerregisters ein Interrupt ausgelöst werden. Hierfür ist es notwendig die Bits &#039;&#039;&#039;GIE&#039;&#039;&#039; und &#039;&#039;&#039;T0IE&#039;&#039;&#039; auf 1 zu setzen. Beide Bits befinden sich im &#039;&#039;&#039;INTCON&#039;&#039;&#039;-Register und sind im Datenblatt auf Seite 38 zu finden.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Im nebenstehendem Diagramm ist der aufbau des Timer0 zusammen mit dem Watchdogtimer dargestellt.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Im Option Register (&#039;&#039;&#039;OPTION&#039;&#039;&#039; Datenblatt Seite 83) kann mit Bit 5 (&#039;&#039;&#039;T0CS&#039;&#039;&#039;) ausgewählt werden ob der interne Takt (0) oder ein externer Takt (1) verwendet wird. Bei einem externen Takt kann mit Bit 4 (&#039;&#039;&#039;T0SE&#039;&#039;&#039;) auswählen ob bei einer steigenden (0) oder bei einer fallenden Flanke (1) das Timer0-Register inkrenemtiert werden soll. Mit Bit 3 (&#039;&#039;&#039;PSA&#039;&#039;&#039;) wird der Prescaler entweder dem Timer (0) oder dem Watchdogtimer (1) zugewiesen. Der Prescaler selbst wird mit den Bits 0 bis 2 (&#039;&#039;&#039;PS0 PS1 PS2&#039;&#039;&#039;) des Option Registers eingestellt.&amp;lt;br/&amp;gt;&lt;br /&gt;
Eine Übersicht der Einstellmöglichkeiten ist auf Seite 83 im Datenblatt einsehbar.&lt;br /&gt;
&lt;br /&gt;
==== Timer0 Codebeispiel ====&lt;br /&gt;
&#039;&#039;Szenario:&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC verwendet als externe Taktquelle einen 32,768 kHz Uhrenquarz.&amp;lt;br/&amp;gt;&lt;br /&gt;
An PORTB sind 8 LEDs mit Vorwiederständen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Jede Sekunde soll PORTB um den Wert 1 inkrementiert werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
Zu diesem Zweck wird der Timer0 mit Prescaler verwendet.&amp;lt;br/&amp;gt;&lt;br /&gt;
Die Einstellungen des Prescaler errechenen sich wie folgt:&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{Fosc}{4*Prescaler*2^8}= t \,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fosc/4 weil der PIC für eine Anweisung 4 Takte benötigt.&amp;lt;br/&amp;gt;&lt;br /&gt;
Der Prescaler als zusätzlicher Teiler des Timertaktes.&amp;lt;br/&amp;gt;&lt;br /&gt;
2^8 (256) Schritte benörigt der Timer 0 zum Überlauf.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{32768Hz}{4*2^8*32}= \frac {1}{Sek}\,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei einem Prescaler von 1:32 lösen wir somit exakt jede Sekunde einen Interrupt aus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
static void interrupt global_int(void)&lt;br /&gt;
{&lt;br /&gt;
	GIE = 0;		// Alle Interruptquellen ausschalten&lt;br /&gt;
	T0IF = 0;		// Timer1 Interruptflag Löschen&lt;br /&gt;
	PORTB++;		// PORTB inkrementieren&lt;br /&gt;
	GIE = 1;		// Interrupts wieder einschalten&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void t0_ini ()&lt;br /&gt;
{&lt;br /&gt;
				// Datenblatt Seite 83&lt;br /&gt;
	OPTION 	= 0b11000100;		&lt;br /&gt;
		 // 1-------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // -1------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // --0-----	Internen Takt für Timer0 verwenden&lt;br /&gt;
		 // ---0----	Bei externem Takt an steigender Flanke inkrementieren&lt;br /&gt;
		 // 		(in diesem Fall egal ob 1 oder 0 weil der interne Takt verwendet wird)&lt;br /&gt;
		 // ----0---	Prescaler für Timer0 verwenden&lt;br /&gt;
		 // -----100	Prescaler 1:32&lt;br /&gt;
&lt;br /&gt;
	T0IF	= 0;		// Interruptflag von Timer0 löschen&lt;br /&gt;
	GIE 	= 1;		// Alle nichtmaskierten Interrupts erlauben&lt;br /&gt;
	T0IE 	= 1;		// Timer0 Interrupt erlauben&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
	ANSEL = 0b00000000;		// Pins als digital I/O &lt;br /&gt;
	ANSELH = 0b00000000;		// Pins als digital I/O&lt;br /&gt;
	PORTA = 0;			// Latch von Port A,B und C löschen&lt;br /&gt;
	PORTB = 0;&lt;br /&gt;
	PORTC = 0;&lt;br /&gt;
	TRISA = 0b00000000;		// Port A,B und C als Ausgänge schalten&lt;br /&gt;
	TRISB = 0b00000000;&lt;br /&gt;
	TRISC = 0b00000000;&lt;br /&gt;
}&lt;br /&gt;
//========================================================================&lt;br /&gt;
void main ()&lt;br /&gt;
{&lt;br /&gt;
	setup();&lt;br /&gt;
	t0_ini();&lt;br /&gt;
&lt;br /&gt;
	while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
[[Bild:Timer1-PIC16F690.png|right|thumb|Hardware Timer1 im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== Timer1 ===&lt;br /&gt;
==== Timer1 Hardware ====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Bild:Timer2-PIC16F690.png|right|thumb|Hardware Timer2 im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== Timer2 ===&lt;br /&gt;
==== Timer2 Hardware ====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Bild:AD-Wandler-PIC16F690.png|right|thumb|Hardware AD-Wandler im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== AD-Wandler ===&lt;br /&gt;
==== Hardware AD-Wandler ====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Bild:PWM-PIC16F690.png|thumb|right|Hardware PWM im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== PWM ===&lt;br /&gt;
==== PWM Hardware ====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Bild:EUSART-TX-PIC16F690.png|thumb|right|Hardware EUSART im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Bild:EUSART-RX-PIC16F690.png|thumb|right|Hardware EUSART im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== EUSART ===&lt;br /&gt;
==== EUSART Hardware ====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Bild:SPI-PIC16F690.png|thumb|right|Hardware SPI im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== SPI ===&lt;br /&gt;
==== SPI Hardware ====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Bild:I2C-PIC16F690.png|thumb|right|Hardware I2C im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== I2C ===&lt;br /&gt;
==== I2C Hardware ====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.microchip.com Homepage Microchip]&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplgidcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1335&amp;amp;dDocName=en023112 Produktseite PIC16F690]&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/41262E.pdf Datenblatt PIC16F690]&lt;br /&gt;
* [http://www.htsoft.com HiTech Software]&lt;br /&gt;
* [http://www.sprut.de Sprut -&amp;gt; DIE deutschsprachige Seite zum Thema PIC]&lt;br /&gt;
* ...&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
* Timer0, Timer1, Timer2&lt;br /&gt;
* AD-Wandler&lt;br /&gt;
* PWM&lt;br /&gt;
* Eusart&lt;br /&gt;
* Komparator&lt;br /&gt;
* SPI&lt;br /&gt;
* I2C&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Wettbewerb|P]]&lt;br /&gt;
[[Category:PIC|P]]&lt;/div&gt;</summary>
		<author><name>Thomas1123</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=PIC_Codebeispiele&amp;diff=28720</id>
		<title>PIC Codebeispiele</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=PIC_Codebeispiele&amp;diff=28720"/>
		<updated>2008-06-27T00:13:41Z</updated>

		<summary type="html">&lt;p&gt;Thomas1123: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von Thomas1123&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ich persönlich benutze den Hitech PIC-C Lite Compiler für meine Projekte.&amp;lt;br/&amp;gt;&lt;br /&gt;
Hierbei handelt es sich um die abgespeckte Version des Hitech PIC-C Compilers von der Firma HiTech Software.&amp;lt;br/&amp;gt;&lt;br /&gt;
Ich möchte hier eine Sammlung von Codebeispielen beginnen mit der es Einsteigern ermöglicht wird verschiedene interne und externe Pereferie zu initialiesieren und zu benutzen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Da der [http://www.microchip.com/stellent/idcplgidcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1335&amp;amp;dDocName=en023112 PIC16F690] mein persönlicher Liebling ist möchte ich die hier gezeigten Beispiele anhand dieses PICs aufzeigen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Selbstverständlich kann dieser Artikel noch mit Codebeispielen für cc5x und ASM erweitert werden, des Weiteren kann man auch Beispiele für andere PICs der 10er, 12er, und 16er Kategorie einfügen.&lt;br /&gt;
&lt;br /&gt;
== Pinbelegung ==&lt;br /&gt;
[[Bild:PIC16F690-Pins.png|center|Pinbelegung des PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC16F690 verfügt über eine grosse Anzahl an interner Pereferie beispielsweise 10-Bit AD-Wandler, SPI/I2C Interface, mehrere Timer (2*8-Bit 1*16-Bit), EUSART (RS232 etc.) usw.&lt;br /&gt;
&lt;br /&gt;
== Codebeispiele ==&lt;br /&gt;
----&lt;br /&gt;
=== Timer0 ===&lt;br /&gt;
==== Timer0 Hardware ====&lt;br /&gt;
[[Bild:Timer0-PIC16F690.png|thumb|right|Hardware Timer0 und WDT im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
Der Timer0 ist ein 8-Bit Timer/Zähler, welcher entweder mit dem internen Takt des PIC oder mit einer externen Taktquelle am Pin 17 (RA2/T0CKI) Betrieben werden kann. Beim Betrieb mit einer externen Taktquelle kann man zusätzlich auswählen ob bei einer steigenden oder fallenden Flanke das Timerregister inkrementiert werden soll. Gleich welche Taktquelle gewählt wird, kann bei einem Überlauf des Timerregisters ein Interrupt ausgelöst werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Im nebenstehendem Diagramm ist der aufbau des Timer0 zusammen mit dem Watchdogtimer dargestellt.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Im Option Register (&#039;&#039;&#039;OPTION&#039;&#039;&#039; Datenblatt Seite 83) kann mit Bit 5 (&#039;&#039;&#039;T0CS&#039;&#039;&#039;) ausgewählt werden ob der interne Takt (0) oder ein externer Takt (1) verwendet wird. Bei einem externen Takt kann mit Bit 4 (&#039;&#039;&#039;T0SE&#039;&#039;&#039;) auswählen ob bei einer steigenden (0) oder bei einer fallenden Flanke (1) das Timer0-Register inkrenemtiert werden soll. Mit Bit 3 (&#039;&#039;&#039;PSA&#039;&#039;&#039;) wird der Prescaler entweder dem Timer (0) oder dem Watchdogtimer (1) zugewiesen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Der Prescaler selbst wird mit den Bits 0 bis 2 (&#039;&#039;&#039;PS0 PS1 PS2&#039;&#039;&#039;) des Option Registers eingestellt.&amp;lt;br/&amp;gt;&lt;br /&gt;
Eine Übersicht der Einstellmöglichkeiten ist auf Seite 83 im Datenblatt einsehbar.&lt;br /&gt;
&lt;br /&gt;
==== Timer0 Codebeispiel ====&lt;br /&gt;
&#039;&#039;Szenario:&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC verwendet als externe Taktquelle einen 32,768 kHz Uhrenquarz.&amp;lt;br/&amp;gt;&lt;br /&gt;
An PORTB sind 8 LEDs mit Vorwiederständen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Jede Sekunde soll PORTB um den Wert 1 inkrementiert werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
Zu diesem Zweck wird der Timer0 mit Prescaler verwendet.&amp;lt;br/&amp;gt;&lt;br /&gt;
Die Einstellungen des Prescaler errechenen sich wie folgt:&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{Fosc}{4*Prescaler*2^8}= t \,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fosc/4 weil der PIC für eine Anweisung 4 Takte benötigt.&amp;lt;br/&amp;gt;&lt;br /&gt;
Der Prescaler als zusätzlicher Teiler des Timertaktes.&amp;lt;br/&amp;gt;&lt;br /&gt;
2^8 (256) Schritte benörigt der Timer 0 zum Überlauf.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{32768Hz}{4*2^8*32}= \frac {1}{Sek}\,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bei einem Prescaler von 1:32 lösen wir somit exakt jede Sekunde einen Interrupt aus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
static void interrupt global_int(void)&lt;br /&gt;
{&lt;br /&gt;
	GIE = 0;		// Alle Interruptquellen ausschalten&lt;br /&gt;
	T0IF = 0;		// Timer1 Interruptflag Löschen&lt;br /&gt;
	PORTB++;		// PORTB inkrementieren&lt;br /&gt;
	GIE = 1;		// Interrupts wieder einschalten&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void t0_ini ()&lt;br /&gt;
{&lt;br /&gt;
				// Datenblatt Seite 83&lt;br /&gt;
	OPTION 	= 0b11000100;		&lt;br /&gt;
		 // 1-------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // -1------	(Betrifft nicht Timer0)&lt;br /&gt;
		 // --0-----	Internen Takt für Timer0 verwenden&lt;br /&gt;
		 // ---0----	Bei externem Takt an steigender Flanke inkrementieren&lt;br /&gt;
		 // 		(in diesem Fall egal ob 1 oder 0 weil der interne Takt verwendet wird)&lt;br /&gt;
		 // ----0---	Prescaler für Timer0 verwenden&lt;br /&gt;
		 // -----100	Prescaler 1:32&lt;br /&gt;
&lt;br /&gt;
	T0IF	= 0;		// Interruptflag von Timer0 löschen&lt;br /&gt;
	GIE 	= 1;		// Alle nichtmaskierten Interrupts erlauben&lt;br /&gt;
	T0IE 	= 1;		// Timer0 Interrupt erlauben&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
//------------------------------------------------------------------------&lt;br /&gt;
void setup ()&lt;br /&gt;
{&lt;br /&gt;
	ANSEL = 0b00000000;		// Pins als digital I/O &lt;br /&gt;
	ANSELH = 0b00000000;		// Pins als digital I/O&lt;br /&gt;
	PORTA = 0;			// Latch von Port A,B und C löschen&lt;br /&gt;
	PORTB = 0;&lt;br /&gt;
	PORTC = 0;&lt;br /&gt;
	TRISA = 0b00000000;		// Port A,B und C als Ausgänge schalten&lt;br /&gt;
	TRISB = 0b00000000;&lt;br /&gt;
	TRISC = 0b00000000;&lt;br /&gt;
}&lt;br /&gt;
//========================================================================&lt;br /&gt;
void main ()&lt;br /&gt;
{&lt;br /&gt;
	setup();&lt;br /&gt;
	t0_ini();&lt;br /&gt;
&lt;br /&gt;
	while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
[[Bild:Timer1-PIC16F690.png|right|thumb|Hardware Timer1 im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== Timer1 ===&lt;br /&gt;
==== Timer1 Hardware ====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Bild:Timer2-PIC16F690.png|right|thumb|Hardware Timer2 im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== Timer2 ===&lt;br /&gt;
==== Timer2 Hardware ====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Bild:AD-Wandler-PIC16F690.png|right|thumb|Hardware AD-Wandler im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== AD-Wandler ===&lt;br /&gt;
==== Hardware AD-Wandler ====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Bild:PWM-PIC16F690.png|thumb|right|Hardware PWM im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== PWM ===&lt;br /&gt;
==== PWM Hardware ====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Bild:EUSART-TX-PIC16F690.png|thumb|right|Hardware EUSART im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Bild:EUSART-RX-PIC16F690.png|thumb|right|Hardware EUSART im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== EUSART ===&lt;br /&gt;
==== EUSART Hardware ====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Bild:SPI-PIC16F690.png|thumb|right|Hardware SPI im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== SPI ===&lt;br /&gt;
==== SPI Hardware ====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Bild:I2C-PIC16F690.png|thumb|right|Hardware I2C im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== I2C ===&lt;br /&gt;
==== I2C Hardware ====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.microchip.com Homepage Microchip]&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplgidcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1335&amp;amp;dDocName=en023112 Produktseite PIC16F690]&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/DeviceDoc/41262E.pdf Datenblatt PIC16F690]&lt;br /&gt;
* [http://www.htsoft.com HiTech Software]&lt;br /&gt;
* [http://www.sprut.de Sprut -&amp;gt; DIE deutschsprachige Seite zum Thema PIC]&lt;br /&gt;
* ...&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
* Timer0, Timer1, Timer2&lt;br /&gt;
* AD-Wandler&lt;br /&gt;
* PWM&lt;br /&gt;
* Eusart&lt;br /&gt;
* Komparator&lt;br /&gt;
* SPI&lt;br /&gt;
* I2C&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Wettbewerb|P]]&lt;br /&gt;
[[Category:PIC|P]]&lt;/div&gt;</summary>
		<author><name>Thomas1123</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:I2C-PIC16F690.png&amp;diff=28719</id>
		<title>Datei:I2C-PIC16F690.png</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:I2C-PIC16F690.png&amp;diff=28719"/>
		<updated>2008-06-26T22:41:12Z</updated>

		<summary type="html">&lt;p&gt;Thomas1123: Das Bild ist aus dem Datenblatt des PIC16F690 rauskopiert Seite 184&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Das Bild ist aus dem Datenblatt des PIC16F690 rauskopiert Seite 184&lt;/div&gt;</summary>
		<author><name>Thomas1123</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:SPI-PIC16F690.png&amp;diff=28718</id>
		<title>Datei:SPI-PIC16F690.png</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:SPI-PIC16F690.png&amp;diff=28718"/>
		<updated>2008-06-26T22:38:31Z</updated>

		<summary type="html">&lt;p&gt;Thomas1123: Das Bild ist aus dem Datenblatt des PIC16F690 rauskopiert Seite 175&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Das Bild ist aus dem Datenblatt des PIC16F690 rauskopiert Seite 175&lt;/div&gt;</summary>
		<author><name>Thomas1123</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=PIC_Codebeispiele&amp;diff=28717</id>
		<title>PIC Codebeispiele</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=PIC_Codebeispiele&amp;diff=28717"/>
		<updated>2008-06-26T22:32:57Z</updated>

		<summary type="html">&lt;p&gt;Thomas1123: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von Thomas1123&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ich persönlich benutze den Hitech PIC-C Lite Compiler für meine Projekte.&amp;lt;br/&amp;gt;&lt;br /&gt;
Hierbei handelt es sich um die abgespeckte Version des Hitech PIC-C Compilers von der Firma HiTech Software.&amp;lt;br/&amp;gt;&lt;br /&gt;
Ich möchte hier eine Sammlung von Codebeispielen beginnen mit der es Einsteigern ermöglicht wird verschiedene interne und externe Pereferie zu initialiesieren und zu benutzen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Da der [http://www.microchip.com/stellent/idcplgidcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1335&amp;amp;dDocName=en023112 PIC16F690] mein persönlicher Liebling ist möchte ich die hier gezeigten Beispiele anhand dieses PICs aufzeigen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Selbstverständlich kann dieser Artikel noch mit Codebeispielen für cc5x und ASM erweitert werden, des Weiteren kann man auch Beispiele für andere PICs der 10er, 12er, und 16er Kategorie einfügen.&lt;br /&gt;
&lt;br /&gt;
== Pinbelegung ==&lt;br /&gt;
[[Bild:PIC16F690-Pins.png|center|Pinbelegung des PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC16F690 verfügt über eine grosse Anzahl an interner Pereferie beispielsweise 10-Bit AD-Wandler, SPI/I2C Interface, mehrere Timer (2*8-Bit 1*16-Bit), EUSART (RS232 etc.) usw.&lt;br /&gt;
&lt;br /&gt;
== Codebeispiele ==&lt;br /&gt;
----&lt;br /&gt;
=== Timer0 ===&lt;br /&gt;
==== Timer0 Hardware ====&lt;br /&gt;
[[Bild:Timer0-PIC16F690.png|thumb|right|Hardware Timer0 und WDT im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
Der Timer0 ist ein 8-Bit Timer/Zähler, welcher entweder mit dem internen Takt des PIC oder mit einer externen Taktquelle am Pin 17 (RA2/T0CKI) Betrieben werden kann. Beim Betrieb mit einer externen Taktquelle kann man zusätzlich auswählen ob bei einer steigenden oder fallenden Flanke das Timerregister inkrementiert werden soll. Gleich welche Taktquelle gewählt wird, kann bei einem Überlauf des Timerregisters ein Interrupt ausgelöst werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Im nebenstehendem Diagramm ist der aufbau des Timer0 zusammen mit dem Watchdogtimer dargestellt.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Im Option Register (&#039;&#039;&#039;OPTION&#039;&#039;&#039; Datenblatt Seite 83) kann mit Bit 5 (&#039;&#039;&#039;T0CS&#039;&#039;&#039;) ausgewählt werden ob der interne Takt (0) oder ein externer Takt (1) verwendet wird. Bei einem externen Takt kann mit Bit 4 (&#039;&#039;&#039;T0SE&#039;&#039;&#039;) auswählen ob bei einer steigenden (0) oder bei einer fallenden Flanke (1) das Timer0-Register inkrenemtiert werden soll.&amp;lt;br/&amp;gt;&lt;br /&gt;
Mit Bit 3 (&#039;&#039;&#039;PSA&#039;&#039;&#039;) wird der Prescaler entweder dem Timer (0) oder dem Watchdogtimer (1) zugewiesen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Der Prescaler selbst wird mit den Bits 0 bis 2 (&#039;&#039;&#039;PS0 PS1 PS2&#039;&#039;&#039;) des Option Registers eingestellt.&amp;lt;br/&amp;gt;&lt;br /&gt;
Eine Übersicht der Einstellmöglichkeiten ist auf Seite 83 im Datenblatt einsehbar.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Bild:Timer1-PIC16F690.png|right|thumb|Hardware Timer1 im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== Timer1 ===&lt;br /&gt;
==== Timer1 Hardware ====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Bild:Timer2-PIC16F690.png|right|thumb|Hardware Timer2 im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== Timer2 ===&lt;br /&gt;
==== Timer2 Hardware ====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Bild:AD-Wandler-PIC16F690.png|right|thumb|Hardware AD-Wandler im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== AD-Wandler ===&lt;br /&gt;
==== Hardware AD-Wandler ====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Bild:PWM-PIC16F690.png|thumb|right|Hardware PWM im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== PWM ===&lt;br /&gt;
==== PWM Hardware ====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Bild:EUSART-TX-PIC16F690.png|thumb|right|Hardware EUSART im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Bild:EUSART-RX-PIC16F690.png|thumb|right|Hardware EUSART im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== EUSART ===&lt;br /&gt;
==== EUSART Hardware ====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Bild:SPI-PIC16F690.png|thumb|right|Hardware SPI im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== SPI ===&lt;br /&gt;
==== SPI Hardware ====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Bild:I2C-PIC16F690.png|thumb|right|Hardware I2C im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== I2C ===&lt;br /&gt;
==== I2C Hardware ====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* [http://www.microchip.com Homepage Microchip]&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplgidcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1335&amp;amp;dDocName=en023112 Produktseite PIC16F690]&lt;br /&gt;
* [http://www.htsoft.com HiTech Software]&lt;br /&gt;
* [http://www.sprut.de Sprut -&amp;gt; DIE deutschsprachige Seite zum Thema PIC]&lt;br /&gt;
* ...&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
* Timer0, Timer1, Timer2&lt;br /&gt;
* AD-Wandler&lt;br /&gt;
* PWM&lt;br /&gt;
* Eusart&lt;br /&gt;
* Komparator&lt;br /&gt;
* SPI&lt;br /&gt;
* I2C&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Wettbewerb|P]]&lt;br /&gt;
[[Category:PIC|P]]&lt;/div&gt;</summary>
		<author><name>Thomas1123</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:EUSART-RX-PIC16F690.png&amp;diff=28716</id>
		<title>Datei:EUSART-RX-PIC16F690.png</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:EUSART-RX-PIC16F690.png&amp;diff=28716"/>
		<updated>2008-06-26T22:31:37Z</updated>

		<summary type="html">&lt;p&gt;Thomas1123: Das Bild ist aus dem Datenblatt des PIC16F690 rauskopiert Seite 150&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Das Bild ist aus dem Datenblatt des PIC16F690 rauskopiert Seite 150&lt;/div&gt;</summary>
		<author><name>Thomas1123</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:EUSART-TX-PIC16F690.png&amp;diff=28715</id>
		<title>Datei:EUSART-TX-PIC16F690.png</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:EUSART-TX-PIC16F690.png&amp;diff=28715"/>
		<updated>2008-06-26T22:31:17Z</updated>

		<summary type="html">&lt;p&gt;Thomas1123: Das Bild ist aus dem Datenblatt des PIC16F690 rauskopiert Seite 149&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Das Bild ist aus dem Datenblatt des PIC16F690 rauskopiert Seite 149&lt;/div&gt;</summary>
		<author><name>Thomas1123</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:PWM-PIC16F690.png&amp;diff=28714</id>
		<title>Datei:PWM-PIC16F690.png</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:PWM-PIC16F690.png&amp;diff=28714"/>
		<updated>2008-06-26T22:25:43Z</updated>

		<summary type="html">&lt;p&gt;Thomas1123: Das Bild ist aus dem Datenblatt des PIC16F690 rauskopiert Seite 130&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Das Bild ist aus dem Datenblatt des PIC16F690 rauskopiert Seite 130&lt;/div&gt;</summary>
		<author><name>Thomas1123</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=PIC_Codebeispiele&amp;diff=28713</id>
		<title>PIC Codebeispiele</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=PIC_Codebeispiele&amp;diff=28713"/>
		<updated>2008-06-26T22:08:05Z</updated>

		<summary type="html">&lt;p&gt;Thomas1123: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von Thomas1123&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ich persönlich benutze den Hitech PIC-C Lite Compiler für meine Projekte.&amp;lt;br/&amp;gt;&lt;br /&gt;
Hierbei handelt es sich um die abgespeckte Version des Hitech PIC-C Compilers von der Firma HiTech Software.&amp;lt;br/&amp;gt;&lt;br /&gt;
Ich möchte hier eine Sammlung von Codebeispielen beginnen mit der es Einsteigern ermöglicht wird verschiedene interne und externe Pereferie zu initialiesieren und zu benutzen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Da der [http://www.microchip.com/stellent/idcplgidcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1335&amp;amp;dDocName=en023112 PIC16F690] mein persönlicher Liebling ist möchte ich die hier gezeigten Beispiele anhand dieses PICs aufzeigen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Selbstverständlich kann dieser Artikel noch mit Codebeispielen für cc5x und ASM erweitert werden, des Weiteren kann man auch Beispiele für andere PICs der 10er, 12er, und 16er Kategorie einfügen.&lt;br /&gt;
&lt;br /&gt;
== Pinbelegung ==&lt;br /&gt;
[[Bild:PIC16F690-Pins.png|center|Pinbelegung des PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC16F690 verfügt über eine grosse Anzahl an interner Pereferie beispielsweise 10-Bit AD-Wandler, SPI/I2C Interface, mehrere Timer (2*8-Bit 1*16-Bit), EUSART (RS232 etc.) usw.&lt;br /&gt;
&lt;br /&gt;
== Codebeispiele ==&lt;br /&gt;
----&lt;br /&gt;
=== Timer0 ===&lt;br /&gt;
==== Timer0 Hardware ====&lt;br /&gt;
[[Bild:Timer0-PIC16F690.png|thumb|right|Hardware Timer0 und WDT im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
Der Timer0 ist ein 8-Bit Timer/Zähler, welcher entweder mit dem internen Takt des PIC oder mit einer externen Taktquelle am Pin 17 (RA2/T0CKI) Betrieben werden kann. Beim Betrieb mit einer externen Taktquelle kann man zusätzlich auswählen ob bei einer steigenden oder fallenden Flanke das Timerregister inkrementiert werden soll. Gleich welche Taktquelle gewählt wird, kann bei einem Überlauf des Timerregisters ein Interrupt ausgelöst werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Im obigen Diagramm ist der aufbau des Timer0 zusammen mit dem Watchdogtimer dargestellt.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Im Option Register (&#039;&#039;&#039;OPTION&#039;&#039;&#039; Datenblatt Seite 83) kann mit Bit 5 (&#039;&#039;&#039;T0CS&#039;&#039;&#039;) ausgewählt werden ob der interne Takt (0) oder ein externer Takt (1) verwendet wird. Bei einem externen Takt kann mit Bit 4 (&#039;&#039;&#039;T0SE&#039;&#039;&#039;) auswählen ob bei einer steigenden (0) oder bei einer fallenden Flanke (1) das Timer0-Register inkrenemtiert werden soll.&amp;lt;br/&amp;gt;&lt;br /&gt;
Mit Bit 3 (&#039;&#039;&#039;PSA&#039;&#039;&#039;) wird der Prescaler entweder dem Timer (0) oder dem Watchdogtimer (1) zugewiesen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Der Prescaler selbst wird mit den Bits 0 bis 2 (&#039;&#039;&#039;PS0 PS1 PS2&#039;&#039;&#039;) des Option Registers eingestellt.&amp;lt;br/&amp;gt;&lt;br /&gt;
Eine Übersicht der Einstellmöglichkeiten ist auf Seite 83 im Datenblatt einsehbar.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Bild:Timer1-PIC16F690.png|right|thumb|Hardware Timer1 im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== Timer1 ===&lt;br /&gt;
==== Timer1 Hardware ====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Bild:Timer2-PIC16F690.png|right|thumb|Hardware Timer2 im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== Timer2 ===&lt;br /&gt;
==== Timer2 Hardware ====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Bild:AD-Wandler-PIC16F690.png|right|thumb|Hardware AD-Wandler im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== AD-Wandler ===&lt;br /&gt;
==== Hardware AD-Wandler ====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Bild:PWM-PIC16F690.png|thumb|right|Hardware PWM im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== PWM ===&lt;br /&gt;
==== PWM Hardware ====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Bild:EUSART-PIC16F690.png|thumb|right|Hardware EUSART im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== EUSART ===&lt;br /&gt;
==== EUSART Hardware ====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Bild:SPI-PIC16F690.png|thumb|right|Hardware SPI im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== SPI ===&lt;br /&gt;
==== SPI Hardware ====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Bild:I2C-PIC16F690.png|thumb|right|Hardware I2C im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== I2C ===&lt;br /&gt;
==== I2C Hardware ====&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* Produktseite Microchip&lt;br /&gt;
* HiTech Software&lt;br /&gt;
* Sprut.de&lt;br /&gt;
* ...&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
* Timer0, Timer1, Timer2&lt;br /&gt;
* AD-Wandler&lt;br /&gt;
* PWM&lt;br /&gt;
* Eusart&lt;br /&gt;
* Komparator&lt;br /&gt;
* SPI&lt;br /&gt;
* I2C&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Wettbewerb|P]]&lt;br /&gt;
[[Category:PIC|P]]&lt;/div&gt;</summary>
		<author><name>Thomas1123</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=PIC32&amp;diff=28712</id>
		<title>PIC32</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=PIC32&amp;diff=28712"/>
		<updated>2008-06-26T21:46:03Z</updated>

		<summary type="html">&lt;p&gt;Thomas1123: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;PIC32 ist eine 2007 vorgestellte Mikrocontrollerfamilie von Microchip. Mit den [[PIC]]- oder [[dsPIC]]-Mikrocontrollern vom selben Hersteller hat sie bis auf den Namen nichts gemeinsam.&lt;br /&gt;
&lt;br /&gt;
Der PIC32 basiert auf einem 32 Bit MIPS-Kern, der mit bis zu 72 MHz getaktet wird. Der Flash-Programmspeicher ist bis zu 512 kB groß, das RAM bis zu 32 kB. Die Ausstattung umfasst mehrere Timer, serielle Interfaces, einen ADC und bei manchen Modellen einen DMA-Controller. Der PIC32 spielt somit ungefähr in der [[ARM]]7-Liga und ist vergleichbar mit Mikrocontrollern wie dem [[AT91SAM]]7 oder dem [[LPC2000|LPC2138]].&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/mikrocontroller-elektronik?filter=pic32* Beiträge im Forum]&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=2591 PIC32-Homepage von Microchip]&lt;br /&gt;
&lt;br /&gt;
[[Category:Mikrocontroller]]&lt;br /&gt;
[[Category:PIC|P]]&lt;/div&gt;</summary>
		<author><name>Thomas1123</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=PIC&amp;diff=28711</id>
		<title>PIC</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=PIC&amp;diff=28711"/>
		<updated>2008-06-26T21:45:38Z</updated>

		<summary type="html">&lt;p&gt;Thomas1123: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Mikrocontroller]]&lt;br /&gt;
* Hersteller: Microchip&lt;br /&gt;
* 8 Bit/16 Bit&lt;br /&gt;
* Grunddesign von 1975&lt;br /&gt;
* als IO-Controller für größere Prozessoren entwickelt&lt;br /&gt;
* [[Harvard-Architektur]] (getrennter Befehls- und Datenspeicher)&lt;br /&gt;
* [[RISC]], nur wenige Befehle &lt;br /&gt;
* sehr viele Varianten verfügbar ([[EPROM|(EP)ROM]], [[Flash-ROM]], [[AD-Wandler|ADC]], [[I²C]], [[ISP]],[[UART]],[[SPI]])&lt;br /&gt;
* Hardware-[[Stack]], kann vom Programm nicht gelesen werden&lt;br /&gt;
* Befehlsdauer 4 Takte, bei Sprungbefehlen 8&lt;br /&gt;
* [[Akkumulator]] für arithmetische Operationen (&amp;quot;W-[[Register]]&amp;quot;)&lt;br /&gt;
* schlecht für Hochsprachen ([[C]], [[Basic]]) geeignet&lt;br /&gt;
* keine guten kostenlosen [[Compiler]] (außer [http://www.bknd.com/cc5x/introduction.shtml CC5X])&lt;br /&gt;
* Bank-Switching bei [[RAM]] über 128 [[Digitaltechnik|Byte]] notwendig&lt;br /&gt;
* geringer Stromverbrauch, robust&lt;br /&gt;
* PIC10XXX-Serie: Low-Range, 6-8 Pins&lt;br /&gt;
* PIC12X5X-Serie: Low-Range, 8 Pins&lt;br /&gt;
* PIC16X5X-Serie: Low-Range&lt;br /&gt;
* PIC12XXX-Serie: Mid-Range, 8 Pins&lt;br /&gt;
* PIC16XXX-Serie: Mid-Range&lt;br /&gt;
* PIC17/18: High-Range (mit erweitertem Befehlssatz - 77 Befehle)&lt;br /&gt;
* Guter, kostenloser [http://www.sprut.de/electronic/pic/brenner/index.htm#brenner5 LTP] und [http://www.sprut.de/electronic/pic/brenner/index.htm#brenner8 USB] Brenner mit zugehöriger Software erhältlich&lt;br /&gt;
[[Category:PIC|P]]&lt;/div&gt;</summary>
		<author><name>Thomas1123</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=DsPIC&amp;diff=28710</id>
		<title>DsPIC</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=DsPIC&amp;diff=28710"/>
		<updated>2008-06-26T21:45:06Z</updated>

		<summary type="html">&lt;p&gt;Thomas1123: /* Siehe auch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Hersteller: Microchip&lt;br /&gt;
* 24 Bit Programm- / 16 Bit Daten-[[Bus]]&lt;br /&gt;
* hat nichts mit dem klassischen 8 Bit-[[PIC]] zu tun&lt;br /&gt;
* [[Digitale Signalverarbeitung#Hardware|DSP]]-Funktionen mit 2 getrennten 40 Bit [[Akkumulator|Akkumulatoren]]&lt;br /&gt;
* [[Harvard-Architektur]] (getrennter Befehls- und Datenspeicher)&lt;br /&gt;
* [[RISC]], 84 Basis-Befehle (Hardware-Multiplikation)&lt;br /&gt;
* bis 144 kB [[Flash-ROM]] als Programmspeicher&lt;br /&gt;
* bis 8 kB internes [[RAM]]&lt;br /&gt;
* bis 4 kB internes [[EEPROM]]&lt;br /&gt;
* Versionen mit internem 12 Bit [[AD-Wandler]], [[I2C]], [[SPI]], [[AC97]] und [[CAN]]&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
Microchip bietet den [[GCC]]-basierten Compiler &#039;&#039;C30&#039;&#039; im 3-4 stelligen $-Bereich an. Eine Studentenlizenz ist kostenlos erhältlich. Nach der Erprobungszeit ist lediglich die Art der Optimierung nicht mehr frei wählbar. Es wird dann nur noch die Standardoptimierung angewandt, welche einen Kompromiss zwischen Ausführungsgeschwindigkeit und Länge des erzeugten Codes darstellt. Diese Einschränkung ist insbesondere für Hobbyanwendungen nahezu bedeutungslos. Nur sehr wenige und dann sehr teure Compiler bieten die Wahl der Optimierungsmethode überhaupt an. Viele Compiler haben überhaupt keinen Optimierungslauf. Somit bietet die Studentenlizenz des Microchip C30 als einzige einen kostenlosen und zudem leistungsfähigen C-Compiler.    &lt;br /&gt;
&lt;br /&gt;
Der Sourcecode ist zwar verfügbar, allerdings sind ein paar Patches notwendig damit dieser sich überhaupt kompilieren lässt, und es fehlt die Standardbibliothek. Folgendes Projekt arbeitet an der Entwicklung einer freien libc für dsPIC: https://gna.org/projects/pic30-libc/&lt;br /&gt;
&lt;br /&gt;
Die Firma TIGAL bietet BASIC, C und PASCAL-Compiler im Bereich von 200,00 Euro an:&lt;br /&gt;
http://www.tigal.com&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [http://www.mikrocontroller.net/search?query=dspic DsPIC-Beiträge im Forum]&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=75 Herstellerseite]&lt;br /&gt;
&lt;br /&gt;
[[Category:Mikrocontroller]]&lt;br /&gt;
[[Category:DSP]]&lt;br /&gt;
[[Category:PIC|P]]&lt;/div&gt;</summary>
		<author><name>Thomas1123</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:AD-Wandler-PIC16F690.png&amp;diff=28705</id>
		<title>Datei:AD-Wandler-PIC16F690.png</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:AD-Wandler-PIC16F690.png&amp;diff=28705"/>
		<updated>2008-06-26T21:30:08Z</updated>

		<summary type="html">&lt;p&gt;Thomas1123: Das Bild ist aus dem Datenblatt des PIC16F690 rauskopiert Seite 107&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Das Bild ist aus dem Datenblatt des PIC16F690 rauskopiert Seite 107&lt;/div&gt;</summary>
		<author><name>Thomas1123</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:Timer2-PIC16F690.png&amp;diff=28692</id>
		<title>Datei:Timer2-PIC16F690.png</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:Timer2-PIC16F690.png&amp;diff=28692"/>
		<updated>2008-06-26T21:08:40Z</updated>

		<summary type="html">&lt;p&gt;Thomas1123: hat eine neue Version von „Bild:Timer2-PIC16F690.png“ hochgeladen: Das Bild ist aus dem Datenblatt des PIC16F690 rauskopiert Seite 91&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Das Bild ist aus dem Datenblatt des PIC16F690 rauskopiert Seite 91&lt;/div&gt;</summary>
		<author><name>Thomas1123</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=PIC_Codebeispiele&amp;diff=28691</id>
		<title>PIC Codebeispiele</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=PIC_Codebeispiele&amp;diff=28691"/>
		<updated>2008-06-26T21:04:42Z</updated>

		<summary type="html">&lt;p&gt;Thomas1123: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von Thomas1123&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ich persönlich benutze den Hitech PIC-C Lite Compiler für meine Projekte.&amp;lt;br/&amp;gt;&lt;br /&gt;
Hierbei handelt es sich um die abgespeckte Version des Hitech PIC-C Compilers von der Firma HiTech Software.&amp;lt;br/&amp;gt;&lt;br /&gt;
Ich möchte hier eine Sammlung von Codebeispielen beginnen mit der es Einsteigern ermöglicht wird verschiedene interne und externe Pereferie zu initialiesieren und zu benutzen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Da der PIC16F690 mein persönlicher Liebling ist möchte ich die hier gezeigten Beispiele anhand dieses PICs aufzeigen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Selbstverständlich kann dieser Artikel noch mit Codebeispielen für cc5x und ASM erweitert werden, des Weiteren kann man auch Beispiele für andere PICs der 10er, 12er, und 16er Kategorie einfügen.&lt;br /&gt;
&lt;br /&gt;
== Pinbelegung ==&lt;br /&gt;
[[Bild:PIC16F690-Pins.png|center|Pinbelegung des PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC16F690 verfügt über eine grosse Anzahl an interner Pereferie beispielsweise 10-Bit AD-Wandler, SPI/I2C Interface, mehrere Timer (2*8-Bit 1*16-Bit), EUSART (RS232 etc.) usw.&lt;br /&gt;
&lt;br /&gt;
== Codebeispiele ==&lt;br /&gt;
=== Timer0 ===&lt;br /&gt;
==== Timer0 Hardware ====&lt;br /&gt;
[[Bild:Timer0-PIC16F690.png|center|Hardware Timer0 und WDT im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
Der Timer0 ist ein 8-Bit Timer/Zähler, welcher entweder mit dem internen Takt des PIC oder mit einer externen Taktquelle am Pin 17 (RA2/T0CKI) Betrieben werden kann. Beim Betrieb mit einer externen Taktquelle kann man zusätzlich auswählen ob bei einer steigenden oder fallenden Flanke das Timerregister inkrementiert werden soll. Gleich welche Taktquelle gewählt wird, kann bei einem Überlauf des Timerregisters ein Interrupt ausgelöst werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Im obigen Diagramm ist der aufbau des Timer0 zusammen mit dem Watchdogtimer dargestellt.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Im Option Register (&#039;&#039;&#039;OPTION&#039;&#039;&#039; Datenblatt Seite 83) kann mit Bit 5 (&#039;&#039;&#039;T0CS&#039;&#039;&#039;) ausgewählt werden ob der interne Takt (0) oder ein externer Takt (1) verwendet wird. Bei einem externen Takt kann mit Bit 4 (&#039;&#039;&#039;T0SE&#039;&#039;&#039;) auswählen ob bei einer steigenden (0) oder bei einer fallenden Flanke (1) das Timer0-Register inkrenemtiert werden soll.&amp;lt;br/&amp;gt;&lt;br /&gt;
Mit Bit 3 (&#039;&#039;&#039;PSA&#039;&#039;&#039;) wird der Prescaler entweder dem Timer (0) oder dem Watchdogtimer (1) zugewiesen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Der Prescaler selbst wird mit den Bits 0 bis 2 (&#039;&#039;&#039;PS0 PS1 PS2&#039;&#039;&#039;) des Option Registers eingestellt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Timer1 ===&lt;br /&gt;
==== Timer1 Hardware ====&lt;br /&gt;
[[Bild:Timer1-PIC16F690.png|center|Hardware Timer1 im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== Timer2 ===&lt;br /&gt;
==== Timer2 Hardware ====&lt;br /&gt;
[[Bild:Timer2-PIC16F690.png|center|Hardware Timer2 im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== AD-Wandler ===&lt;br /&gt;
==== Hardware AD-Wandler ====&lt;br /&gt;
[[Bild:AD-Wandler-PIC16F690.png|center|Hardware Timer2 im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
== Links ==&lt;br /&gt;
* Produktseite Microchip&lt;br /&gt;
* HiTech Software&lt;br /&gt;
* Sprut.de&lt;br /&gt;
* ...&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
* Timer0, Timer1, Timer2&lt;br /&gt;
* AD-Wandler&lt;br /&gt;
* PWM&lt;br /&gt;
* Eusart&lt;br /&gt;
* Komparator&lt;br /&gt;
* SPI&lt;br /&gt;
* I2C&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Wettbewerb|P]]&lt;br /&gt;
[[Category:PIC|P]]&lt;/div&gt;</summary>
		<author><name>Thomas1123</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=PIC_Codebeispiele&amp;diff=28690</id>
		<title>PIC Codebeispiele</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=PIC_Codebeispiele&amp;diff=28690"/>
		<updated>2008-06-26T21:04:04Z</updated>

		<summary type="html">&lt;p&gt;Thomas1123: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von Thomas1123&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ich persönlich benutze den Hitech PIC-C Lite Compiler für meine Projekte.&amp;lt;br/&amp;gt;&lt;br /&gt;
Hierbei handelt es sich um die abgespeckte Version des Hitech PIC-C Compilers von der Firma HiTech Software.&amp;lt;br/&amp;gt;&lt;br /&gt;
Ich möchte hier eine Sammlung von Codebeispielen beginnen mit der es Einsteigern ermöglicht wird verschiedene interne und externe Pereferie zu initialiesieren und zu benutzen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Da der PIC16F690 mein persönlicher Liebling ist möchte ich die hier gezeigten Beispiele anhand dieses PICs aufzeigen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Selbstverständlich kann dieser Artikel noch mit Codebeispielen für cc5x und ASM erweitert werden, des Weiteren kann man auch Beispiele für andere PICs der 10er, 12er, und 16er Kategorie einfügen.&lt;br /&gt;
&lt;br /&gt;
== Pinbelegung ==&lt;br /&gt;
[[Bild:PIC16F690-Pins.png|center|Pinbelegung des PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC16F690 verfügt über eine grosse Anzahl an interner Pereferie beispielsweise 10-Bit AD-Wandler, SPI/I2C Interface, mehrere Timer (2*8-Bit 1*16-Bit), EUSART (RS232 etc.) usw.&lt;br /&gt;
&lt;br /&gt;
== Codebeispiele ==&lt;br /&gt;
=== Timer0 ===&lt;br /&gt;
==== Timer0 Hardware ====&lt;br /&gt;
[[Bild:Timer0-PIC16F690.png|center|Hardware Timer0 und WDT im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
Der Timer0 ist ein 8-Bit Timer/Zähler, welcher entweder mit dem internen Takt des PIC oder mit einer externen Taktquelle am Pin 17 (RA2/T0CKI) Betrieben werden kann. Beim Betrieb mit einer externen Taktquelle kann man zusätzlich auswählen ob bei einer steigenden oder fallenden Flanke das Timerregister inkrementiert werden soll. Gleich welche Taktquelle gewählt wird, kann bei einem Überlauf des Timerregisters ein Interrupt ausgelöst werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Im obigen Diagramm ist der aufbau des Timer0 zusammen mit dem Watchdogtimer dargestellt.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Im Option Register (&#039;&#039;&#039;OPTION&#039;&#039;&#039; Datenblatt Seite 83) kann mit Bit 5 (&#039;&#039;&#039;T0CS&#039;&#039;&#039;) ausgewählt werden ob der interne Takt (0) oder ein externer Takt (1) verwendet wird. Bei einem externen Takt kann mit Bit 4 (&#039;&#039;&#039;T0SE&#039;&#039;&#039;) auswählen ob bei einer steigenden (0) oder bei einer fallenden Flanke (1) das Timer0-Register inkrenemtiert werden soll.&amp;lt;br/&amp;gt;&lt;br /&gt;
Mit Bit 3 (&#039;&#039;&#039;PSA&#039;&#039;&#039;) wird der Prescaler entweder dem Timer (0) oder dem Watchdogtimer (1) zugewiesen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Der Prescaler selbst wird mit den Bits 0 bis 2 (&#039;&#039;&#039;PS0 PS1 PS2&#039;&#039;&#039;) des Option Registers eingestellt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Timer1 ===&lt;br /&gt;
==== Timer1 Hardware ====&lt;br /&gt;
[[Bild:Timer1-PIC16F690.png|center|Hardware Timer1 im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== Timer2 ===&lt;br /&gt;
==== Timer2 Hardware ====&lt;br /&gt;
[[Bild:Timer2-PIC16F690.png|center|Hardware Timer2 im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
=== AD-Wandler ===&lt;br /&gt;
==== Hardware AD-Wandler ====&lt;br /&gt;
[[Bild:Timer2-PIC16F690.png|center|Hardware Timer2 im PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
== Links ==&lt;br /&gt;
* Produktseite Microchip&lt;br /&gt;
* HiTech Software&lt;br /&gt;
* Sprut.de&lt;br /&gt;
* ...&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
* Timer0, Timer1, Timer2&lt;br /&gt;
* AD-Wandler&lt;br /&gt;
* PWM&lt;br /&gt;
* Eusart&lt;br /&gt;
* Komparator&lt;br /&gt;
* SPI&lt;br /&gt;
* I2C&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Wettbewerb|P]]&lt;br /&gt;
[[Category:PIC|P]]&lt;/div&gt;</summary>
		<author><name>Thomas1123</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:Timer2-PIC16F690.png&amp;diff=28689</id>
		<title>Datei:Timer2-PIC16F690.png</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:Timer2-PIC16F690.png&amp;diff=28689"/>
		<updated>2008-06-26T21:03:56Z</updated>

		<summary type="html">&lt;p&gt;Thomas1123: Das Bild ist aus dem Datenblatt des PIC16F690 rauskopiert Seite 91&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Das Bild ist aus dem Datenblatt des PIC16F690 rauskopiert Seite 91&lt;/div&gt;</summary>
		<author><name>Thomas1123</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:Timer1-PIC16F690.png&amp;diff=28688</id>
		<title>Datei:Timer1-PIC16F690.png</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:Timer1-PIC16F690.png&amp;diff=28688"/>
		<updated>2008-06-26T21:03:02Z</updated>

		<summary type="html">&lt;p&gt;Thomas1123: Das Bild ist aus dem Datenblatt des PIC16F690 rauskopiert Seite 84&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Das Bild ist aus dem Datenblatt des PIC16F690 rauskopiert Seite 84&lt;/div&gt;</summary>
		<author><name>Thomas1123</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:Timer0-PIC16F690.png&amp;diff=28667</id>
		<title>Datei:Timer0-PIC16F690.png</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:Timer0-PIC16F690.png&amp;diff=28667"/>
		<updated>2008-06-26T18:56:29Z</updated>

		<summary type="html">&lt;p&gt;Thomas1123: Bild aus dem Datenblatt des PIC16F690 rauskopiert. Seite 81&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Bild aus dem Datenblatt des PIC16F690 rauskopiert. Seite 81&lt;/div&gt;</summary>
		<author><name>Thomas1123</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=PIC_Codebeispiele&amp;diff=28666</id>
		<title>PIC Codebeispiele</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=PIC_Codebeispiele&amp;diff=28666"/>
		<updated>2008-06-26T18:39:13Z</updated>

		<summary type="html">&lt;p&gt;Thomas1123: Die Seite wurde neu angelegt: &amp;#039;&amp;#039;von Thomas1123&amp;#039;&amp;#039;  == Einleitung ==  Ich persönlich benutze den Hitech PIC-C Lite Compiler für meine Projekte.&amp;lt;br/&amp;gt; Hierbei handelt es sich um die abgespeckte Versio...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von Thomas1123&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ich persönlich benutze den Hitech PIC-C Lite Compiler für meine Projekte.&amp;lt;br/&amp;gt;&lt;br /&gt;
Hierbei handelt es sich um die abgespeckte Version des Hitech PIC-C Compilers von der Firma HiTech Software.&amp;lt;br/&amp;gt;&lt;br /&gt;
Ich möchte hier eine Sammlung von Codebeispielen beginnen mit der es Einsteigern ermöglicht wird verschiedene interne und externe Pereferie zu initialiesieren und zu benutzen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Da der PIC16F690 mein persönlicher Liebling ist möchte ich die hier gezeigten Beispiele anhand dieses PICs aufzeigen.&amp;lt;br/&amp;gt;&lt;br /&gt;
Selbstverständlich kann dieser Artikel noch mit Codebeispielen für cc5x und ASM erweitert werden, des Weiteren kann man auch Beispiele für andere PICs der 10er, 12er, und 16er Kategorie einfügen.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
[[Bild:PIC16F690-Pins.png|center|Pinbelegung des PIC16F690]]&amp;lt;br/&amp;gt;&lt;br /&gt;
Der PIC16F690 verfügt über eine grosse Anzahl an interner Pereferie beispielsweise 10-Bit AD-Wandler, SPI/I2C Interface, mehrere Timer (2*8-Bit 1*16-Bit), EUSART (RS232 etc.) usw.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Downloads ==&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
*&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
* Timer0, Timer1, Timer2&lt;br /&gt;
* AD-Wandler&lt;br /&gt;
* PWM&lt;br /&gt;
* Eusart&lt;br /&gt;
* Komparator&lt;br /&gt;
* SPI&lt;br /&gt;
* I2C&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Wettbewerb|P]]&lt;br /&gt;
[[Category:PIC|P]]&lt;/div&gt;</summary>
		<author><name>Thomas1123</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:PIC16F690-Pins.png&amp;diff=28664</id>
		<title>Datei:PIC16F690-Pins.png</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:PIC16F690-Pins.png&amp;diff=28664"/>
		<updated>2008-06-26T18:13:22Z</updated>

		<summary type="html">&lt;p&gt;Thomas1123: hat eine neue Version von „Bild:PIC16F690-Pins.png“ hochgeladen: Das Bild ist aus dem Datenblatt des PIC16F690 rauskopiert Seite 8&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Das Bild ist aus dem Datenblatt des PIC16F690 rauskopiert Seite 8&lt;/div&gt;</summary>
		<author><name>Thomas1123</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:PIC16F690-Pins.png&amp;diff=28663</id>
		<title>Datei:PIC16F690-Pins.png</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:PIC16F690-Pins.png&amp;diff=28663"/>
		<updated>2008-06-26T18:08:06Z</updated>

		<summary type="html">&lt;p&gt;Thomas1123: Das Bild ist aus dem Datenblatt des PIC16F690 rauskopiert Seite 8&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Das Bild ist aus dem Datenblatt des PIC16F690 rauskopiert Seite 8&lt;/div&gt;</summary>
		<author><name>Thomas1123</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Benutzer:Thomas1123&amp;diff=28662</id>
		<title>Benutzer:Thomas1123</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Benutzer:Thomas1123&amp;diff=28662"/>
		<updated>2008-06-26T16:59:07Z</updated>

		<summary type="html">&lt;p&gt;Thomas1123: /* Zu meiner Person */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Alles noch Baustelle *&lt;br /&gt;
&lt;br /&gt;
== Zu meiner Person ==&lt;br /&gt;
&lt;br /&gt;
* Baujahr 1982&lt;br /&gt;
* Erweiterter Hauptschulabschluss 1999&lt;br /&gt;
* 99 bis 2003 3 1/2 Jahre Lehre als Elektroinstallateur&lt;br /&gt;
* Weitere 3 1/2 Jahre als Elektroinstallateur gearbeitet&lt;br /&gt;
* Sommer 2006 Beginn der zweijährigen Fachschule für Technik&lt;br /&gt;
* Sommer 2008 staatlich geprüfter Techniker mit nem Schnitt von 2.1&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Projekte ==&lt;br /&gt;
&lt;br /&gt;
=== Labornetzteil ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Grundsätzlich baue ich das Netzteil nicht um das beste, tollste, schönste Labornetzteil von allen zu haben, sondern weil ich spass dran habe.&#039;&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Wem es nicht gefällt der soll es nicht nachbauen oder benutzen.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== Vorhaben ====&lt;br /&gt;
&lt;br /&gt;
* Spannung regelbar von 0...20V&lt;br /&gt;
* Strombegrenzung regelbar von 0...2A&lt;br /&gt;
* Als Stellgrösse für Spanung und Strom jeweils 0..2048mV (12-Bit da-Wandler)&lt;br /&gt;
* Einstellung von Strom und Spannung mit Endlospotis&lt;br /&gt;
* Anzeige von diversen Werten (Istspannung, Sollspannung, Iststrom, Maxstrom, aktuelle Leistung in W und was sonst noch so gefällt) auf 4*16 oder 4*20 LC-Display&lt;br /&gt;
* Steuer µC PIC 16F877 oder PIC 16F887&lt;br /&gt;
* Diverse feste Spannungen (+5V +12V etc.)&lt;br /&gt;
&lt;br /&gt;
==== Schön wärs aber nicht umbedingt nötig ====&lt;br /&gt;
&lt;br /&gt;
*Temperaturüberwachung der Leistungsbauteile&lt;br /&gt;
*Kommunikation über RS232&lt;br /&gt;
*Speicherbare Einstellungen (wie im Autoradio Taste lang gedrückt halten und Einstellungen (Sender) sind gespeichert, Taste kurz drücken und das Setting wird aufgerufen.&lt;br /&gt;
*Integriertes Radio mit TV und Premiere Decoder :-)&lt;br /&gt;
&lt;br /&gt;
==== Was sich bis jetzt so getan hat ====&lt;br /&gt;
[[Bild:Tastenabfrage.png|thumb|right|Spannungsteiler für die analoge Tastenabfrage]]&lt;br /&gt;
[[Bild:Tastenabfrage_S1.png|thumb|right|Schaltung des Spannungsteilers bei gedrücktem Taster S1]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Der Steuerpic wird wahrscheinlich doch ein PIC 16F690 (ist mein persönlicher Liebling) werden der hat zwar nur die Hälfte der Pins aber mit etwas Trixen müsste des gehen.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Als Display habe ich mich für ein 20*4 zeichen DIP-Display von ELECTRONIC ASSEMBLY entschieden (Reichelt Bestellnummer: LCD 204 DIP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Die Abfrage der Tasten wird über einen Analogeingang realisiert. Somit lassen sich mehrere Tasten an einem Pin abfragen indem man die Ausgangsspannung des Spannungsteilers misst und diese dann mit vorgegebenen Werten im Programm vergleicht. Es empfiehlt sich einen Tolleranzwert für den Analogwert der Tastenabfrage zu verwenden. &amp;lt;br/&amp;gt;&lt;br /&gt;
Wenn nur ein Taster gedrückt wird hat man einen &amp;quot;relativ&amp;quot; einfach zu berechnenden Spannungsteiler. Zuerst muss man den Ersatzwiederstand &amp;lt;math&amp;gt;R_e&amp;lt;/math&amp;gt; ausrechnen. Dies ist aber nicht weiters schwierig wenn man sich die Schaltung mal etwas anderst aufmalt und erkennt, dass mehrere Widerstände in reihe und diese Reihenschaltungen dann Paralell zu einander sind(siehe Bild 2).&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Beispielhaft die Berechnung der Ausgangsspannung wenn Taster S1 gedrückt wird.&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
R_e = \frac{1}{(R_2+R_8)^{-1}+ (R_3+R_9)^{-1}+ (R_4+R_{10})^{-1}+ (R_5+R_{11})^{-1}+ (R_6+R_{12})^{-1}} \,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Ja ich weiss das ist viel Tipparbeit und ganz bestimmt gibt es auch eine einfacherre möglichkei &amp;lt;math&amp;gt;R_e&amp;lt;/math&amp;gt; auszurechnen,wenn man davon ausgeht,dass &amp;lt;math&amp;gt;R_1&amp;lt;/math&amp;gt; bis &amp;lt;math&amp;gt;R_6&amp;lt;/math&amp;gt; gleich gross sind. Ich bin halt net so der Held was Formeln umstellen angeht :-).&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
U_{AD-Wandler} = U \cdot \frac{R_e}{R_7+R_e} \,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Links ====&lt;br /&gt;
http://www.elektronik-kompendium.de/public/schaerer/kdarl2.htm&amp;lt;br/&amp;gt;&lt;br /&gt;
http://www.mikrocontroller.net/topic/90246&amp;lt;br/&amp;gt;&lt;br /&gt;
http://www.mikrocontroller.net/topic/90417&amp;lt;br/&amp;gt;&lt;br /&gt;
http://www.mikrocontroller.net/topic/90780&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Codeschnipsel ==&lt;br /&gt;
http://www.mikrocontroller.net/topic/99323 Bargraph anzeige für Text-Displays&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;/div&gt;</summary>
		<author><name>Thomas1123</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Linksammlung&amp;diff=27902</id>
		<title>Linksammlung</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Linksammlung&amp;diff=27902"/>
		<updated>2008-05-12T16:53:06Z</updated>

		<summary type="html">&lt;p&gt;Thomas1123: /* Projektsammlungen/Einzelprojekte */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Auf dieser Seite werden Links zu anderen interessanten Mikrocontroller- und Elektronikseiten gesammelt.&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
Die alte Linkseite findet man [http://www.mikrocontroller.net/en/links hier].&lt;br /&gt;
&lt;br /&gt;
Hinzufügen von Links:&lt;br /&gt;
# [http://www.mikrocontroller.net/wikisoftware/index.php?title=Linksammlung&amp;amp;action=edit Bearbeiten] anklicken&lt;br /&gt;
# Link unter der entsprechenden Kategorie eintragen&lt;br /&gt;
# &amp;quot;Artikel speichern&amp;quot; klicken&lt;br /&gt;
&lt;br /&gt;
== Suchen &amp;amp; Finden ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Verkauf einem hungrigen Mann einen Fisch und du hast ein Geschäft gemacht, bring ihm das Angeln bei und du hast einen Kunden verloren! (asmo)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [http://www.supplyframe.com/ SupplyFrame] - Datasheet and Electronic Spec Search Engine&lt;br /&gt;
* [http://www.globalspec.com/ GlobalSpec] - The Engineering Search Engine&lt;br /&gt;
* [http://www.alldatasheet.com/ alldatasheet] - Datasheet Search&lt;br /&gt;
* [http://www.datasheetarchive.com/ datasheetarchive] - Datasheet Search&lt;br /&gt;
&lt;br /&gt;
== [[AVR]] ==&lt;br /&gt;
&lt;br /&gt;
=== Herstellerseiten ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.atmel.com/products/avr/ Atmel.com] Herstellerseiten&lt;br /&gt;
* [http://www.atmel.com/dyn/general/updates.asp Atmel.com updates] Liste der letzten Änderungen in Datenblättern und Beispielcode auf ATMEL.com (nicht nur für AVRs)&lt;br /&gt;
&lt;br /&gt;
=== Information (Foren, Mailinglisten, Linksammlungen) ===&lt;br /&gt;
* [http://progforum.com Batronix Elektronik Forum] Gut besuchtes Forum für allgemeine Elektronik, Mikrocontroller und Programmierung&lt;br /&gt;
* [http://www.avrfreaks.net/ AVR Freaks] AVR Forum, Samples, Tutorials, User-Projekte, GCC für AVR (Registrierung empfohlen)&lt;br /&gt;
* [http://avr-asm.tripod.com Atmel AVR ASM Site]&lt;br /&gt;
* [http://www.mikrocontroller.net Mikrocontroller.net] - AVR Tutorials, Examples, LINKS, Forum (D)&lt;br /&gt;
* [http://www.openavr.org/ Openavr.org] &amp;quot;central repository of information for the various open source tools available for the development of software for Atmel&#039;s AVR family of 8-bit RISC microcontrollers&amp;quot;&lt;br /&gt;
* [http://www.omegav.ntnu.no/avr/resources.php3 Omega V&#039;s AVR Resource List]&lt;br /&gt;
* [http://www.omegav.ntnu.no/avr/newresources.php3 Omega V&#039;s AVR NEW Resource List]&lt;br /&gt;
* [http://www.ipass.net/hammill/newavr.htm Atmel AVR Embedded Microcontroller Resources]&lt;br /&gt;
* [http://members.tripod.com/Stelios_Cellar/AVR/AVR%20Info.html Stelios Cellar Atmel AVR Info Page] - Samples, Links&lt;br /&gt;
* [http://www.elektronik-projekt.de Elektronik Projekt] - Hauptthemen sind AVR und Roboter&lt;br /&gt;
* [http://www.roboprogy.de Steuerplatine mit Forth] - Fertigsteuerung mit Anschlüssen für Servos, Motore, Inkrementalgeber und Sensoren&lt;br /&gt;
* [http://www.microschematic.com/ AVR Microcontroller inside] (nett gemacht, Engl.)&lt;br /&gt;
* [http://electrons.psychogenic.com/avr/ Intro To AVR Microcontrollers] (noch(?) sehr wenig Information)&lt;br /&gt;
* [http://www.itwissen.info ITWissen.info] (gutes Lexikon)&lt;br /&gt;
&lt;br /&gt;
=== Entwicklungswerkzeuge (Compiler/Assembler/Debugger/Tools/Libraries) ===&lt;br /&gt;
&lt;br /&gt;
==== C ====&lt;br /&gt;
* [http://sourceforge.net/projects/winavr WinAVR] (pronounced &amp;quot;whenever&amp;quot;) is a suite of executable, open source software development tools for the Atmel AVR series [for the] Windows platform&amp;quot; (includes GNU GCC) &lt;br /&gt;
* [http://sourceforge.net/projects/kontrollerlab KontrollerLab] is a free GPL open-source development environment based on KDE, using the avr-gcc, UISP and AVRDUDE&lt;br /&gt;
* [http://www.nongnu.org/avr-libc/ avr-libc] avr-gcc&#039;s &amp;quot;standard&amp;quot;-library&lt;br /&gt;
&amp;lt;!-- * [http://hubbard.engr.scu.edu/embedded/avr/avrlib/ Procyon AVRlib] a lot of device drivers and Visual-Studio link for avr-gcc --&amp;gt;&lt;br /&gt;
* [http://hubbard.engr.scu.edu/embedded/avr/avrlib/ Procyon AVRlib] a lot of device drivers and Visual-Studio link for avr-gcc&lt;br /&gt;
* [http://rod.info/avr.html rod.info on AVR] esp. for AVR GNU development tools setup under Linux&lt;br /&gt;
* [http://www.sisy.de SiSy AVR] - graphische Entwicklungsumgebung mit C/C++ Codegenerierung aus Struktogrammen und Klassendiagrammen&lt;br /&gt;
* [http://shop.embedit.de/product__206.php AtmanAVR C/C++ IDE]&lt;br /&gt;
* [http://www.iar.com IAR Embedded Workbench]&lt;br /&gt;
* [http://www.hpinfotech.com CodeVisionAVR] C-Compiler für AVRs mit Terminal&lt;br /&gt;
* [http://www.myAVR.de myAVRWorkpad] kompakte Entwicklungsumgebung für AVRs mit Terminal&lt;br /&gt;
* [http://www.amctools.com/vmlab.htm VMLab] komplette IDE mit Debugger und Simulator (auch Peripheriehardware)&lt;br /&gt;
* [http://www.forestmoon.com/Software/AvrIoDesigner/ AVR IO Designer] is a utility to generate initialization source code in C/C++ for the various devices, ports and registers of Atmel AVR processors. The intent is to allow the user to explore the devices specific to a selected processor and experiment with settings thru a user interface that assists in understanding the complexities involved. The user can also assign custom variable names to PORT IO pins thereby keeping track of the IO resources in use. These names are emitted in the generated code for use in the user’s program. (Windows .NET 2.0 erforderlich)&lt;br /&gt;
* [http://www.piconomic.co.za/avrlib/index.html Piconomic AVRLIB] is a collection of firmware for Atmel AVR microcontrollers. The aim is to share source code, experience and expertise (in the eye of the beholder) with the community of engineers, scientists and enthusiasts.&lt;br /&gt;
&lt;br /&gt;
==== Assembler ====&lt;br /&gt;
&lt;br /&gt;
* [http://avr-asm.tripod.com Atmel AVR ASM Site]&lt;br /&gt;
* [http://www.tavrasm.org/ tavrasm] - Toms Linux (Atmel) AVR Assembler&lt;br /&gt;
* [http://www.avr-asm-tutorial.net/gavrasm/index_de.html gavrasm] - Gerds Linux/Win/DOS AVR Assembler &lt;br /&gt;
* [http://avra.sourceforge.net/ avra] - avra ATMEL AVR Assembler für Linux, FreeBSD, AmigaOS und Win32&lt;br /&gt;
* [http://algrom.net/english.html Algorithm Builder] - graphische Makro-Assembler Entwicklungsumgebung&lt;br /&gt;
* [http://www.sisy.de SiSy AVR] - graphische Entwicklungsumgebung mit Assembler Codegenerierung aus Programmablaufplänen&lt;br /&gt;
* [http://www.sbprojects.com/sbasm/sbasm.htm SB-Assembler] - Freeware Cross-Assembler unter DOS. (6502, 6800, 6801, 6804, 6805, 6809, 68HC08, 68HC11, Z8, Z80, Z180, 8080, 8085, 8021, 8041, 8048, 8051, AVR, PIC1684,...)&lt;br /&gt;
* [http://www.myAVR.de myAVRWorkpad] kompakte Entwicklungsumgebung für AVRs mit Terminal&lt;br /&gt;
&lt;br /&gt;
==== Disassembler ====&lt;br /&gt;
&lt;br /&gt;
* [http://www.datarescue.com/idabase/ IDA-Pro] -Disassembler und Debugger für fast alle bekannten Prozessoren. Evaluation Version verfügbar. Tagline: &#039;&#039;The most advanced tool for Hostile Code Analysis, Vulnerability and Software Reverse Engineering&#039;&#039;&lt;br /&gt;
* [http://avr.jassenbaum.de/ja-tools ReAVR] - Disassembler und ACXutility Binary Tool&lt;br /&gt;
* [http://www.visi.com/~dwinker/revava/ revava] - Disassembler&lt;br /&gt;
* [http://www.frozeneskimo.com/electronics/vavrdisasm-free-avr-disassembler/ vAVRdisasm] - Free AVR Disassembler&lt;br /&gt;
&lt;br /&gt;
==== BASIC ====&lt;br /&gt;
* [http://www.mcselec.com/bascom-avr.htm Bascom AVR]&lt;br /&gt;
* [http://www.fastavr.com FastAVR] - und mit &#039;ASM&#039; Ausgabe, Nokia3310 LCD Unterstützung&lt;br /&gt;
* [http://www.nettypes.de/mbasic mikrocontrollerBASIC Freeware] - mit Simulator für ATmega32, ATmega128 und C-CONTROL.&lt;br /&gt;
* [http://www.mikroe.com/en/compilers/mikrobasic/avr/ mikroBasic] - Comprehensive, stand-alone Basic compiler for AVR microcontrollers&lt;br /&gt;
* [http://home.arcor.de/EDAconsult/Page3/index.html?c~3.1 MCS BASIC-52] - Original-Übersetzung 1988 INTEL MCS BASIC-52 USERS MANUAL 220 Seiten frei Download als PDF&lt;br /&gt;
&lt;br /&gt;
==== Pascal ====&lt;br /&gt;
* [http://www.e-lab.de AVRco Pascal Compiler] - AVR Pascal Compiler mit umfangreicher Funktionslibrary&lt;br /&gt;
* [http://www.mikroe.com/en/compilers/mikropascal/avr/ mikroPascal] - Comprehensive, stand-alone Pascal compiler for AVR microcontrollers&lt;br /&gt;
&lt;br /&gt;
==== Forth ====&lt;br /&gt;
* [http://www.robo-forth.de www.robo-forth.de] - AVR Forth Compiler mit umfangreicher Funktionslibrary für Servos, Motore und Sensoren&lt;br /&gt;
* [http://amforth.sourceforge.net/ amforth] - Forth for Atmel ATmega micro controllers von Matthias Trute. [http://www.mikrocontroller.net/topic/55807#430816 Diskussion]&lt;br /&gt;
&lt;br /&gt;
==== Java ====&lt;br /&gt;
* [http://www.harbaum.org/till/nanovm NanoVM - Java for the AVR] ([[NanoVM|deutsches Wiki]])&lt;br /&gt;
&lt;br /&gt;
==== Ada ====&lt;br /&gt;
* [http://avr-ada.sourceforge.net/ AVR-Ada] - Ada Compiler innerhalb von GCC (GNAT) für AVR.  Enthält eine kleine Laufzeitbibliothek ohne Tasking und ohne Exceptions.&lt;br /&gt;
&lt;br /&gt;
==== Virgil ====&lt;br /&gt;
* [http://compilers.cs.ucla.edu/virgil/index.html The Virgil Programming Language] is designed for building robust, flexible, and scalable software systems on embedded hardware platforms. Virgil builds on ideas from object-oriented, statically typed languages like Java, providing a clean, consistent source language. Its compiler system provides an efficient implementation for resource-constrained environments.&lt;br /&gt;
&lt;br /&gt;
==== LabVIEW ====&lt;br /&gt;
* http://www.ni.com/embedded/ Informationen zu LabVIEW, der graphischen Entwicklungsumgebung von National Instruments&lt;br /&gt;
&lt;br /&gt;
=== Tutorials und Beispiele ===&lt;br /&gt;
* [http://www.meinemullemaus.de/elektronik/avr/index.html AVR Mikrocontroller] Einfühung in AVR Mikrocontroller mit Nachbau des Spiels &amp;quot;Senso&amp;quot;.&lt;br /&gt;
* [http://www.avrbeginners.net AVRBeginners.net] Beginners Guides to AVRs&lt;br /&gt;
* [http://electrons.psychogenic.com/avr/ electrons.psychgenic.com] AVR Microcontroller Section - Einführung und Tutorial (E)&lt;br /&gt;
* [http://www.wikidorf.de/reintechnisch/Inhalt/AVRProjekt-9V-LED-Lampe reintechnisch.de] AVR Tutorial: 9V-LED-Lampe&lt;br /&gt;
* [http://digitaltechnik.mschoeffler.de digitaltechnik.mschoeffler.de] Einführung in die Grundlagen der Digitaltechnik&lt;br /&gt;
&lt;br /&gt;
==== C ====&lt;br /&gt;
* [[AVR-GCC-Tutorial]]&lt;br /&gt;
* [http://www.smileymicros.com/QuickStartGuide.pdf Quick Start Guide for using the WinAVR Compiler with ATMEL&#039;s AVR Butterfly] ([http://www.smileymicros.com www.smileymicros.com], PDF)&lt;br /&gt;
* [http://www.piconomic.co.za/avr.html Piconomic Design Atmel AVR Course] is for the engineer who wants to switch to the 8-bit Atmel AVR microcontroller and learns by example. C language and compiler experience is a prerequisite. (Beim Nachbau des AVR-Boards &#039;&#039;&#039;Copyright notice&#039;&#039;&#039; beachten!)&lt;br /&gt;
* [http://www.avrtutor.com/tutorial/thermo/contents.htm avrtutor] - an attempt to provide a real tutorial for the ATMEL AVR microcontrollers.&lt;br /&gt;
* [http://www.sparkfun.com/commerce/present.php?p=BEE-1-PowerSupply Spark Fun Electronics] - Beginning Embedded Electronics (Atmega8, englisch)&lt;br /&gt;
&lt;br /&gt;
==== Assembler ====&lt;br /&gt;
* [http://avr-asm.tripod.com Atmel AVR ASM Site]&lt;br /&gt;
* [http://www.avr-asm-tutorial.net Atmel AVR Microcontroller Assembler Tutorial] (D)&lt;br /&gt;
* [http://www.itee.uq.edu.au/~cse/_atmel/AVR_Studio_Tutorial/ Einstieg in AVRStudio 4] (viele Abbildungen, Engl.)&lt;br /&gt;
* [[AVR-Studio]]&lt;br /&gt;
&lt;br /&gt;
==== Bascom ====&lt;br /&gt;
* [http://www.mcselec.com/ MCS Elektronik] BASCOM AVR Demo zum Download&lt;br /&gt;
&lt;br /&gt;
==== Pascal ====&lt;br /&gt;
* [http://www.elektronik-projekt.de/content/download/avrco_tut2.pdf AVRco Pascal Tutorial] - von Markus&lt;br /&gt;
* [http://www.ibrtses.com/embedded/avr.html ein paar Seiten zum AVR] (ASM und Pascal) von ibrt&lt;br /&gt;
&lt;br /&gt;
=== Hardware (Prototypen-Platinen-Boards etc.) ===&lt;br /&gt;
&lt;br /&gt;
* [http://retrodan.tripod.com Atmel AVR Butterfly Site]&lt;br /&gt;
* [http://www.simplesign.de simplesign.de] Controller Module, Bausätze. Auf Kundenwünsche wird sehr gerne eingegangen&lt;br /&gt;
* [http://www.fox4you.cc Austria] Development Tools for ATMEL ATmega Microcontrollers Connections via USB and LAN&lt;br /&gt;
* [http://www.kanda.com Kanda] Starter Kits and Development Tools for different Microcontrollers&lt;br /&gt;
* [http://www.dontronics.com Dontronics] Starter Kits and Development Tools for different Microcontrollers, Linkpages for AVR and PIC&lt;br /&gt;
* [http://www.mikrocontroller.com mikrocontroller.com] u.a. Platine AVR-Ctrl, AVR-Webserver (D)&lt;br /&gt;
* [http://mikrocontroller.cco-ev.de/eng/ AVR webserver] RTL8019, 3COM (E) &lt;br /&gt;
* [http://www.microcontroller-starterkits.de Microcontroller-Starterkits] Starter Kits for different Microcontrollers (D)&lt;br /&gt;
* [http://www.olimex.com Olimex Ltd.] DevelopmentBoards and Tools&lt;br /&gt;
* [http://www.krause-robotik.de Krause Robotik] Controller Boards &amp;amp; Zubehör&lt;br /&gt;
* [http://www.robotikhardware.de robotikhardware.de] Controller Boards&lt;br /&gt;
* [http://www.ssv-embedded.de SSV Embedded Systems] 32-bit Mikrocontrollermodule und -boards, Starter Kits etc.&lt;br /&gt;
* [http://shop.embedit.de/browse_002_21__.php Embedit] Mikrocontrollermodule und -boards&lt;br /&gt;
* [http://www.roboprogy.de Roboprogy] Kleine Mikrocontrollerplatine mit Peripherie-ICs und vielen Ein- und Ausgängen. Vorbereitete Programmbausteine.&lt;br /&gt;
* [http://www.display3000.com Display3000] Farbdisplays, Mikrocontrollermodule und -boards mit TFT-Farbdisplays; Experimentierplatinen und Ansteuerplatinen für TFT Farbdisplays&lt;br /&gt;
* [http://www.glyn.de GLYN High-Tech Distribution] Mikrocontroller Applikationen, TFT-Displays, LCD-Anzeigen, Memory Cards&lt;br /&gt;
* [http://www.myavr.de myAVR] Einsteigerboards und Zubehör&lt;br /&gt;
* [http://www.siphec.com/ SIPHEC] Development Boards für AVR, MSP430, USB&lt;br /&gt;
* [http://www.pollin.de/shop/shop.php?cf=detail.php&amp;amp;pg=OA==&amp;amp;a=MTY5OTgxOTk=&amp;amp;w=OTk4OTY4&amp;amp;ts=0 ATMEL Evaluations-Board Bausatz] ([http://www.pollin.de/shop/downloads/D810038B.PDF PDF]) und [http://www.pollin.de/shop/shop.php?cf=detail.php&amp;amp;pg=OA==&amp;amp;a=MzU5OTgxOTk=&amp;amp;w=OTk4OTY4&amp;amp;ts=0 ATMEL Funk-Evaluations-Board Bausatz] ([http://www.pollin.de/shop/downloads/D810046B.PDF PDF]) von Pollin&lt;br /&gt;
* [http://www.lochraster.org/etherrape/ Etherrape] Atmaga 644 mit Ethernet und TCP/IP als Bausatz.&lt;br /&gt;
* [http://www.ic-board.de/index.php?cat=c4_Programmer.html AVR Programmieradapter],[http://www.ic-board.de/index.php?cat=c3_Funkmodule.html ZigBee-ready Funkmodule/Funk-USB-Sticks] und [http://www.ic-board.de/index.php?cat=c13_ICradio-Bundles.html Funk Starterkits] von In-Circuit&lt;br /&gt;
* [http://www.ic-board.de/index.php?cat=c2_ICnova-Module.html AVR32 AP7000 Linux Board] mit 2xEthernet, TFT, Audio, SDCARD, USB-Host/Devive, Funk...&lt;br /&gt;
* [http://www.freeduino.org/ Freedunio] - Riesige Linksammlung zu dem &#039;&#039;&#039;Ardunio&#039;&#039;&#039;(R) AVR-Board (Kit) und dessen Clones und Mutanten (DIY oder Kit)&lt;br /&gt;
* [http://www.das-labor.org/wiki/Laborboard Das Laborboard] von das-labor.org (DIY)&lt;br /&gt;
* [http://www.liberlab.net/ Liberlab-Board] - Steckbrett- oder PCB-Design zum AVR-Einstieg mit dem Atmega8. Interessant ist, dass alle Ports auf einen DB25-female Buchsenleiste herausgeführt sind. (DIY)&lt;br /&gt;
* [http://six.media.mit.edu:8080/6 number six] - Open Source Design, Atmega32. Alle Pins sind auf eine 2x20 Pol Wannenstiftleiste herausgeführt.&lt;br /&gt;
&lt;br /&gt;
=== Programmierhard- und Software ===&lt;br /&gt;
* [http://www.bsdhome.com/avrdude/ AVRDUDE] AVR ISP-Programmerierwerkzeug für Unix/Linux/BSD und Windows. Kommandozeile [http://sourceforge.net/projects/avrdude-gui/ (oder mit GUI)], AVR Butterfly-Unterstützung&lt;br /&gt;
* [http://www.lancos.com/prog.html PonyProg] neben AVR für diverse seriell programmierbare Bauteile (Grafische Nutzeroberfläche und Kommandozeile), siehe auch [[Pony-Prog Tutorial]]&lt;br /&gt;
* [http://savannah.nongnu.org/projects/uisp/ uisp] AVR ISP-Programmierwerkzeug für Unix/Linux/BSD und Windows (Kommandozeile)&lt;br /&gt;
* [http://www.myplace.nu/avr/yaap/ yaap]&lt;br /&gt;
* [http://www.xs4all.nl/~sbolt/e-index.html SP12]&lt;br /&gt;
* [http://www.mikrocontroller-projekte.de/Mikrocontroller/AVR-Prog/AVR-Programmer.html AVR910 kompatibler Programmer] mit aktueller, beschleunigter Firmware.&lt;br /&gt;
* [http://www.der-hammer.info/hvprog STK500 kompatibler Programmer] als Nachbauprojekt. Siehe auch [[STK500]]&lt;br /&gt;
* [http://www.shop.robotikhardware.de/shop/catalog/product_info.php?cPath=73&amp;amp;products_id=41 Preiswerter Standard ISP (STK200 kompatibel)]&lt;br /&gt;
*  [http://www.siwawi.arubi.uni-kl.de/avr_projects/evertool/ Evertool] kombinierter ISP &amp;amp; [[JTAG]] Programmer (kompatibel zum &amp;quot;original&amp;quot; Atmel AVRISP und Atmel JTAGICE) &lt;br /&gt;
* [http://www.olimex.com Olimex] (Bulgarischer Anbieter) Kostengünstig&lt;br /&gt;
* [http://www.avr-projekte.de/isp.htm AVR910-USB Programmer] incl. USB-Modul und USB-&amp;gt;Seriell Wandler&lt;br /&gt;
*[http://www.fischl.de/usbasp/ USBasp] &amp;amp;#8211; USB-Programmer bestehend aus ATmega8 (kein spezieller USB-Chip notwendig)&lt;br /&gt;
* [http://home.arcor.de/bernhard.michelis Amadeus-USB] - Highspeed-Programmer für (ds)PIC und AVR. Bietet auch Möglichkeiten zur Fehlersuche.&lt;br /&gt;
* [http://www.e-dsp.com Signalgenerator] - Signalgenerator software&lt;br /&gt;
* [http://www.myavr.de/shop/artikel.php?artID=42 mySmartUSB] - USB Programmer und USB-UART-Bridge, AVR910 und AVR911 kompatibel&lt;br /&gt;
* [http://www.shop.robotikhardware.de/shop/catalog/product_info.php?cPath=73&amp;amp;products_id=161 USB-Programmer für Bascom Programmierer]&lt;br /&gt;
* [http://www.virtualserialport.com/ Virtual Serial Port] Software for serial port communication and null-modem emulation&lt;br /&gt;
* [http://www.ic-board.de/index.php?cat=c4_Programmer.html AVR Programmieradapter und JTAGICE MKII]&lt;br /&gt;
* [http://www.helmix.at/hapsim/index.htm HAPSIM graphischer Simulator ] zu graphischen Simulation von Tasten /LED /LCD und Terminal in AVR Studio Freeware !!!&lt;br /&gt;
* [http://www.ic-board.de/index.php?cat=c4_Programmer.html AVR Programmieradapter und JTAGICE MKII]&lt;br /&gt;
* [http://www.myavr.de/download/myavr_progtool.zip myAVR ProgTool] nette Programmieroberfläche (free)&lt;br /&gt;
* [http://b9.com/elect/avr/kavrcalc/ KAVRCalc] is a free calculator to assist in programming AVR microcontrollers (Baudrate, Watchdog, Timer, ...)&lt;br /&gt;
&lt;br /&gt;
=== Projekte und Quellcodebibliotheken ===&lt;br /&gt;
&lt;br /&gt;
====Bibliotheken====&lt;br /&gt;
* [http://www.nongnu.org/avr-libc/ AVR Libc]&lt;br /&gt;
* [http://hubbard.engr.scu.edu/embedded/avr/avrlib/docs/html/index.html Procyon AVRlib]&lt;br /&gt;
* [http://homepage.hispeed.ch/peterfleury Peter Fleury&#039;s Pages] - UART / LCD (HD44780) / I²C (TWI)/ AVR-GCC Bibliotheken, STK500v2 Bootloader&lt;br /&gt;
*[http://sourceforge.net/projects/avrfix  Fixed Point Library Based on ISO/IEC Standard DTR 18037 for Atmel AVR microcontrollers, u.a. Cordic-Algorithmen] und [http://www.enti.it.uc3m.es/wises07/presentations/session2/05%20-%20Fixed%20Point%20Library%20According%20to%20ISOIEC%20Standard%20DTR%2018037%20for%20Atmel%20AVR%20ProcessorsWISES07-fixedpointlibrary%20-%20Elmenreich.pdf  Kurzbeschreibung dazu als Powerpoint-PDF TU Wien Febr. 2007]&lt;br /&gt;
&lt;br /&gt;
==== Betriebssysteme &amp;amp; Co. ====&lt;br /&gt;
* [http://www.chris.obyrne.com/yavrtos/ YAVRTOS] - Yet Another Atmel® AVR® Real-Time Operating System von Chris O&#039;Byrne (C, Atmega32, GPL3 Lizenz)&lt;br /&gt;
* [http://www.freertos.org/ FreeRTOS] is a portable, open source, mini Real Time Kernel - a free to download and royalty free RTOS that can be used in commercial applications. (AVR, MSP430, PIC, ARM7, ...)&lt;br /&gt;
* [http://www.barello.net/avrx/index.htm AvrX Real Time Kernel] (IAR ASM oder IAR/GCC C, GPL2 Lizenz)&lt;br /&gt;
* [http://scmrtos.sourceforge.net/ scmRTOS] - Single-Chip Microcontroller Real-Time Operating System (C++, AVR, MSP430, Blackfin, ARM7, FR (Fujitsu, [http://www.opensource.org/licenses/mit-license.php MIT Lizenz]).&lt;br /&gt;
* [http://www.circuitcellar.com/avr2004/DA3650.html csRTOS] - cooperative single-stack RTOS aus dem Circuit Cellar AVR 2004 Design Contest.  [http://www.avrfreaks.net/index.php?module=Freaks%20Academy&amp;amp;func=viewItem&amp;amp;item_id=987&amp;amp;item_type=project csRTOS port to ATmega32] und [http://www.avrfreaks.net/index.php?name=PNphpBB2&amp;amp;file=viewtopic&amp;amp;t=50743&amp;amp;start=all&amp;amp;postdays=0&amp;amp;postorder=asc Diskussion] auf www.avrfreaks.net führte zur Weiterentwicklung als [http://www.mtcnet.net/~henryvm/4AvrOS/ 4AvrOS] - cooperative scheduler&lt;br /&gt;
* [http://www.avrfreaks.net/index.php?module=Freaks%20Academy&amp;amp;func=viewItem&amp;amp;item_type=project&amp;amp;item_id=230 OPEX] - freeware cooperative scheduler with lots of calendar and I/O functions von Steve Childress (Download auf www.avrfreaks.net ggf. Registrierung notwendig)&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/12176#79672 Scheduler] von Peter Dannegger&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/25087#186454 RTC-Scheduler] von ape&lt;br /&gt;
* [http://www.sics.se/~adam/pt/ Protothreads] - Lightweight, Stackless Threads in C (open source BSD-style license)&lt;br /&gt;
* [http://www.micrium.com/products/rtos/kernel/rtos.html uC/OS-II] is a real time operating system developed by Jean J. Labrosse. You can obtain the source code for the OS by buying Labrosse&#039;s excellent book &#039;&#039;MicroC/OS-II The Real-Time Kernel (2nd edition)&#039;&#039;. [http://www.ee.lut.fi/staff/Julius.Luukko/ucos-ii/avr/index.shtml Port for AVR (gcc 3.x)] and [http://www.myplace.nu/avr/ucos/index.htm AVR (gcc 2.x)].&lt;br /&gt;
* [http://freshmeat.net/projects/qp/ QP] is a lightweight, portable framework/RTOS for embedded systems (ARM, Cortex-M3, 8051, AVR, MSP430, M16C, HC08, NiosII, and x86). GPL (und kommerzielle Lizenz verfügbar)&lt;br /&gt;
* [http://www.femtoos.org/ Femto OS] von  Ruud Vlaming ist ein preemptives Betriebssystem für die kleinsten Mikrocontroller aus der AVR Serie bis ca. 16 KB ROM und 1 KB RAM. Spezielle Targets sind: ATtiny861/461/261. Geschrieben in C. Freie Software, GPLv3.&lt;br /&gt;
* [http://www.projects-lab.com/?p=344 kaOS] is a real-time, multithreaded, preemptive operating system for the ATmega32 microcontroller, which loads and executes programs from a Secure Digital or MMC card. Authors Nicholas Clark &amp;amp; Adam Liechty. (Circuit Cellar AVR Wettbewerb 2006)&lt;br /&gt;
&lt;br /&gt;
==== Projektsammlungen ====&lt;br /&gt;
&lt;br /&gt;
* [http://iwenzo.de Elektronik und Informationen] Wissenswertes aus der Unterhaltungselektronik..&lt;br /&gt;
* [http://instruct1.cit.cornell.edu/courses/ee476/FinalProjects/ Cornell University ECE 476 Microcontroller Design Final Projects]&lt;br /&gt;
* [http://www.serasidis.gr/ Serasidis Vasilis&#039; AVRsite] u.a. GLCD, SMS, PAL&lt;br /&gt;
* [http://www.riccibitti.com Alberto Ricci Bitti] u.a. PAL Video-Interface&lt;br /&gt;
* [http://www.ulrichradig.de Mikrocontroller and more] AVR - Projekte (Ethernet, LCD, Relaiskarte usw.) und mehr&lt;br /&gt;
* [http://home.arcor.de/burkhard-john/index.html Burkhard John] (D)&lt;br /&gt;
* [http://home.planet.nl/~meurs274/ AVRmicrocontrollerprojects] u.a. Text-LCD, Schrittmotor, Thermometer&lt;br /&gt;
* [http://hem.bredband.net/robinstridh/ Robin Stridh] Rotor-Anzeige, Video-Interface&lt;br /&gt;
* [http://www.dertien.dds.nl/content/avrprojects.html dertien.dds.nl AVR-Projects]&lt;br /&gt;
* [http://www.microsps.com MicroSPS.com] Grafische Programmierung des AVR mit EAGLE&lt;br /&gt;
* [http://www.h-mpeg.de h-mpeg Festplatten mp3 Player] IDE Ansteuerung, IDE Filesystem, LCD Ansteuerung etc. in 8K Code. Quelltext unter GPL&lt;br /&gt;
* [http://www.embedtronics.com/ embedtronics.com]&lt;br /&gt;
* [http://www.siwawi.arubi.uni-kl.de/avr_projects  M. Thomas&#039; AVR Projekte] AVR Butterfly avr-gcc-port, Bootloader, Programmier- und Debughardware, Software-UART, DS1820-Lib., experimentelle avrdude-Versionen, AVR und CAN mit MCP2515 &amp;lt;!-- Vorsicht &amp;quot;Eigenwerbung&amp;quot; --&amp;gt;&lt;br /&gt;
* [http://www.mictronics.de Michaels Electronic Projects] AVR Projekte (EN) - ua. Sony/Becker CD/MD Wechsler Emulator, RDS-Decoder, GPS Infos, OBD J1850 VPW Interface, USB&amp;lt;&amp;gt;CAN Bus Interface. Informationen zu CD Wechsler Protokollen. MP3stick - MP3 Player mit ATmega128, color LCD, SD/MMC Karte und VS1011b&lt;br /&gt;
* [http://www.stahlbucht.de/elektronik/node13/ node13] modulares AVR 8515 Projekt: eine Controller-Platine, an die sich weitere Ein-Ausgabemodule (Tastenfeld, LEDs, LCD-Modul) anschliessen lassen&lt;br /&gt;
* [http://www.mikrocontroller-projekte.de www.mikrocontroller-projekte.de] Diverse Projekte mit AVR Controllern. AVR910 Programmer, Testboard und Modellbauelektronik&lt;br /&gt;
* [http://www.roboternetz.de/phpBB2 Roboternetz-Mikrocontroller Projekte.de] Diverse Projekte mit AVR und anderen Controllern, insbesondere im Bereich Robotik&lt;br /&gt;
* [http://www.avr-projekte.de AVR-Projekte.de] HD44780-LCD über USB und Seriell, AVR910-USB Programmer, Basteleien&lt;br /&gt;
* [http://openeeg.sourceforge.net/ openeeg.sourceforge.net] Das OpenEEG Projekt befasst sich mit der Entwicklung eines preiswerten Elektro-Enzephalographie (EEG) Geräts und dessen freier Steuersoftware zur Messung elektrischer Gehirnströme. Sein µPC-Herz ist ein AT90S4433 bzw. ein ATmega8. Ziel sind auch verschiedene EEG Anwendungen z.B. im Bereich mentaler Trainingsmethoden (Neurofeedback).&lt;br /&gt;
* [http://www.amateurfunkbasteln.de/ www.amateurfunkbasteln.de] Seite von Michael Wöste (DL1DMW) u.a. CPU-Board mit AT89C2051, AT89C4051 oder AVR AT90S2313, CPU-Board mit Atmel AT90S8535, Experimentierplatine mit ATmega103, Programmer für AT89C2051/AT89C4051, 32-Kanal-Logik-Analysator bis 40 MHz (Entwurf von David L. Jones)&lt;br /&gt;
* [http://www.atmel.com/dyn/products/app_notes.asp?family_id=607 Atmel - AVR 8-Bit RISC - Application Notes] Anwendungshinweise und Beispiele vom Hersteller&lt;br /&gt;
* [http://www.projects.cappels.org/ Dick Cappels&#039; Project Pages]&lt;br /&gt;
* [http://see-by-touch.sourceforge.net/index.html SeebyTouch - Blinden-Seh-Ersatzsystem] Computerbilder fühlen durch ein einfaches Gerät (Bauanleitung) und freier Software (für 10 Betriebssysteme) - eine neue Erfahrung für alle&lt;br /&gt;
* [http://www.loetstelle.net www.loetstelle.net] Verschiedene kleinere AVR-Projekte rund um LEDs, z.B. RGB Dimmer, Moodlight. Diverse Elektronikprojekte und Grundlagen&lt;br /&gt;
* [http://www.dietmar-weisser.de Selbstbauprojekte Elektronik] kleine Sammlung von Elektronikprojekten zum Thema Leiterplattenfertigung, Hochfrequenztechnik und Mikrocontroller.&lt;br /&gt;
* [http://www.myplace.nu/avr/ Jesper&#039;s AVR pages] Yampp MP3 Player, Yaap Programmer, DDS mit 2313+R2R, Gitarrentuner, Frequenzzähler.&lt;br /&gt;
* [http://www.microsyl.com/ MicroSyl MCU] MP3 Player, MegaLoad, HCLoad, Propeller Clock, Freq Meter, BarCode Reader, Door Bell, OneWire Lib, Text LCD Lib, Graph LCD Lib, Nokia LCD Lib, Led Sign with MMC MemoryCard, Intercom&lt;br /&gt;
* [http://www.jeroen.homeunix.net/ http://www.jeroen.homeunix.net/] Aufbau eines elektronischen Rouletts auf basis eines AVRs&lt;br /&gt;
* [http://thomaspfeifer.net thomaspfeifer.net] Reflow-Ofen, Laminator-Temperaturregelung, USB-Atmel-Programmer, SMD-Tricks u.v.m.&lt;br /&gt;
* [http://www.scienceprog.com Scienceprog - embedded theory and projects] - AVR, ARM theory and projects&lt;br /&gt;
* [http://www.iuse.org Hausautomatisierung] - CAN-Bus mit ATmega32-Controllern und Bedienfeldern, Admin-Tools zum Updaten via CAN, Traffic Dumper etc.&lt;br /&gt;
* [http://www.myevertool.de AVRSAM] - AT91SAM7S Header Board annährend 100% Pinkompatibel zu den folgenden AVR Mikrocontroller: AT90S8535 / ATMEGA8535 / ATMEGA16 / ATMEGA32&lt;br /&gt;
* [http://members.aon.at/hausbus Hausbus Home] - Hausbus-Projekt unter Verwendung von ATmega8, ATtiny13 und ATmega128&lt;br /&gt;
* [http://www.thomas-wedemeyer.de/elektronik/AVR/avr-dcf-clock.html AVR-DCF-Clock] - DCF-Uhr mit bunter LED-Anzeige - ATmega8&lt;br /&gt;
* [http://www.grasbon.de/genuhr.html GenuhR] - DCF-Funkuhr / Wecker/ Timer mit LED-Punktmatrixanzeige. Das Projekt beschreibt den Aufbau des kompletten Gerätes beginnend beim Schaltplan bis hin zur Montage in ein Gehäuse.&lt;br /&gt;
* [http://www.avrguide.com/ AVR Projektsammlung] bei www.avrguide.com&lt;br /&gt;
* AVR Synth http://www.elby-designs.com/avrsynth/avrsyn-about.htm http://www.jarek-synth.strona.pl/&lt;br /&gt;
* [http://elm-chan.org/he_e.html Electronic Lives Manufacturing] - Aufbauten in Fädeldrahttechnik, tlw. auf Japanisch, aber mit englischen Sourcecodes&lt;br /&gt;
* AVR Synthesizer http://www.avrx.se/&lt;br /&gt;
* [http://freenet-homepage.de/wedis-bastelecke/ Wedis-Bastelecke] - Modellbahn DCC-Servo-Zubehördecoder DCC Servo Decoder mit ATmega8 / Servo Differenzierbaugruppe für Modellbau&lt;br /&gt;
* http://www.electronicspit.com - Verschiedene Elektronikprojekte (LED-Matrix, PAL-Video)&lt;br /&gt;
* http://www.hebel23.de/index.htm?/projekte/radio/radio.htm RDS RADIO: ATMega32, TEA5757, T6963C, TDA7330B in C&lt;br /&gt;
* [http://www.gasenzer.dk Analog/Digital and MPU Eletronic Projects] PAL/VGA Terminal, CallerID, Ethernet, Wireless Bridge, LPC2214, AT91RM9200, Sony Unilink Controlled Wireless MP3 Player.&lt;br /&gt;
* [http://www.circuitcellar.com/avr2004/ Circuit Cellar AVR Design Contest 2004] mit Projektbeschreibungen&lt;br /&gt;
* [http://www.circuitcellar.com/avr2006/ Circuit Cellar AVR Design Contest 2006] mit Projektbeschreibungen&lt;br /&gt;
&lt;br /&gt;
==== Schnittstellen ====&lt;br /&gt;
===== TCP/IP =====&lt;br /&gt;
* [http://www.laskater.com/projects/uipAVR.htm TCP/IP Stack für AVR] mit Realtek RTL8019AS oder Axis AX88796 Netzwerk-Chips (open source für avr-gcc und Imagecraft). Passende Hardware in [http://www.edtp.com/ diesem online-shop]&lt;br /&gt;
* [http://www.ethernut.de Ethernut] - AVR based Hardware with Ethernet-Interface, Multithreading OS, Software and Hardwaredesign is free&lt;br /&gt;
* [http://www.cesko.host.sk/IgorPlugUDP/IgorPlug-UDP%20(AVR)_eng.htm IgorPlug-UDP AVR] - Ethernet &amp;amp; UDP/IP in Software implementiert&lt;br /&gt;
* [http://members.home.nl/bzijlstra/software/examples/RTL8019as.htm] RTL8019 Bascom&lt;br /&gt;
* [http://members.home.nl/bzijlstra/software/examples/RTL8019as.htm AVR und RTL8019]&lt;br /&gt;
* [http://avr.auctionant.de/avr-ip-webcam AVR IP Webcam] &lt;br /&gt;
* http://mikrocontroller.cco-ev.de/de/webcam.php&lt;br /&gt;
* [http://avr.auctionant.de/avrETH1/ avrETH1 - Webserver mit enc28j60 und Webcam-Support]&lt;br /&gt;
* [http://www.sics.se/~adam/uip/ uIP-Stack, Teil des Contiki OS]&lt;br /&gt;
* [http://www.harbaum.org/till/spi2cf/ WLAN-Implementierung auf Basis einer PRISM-CF-Karte und uIP]&lt;br /&gt;
* http://www.circuitcellar.com/AVR2006/winners/DE/AT2581.htm MEGA128(CAN) PCMCIA&lt;br /&gt;
* [http://www.ic-board.de/index.php?cat=c2_ICnova-Module.html AVR32 AP7000 Linux Board] mit 2xEthernet, TFT, Audio, SDCARD, USB-Host/Devive, Funk...&lt;br /&gt;
* [https://berlin.ccc.de/wiki/AVR-Board_mit_Ethernet AVR-Board mit Ethernet mit dem ENC28J60 von Microchip]&lt;br /&gt;
&lt;br /&gt;
===== CAN =====&lt;br /&gt;
* [http://www.canathome.de/ Can@Home] - CAN als &amp;quot;Installationsbus&amp;quot;, u.a. mit AVRs (D)&lt;br /&gt;
* [http://www.iuse.org/ www.iuse.org] - Hausautomatisierung auf CAN Basis&lt;br /&gt;
* [http://www.port.de/ www.port.de] - Professionelle CAN/CANopen Entwicklungswerkzeuge&lt;br /&gt;
* [http://can-wiki.info CAN-WIKI] - spezielle Wiki Site für CAN bus (Englisch)&lt;br /&gt;
* [[CAN-Bus]] - Eintrag in diesem Wiki&lt;br /&gt;
* [[CAN als Hausbus]] - Eintrag in diesem Wiki&lt;br /&gt;
* [http://www.canhack.de/ www.canhack.de] - Ein Forum, dass sich mit dem CAN bus im Auto beschäftigt&lt;br /&gt;
&lt;br /&gt;
===== USB =====&lt;br /&gt;
* [http://www.cesko.host.sk/IgorPlugUSB/IgorPlug-USB%20(AVR)_eng.htm Igor-Plug] - USB Device interface in AVR Firmware - no extra Interface IC needed, read the License&lt;br /&gt;
* [http://www.obdev.at/products/avrusb/ AVR-USB] &amp;amp;#8211; USB-Implementation in C nach gleichem Prinzip wie Igor-Plug, aber einfacher zu verwenden, GPL-ähnliche Lizenz (Nutzung des Projekts &#039;&#039;erfordert&#039;&#039; Veröffentlichung), englisch kommentierter Code&lt;br /&gt;
* [http://www.xs4all.nl/~dicks/avr/usbtiny/ USBTiny] &amp;amp;#8211; weitere Software-USB-Implementierung in C; sehr ähnlich AVR-USB; steht aber unter GPL; relativ wenige Beispiele&lt;br /&gt;
* MJoy USB Joystick Controller on AVR ATmega8&lt;br /&gt;
* [http://www.ime.jku.at/tusb/ TUSB3210-Controller, HID, LIBUSB] Ein Projektseminar, in dem es darum ging, die USB-Schnittstelle des TUSB3210 zu aktivieren und die Daten eines ADC an den PC zu senden. USB-Implementierung für µC und PC.&lt;br /&gt;
* [http://www.b-redemann.de Steuern und Messen mit USB - FT232, 245 und 2232] Das aktuelle Buch zu den USB-Controllern von FTDI. Viele Beispielprogramme in C, zwei Projektbeschreibungen: I²C-Bus mit LM75A und ein Web-Projekt. Bauteilesatz und USB-Modul mit dem FT2232 zum schnellen Einstieg in die Thematik. Buch / Teilesatz über Segor oder dieser Seite erhältlich.&lt;br /&gt;
* [http://www.eltima.com/products/usb-over-ethernet/ USB to Ehternet Connector] - Share your USB devices via LAN/Internet&lt;br /&gt;
* [http://www.ixbat.de Viele kleine USB Projekte] Rund um die Bibliothek usbn2mc http://usbn2mc.berlios.de. Dies ist eine einfache Bibliothek für den USBN9604/03 von National Semiconductor&lt;br /&gt;
* [http://www.rahand.eu Mega8D12] - Einsteiger-Tutorial zur CDC-Klasse (virtueller COM-Port) mit Schaltung und Firmware (ATmega8 und PDIUSBD12).&lt;br /&gt;
&lt;br /&gt;
===== DMX512 =====&lt;br /&gt;
* [http://Dworkin-DMX.de Konverter RS232 zum DMX512] Steuerung DMX-fähigen Geräten mit einem PC. Es gibt Low cost Variante zum selber basteln.&lt;br /&gt;
* [http://www.hoelscher-hi.de/hendrik/light/license.htm Hennes Sites] Bauanleitungen für DMX-Dimmerpacks, DMX-Switchpacks, PWM-Controller, ... Tutorial für Senden und Empfangen von DMX-Daten mit AVRs.&lt;br /&gt;
* [http://www.lj-skinny-development.de/lj2000/ DMX Lichtanlage im Selbstbau] Projekt für den Selbstbau einer kompletten Lichtanlage zur Steuerung über DMX. Projekt beinhaltet alles was man für den Betrieb einer eigenen Lichtanlage benötigt (Mischpult, Steuersoftware, Dimmer, Scanner mit Iris, Shutter-Dimmer, 2 rotierenden Goborädern, 2 Farbrädern, CMY-Farbmischeinheit, Prisma, Fokus ...).&lt;br /&gt;
* [http://digital-enlightenment.de Digital Enlightenment ]Verschiedene DMX-Selbstbauprojekte&lt;br /&gt;
&lt;br /&gt;
===== PS2 =====&lt;br /&gt;
* [http://www.avrfreaks.net/index.php?module=Freaks%20Academy&amp;amp;func=viewItem&amp;amp;item_id=1086&amp;amp;item_type=project&amp;amp;timestamp=2007-09-04%2018:34:41 PC keyboard to an AVR]&lt;br /&gt;
&lt;br /&gt;
===== LANC =====&lt;br /&gt;
* [http://www-e2.ijs.si/3DLANCMaster/ 3D LANC Master from Damir Vrancic] is a device which keeps in synchronisation some of Sony camcorders by using LANC (CONTROL-L, ACC) protocol. (Open Hardware + Open Source, Atmega8).&lt;br /&gt;
&lt;br /&gt;
===== MMC/SD-Card =====&lt;br /&gt;
* [http://www.roland-riegel.de/sd-reader/index.html MMC/SD card reader example application] von Roland Riegel (Atmega8, Atmega168 für FAT16)&lt;br /&gt;
* [http://www.captain.at/electronic-atmega-mmc.php MMC Flash] bzw.  [http://www.captain.at/electronic-atmega-sd-card.php SD Flash ] Memory Extension für Atmegas von Captain. (Atmega16, Atmega32)&lt;br /&gt;
&lt;br /&gt;
==== LC-Displays ====&lt;br /&gt;
&lt;br /&gt;
===== Text (character-mode) HD44870 =====&lt;br /&gt;
* [http://jump.to/fleury P.Fleury]&lt;br /&gt;
* avrfreaks Projekt 59 (Chris E.) und andere&lt;br /&gt;
* Procyon avrlib v. Pascal Slang (GPL)&lt;br /&gt;
* Bray&lt;br /&gt;
* [http://www.sprut.de/electronic/lcd/index.htm Spruts LCD-Seite]&lt;br /&gt;
* [http://elm-chan.org/docs/lcd/lcd3v.html Standard-LCD auf 3V betreiben (eng)]&lt;br /&gt;
* [http://www.harbaum.org/till/lcd2usb LCD2USB, LCD mit AVR am USB betreiben]&lt;br /&gt;
&lt;br /&gt;
===== Grafik T6963C etc. =====&lt;br /&gt;
&lt;br /&gt;
* http://www.holger-klabunde.de/avr/avrboard.htm#t6963&lt;br /&gt;
* [[Projekt T6963-LCD-Ansteuerung]] nur PC, keine Änderung seit Juli 2006&lt;br /&gt;
* avrfreaks.net - TOSHIBA_LCD_T6963C, AVR Graphics&lt;br /&gt;
* http://www.mikrocontroller.net/topic/48456 C&lt;br /&gt;
* http://www.mikrocontroller.net/topic/54563 C&lt;br /&gt;
* http://www.mikrocontroller.net/topic/48584 ASM&lt;br /&gt;
* [http://passworld.co.jp/ForumMSP430/viewtopic.php?t=47 Grafik LCDs] - 128 x 112 Grayscale für MSP430 und andere uCs.&lt;br /&gt;
* http://www.display3000.com/ Farb-TFT-Module inkl. Mikrocontroller (ATMega128; ATMega2561 und AT90CAN128)&lt;br /&gt;
In der Codesammlung gibt es auch für andere Controller was.&lt;br /&gt;
&lt;br /&gt;
===== Siemens S65/M65/CX65 =====&lt;br /&gt;
* [http://www.superkranz.de/christian/S65_Display/DisplayIndex.html S65-Display] vom Siemens S65/M65/CX65, 132x176 Pixel, 65536 Farben, günstig als Ersatzteil zu bekommen.&lt;br /&gt;
&lt;br /&gt;
===== Nokia 3210/3310 =====&lt;br /&gt;
* [http://www.microsyl.com MicroSyl.Com]&lt;br /&gt;
&amp;lt;!-- * [http://www.microsyl.com/nokialcd/shematic.gif Belegung] --&amp;gt;&lt;br /&gt;
* [http://www.deramon.de/nokia3310lcd.php Deramon.de]&lt;br /&gt;
&amp;lt;!-- [[Bild:Beispiel.jpg]] --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Nokia 6100 LCD =====&lt;br /&gt;
&amp;lt;!-- * [http://www.apetech.de/article.php?artId=3&amp;amp;nnId=12 Nokia 6100 LCD Library] für Nokia-Displays 132x132 Pixel, 4096 Farben mit Philips Controller (bei eBay ziemlich preiswert zu ersteigern) --&amp;gt;&lt;br /&gt;
* [http://www.myplace.nu/mp3/download/download.php Yampp 7 Software Download Seite]: Archiv &amp;quot;yampp-7 with colour LCD firmware&amp;quot; enthaelt avr-gcc/avr-as Routinen für 6100-LCDs mit Philips- oder Epson-Controller (nicht direkt eine &amp;quot;Library&amp;quot;)&lt;br /&gt;
*[http://www.e-dsp.com/controlling-a-color-graphic-lcd-epson-s1d15g10-controller-with-an-atmel-avr-atmega32l/ S1D15G10]: Routine code für den Epson S1D15G10 Controller&lt;br /&gt;
*[http://thomaspfeifer.net/nokia_6100_display.htm Nokia 6100 Display am AVR] Anzeige von RGB-Bildern (für avr-gcc)&lt;br /&gt;
*[http://www.optixx.org/ www.optixx.org] Code zur Ansteuerung von Philips und Epson&lt;br /&gt;
&lt;br /&gt;
===== KS0108 =====&lt;br /&gt;
* [http://hubbard.engr.scu.edu/embedded/avr/avrlib Procyon avrlib (GPL)]&lt;br /&gt;
* avrfreaks UP&lt;br /&gt;
* apetech.de nicht mehr erreichbar http://www.mikrocontroller.net/topic/68316&lt;br /&gt;
&lt;br /&gt;
====GPS====&lt;br /&gt;
* http://www.holger-klabunde.de/avr/avrboard.htm#GPSdisplay GPS-Daten auf LCD&lt;br /&gt;
* [http://www.geoclub.de/forum57.html www.geoclub.de] - Elektronik beim Geocaching&lt;br /&gt;
* [http://passworld.co.jp/ForumMSP430/viewtopic.php?t=22 passworld.co.jp] - Do It Yourself GPS&lt;br /&gt;
&lt;br /&gt;
== [[8051|8051 / MCS51]] ==&lt;br /&gt;
* [http://www.progshop.com/versand/software/prog-studio/index.html Prog-Studio] - Moderne Assembler Entwicklungsumgebung für 8051 Mikrocontroller mit Debugger, Edit &amp;amp; Continue, Code-Folding, Intelli-Sense, Monitorung und mehr&lt;br /&gt;
* [http://www.yCModule.de yCModule: µController-Systeme] - Preisgünstige µController-Module, ISP-Programmiertools und Applikationsboards&lt;br /&gt;
* [http://www.erikbuchmann.de/ Erik Buchmanns Mikrocontroller-Seite] - Assemblerkurs und mehrere Projekte&lt;br /&gt;
* [http://www.holger-klabunde.de/projects/8051.htm Experimentierboard für 8051 Controller] von Holger Klabunde.&lt;br /&gt;
* [http://www.woe.de.vu/ World Of Electronics] - Projekte mit den 8051-Controllern von Atmel&lt;br /&gt;
* [http://www.thomas-wedemeyer.de/elektronik/8051/8051.html Controllerplatine mit SAB80C535]&lt;br /&gt;
* [http://www.maxim.ph.tc Selbstbau-Programmer] für 2051er&lt;br /&gt;
* [http://www.nomad.ee/micros/8052bas.html 8052 BASIC Projects] - IDE-Interface&lt;br /&gt;
* [http://home.t-online.de/home/s.holst/sh51/index.html Mikrokontroller sh51] Schaltplan fuer 80C535-Board&lt;br /&gt;
* 8051-Makroassembler [http://plit.de/asem-51/ ASEM-51] (Freeware)&lt;br /&gt;
* [http://sdcc.sourceforge.net/ SDCC - Small Device C Compiler] - freier ANSI-C compiler für Intel 8051, Maxim DS80C390 und Zilog Z80 kompatible Controller.&lt;br /&gt;
* [http://sdccokr.dl9sec.de/ The SDCC Open Knowledge Resource]&lt;br /&gt;
* [http://www.wickenhaeuser.de/ Wickenhäuser C Compiler] - Preisgünstiger C Compiler&lt;br /&gt;
* [http://home.tiscali.cz:8080/~cz056018/lanc_a.htm LANC-Remote] Projekt von Ji&amp;amp;#345;í &amp;amp;#352;mach zur Steuerung von Videorekordern oder Camcordern über das Control-L (LANC) Protokoll mit Hilfe eines AT89C2051.&lt;br /&gt;
* [http://www.microcontroller-starterkits.de Microcontroller-Starterkits] Starter-Kits für verschiedene Microcontroller (D) preisgünstige Platinen (ab 12,95 Euro für AT89S8252). Beim uC-Dualboard : Das Board ist nutzbar mit AVR-Controllern und 8051-Controllern!&lt;br /&gt;
&lt;br /&gt;
== MSP430 ==&lt;br /&gt;
* [http://www.mathar.com MSP430 Tutorials] - Tutorials, Anleitungen und viele Beispielprojekte mit dem MSP430-Mikrocontroller&lt;br /&gt;
* [http://www.student-zw.fh-kl.de/~stwi0001/imp/msp430/pwm430/index.htm Pulsweitenmodulation mit dem MSP430] - sehr ausführliche Einführung&lt;br /&gt;
* [http://www.thomas-wedemeyer.de/elektronik/msp430/msp430.html Kleine Projekte mit dem MSP430] - Schaltplan und Layout zu einem MSP430F149-Board und einem ADXL-G-Sensor mit MSP430&lt;br /&gt;
* [http://tinymicros.com/embedded/MSP430/ The MSP430 Bugspray Database] - umfangreiche Datenbank für Bugs in MSP430-Controllern&lt;br /&gt;
* [http://msp430.info MSP430.info] - Portalseite für MSP430; Info, Projekte (MIDI, USB)&lt;br /&gt;
* [http://groups.yahoo.com/group/msp430 Yahoo group MSP430] - lebhaftes Forum mit vielen MSP430-Experten&lt;br /&gt;
* [http://homepage.hispeed.ch/py430/mspgcc/ mps430-gdb und Eclipse] - Eine Anleitung von Chris Liechti&lt;br /&gt;
* [http://passworld.co.jp/ForumMSP430 Forum MSP430] - Projekte mit MSP430 (GPS, BlueTooth usw...)&lt;br /&gt;
* TI Design-WEttbewerb: http://www.designmsp430.com/View.aspx (dateien liegen evtl. in /projects/)&lt;br /&gt;
* [http://www.sics.se/project/mspsim MSPsim] - a Java-based simulator of MSP430 sensor network platforms (BSD License (revised))&lt;br /&gt;
* [http://develissimo.net/de/msp430entwicklung MSPGCC + Eclipse + msp430-gdbproxy / Linux / Debian / Ubuntu] - Anleitung / Tutorial zur Installation der MSPGCC Toolchain + Eclipse + msp430-gdbproxy für Linux / Debian / Ubuntu Lang=Deutsch und Englisch&lt;br /&gt;
&lt;br /&gt;
== ARM ==&lt;br /&gt;
&lt;br /&gt;
=== Herstellerseiten ===&lt;br /&gt;
* [http://www.arm.com ARM] - Entwickler des ARM-Prozessorkerns (kein Hersteller von ICs)&lt;br /&gt;
* [http://infocenter.arm.com ARM Infocenter] Sammlung Technischer Informationen&lt;br /&gt;
&lt;br /&gt;
* [http://www.analog.com/ Analog Devices] ADuC7xxx ARM7TDMI Serie unter &#039;&#039;Analog Microcontrollers&#039;&#039;&lt;br /&gt;
* [http://www.atmel.com/products/AT91/ Atmel AT91 Startseite]&lt;br /&gt;
* [http://www.at91.com AT91.COM] - Atmel ARM Informationsseite (Forum, Beispielcodes etc.)&lt;br /&gt;
* [http://www.cirrus.com/en/products/pro/techs/T7.html Cirrus Logic]&lt;br /&gt;
* [http://www.freescale.com/mac7100 Freescale MAC7100]&lt;br /&gt;
* [http://www.hilscher.com Hilscher netX] (ARM926 core)&lt;br /&gt;
* [http://www.intel.com/design/intelxscale/ Intel XSCALE Startseite], siehe auch [http://www.marvell.com/ Marvell]&lt;br /&gt;
* [http://www.luminarymicro.com/ Luminiary Micro] Controller mit Cortex M3 core&lt;br /&gt;
* [http://www.standardics.nxp.com/microcontrollers/ NXP (ehemals Philips) Microcontroller Startseite] für sämtliche Mikrocontroller (ARM7, MCS51 etc.), neben LPC2000, LPC3000 auch die LH7xxxx BlueStreak-Serie (ehemals Sharp Microelectronics)&lt;br /&gt;
* [http://www.lpc2000.com lpc2000.com] Infoseite fuer NXP (ex. Philips) LPC2000 und LPC3000&lt;br /&gt;
* [http://www.okisemi.com/eu/1.Products/ARM32bit.html OKI ARM-Controller Startseite]&lt;br /&gt;
* [http://www.samsung.com/Products/Semiconductor/ Samsung] ARM7/9 unter &#039;&#039;Mobile SoC&#039;&#039;&lt;br /&gt;
* [http://mcu.st.com/mcu/ STMicroelectronics (ST) Microcontroller Startseite] u.a. STR7, STR9, STM32 Support-Forum&lt;br /&gt;
* [http://www.ti.com/ Texas Instruments] TMS470 ARM7TDMI Serie&lt;br /&gt;
&lt;br /&gt;
=== Information (Foren, Mailinglisten, Linksammlungen) ===&lt;br /&gt;
* [http://www.neko.ne.jp/~freewing/cpu/arm_olimex/ Freewing Linksammlung] zu den NXP (ex. Philips) LPC-ARM7-Controllern (Assemblerbeispiele u.a. für Nokia 3310-GLCD)&lt;br /&gt;
* [http://www.open-research.org.uk/ARMuC ARM Microcontroller Wiki]&lt;br /&gt;
&lt;br /&gt;
* [http://tech.groups.yahoo.com/group/ADuC7000/ ADuC7000 Yahoo-Group]&lt;br /&gt;
* [http://www.at91.com AT91 Forum] (Atmel Rousset)&lt;br /&gt;
* [http://tech.groups.yahoo.com/group/AT91SAM/ AT91SAM Yahoo-Group]&lt;br /&gt;
* [http://en.mikrocontroller.net/forum/17 arm-elf-gcc WinARM Forum] (auch für Yagarto)&lt;br /&gt;
* [http://www.codesourcery.com/archives/arm-gnu/maillist.html Sourcery G++ Lite Edition User Forum/Mailing-List&lt;br /&gt;
* [http://tech.groups.yahoo.com/group/gnuarm/ GNUARM Yahoo-Group]&lt;br /&gt;
* [http://www.keil.com/forum/ Keil/ARM Forum]&lt;br /&gt;
* [http://groups.yahoo.com/group/lpc2000/ LPC2000 Yahoo-Group]&lt;br /&gt;
* [http://forum.sparkfun.com/ Sparkfun Foren]&lt;br /&gt;
* [http://mcu.st.com/mcu/modules.php?name=Splatt_Forums STMicroelectronis Forum]&lt;br /&gt;
&lt;br /&gt;
=== Entwicklungswerkzeuge (Compiler/Assembler/Debugger/Tools) ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.st-angliamicro.com/software.asp Anglia Idealist IDE und Anglia Toolchain] GNU toolchain für Win32-hosts inkl. Beispielen für STR7, STR9 und STM32. IDE kostenlost aber registrierungspflichtig&lt;br /&gt;
* [http://www.codesourcery.com/gnu_toolchains/ Codesourcery] GNU Toolchains für ARM (Hosts: Linux, MS Windows, Solaris; Targets: arm-elf, arm-linux, SybianOS)&lt;br /&gt;
* [http://devkitpro.org/ devkitPro/devkitARM] GNU-Toolchain für MS-Windows &amp;quot;Hosts&amp;quot;. Vor allem auf GBA abgestimmt aber auch für andere ARM-Controller geeignet (arm-elf)&lt;br /&gt;
* [http://www.gnuarm.org GNU ARM] GNU Compiler-Toolchain für ARM mit binutils, gcc für C, C++, Java, newlib, gdb/Insight. Binaries für Linux und MS-Windows mit Cygwin&lt;br /&gt;
* [http://www.ghs.com/ Green Hills Software]&lt;br /&gt;
* [http://www.hitex.de Hitex] IDE für diverse Compiler, Debugger&lt;br /&gt;
* [http://www.iar.com IAR] Embedded Workbench, kommerzielle IDE/Compiler, codegrößenbeschränkte Evaluierungsversion verfügbar&lt;br /&gt;
* [http://www.isystem.com/ iSYSTEM] Integrated Development Environment, USB/JTAG interface, OnChip Emulation and Trace&lt;br /&gt;
* [http://www.keil.com Keil/ARM RVDK/uVision] kommerzielle IDE/Compiler, unterstützt zwei Compiler (ARM RealView, GNU/gcc), codegrößenbeschränkte Evaluierungsversion verfügbar (IDE/Compiler unbeschränkt für GNU), guter Debugger, guter Simulator (teilw. mit Hardwaresimulation) Simulator und Debugger in der Evaluierungsversion auch bei Nutzung der GNU-Toolchain auf 16kB beschränkt&lt;br /&gt;
* [http://mct.de/download.html#free MCT Demoversion C-Compiler fuer ARM und 68k] ARM C-Compiler basiert auf GCC laut Herstellerinformation jedoch mit Codegrößenbeschränkung &amp;lt;!-- etwas ungewöhnlich: Codegrößenbeschränkung bei GNU-Toolchain --&amp;gt;&lt;br /&gt;
* [http://www.mpeforth.com www.mpeforth.com] - A free Forth system with 125 page manual for all Philips LPC2xxx CPUs with at least 64k Flash and 16k RAM and cystal frequency of 10, 12, or 14.7456 MHz. &lt;br /&gt;
* [http://www.rowley.co.uk/ Rowley] Kommerzielle IDE für GNU-Compiler, eigene libc (nicht newlib), Debugger (inkl. gutem Support für Wiggler)&lt;br /&gt;
* [http://h-storm.tantos.homedns.org/gcc_arm.htm Tantos gcc for ARM Targets] eine weitere ARM-GNU-Toolchain für MS-Windows &amp;quot;Hosts&amp;quot; &lt;br /&gt;
* [http://www.yagarto.de Yagarto] GNU arm-elf-Toolchain, Eclipse, OpenOCD für Win32 inkl. Setup&lt;br /&gt;
* [http://www.siwawi.arubi.uni-kl.de/avr_projects/arm_projects/index.html#winarm WinARM] eine an WinAVR angelehnte Sammlung von Entwicklungswerkzeugen (binutils, arm-elf-gcc, newlib, &#039;&#039;newlib-lpc&#039;&#039;, Programmers Notepad, &#039;&#039;Beispiel-Makefiles und Beispielcode&#039;&#039;) für alle ARM-Controller. Beispiele für Philips LPC2000 und Atmel AT91SAM7S (ARM7TDMI) u.a.&lt;br /&gt;
* [http://rtlab.tekproj.bth.se/wiki/index.php/Dissy#Architecture_support Dissy] is a disassembler for Linux and UNIX which supports multiple architectures and allows easy navigation through the code. Dissy is implemented in Python and uses objdump for disassembling files.&lt;br /&gt;
&lt;br /&gt;
* [http://openocd.berlios.de/web/ OpenOCD] Open On-Chip Debugger: Schnittstelle (&amp;quot;gdb-Server&amp;quot;) zwischen Wiggler-komaptiblem JTAG-Interface und GNU-debugger (gdb/Insight-gdb), ebenfalls Unterstützung für JTAG-Hardware auf FTDI2232-Basis, Flash-Programmierfunktion für LPC2k, AT91SAM7S u.a.&lt;br /&gt;
* [http://macraigor.com/full_gnu.htm OCDLibRemote] Schnittstelle zwischen WIGGLER-kompatibler JTAG Hardware und dem GNU-Debugger (gdb)&lt;br /&gt;
* [http://gdb-jtag-arm.sourceforge.net/ GDB-JTAG-ARM] GDB JTAG Tools&lt;br /&gt;
* [http://jtagpack.sourceforge.net/ JTAG-Pack] GDB JTAG Tools&lt;br /&gt;
* [http://www.hjtag.com H-JTAG] RDI-Interface für Wiggler, Flash-Funktionen für diverse interne und externe Speicher&lt;br /&gt;
* [http://www.clibb.de/ lpc21isp] Flashutility für LPC21xx, ISP via &amp;quot;Bootloader&amp;quot; (&amp;quot;multiplattform&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
*http://www.abatron.ch Abatron] BDI1000 &amp;amp; BDI2000, On-Chip Debuggers für ARM, 68k, Coldfire uvm.&lt;br /&gt;
* [http://www.amontec.com Amontec] JTAGkey, JTAG-Adapter auf Basis des FTDI2232 &lt;br /&gt;
* [http://www.keil.com Keil/ARM ULINK/ULINK2/ULINK-ME] JTAG-Adapter, USB-Anschluss, wird von Keil uVision unterstützt, ULINK2 teilw. auch von Codesourcery G++ (lt. Hestellerangaben)&lt;br /&gt;
* [http://www.kristech.eu Kristech] USB-Scarab, JTAG Adapter, kommt mit eigener Debugger-UI, kompatibel zu Olimex&lt;br /&gt;
* [http://www.lauterbach.de Lauterbach] TRACE32 JTAG-Adapter, USB und Ethernet-Anschluss, eigene Software&lt;br /&gt;
* [http://www.olimex.com Olimex] JTAG-Adapter: Wiggler-Nachbau (ParPort) und  Adapter auf Basis des FTDI2232 (USB)&lt;br /&gt;
* [http://www.ronetix.at/peedi.html Ronetix Peedi]&lt;br /&gt;
* [http://www.segger.de Segger J-Link] JTAG-Adapter, USB-Anschluss, unterstützt z.B. von IAR, Keil uVision (via RDI) (OEM: IAR J-Link, SAM-ICE)&lt;br /&gt;
* [http://www.signalyzer.com/ Signalyzer] Signalyzer Tool, u.a. JTAG-Adapter auf Basis des FTDI2232&lt;br /&gt;
* [http://www.sinelabore.com sinelaboreRT] - generiert leicht lesbaren C-Code aus einer Zustandsmaschine. Die Generierung berücksichtig speziell die Bedürfnisse eingebetteter Echtzeitsysteme.&lt;br /&gt;
&lt;br /&gt;
=== Tutorials und Beispiele ===&lt;br /&gt;
* [http://www.dreamislife.com/arm/ LPC210x ARM7 Microcontroller Tutorial] - Assembler-Beispiele (arm-elf-as) für das Olimex LPC-MT-Board (Philips LPC2106 ARM7TDMI)&lt;br /&gt;
* [http://re-eject.gbadev.org/index.php gcc-Assembler für ARM] - Befehlsübersicht&lt;br /&gt;
* [http://k2pts.home.comcast.net/gbaguy/gbaasm.htm GBA ASM Tutorial] - ARM7 Assembler Tutorial mit arm-elf-as (&amp;quot;gcc&amp;quot;) (Allgemein und GBA)&lt;br /&gt;
* [http://www.robsite.de/daten/tutorials/devgba/gba_asm1.html GBA Assembler Tutorial] - ARM7TDMI, Schwerpunkt auf GBA&lt;br /&gt;
* [http://www.sparkfun.com/tutorial/ARM/ARM_Cross_Development_with_Eclipse.pdf Eclipse+CDT+gnuarm-Tutorial]&lt;br /&gt;
* [http://mct.de/download/armsamples/map.html Beispiele in C, für ARM7-Controller von Philips und ADI]&lt;br /&gt;
* [http://www.embedded.com/design/opensource/201802580 Embedded.com: Building Bare-Metal ARM Systems with GNU] Teil 10, Links zu den Teilen 1-9 auf der Seite&lt;br /&gt;
&lt;br /&gt;
=== Projekte und Quellcodebibliotheken ===&lt;br /&gt;
* [http://hubbard.engr.scu.edu/embedded/arm/armlib/ Procyon ARMlib-LPC2100] - Treiber, Beispiele (Lizenz: GPL, kaum weiterentwickelt)&lt;br /&gt;
* [http://www.standardics.nxp.com/support/documents/?type=software NXP BlueStreak] Code für LH7xxxx (ehemals Sharp)&lt;br /&gt;
* [http://www.siwawi.arubi.uni-kl.de/avr_projects/arm_projects/index.html M. Thomas&#039; ARM Projekte] &amp;quot;Projectvorlagen&amp;quot; für AT91SAM7 und LPC2000 mit GNU-Toolchain Einsteiger-Projekte für AT91SAM7, LPC2000, ADuC7000 u.a. (u.a. Blinky, UART, Interrupt, C++, GLCD mit KS0108, DS18x20, DCF77, Anpassungen von FAT16/32-Libraries) &amp;lt;!-- noch mehr &amp;quot;Eigenwerbung&amp;quot; --&amp;gt;&lt;br /&gt;
* [http://mcu.st.com/ STMicro] Treiber und Beispiel für STR7, STR9 und STM32&lt;br /&gt;
* [http://www.gnuarm.com/~lpc2000/ Mirror der LPC2100-Group Dateien] (veraltet, aber ohne Yahoo-Account zugänglich.)&lt;br /&gt;
* [http://www.geocities.com/leon_heller/lpc2104.html Simple LPC210x Prototyping System]&lt;br /&gt;
* [http://wiki.sikken.nl/index.php?title=LPCUSB LPCUSB] - Open-source [[USB]] stack for the built-in USB controller in LPC214x microcontrollers von Bertrik Sikken. [http://lpcusb.cvs.sourceforge.net/lpcusb/host/benchmark/main.c?revision=1.2&amp;amp;view=markup Sample code]&lt;br /&gt;
* [http://www.olimex.com Olimex] Einige Beispiele auf den &amp;quot;Produktseiten&amp;quot; der ARM Boards.&lt;br /&gt;
* [[ARM MP3/AAC Player]]&lt;br /&gt;
* [http://www.jcwren.com/arm/ J.C. Wrens Beispielprojekt] für LPC214x&lt;br /&gt;
* [http://www.keil.com/download/list/arm.htm Beispiele von Keil] abgestimmt auf deren Boards und Realview-Toolchain, Portierung auf andere Boards und Compiler relativ einfach, Lizenz beachten.&lt;br /&gt;
* [http://www.luminarymicro.com/ Luminary Micro Driverlib] für Stellaris Cortex-M3&lt;br /&gt;
&lt;br /&gt;
=== Betriebssysteme ===&lt;br /&gt;
* [http://agnix.sourceforge.net/ Agnix]&lt;br /&gt;
* [http://sources.redhat.com/ecos/ eCos] - &amp;quot;Real-Time-Operating-System&amp;quot; o.a. auch für ARM7&lt;br /&gt;
* [http://www.freertos.org/ FreeRTOS (.org!)] - &amp;quot;Real-Time-Kernel&amp;quot; unter anderem für ARM7 (LPC2xxx) auch AVR, MSP430, &#039;51er&lt;br /&gt;
* [http://l4ka.org/ L4Ka]&lt;br /&gt;
* [http://www.toradex.com/colibri_downloads/Linux/readme.txt Linux 2.4.29 für Toradex Colibri] basierend auf Intel XScale PXA270&lt;br /&gt;
* [http://www.linux4sam.org Linux4SAM] Informationen, Anleitungen und Code zur Anwendung von Linux auf AT91SAM9xxx&lt;br /&gt;
* [http://www.freertos.com/ NicheTask] (URL ist www.freertos.com aber hat nichts mit FreeRTOS(.org) zu tun)&lt;br /&gt;
* [http://www.ethernut.de/en/software/index.html Nut/OS]&lt;br /&gt;
* [http://nuttx.sourceforge.net/ NuttX RTOS] (ARM7TDMI port for TI TMS320C5471 also called a C5471 or TMS320DM180).&lt;br /&gt;
* [http://www.phoenix-rtos.org/ Phoenix-RTOS]&lt;br /&gt;
* [http://picoos.sourceforge.net/ PicoOS]&lt;br /&gt;
* [http://prex.sourceforge.net Prex] is a portable real-time operating system for embedded systems. The small, reliable, and low power kernel is written in the C language based on microkernel design. The file system, Unix process, and networking features are provided by user mode tasks. (ARM, i386, geplant: MIPS, PowerPC, Hitachi-SH und Win32)&lt;br /&gt;
* [http://www.rtems.org/ RTEMS]&lt;br /&gt;
* [http://www.tnkernel.com/downloads.html TNKernel] - &amp;quot;Real-Time-Kernel&amp;quot; TNKernel ist ein kompakter und sehr schneller Echtzeitkernel unter anderem für ARM7 (Philips LPC2106/LPC21XX/LPC22xx, Samsung S3C44B0X, Atmel AT91SAM7S128, STMicroelectronics STR711FR2)&lt;br /&gt;
* [http://www.ucos-ii.com/ uC/OS-II RTOS]&lt;br /&gt;
&lt;br /&gt;
=== Hardware (Prototypen-Platinen etc.) ===&lt;br /&gt;
* [http://www.cpu-module.de/de/elektronik.html cpu-module.de] Module mit AT91RM9200, AT91SAM9261, RAM, Flash, USB, Ethernet, fast alle IOs zugänglich.&lt;br /&gt;
* [http://www.armkits.com/ Embest] Philips, Samsung und Atmel ARM Boards und Module, JTAG-Hard- und Software&lt;br /&gt;
* [http://www.waveplayer.de/ Embedded-Waveplayer] mit ARM7-Prozessor EP7309 (MIDI- und RS232-Steuerung)&lt;br /&gt;
* [http://www.embeddedartists.com/ Embedded Artists] bietet verschiedene preisgünstige Platinen (ab 25 Euro für LPC213x Familie)&lt;br /&gt;
* [http://www.hiteg.com Hiteg] SAMSUNG und Intel XScale basierende boards. (Deutsches Unternehmen in China)&lt;br /&gt;
* [http://www.hitex.de/ Hitex] Starter-Kits für Philips LPC2000, ST STR7, Atmel AT91M&lt;br /&gt;
* [http://www.iar.com/ IAR] Starter-Kits für Atmel, Oki, Philips, ST und TI &lt;br /&gt;
* [http://www.ic-board.de/index.php?cat=c12_ICswift-Module.html ic-board.de] Kommunikationsplattform auf Basis des AT91SAM7X256 mit Ethernet, USB, CAN und Funk Schnittstellen&lt;br /&gt;
* [http://www.keil.com/ Keil] Philips LPC2000 und ST STR7/9 Boards und Starter-Kits&lt;br /&gt;
* [http://www.lpctools.com/ LPCTools] bietet verschiedene Starter Kits für die LPC2000-Familie&lt;br /&gt;
* [http://www.makingthings.com/ MakingThings] Make Controller Kit (AT91SAM7X256)&lt;br /&gt;
* [http://mct.de/index.html MCT Paul und Scherer] Starterkits für ARM7 (NXP LPC2000, ADI ADUC7000)&lt;br /&gt;
* [http://shop.mikrocontroller.net Mikrocontroller.net Shop] Platinen mit AT91SAM7, LPC2xxx, JTAG&lt;br /&gt;
* [http://www.microcontroller-starterkits.de Microcontroller-Starterkits] Starter-Kits für verschiedene Microcontroller (D) preisgünstige Platinen (ab 12,95 Euro für LPC2129 und 2194) sowie Entwicklungsboard komplett bestückt&lt;br /&gt;
* [http://stores.ebay.de/Micro-Research Micro-Research] Development- und Header-Boards für LPC2000 und ADuC7000&lt;br /&gt;
* [http://www.olimex.com Olimex] Bulgarischer Anbieter günstiger ARM Prototypen- und Header-Boards (LPC2000, STR7, AT91SAM, ADI, TI, OKI u.a.)&lt;br /&gt;
* [http://www.propox.com/?lang=en Propox]&lt;br /&gt;
* [http://www.revely.com/ Revely] Evaluations- und Demo-Boards mit Sharp ARM Controllern. Teilweise mit SVGA-Anschluss.&lt;br /&gt;
* [http://www.skpang.co.uk/catalog/index.php SKPang electronics] Entwicklungsboards für diverse ARM7/9 (UK)&lt;br /&gt;
* [http://www.dilnetpc.com SSV Embedded Systems] bietet verschiedene Starter Kits für die verschiedenen DIL/NetPC u.a. (A)DNP/9200 SBC mit AT91RM9200&lt;br /&gt;
* [http://www.taskit.de taskit] [https://ssl.kundenserver.de/taskit.de/at91shop/shop_content.php?coID=10 Development- und Header-Boards für AT91SAM7S/X], AT91RM9200, AT91SAM9&lt;br /&gt;
* [http://www.toradex.com/e/products.html Toradex] Colibri: Intel XScale PXA270 DevKit (Schweiz)&lt;br /&gt;
&lt;br /&gt;
== [[PIC]] ==&lt;br /&gt;
&lt;br /&gt;
=== Herstellerseiten ===&lt;br /&gt;
* [http://www.microchip.com Microchip] Hersteller der PIC Microcontroller&lt;br /&gt;
* [http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&amp;amp;nodeId=1406&amp;amp;dDocName=en010014&amp;amp;part=SW006011 Microchip C18 Student Edition] - die &amp;quot;Student Edition&amp;quot; des Microchip C18 C Compilers für die PIC18 Serie ist kostenlos verfügbar.&lt;br /&gt;
* [http://www.powercontact.de Systemtechnik Leber] Offizieller Microchip Design Partner für professionelles Microcontroller Design und Hersteller von Leistungsstellern, Thyristorstellern und Halbleiterelais.&lt;br /&gt;
&lt;br /&gt;
=== Entwicklungstools / Tutorials / Foren  ===&lt;br /&gt;
* [http://www.sprut.de/electronic/pic/index.htm PIC-Microchip-Controller (www.sprut.de)] Diese Seite soll dem Anfänger die ersten Schritte in die Welt der Microcontroller der Firma Microchip erleichtern. Betrachtet werden die 14-Bit-Controller der Serien PIC16Fxxx bzw PIC12Fxxx.&lt;br /&gt;
* [http://www.fernando-heitor.de PIC: Programmierung in CCS (www.fernando-heitor.de)] Dies ist eine weitere Seite die dem Anfänger, der sich mit PICs beschäftigt, auf die Beine hilft. Sie befasst sich hauptsächlich mit dem CCS-Compiler und hat dazu ein sehr gutes Tutorial. Ausserdem bietet die Seite ein Forum speziell für PIC Mikrocontroller.&lt;br /&gt;
* [http://www.cc5x.de CC5X] Programmierkurs für PIC-Microkontroller in C (CC5X Compiler)] Programmierkurs mit Beispielen und Schaltplänen, fertige Hardware- und Softwarelösungen. In diesem Kurs sind auch einige Unterprogramme detailliert erklärt.&lt;br /&gt;
* [http://www.microchipc.com/ MicrochipC.com] Programmieren von PIC-Microcontrollern mit C. (Enthält auch Links und Bootloader für diverse PICs.)&lt;br /&gt;
* [http://www.amodio.biz/projects/PIC10BaseT/index.html Internetworking with Microchip Microcontrollers - PIC18F4620+ENC28J60]&lt;br /&gt;
* [http://pic18fusb.online.fr/wiki/wikka.php?wakka=WikiHome Wiki about Microchip USB PIC] (PIC18F2550, PIC18F4550...)&lt;br /&gt;
* [http://piklab.sourceforge.net/ Piklab] is an integrated development environment for applications based on Microchip PIC and dsPIC microcontrollers similar to the MPLAB environment. It integrates with several compiler and assembler toolchains (like gputils, sdcc, c18) and with the simulator gpsim. It supports the most common programmers (serial, parallel, ICD2, Pickit2, PicStart+) and debuggers (ICD2).&lt;br /&gt;
* [http://www.members.aon.at/electronics/pic/picpgm/_main.html PICPgm - Free PIC Development Programmer for Windows] Einfacher PIC Programmer für Windows. Unterstützt eine Vielzahl von PIC-Chips und wird ständig erweitert.&lt;br /&gt;
* [http://www.stolz.de.be InCircuit-Programmer und -Debugger (www.stolz.de.be)] Einfacher Nachbau des Microchip ICD2s. Zum Programmieren und Debuggen.&lt;br /&gt;
* [http://www.winpicprog.co.uk WinPicProg] Programmer und Tutorials für Anfänger von Nigel Goodwin (Englisch)&lt;br /&gt;
* [http://www.tigal.com EasyPIC3, EasyPIC4, Easy8051A, EasyAVR, Easy-was-weiss-ich (www.tigal.com)] - Distributor für Produkte von [http://www.mikroelektronika.co.yu mikroelektronika] und weiteren Herstellern&lt;br /&gt;
*[http://www.pro-zukunft.de Pro Zukunft] Evaluation-Board für PIC16F84A, hands-on-training und Print-Lehrgang. Für Schulen, Ausbildungsbetriebe &amp;amp; Hobbyelektroniker.&lt;br /&gt;
* [http://www.wselektronik.at www.wselektronik.at] Bausatz für &amp;quot;Full Speed ICD2&amp;quot; (USB2.0, Debugger, Programmer) oder Fertiggerät erhältlich.&lt;br /&gt;
* [http://www.uchobby.com/index.php/2008/04/19/pic-development-linux-style/ How to setup for PIC microcontroller development on Linux] von Steven Moughan&lt;br /&gt;
&lt;br /&gt;
=== Projektsammlungen/Einzelprojekte ===&lt;br /&gt;
* [http://www.picguide.org PIC Guide] Eine große Sammlung von PIC-Projekten für den Anfänger&lt;br /&gt;
* [http://www.rentron.com www.rentron.com] Anfänger-taugliche Projekte für PIC und [[8051]] von Reynolds Electronics (Englisch)&lt;br /&gt;
* [http://www.ing-pfenninger.ch/artikel.html PIC-Projekte] Einige PIC-Projekte zum Nachbauen wie IR-Lichtschranke, Frequenzzähler.&lt;br /&gt;
* [http://mondo-technology.com/ SuperProbe] - Logic Probe,(Auf der linken Seite ganz oben) Logic pulser, Frequency Counter, Event Counter, Voltmeter, Diode Junction Voltage, Capacitance Measurement, Inductance Measurement, Signal Generator, Video Patern, Serial Ascii, Midi Note, R/C Servo, Square Wave, Pseudo Random Number, ir38, PWM in einem... (PIC16F870)&lt;br /&gt;
* [http://www.circuitcellar.com/microchip2007/ Microchip 16-Bit Embedded Control 2007 Design Contest] bei [http://www.circuitcellar.com/ Circuit cellar]&lt;br /&gt;
* [http://mondo-technology.com/ Mondo Technologiy] Grosse Ansammlung von PIC-Projekten&lt;br /&gt;
&lt;br /&gt;
== [[Z8]] ==&lt;br /&gt;
* [http://www.z8micro.com/forum/ Z8 Encore! Microcontroller Discussion Forum - Dedicated to the ZiLOG Z8 Encore! Microcontroller] Ein der Z8 Encore!-Mikrocontrollerfamilie gewidmetes Diskussionsforum (in Englisch).&lt;br /&gt;
* [http://groups.yahoo.com/group/z8encore/ Yahoo! Groups : z8encore] Yahoo-Gruppe, die sich mit den Z8 Encore! Mikrocontrollern beschäftigt (Anmeldung bei Yahoo erforderlich).&lt;br /&gt;
&lt;br /&gt;
== Programmierbare Logik ([[CPLD]]/[[FPGA]]/[[GAL]]) ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.opencores.org/ OpenCores.org], VHDL Sourcen&lt;br /&gt;
* [http://www.fpga4fun.com/ fpga4fun], umfangreiche Seite mit Einführung und Beispielen, berücksichtigt Xilinx &amp;amp; Altera&lt;br /&gt;
* [http://opencollector.org/history/freecore/ Freecore], unter &#039;Module library&#039; gibt&#039;s einige freie Designs&lt;br /&gt;
* [http://www.cmosexod.com/ CMOSExod], Designs unter &#039;Free IP&#039;&lt;br /&gt;
* [https://digilent.us/ Digilent], Hersteller verschiedener FPGA/CPLD-Boards (u.a. Xilinx Spartan Starter Kit)&lt;br /&gt;
* [http://www.terasic.com.tw/cgi-bin/page/archive.pl?Language=English&amp;amp;CategoryNo=39 Terasic], Anbieter von Altera FPGA-Boards&lt;br /&gt;
* [http://shop.trenz-electronic.de/catalog/ Trenz Elektronik], verkauft verschiedene FPGA/CPLD-Boards&lt;br /&gt;
* [http://www.xess.com/index.html XESS], Anbieter von FPGA-Boards (Xilinx), unter Support gibts es eine Menge Beispiele&lt;br /&gt;
* [http://members.optushome.com.au/jekent/FPGA.htm Private Seite von John Kent], enthält eine Menge Links und auch einige Designs&lt;br /&gt;
* [http://www.mediatronix.com/Tools.htm Mediatronix tools], Picoblaze und DSP tools&lt;br /&gt;
* [http://www.ixo.de/info/usb_jtag/ ixo.de usbjtag] - USB-JTAG Adapter, fast kompatibel zu Altera USB-Blaster, wahlweise basierend auf FT245+CPLD oder Cypress FX2 Controller&lt;br /&gt;
* [http://www.fpgacpu.org/links.html FPGA CPU Links]&lt;br /&gt;
* [http://www.fpga-forum.com/wbb Forum mit allgemeinen Diskussionen zum Thema FPGA und FAQ&#039;s speziell zu den Cesys FPGA Karten]&lt;br /&gt;
* [http://www.cesys.biz Online Shop für Cesys FPGA Karten]&lt;br /&gt;
&lt;br /&gt;
== DSP ==&lt;br /&gt;
&lt;br /&gt;
=== Embedded Linux &amp;amp; DSP ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.tetrix-systems.de/embedded.html combined embedded Linux-DSP Solutions]&lt;br /&gt;
&lt;br /&gt;
=== ADSP-2181 / EZ-Kit Lite ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.ece.rutgers.edu/ftp/sjo/ezkitl/ezkitl.html ADSP-2181 Experiments]&lt;br /&gt;
* [http://www.dce.bg/~vladitx/adsp2181/ Music synthesizer and guitar effects, ADSP-2181 disassembler]&lt;br /&gt;
* [http://www.gweep.net/~shifty/ezkit/ EZ-Kit Lite Experimenters&#039; Gathering]&lt;br /&gt;
* [http://www.hta-bi.bfh.ch/~ctr/dsp/adspcode.htm Example programs for ADSP2181]&lt;br /&gt;
* [http://web.archive.org/web/20011030073105/www.geocities.com/SiliconValley/Bridge/6581/21xxdsp.html Analog Devices 21xx DSP Underground Appnote Index]&lt;br /&gt;
* [http://yves_c.tripod.com/EzKit/ Building an audio effect or a music generator using a DSP evaluation board.]&lt;br /&gt;
* [http://www.wau.nl/hemeltje/temporary/personal/adsp/adsp.html ADSP21xx Application notes]&lt;br /&gt;
* [http://www.psionics.demon.co.uk/mp3/ Hardware Assisted Playback of Compressed Audio.]&lt;br /&gt;
* [http://www3.telus.net/sharpshin/ Open21xx] - open source assembler tool suite&lt;br /&gt;
&lt;br /&gt;
=== Misc. ===&lt;br /&gt;
&lt;br /&gt;
* [http://open.neurostechnology.com/node/1020 TI c54x DSP  Compilertools (ohne Debugger)] frei für Open Source Projekte.&lt;br /&gt;
&lt;br /&gt;
== Interfaces &amp;amp; Protokolle ==&lt;br /&gt;
&lt;br /&gt;
=== iPod ===&lt;br /&gt;
* [http://ipodlinux.org/IPod_to_T%26A_remotecontrol_adapter IPod to T&amp;amp;A remotecontrol adapter] ([[PIC]]-Projekt)&lt;br /&gt;
&lt;br /&gt;
=== [[RFID]] ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.mwjournal.com/journal/article.asp?HH_ID=AR_905 Radio Frequency Identification: Evolution of Transponder Circuit Design] - Übersichtsartikel aus dem Microwave Journal&lt;br /&gt;
* [http://www.foebud.org/rfid Die StopRFID-Seiten des FoeBuD e.V.]&lt;br /&gt;
* [http://www.rfzone.org/free-rf-ebooks/ PDF-Bücher (englisch) ]- Bücher über RF, Antennen und elektromagnetische Wellen.&lt;br /&gt;
&lt;br /&gt;
* http://cq.cx/proxmark3.pl Jonathan Westhues RFID Leser/Schreiber/Cloner&lt;br /&gt;
&lt;br /&gt;
http://load2load.info Free views Video Clips&lt;br /&gt;
&lt;br /&gt;
==== 134,2 kHz RFID ====&lt;br /&gt;
&lt;br /&gt;
==== 13,56 MHz RFID ====&lt;br /&gt;
* [http://www.openpcd.org/ OpenPCD - a free 13.56MHz RFID reader design] for Proximity Coupling Devices (PCD) based on 13,56MHz communication. This device is able to screen informations from Proximity Integrated Circuit Cards (PICC) conforming to vendor-independent standards such as ISO 14443, ISO 15693 as well as proprietary protocols such as Mifare Classic. (AT91SAM7S128 [[ARM]] Projekt)&lt;br /&gt;
* [http://www.rf-dump.org/ RFDump] is a backend GPL tool to directly interoperate with any RFID ISO-Reader to make the contents stored on RFID tags accessible. (Linux)&lt;br /&gt;
&lt;br /&gt;
==== 2,4 GHz RFID ====&lt;br /&gt;
* [http://www.openbeacon.org/ OpenBeacon] - a free active 2.4GHz beacon design. (Reader: USB oder Ethernet; Tags: RF_Chip: NRF24L01, PIC16F684)&lt;br /&gt;
&lt;br /&gt;
=== [[DMX512]] ===&lt;br /&gt;
* [http://www.soundlight.de/techtips/dmx512/dmx512.htm DMX-512 - was ist das?] Eine Übersicht von SOUNDLIGHT.&lt;br /&gt;
* [http://www.oksidizer.com/electronic/spp2dmx/index_en.html OksiD DMX 3/1 is a Standard Parallel Port DMX 512 interface for IBM compatible PCs]. Drei Output Universe und ein Input Universe (Universe = 512 channels). Open project. All source code and schematics are available for free. &lt;br /&gt;
* [http://www.usbdmx.com/usb_dmx_interface.html USB DMX Interface revision 1.3] - opto isolated, bus powered, DMX512 from/to [[USB]]interface with both in and out universes. Cheap and simple to build.&lt;br /&gt;
* [http://www.dmx512-online.com/ Ujjal&#039;s DMX512 Seite]&lt;br /&gt;
* [http://llg.cubic.org/dmx4linux/ DMX4Linux 2.6] - A DMX device driver package for Linux (incl. hardware schematics with TI [[MSP430]])&lt;br /&gt;
&lt;br /&gt;
=== Verschiedenes ===&lt;br /&gt;
* [http://www.taelektroakustik.de/deu/index.htm T&amp;amp;A Kommandos] - &#039;&#039;&#039;RC&#039;&#039;&#039; und &#039;&#039;&#039;RCII&#039;&#039;&#039; Kommandoset der Philips PRONTO Familie zur Steuerung von Audiogeräten. Dokumentation siehe unter Downloads.&lt;br /&gt;
&lt;br /&gt;
== Leiterplattenhersteller ==&lt;br /&gt;
&lt;br /&gt;
siehe [[Platinenhersteller|Platinenhersteller]]&lt;br /&gt;
&lt;br /&gt;
== Schulungen (Online) ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.esacademy.com/myacademy/ www.esacademy.com] (engl.) - C, CAN, I²C, BlueTooth, PWM, USB, 51LPC, ARM (Einführung)&lt;br /&gt;
* [http://www.elprak.ch Elektronik in der Praxis] Präsentationen zu verschiedenen Themen der Elektronik in der Praxis. Lötvideo, das den zeitlichen Ablauf beim Löten anschaulich darstellt.&lt;br /&gt;
* [http://www.national.com/onlineseminar/ www.national.com] - Amplifiers, Audio, Data Acquisition, Die Products, Displays, Interface, Microcontrollers, Military/Aerospace, Power, Thermal Management, Wireless&lt;br /&gt;
* [http://www.circuitrework.com Circuit Technology Center] - Surgeon grade rework and repair, by the book and guaranteed. Deeplink: [http://www.circuitrework.com/guides/guides.shtml Guides]&lt;br /&gt;
* [http://www.onlinetutorials.de/index.htm onlinetutorials.de] - Linksammlung zu Tutorials für höhere Programmiersprachen ([[HLL]]) wie C, C++, Java, BASIC, Perl, PHP, ...&lt;br /&gt;
* [http://www.awce.com/classroom/ AWCE Interactive Classroom] - Embedded Systems (Using the APP-IV with GCC, Getting Started with the PIC 18F Family), Electronics (CLARC/HBSIG DSP Study Group, Basic Circuits), RoadMap to Programmable Logic&lt;br /&gt;
* [http://www.ibiblio.org/kuphaldt/socratic/ Socratic Electronics] (englisch)&lt;br /&gt;
* [http://www.embedded.com/design/multicore/201200638;jsessionid=4T1T0OZQW4PFSQSNDLRSKH0CJUNN2JVN?printable=true The basics of programming embedded processors] von Wayne Wolf. Neun Artikel bei embedded.com (englisch)&lt;br /&gt;
* [http://webcast.berkeley.edu/course_details.php?seriesid=1906978507 EE 42/EE 100 Introduction to Digital Electronics] - Webcast, Spring 2008 (englisch)&lt;br /&gt;
* [http://freevideolectures.com freevideolectures.com] - Webcasts zu  naturwissenschaftlichen Theman (englisch)&lt;br /&gt;
* [http://www.circuitsage.com/ Circuit Sage], a complete source of information to help you design circuits fast. (Linksammlung zu Software, Artikeln Büchern und Websites)&lt;br /&gt;
&lt;br /&gt;
== Skripte ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.janson-soft.de/skripte/index.html Linksammlung von Volker Lange-Janson]&lt;br /&gt;
* [http://wwwex.physik.uni-ulm.de/lehre/physikalischeelektronik/phys_elektr/phys_elektr.html Physikalische Elektronik und Messtechnik] von Othmar Marti und Dr. Alfred Plettl, Universität Ulm&lt;br /&gt;
&lt;br /&gt;
== Messequipment ==&lt;br /&gt;
&lt;br /&gt;
=== Logikanalyse ===&lt;br /&gt;
* [http://www.pctestinstruments.com Intronix LogicPort], Günstiger, aber sehr leistungsfähiger Logikanalysator mit USB-Anschluß an PC (34Ch, 500MHz Timing, 34 x 2kSa mit Kompression, ca. 235 Euro [http://www.shop.display3000.com/pi21/pi28/pd104.html hier])&lt;br /&gt;
* [http://www.tech-tools.com/dv_main.htm TechTools DigiView], Günstiger Logikanalysator mit USB-Anschluß an PC (18Ch, 100MHz Timing, 128kSa mit Kompression,  [http://elmicro.com/de/digiview.html ca. 430Euro])&lt;br /&gt;
* [http://www.tribalmicro.com/logic_an/ Tribalmicro], PC hosted LA (32ch, 40MHz Timing, 128kSa, ca. 1700$)&lt;br /&gt;
* [http://www.nci-usa.com/frame_products_overview.htm NCI GoLogic], Logikanalysator mit USB-Anschluß an PC (34 oder 72Ch, 500MHz Timing, 1 oder 2MSa, ca. 3000..5500$)&lt;br /&gt;
* [http://www.tek.com/products/logic_analyzers/index.html Tektronix], Verschiedene Geräte, standalone oder modular (ab 34ch, 2GHz Timing, ab 512kSa, gut und teuer)&lt;br /&gt;
* [http://www.home.agilent.com/DEger/nav/-536902443.0/pc.html Agilent], Verschiedene Geräte, standalone, modular oder PC-hosted (ab 34ch, ab 800MHz timing, ab 256kSa, gut und teuer)&lt;br /&gt;
* [http://www.sump.org/projects/analyzer/ Sumps LA], günstiges Projekt für einen LA basierend auf einem Digilent Spartan Board (32ch, 100MHz Timing, 256kSa, Kosten Digilent Board ca. 100$ + Versand/Zoll)&lt;br /&gt;
* [http://www.meilhaus.de/produkte/usb-mobile-messtechnik/?user_produkte%5BPATTR%5D=HPG_3-UPG1_3-UPG2_2&amp;amp;user_produkte%5BPR%5D=8&amp;amp;cHash=2c8edb93e2 Meilhaus Electronic - MEphisto Scope UM203] Robustes, mobiles 16 bit Kombi-Instrument 7 Mess-Geräte in einem! (ab 348€)&lt;br /&gt;
* [http://www.hacker-messtechnik.de/13722/59001.html TravelLogic TL2x36], Logikanalysator zum Anschluß an PC über USB, (36ch, 4GHz timing, 200MHz state, Speicher bis 72MBit, Preis ab ca. 500,- netto)&lt;br /&gt;
* [http://www.inovaflex.de/index.html Bus und Logic Analyzer] 100MHz Samplerate und integrierten SPI, I²C, CAN Interpreter, erweiterbar als Oszilloskop&lt;br /&gt;
&lt;br /&gt;
* Eine Übersicht über verschiedene Selbstbauprojekte: [[Logic_Analyzer]]&lt;br /&gt;
&lt;br /&gt;
=== Oszilloskope ===&lt;br /&gt;
&lt;br /&gt;
siehe die separate [http://www.mikrocontroller.net/articles/Oszilloskop Seite] zum Thema&lt;br /&gt;
&lt;br /&gt;
=== Generatoren ===&lt;br /&gt;
[http://www.meilhaus.de/produkte/mess-und-steuer-karten/?user_produkte%5BPR%5D=23&amp;amp;cHash=64a269a3c6 Meilhaus Electronic - ME-6x00] Waveform-Generator - potentialfrei isolierte 16 bit Analog-Ausgabe-Karte (ab EUR 1138,00)&lt;br /&gt;
&lt;br /&gt;
== Vermischtes == &lt;br /&gt;
&lt;br /&gt;
=== Foren ===&lt;br /&gt;
* [http://www.sparkfun.com/cgi-bin/phpbb/ Spark Fun Electronics] MicroController Ideas and Support (Englisch) ([[AVR]], [[PIC]], [[MSP]], [[ARM]], OpenOCD)&lt;br /&gt;
* [http://www.edaboard.com/ EDAboard.com] International Electronics Forum Center (Englisch)&lt;br /&gt;
* [http://stsboard.de STS Reparatur Forum] Forum für Radio und Fernsehtechniker&lt;br /&gt;
* [http://formu.iwenzo.de Elektronik Reparatur Forum] Informationselektroniker Reparatur Forum&lt;br /&gt;
&lt;br /&gt;
=== Projektsammlungen ===&lt;br /&gt;
Meist in Englisch. &lt;br /&gt;
* [http://circuitscout.com/ Circuit Scout] - Online Suchmaschine&lt;br /&gt;
* [http://www.epanorama.net ePanorama.net]&lt;br /&gt;
* [http://www.commlinx.info Electronic Schematics] from CommLinx Solutions Pty Ltd&lt;br /&gt;
* [http://www.discovercircuits.com Discover Circuits] a collection of 25000+ electronic circuits or schematics&lt;br /&gt;
* [http://www.beyondlogic.org/ BeyondLogic.org] Diverse Mikrocontroller und Interfacing Projekte&lt;br /&gt;
* [http://www.uoguelph.ca/~antoon/circ/circuits.htm Circuits for the Hobbyist] by VA3AVR&lt;br /&gt;
* [http://www.stefpro.de/ StefPro.de] Diverse Projekte und Datenblattsammlung nach Kategorien, Microcontroller, Digital und Analog... Sowie Tutorial &amp;quot;Grundlagen der Bestückung von Platinen&amp;quot; und anderes Wissen&lt;br /&gt;
* [http://www.schaltplaene-online.de/ www.schaltplaene-online.de] Umfangreiche Linksammlung zu Schaltplänen aller Art&lt;br /&gt;
* [http://www.avr-projects.info www.avr-projects.info] Liste mit AVR-Projekten, die von jedem Besucher erweitert werden kann (wiki like)&lt;br /&gt;
* [http://www.halloweenmonsterlist.info/ MoNsTeRlIsT of Halloween Projects]&lt;br /&gt;
&lt;br /&gt;
=== Referenzen, Beschreibungen, Standards ===&lt;br /&gt;
* Extraseite: [[Datenblätter]]&lt;br /&gt;
* [http://www.technick.net Technik.Net] Pinouts, Circuits and Guides&lt;br /&gt;
* [http://pinouts.ru/ pinout.ru] und [http://www.hardwarebook.info/ hardwarebook.info] - Online handbooks of hardware pinouts, cables schemes and connectors layouts&lt;br /&gt;
* [http://www.networktechinc.com/technote.html Keyboard, Monitor &amp;amp; Mouse Pinouts] for PC, SUN, MAC, USB, FireWire, RS232, Digital Flat Panel and EVC configurations&lt;br /&gt;
* [http://www.q1.fcen.uba.ar/materias/iqi/joygus/tvgames.html Special joysticks used in TV games]&lt;br /&gt;
* [http://www.cs.net/lucid/intel.htm Intel-Hex-Format]&lt;br /&gt;
* [http://home.teleport.com/~brainy/fat32.htm FAT32 Structure Information] - Written by Jack Dobiash&lt;br /&gt;
* [http://www.pjrc.com/tech/8051/ide/fat32.html Understanding FAT32 Filesystems] mit Beispielen (engl.)&lt;br /&gt;
&lt;br /&gt;
=== Online-Bücher ===&lt;br /&gt;
* [http://www.allaboutcircuits.com/ All About Circuits] - Series of online textbooks covering electricity and electronics. The information provided is great for both students and hobbyists who are looking to expand their knowledge in this field. (Englisch)&lt;br /&gt;
* http://www.computer-books.us/ - überwiegend zu höheren Programmiersprachen. Englisch.&lt;br /&gt;
* [http://www.vias.org/feee/index.html FEEE - Fundamentals of Electrical Engineering and Electronics]&lt;br /&gt;
* [http://www.nrbook.com/a/bookcpdf.php Numerical Recipes in C, Second Edition (1992)]&lt;br /&gt;
&lt;br /&gt;
=== Bedienungsanleitungen / Manuals ===&lt;br /&gt;
* [http://bama.edebris.com/manuals/ BAMA Archiv] &lt;br /&gt;
* [http://www.big-list.com/ Big-List.com] - This is a directory of over 600 dealers in used high technology equipment. Most deal in used electronic test equipment or semiconductor production equipment. Included are dealers in related high technology items, rental companies, equipment auction sites, test equipment manual dealers, foreign (non-U.S.) used equipment dealers, cal labs, and repair services.&lt;br /&gt;
&lt;br /&gt;
=== Ungewöhnliche Basteleien (Hacks) ===&lt;br /&gt;
Auf eigene Gefahr und nicht immer ganz ernst... Meist in Englisch. &lt;br /&gt;
&lt;br /&gt;
* Metablogs (tägliche News)&lt;br /&gt;
** [http://www.makezine.com/ Makezine] und [http://hackszine.com/ Hackszine]&lt;br /&gt;
** [http://www.electronics-lab.com/blog/ Electronics-Lab] und [http://www.projects-lab.com Projects-Lab] und [http://www.circuits-lab.com Circuits-Lab] ...&lt;br /&gt;
** [http://www.hackaday.com/ Hack a Day]&lt;br /&gt;
** [http://www.hackedgadgets.com/ HackedGadgets]&lt;br /&gt;
** [http://www.hack247.co.uk/ Hack247]&lt;br /&gt;
** [http://www.electronicsinfoline.com/ Electronics Infoline]&lt;br /&gt;
** [http://www.uchobby.com/ uC Hobby]&lt;br /&gt;
** ([http://www.diylive.net/ DIY Live])&lt;br /&gt;
&lt;br /&gt;
* Foren&lt;br /&gt;
** [http://www.fingers-welt.de/home.htm Fingers elektrische Welt]&lt;br /&gt;
** [http://forum.hackedgadgets.com/ HackedGadgets Forum]&lt;br /&gt;
** [http://stsboard.de Reparatur Forum]&lt;br /&gt;
** [http://camerahacking.com camerahacking Forum]&lt;br /&gt;
&lt;br /&gt;
* Projektsammlungen&lt;br /&gt;
** Final Projects der Kurse [http://instruct1.cit.cornell.edu/courses/ee476/FinalProjects/  ECE476] (Microcontroller Design) und [http://instruct1.cit.cornell.edu/courses/ece576/FinalProjects/ ECE576] (Advanced Microcontroller Systems on a Programmable Chip) an der Cornell University &lt;br /&gt;
&lt;br /&gt;
* DIY-Anleitungen&lt;br /&gt;
** [http://www.instructables.com/ instructables]&lt;br /&gt;
** [http://www.scitoys.com/ Scitoys] You Can Make With Your Kids&lt;br /&gt;
&lt;br /&gt;
* Mix&lt;br /&gt;
** [http://www.evilmadscientist.com Evil Mad Scientist Laboratories] - u.a. The Flying Spaghetti Monster, on toast ;-)&lt;br /&gt;
** [http://home.earthlink.net/~lenyr/index.html Spark, Bang, Buzz and Other Good Stuff] ([http://www.sparkbangbuzz.com Neue Sachen])&lt;br /&gt;
** [http://www.electricstuff.co.uk/ Mike&#039;s Electric Stuff] - Antique Glass, Tesla coils and high-voltage stuff, Lasers&lt;br /&gt;
** [http://electricity.pbwiki.com/ DHS electricity]&lt;br /&gt;
** [http://www.elephantstaircase.com/wiki/index.php?title=Main_Page Elephant Staircase]&lt;br /&gt;
** [http://mycpu.eu Eine selbstgebaute CPU aus TTL-Gattern]&lt;br /&gt;
** [http://www.knollep.de/ Knolles Bauanleitungen]&lt;br /&gt;
&lt;br /&gt;
=== Zeitschriften über Elektronik und µC ===&lt;br /&gt;
* [http://www.embedded.com embedded.com] - Hauptaugenmerk auf die Philosophie drumherum&lt;br /&gt;
* [http://www.siliconchip.com.au/ Silicon Chip] - Freie Artikel unter &#039;&#039;Free Preview&#039;&#039;&lt;br /&gt;
* [http://www.circuitcellar.com/ Circuit Cellar] - Freie Artikel unter &#039;&#039;Digital Library&#039;&#039;&lt;br /&gt;
* [http://www.elektronikpraxis.vogel.de/themen/hardwareentwicklung/mikrocontrollerprozessoren/ Elektronikpraxis - Das professionelle Elektronikmagazin]&lt;br /&gt;
* [http://www.funkamateur.de/ FUNKAMATEUR] - Elektronik, Amateurfunk, CB-Funk u. v. a. m.&lt;br /&gt;
* [http://www.edn.com/ EDN] (etwas schwer zu finden, aber lesenswert: die [http://www.edn.com/index.asp?layout=news&amp;amp;spacedesc=designIdeas Design Ideas])&lt;br /&gt;
* [http://www.franzis.de/elo-das-magazin ELO - Das Magazin] für Elektronik-Einsteiger&lt;/div&gt;</summary>
		<author><name>Thomas1123</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Benutzer:Thomas1123&amp;diff=27892</id>
		<title>Benutzer:Thomas1123</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Benutzer:Thomas1123&amp;diff=27892"/>
		<updated>2008-05-11T20:54:12Z</updated>

		<summary type="html">&lt;p&gt;Thomas1123: /* Was sich bis jetzt so getan hat */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Alles noch Baustelle *&lt;br /&gt;
&lt;br /&gt;
== Zu meiner Person ==&lt;br /&gt;
&lt;br /&gt;
* Baujahr 1982&lt;br /&gt;
* Erweiterter Hauptschulabschluss 1999&lt;br /&gt;
* 99 bis 2003 3 1/2 Jahre Lehre als Elektroinstallateur&lt;br /&gt;
* Weitere 3 1/2 Jahre als Elektroinstallateur gearbeitet&lt;br /&gt;
* Seit Sommer 2006 zweijährige Fachschule für Technik&lt;br /&gt;
* Vorraussichtlich Sommer 2008 fertig&lt;br /&gt;
----&lt;br /&gt;
== Projekte ==&lt;br /&gt;
&lt;br /&gt;
=== Labornetzteil ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Grundsätzlich baue ich das Netzteil nicht um das beste, tollste, schönste Labornetzteil von allen zu haben, sondern weil ich spass dran habe.&#039;&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Wem es nicht gefällt der soll es nicht nachbauen oder benutzen.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== Vorhaben ====&lt;br /&gt;
&lt;br /&gt;
* Spannung regelbar von 0...20V&lt;br /&gt;
* Strombegrenzung regelbar von 0...2A&lt;br /&gt;
* Als Stellgrösse für Spanung und Strom jeweils 0..2048mV (12-Bit da-Wandler)&lt;br /&gt;
* Einstellung von Strom und Spannung mit Endlospotis&lt;br /&gt;
* Anzeige von diversen Werten (Istspannung, Sollspannung, Iststrom, Maxstrom, aktuelle Leistung in W und was sonst noch so gefällt) auf 4*16 oder 4*20 LC-Display&lt;br /&gt;
* Steuer µC PIC 16F877 oder PIC 16F887&lt;br /&gt;
* Diverse feste Spannungen (+5V +12V etc.)&lt;br /&gt;
&lt;br /&gt;
==== Schön wärs aber nicht umbedingt nötig ====&lt;br /&gt;
&lt;br /&gt;
*Temperaturüberwachung der Leistungsbauteile&lt;br /&gt;
*Kommunikation über RS232&lt;br /&gt;
*Speicherbare Einstellungen (wie im Autoradio Taste lang gedrückt halten und Einstellungen (Sender) sind gespeichert, Taste kurz drücken und das Setting wird aufgerufen.&lt;br /&gt;
*Integriertes Radio mit TV und Premiere Decoder :-)&lt;br /&gt;
&lt;br /&gt;
==== Was sich bis jetzt so getan hat ====&lt;br /&gt;
[[Bild:Tastenabfrage.png|thumb|right|Spannungsteiler für die analoge Tastenabfrage]]&lt;br /&gt;
[[Bild:Tastenabfrage_S1.png|thumb|right|Schaltung des Spannungsteilers bei gedrücktem Taster S1]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Der Steuerpic wird wahrscheinlich doch ein PIC 16F690 (ist mein persönlicher Liebling) werden der hat zwar nur die Hälfte der Pins aber mit etwas Trixen müsste des gehen.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Als Display habe ich mich für ein 20*4 zeichen DIP-Display von ELECTRONIC ASSEMBLY entschieden (Reichelt Bestellnummer: LCD 204 DIP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Die Abfrage der Tasten wird über einen Analogeingang realisiert. Somit lassen sich mehrere Tasten an einem Pin abfragen indem man die Ausgangsspannung des Spannungsteilers misst und diese dann mit vorgegebenen Werten im Programm vergleicht. Es empfiehlt sich einen Tolleranzwert für den Analogwert der Tastenabfrage zu verwenden. &amp;lt;br/&amp;gt;&lt;br /&gt;
Wenn nur ein Taster gedrückt wird hat man einen &amp;quot;relativ&amp;quot; einfach zu berechnenden Spannungsteiler. Zuerst muss man den Ersatzwiederstand &amp;lt;math&amp;gt;R_e&amp;lt;/math&amp;gt; ausrechnen. Dies ist aber nicht weiters schwierig wenn man sich die Schaltung mal etwas anderst aufmalt und erkennt, dass mehrere Widerstände in reihe und diese Reihenschaltungen dann Paralell zu einander sind(siehe Bild 2).&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Beispielhaft die Berechnung der Ausgangsspannung wenn Taster S1 gedrückt wird.&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
R_e = \frac{1}{(R_2+R_8)^{-1}+ (R_3+R_9)^{-1}+ (R_4+R_{10})^{-1}+ (R_5+R_{11})^{-1}+ (R_6+R_{12})^{-1}} \,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Ja ich weiss das ist viel Tipparbeit und ganz bestimmt gibt es auch eine einfacherre möglichkei &amp;lt;math&amp;gt;R_e&amp;lt;/math&amp;gt; auszurechnen,wenn man davon ausgeht,dass &amp;lt;math&amp;gt;R_1&amp;lt;/math&amp;gt; bis &amp;lt;math&amp;gt;R_6&amp;lt;/math&amp;gt; gleich gross sind. Ich bin halt net so der Held was Formeln umstellen angeht :-).&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
U_{AD-Wandler} = U \cdot \frac{R_e}{R_7+R_e} \,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Links ====&lt;br /&gt;
http://www.elektronik-kompendium.de/public/schaerer/kdarl2.htm&amp;lt;br/&amp;gt;&lt;br /&gt;
http://www.mikrocontroller.net/topic/90246&amp;lt;br/&amp;gt;&lt;br /&gt;
http://www.mikrocontroller.net/topic/90417&amp;lt;br/&amp;gt;&lt;br /&gt;
http://www.mikrocontroller.net/topic/90780&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Codeschnipsel ==&lt;br /&gt;
http://www.mikrocontroller.net/topic/99323 Bargraph anzeige für Text-Displays&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;/div&gt;</summary>
		<author><name>Thomas1123</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Benutzer:Thomas1123&amp;diff=27821</id>
		<title>Benutzer:Thomas1123</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Benutzer:Thomas1123&amp;diff=27821"/>
		<updated>2008-05-07T13:32:20Z</updated>

		<summary type="html">&lt;p&gt;Thomas1123: /* Was sich bis jetzt so getan hat */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* Alles noch Baustelle *&lt;br /&gt;
&lt;br /&gt;
== Zu meiner Person ==&lt;br /&gt;
&lt;br /&gt;
* Baujahr 1982&lt;br /&gt;
* Erweiterter Hauptschulabschluss 1999&lt;br /&gt;
* 99 bis 2003 3 1/2 Jahre Lehre als Elektroinstallateur&lt;br /&gt;
* Weitere 3 1/2 Jahre als Elektroinstallateur gearbeitet&lt;br /&gt;
* Seit Sommer 2006 zweijährige Fachschule für Technik&lt;br /&gt;
* Vorraussichtlich Sommer 2008 fertig&lt;br /&gt;
----&lt;br /&gt;
== Projekte ==&lt;br /&gt;
&lt;br /&gt;
=== Labornetzteil ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Grundsätzlich baue ich das Netzteil nicht um das beste, tollste, schönste Labornetzteil von allen zu haben, sondern weil ich spass dran habe.&#039;&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Wem es nicht gefällt der soll es nicht nachbauen oder benutzen.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== Vorhaben ====&lt;br /&gt;
&lt;br /&gt;
* Spannung regelbar von 0...20V&lt;br /&gt;
* Strombegrenzung regelbar von 0...2A&lt;br /&gt;
* Als Stellgrösse für Spanung und Strom jeweils 0..2048mV (12-Bit da-Wandler)&lt;br /&gt;
* Einstellung von Strom und Spannung mit Endlospotis&lt;br /&gt;
* Anzeige von diversen Werten (Istspannung, Sollspannung, Iststrom, Maxstrom, aktuelle Leistung in W und was sonst noch so gefällt) auf 4*16 oder 4*20 LC-Display&lt;br /&gt;
* Steuer µC PIC 16F877 oder PIC 16F887&lt;br /&gt;
* Diverse feste Spannungen (+5V +12V etc.)&lt;br /&gt;
&lt;br /&gt;
==== Schön wärs aber nicht umbedingt nötig ====&lt;br /&gt;
&lt;br /&gt;
*Temperaturüberwachung der Leistungsbauteile&lt;br /&gt;
*Kommunikation über RS232&lt;br /&gt;
*Speicherbare Einstellungen (wie im Autoradio Taste lang gedrückt halten und Einstellungen (Sender) sind gespeichert, Taste kurz drücken und das Setting wird aufgerufen.&lt;br /&gt;
*Integriertes Radio mit TV und Premiere Decoder :-)&lt;br /&gt;
&lt;br /&gt;
==== Was sich bis jetzt so getan hat ====&lt;br /&gt;
[[Bild:Tastenabfrage.png|thumb|right|Spannungsteiler für die analoge Tastenabfrage]]&lt;br /&gt;
[[Bild:Tastenabfrage_S1.png|thumb|right|Schaltung des Spannungsteilers bei gedrücktem Taster S1]]&lt;br /&gt;
[[Bild:2Encoder_4Pins.png|thumb|right|Schaltung zum Auswerten von von zwei Drehencodern an 4 Portpins]]&lt;br /&gt;
&lt;br /&gt;
*Der Steuerpic wird wahrscheinlich doch ein PIC 16F690 (ist mein persönlicher Liebling) werden der hat zwar nur die Hälfte der Pins aber mit etwas Trixen müsste des gehen.&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Als Display habe ich mich für ein 20*4 zeichen DIP-Display von ELECTRONIC ASSEMBLY entschieden (Reichelt Bestellnummer: LCD 204 DIP)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Die Abfrage der Tasten wird über einen Analogeingang realisiert. Somit lassen sich mehrere Tasten an einem Pin abfragen indem man die Ausgangsspannung des Spannungsteilers misst und diese dann mit vorgegebenen Werten im Programm vergleicht. Es empfiehlt sich einen Tolleranzwert für den Analogwert der Tastenabfrage zu verwenden. &amp;lt;br/&amp;gt;&lt;br /&gt;
Wenn nur ein Taster gedrückt wird hat man einen &amp;quot;relativ&amp;quot; einfach zu berechnenden Spannungsteiler. Zuerst muss man den Ersatzwiederstand &amp;lt;math&amp;gt;R_e&amp;lt;/math&amp;gt; ausrechnen. Dies ist aber nicht weiters schwierig wenn man sich die Schaltung mal etwas anderst aufmalt und erkennt, dass mehrere Widerstände in reihe und diese Reihenschaltungen dann Paralell zu einander sind(siehe Bild 2).&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
Beispielhaft die Berechnung der Ausgangsspannung wenn Taster S1 gedrückt wird.&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
R_e = \frac{1}{(R_2+R_8)^{-1}+ (R_3+R_9)^{-1}+ (R_4+R_{10})^{-1}+ (R_5+R_{11})^{-1}+ (R_6+R_{12})^{-1}} \,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Ja ich weiss das ist viel Tipparbeit und ganz bestimmt gibt es auch eine einfacherre möglichkei &amp;lt;math&amp;gt;R_e&amp;lt;/math&amp;gt; auszurechnen,wenn man davon ausgeht,dass &amp;lt;math&amp;gt;R_1&amp;lt;/math&amp;gt; bis &amp;lt;math&amp;gt;R_6&amp;lt;/math&amp;gt; gleich gross sind. Ich bin halt net so der Held was Formeln umstellen angeht :-).&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
U_{AD-Wandler} = U \cdot \frac{R_e}{R_7+R_e} \,&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
*Wegen der nur wenig vorhandenen IO-Pins habe ich mir Gedanken gemacht wie ich zwei Inkrementalgeber mit möglichst wenig IO-Pins auswerten kann. Hierbei bin ich zu dem Schluss gekommen, dass nur 4 IO-Pins benötigt werden. Dabei werden die Inkrementalgeber nach einander ausgelesen. Im nebenstehenden Schaltungsauszug kann man erkennen, dass drei Eingänge und ein Ausgang benötigt werden. Wenn Select auf Low ist hat ENC2 keine Versorgungsspannung mehr und der Transistor T1 Schaltet durch und versorgt ENC1 mit Spannung. Wenn Select auf High ist dann bekommt ENC2 seine versorgungsspannung und Transistor T1 sperrt die Versorgungsspannung für ENC1.&lt;br /&gt;
&lt;br /&gt;
==== Links ====&lt;br /&gt;
http://www.elektronik-kompendium.de/public/schaerer/kdarl2.htm&amp;lt;br/&amp;gt;&lt;br /&gt;
http://www.mikrocontroller.net/topic/90246&amp;lt;br/&amp;gt;&lt;br /&gt;
http://www.mikrocontroller.net/topic/90417&amp;lt;br/&amp;gt;&lt;br /&gt;
http://www.mikrocontroller.net/topic/90780&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Codeschnipsel ==&lt;br /&gt;
http://www.mikrocontroller.net/topic/99323 Bargraph anzeige für Text-Displays&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;/div&gt;</summary>
		<author><name>Thomas1123</name></author>
	</entry>
</feed>