<?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=Horha</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=Horha"/>
	<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/articles/Spezial:Beitr%C3%A4ge/Horha"/>
	<updated>2026-04-13T12:02:39Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Entwicklungsboard_mit_PIC&amp;diff=77515</id>
		<title>Entwicklungsboard mit PIC</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Entwicklungsboard_mit_PIC&amp;diff=77515"/>
		<updated>2013-07-09T09:00:10Z</updated>

		<summary type="html">&lt;p&gt;Horha: Unsinn entfernt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Wettbewerb]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;von Denys Maiier&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Wettbewerb Header}}&lt;br /&gt;
&lt;br /&gt;
      [[Datei:brd mini.jpg]]  [[Datei:Entwicklungsboard_gefräst.JPG]]&lt;br /&gt;
&lt;br /&gt;
== Vorwort ==&lt;br /&gt;
&lt;br /&gt;
Dieses Kit dient als Lehrmittel  für Studenten, Schüler und diejenigen, die Grundlagen und Funktionalität der Mikroprozessortechnik, am Beispiel des Microcontrollers der PIC18 Familie von der Firma Microchip, beherrschen möchten.  Mit Hilfe der im Kit erhaltenen Modulen  können folgende Programmieraufgaben gelöst werden:&lt;br /&gt;
&lt;br /&gt;
•	Ein- und Ausgabe über I/O Ports und Kontrolle  der Ausgabe über 16 LED’s&lt;br /&gt;
&lt;br /&gt;
•	Externe Programmunterbrechung über 3 Interruptquellen(3 Buttons)&lt;br /&gt;
&lt;br /&gt;
•	Verbindung mit dem PC über UART &lt;br /&gt;
&lt;br /&gt;
•	Datenübertragung über IR&lt;br /&gt;
&lt;br /&gt;
•	Tonausgabe (Buzzer)&lt;br /&gt;
&lt;br /&gt;
•	Datenübertragung über SPI und I²C  im Halb-Duplex-Mode&lt;br /&gt;
&lt;br /&gt;
•	Schrittmotorensteuerung&lt;br /&gt;
&lt;br /&gt;
•	Dynamische Tastatureingabe&lt;br /&gt;
&lt;br /&gt;
•	AD- Umwandlung&lt;br /&gt;
&lt;br /&gt;
•	Datenausgabe auf dem HD44780 Display&lt;br /&gt;
&lt;br /&gt;
== Projektinhalt ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
     a.	Mainboard&lt;br /&gt;
     b.	SPI-Board&lt;br /&gt;
     c.	I²C-Board&lt;br /&gt;
     d.	Com-Board&lt;br /&gt;
     e.	Hitachi LCD Board&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
Projekt der Entwicklungsplatine basiert sich auf dem PIC 18F4520 Microcontroller und besteht aus dem Main-board und Peripherie-Modulen , die mit Hilfe der Kabelverbindungen mit Main-board verbunden werden. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Mainboard ==&lt;br /&gt;
&lt;br /&gt;
Mainboard verfügt über 33 I/O Ports, die allerdings spezifisch benutzt werden können. Die PORTB I/O Pins können softwaremäßig an die innere Pull-Up Widerstände angeschlossen werden. Das MCU wird über Quarz/Keramik Oszillator taktversorgt.Die Kapazität der Kondensatoren liegt im Bereich 15-25pF und von den Quartzeigenschaften abhängig.Die empfohlene Größe steht üblicherweise im Datenblatt. Buzzer SG1  kann anhand dem Jumper JP2 an Port RE2 angeschlossen werden. Drei Tasten (INT1-INT3) zusammen mit Widerständen R69 bis R71 und R20 bis R23 ermöglichen die externe Programmunterbrechung. Mikrocontroller PIC18 verfügt über ICSP Modul und kann über ICSP Input direkt im Board programmiert werden.  16 separat gesteuerte LED sind  über JP5 und JP10 an die Output-Pins von PIC18 anzuschließen.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Mainboard Modul&#039;&#039;&lt;br /&gt;
[[Datei:Mainboard V1.0.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PIC 18 verfügt über Master Synchronous Serial Port und kann im SPI oder I²C Modus arbeiten. Dieses Entwicklungsboard hat zwei Module womit die  Grundlagen der  seriellen Übertragung  geübt werden können.&lt;br /&gt;
&lt;br /&gt;
== SPI-Interface Board ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;SPI Modul&#039;&#039;&lt;br /&gt;
[[Datei:SPI Modul.png]]&lt;br /&gt;
&lt;br /&gt;
Wenn MSSP als SPI eingestellt ist, sollen die Pins RC3-RC5 des PIC18 entsprechend softwaremäßig eingestellt und mit ISP – Modul verbunden werden. Benötigt wird auch noch ein Port-Pin des MCU um den Chip Select Eingänge der MCP23S17  zu steuern.&lt;br /&gt;
SPI Interface Modul – Platine ermöglicht separate Steuerung von zwei MCP23S17 Bausteinen, die allerdings mit dem gemeinsamen Chip Select Signal  und unterschiedlichen HW-Adressen (000 und 111) als I/ O  Serial – zu –Parallel Treiber funktionieren. &lt;br /&gt;
IC2 ist mit 4 Binär zu Dezimal Wandler ausgestattet und  wird zur Ausgabe der 16 Bit Daten benutzt.  &lt;br /&gt;
Die ersten 8 Bit vom IC3 können über JP15 mit zwei L293D Schritt-Motoren –Treiber beschaltet werden. &lt;br /&gt;
Die Bits 9 bis 16 dienen als Inputs und können mit externer Tastatur  4x4 angeschlossen werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== I²C Interface Board ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;I²C Modul&#039;&#039; [[Datei:I2C Interface.jpg]]&lt;br /&gt;
&lt;br /&gt;
Wenn MSSP im I²C Modus ist, wird die I²C Interface Platine benötigt.  Entsprechende MCU Pins RC3 und RC4 sollen dann mit I2C-Input beschaltet werden. &lt;br /&gt;
Über I²C Protokoll können  folgende Peripherie-Bauteile angesteuert werden: Real Clock Modul, EEProm, ADU Umwander mit 4 über Potis beschalteten  Analog- Eingängen, Serial-to-Parallel Wandler mit 8 LED , Serial-to-Parallel Wandler mit 4x4 Tastatur und ein Temperatursensor.&lt;br /&gt;
Zugang zu den einzelnen Bauelementen erfolgt über  verschiedene Adressen der Peripherie. Damit werden die Kollisionen vermieden. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;HW-Adressen der I²C Peripherie&#039;&#039;&lt;br /&gt;
[[Datei:HW-Adresse.bmp]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Comm-Modul ==&lt;br /&gt;
RS-232&amp;amp; USB Modul [[Datei:USB&amp;amp;RS-232&amp;amp;Keyboard.jpg]]&lt;br /&gt;
&lt;br /&gt;
Peripherie- Com-Modul ermöglicht die Datenübertragung zwischen dem PC und MCU über eine UART Schnittstelle. Dafür müssen gewisse Änderungen im Software vorgenommen werden. Außerdem sollen die Port-Pins RC6 und RC7 mit den entsprechenden Kontakten der JP18 JP17 verbunden sein(Siehe Videobeispiel &amp;quot;Anschluß mit PC über USB&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
== LCD-Modul ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;PVC200403P&#039;&#039;[[Datei:PVC200403P.JPG]]&lt;br /&gt;
&lt;br /&gt;
Über  die Pin-Heads JP8(JP6 oder JP7) und JP19 kann die parallele Steuerung des LCD-Moduls organisiert werden. In meinem Fall habe ich ein Display PVC200403P von PICVUE  genommen.  Das ist ein Hitachi HD44780 Standard- Display, und verfügt über 8–bit Daten-Bus + 3 Steuerung-Wires.  Erlaubt ist auch die Datenübertragung über 4-bit Daten-Bus+3 Steuerung-Wires. D.h. benötigt werden mindestens 7 Adern des MCU + Stromversorgung. Im Beispiel 3 und 4 (Siehe Anhang &amp;quot;Videobeispiele&amp;quot;), habe ich mein Display mit insgesamt 8 Adern gesteuert(-,+ -Stromversorgung, E-Enable, RS-Register Select, 4-bit Datenbus). Alle anderen Eingänge wurden mit &amp;quot;-&amp;quot; verbunden.  Diese Lösung spart Euch I/O, benötigt allerdings bisschen komplexere LCD-Initialisierung. Die im Datenblatt&amp;quot;PVC200403P&amp;quot; angegebene Zeitverzögerungen zwischen den Initialisierungsbefehlen habe ich mit Timer1 realisiert und damit die Abfrage des Busy-Flags gespart.&lt;br /&gt;
&lt;br /&gt;
== ICSP Programmierung ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;ICSP I/O  Beschaltung&#039;&#039; [[Datei:ICSP.png]]&lt;br /&gt;
&lt;br /&gt;
Ein ICSP I/O ermöglicht die interne Programmierung des Microcontrollers, &lt;br /&gt;
Z.b. via PicKit2 oder PicKit3. In meinem Fall habe ich ein EEPRom Programmiergerät mit ZIF-Socket zu ICSP Adapter genommen(Siehe Anhang).&lt;br /&gt;
&lt;br /&gt;
[http://www.mikrocontroller.net/wikifiles/2/2f/ICSP_Programmierung.JPG EEPROM_Programmer + ICSP Adapter]&lt;br /&gt;
&lt;br /&gt;
== Leiterplatte ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;A4 Größe Design&#039;&#039; [[Datei:Brd Entwicklungsboard.png]]&lt;br /&gt;
&lt;br /&gt;
Schaltplandesign und Leiterplattenentwurf wurde im Eagle realisiert. Der Prototyp wurde auf der doppelseitigen Leiterplatte gefräst und bestückt. Das MCU wurde im Sockel befestigt. Hiermit können die weitere Erweiterungen und MCU-Wechsel ohne Löten durchgeführt werden.&lt;br /&gt;
Der Spannungsregler wurde auf die Leiterplatte gelegt und übers Wärmeleitpad mit dem Lötzinn befestigt. Somit spielt die Plattenfläche auch die Rolle des Kühlkörpers. &lt;br /&gt;
&lt;br /&gt;
[[Datei:7805T.JPG]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Praktische Anwendung ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Real Time Clock &#039;&#039; [[Datei:Realtime_Clock.BMP]]&lt;br /&gt;
&lt;br /&gt;
Eine der möglichen Anwendungen der Entwicklungsplatine ist ein Real-Clock mit der Ausgabe auf dem LCD-Display (siehe Bild). Hiermit werden die Prinzipien der I2C-, Parallel Datenübertragung und der dynamischen Tastenabfrage geübt. In dem Fall benötigen wir ein HD44780 Modul, Mainboard- Modul und ein I2C Modul. &lt;br /&gt;
Die 4x4 Tastatur wird direkt an PortB des MCU angeschlossen. Die ersten 4 Bits sind als Ausgange konfiguriert und die letzten 4 Bits dienen als Eingange mit den inneren Pull-Up Widerständen. Die parallele Datenübertragung zwischen dem MCU und LCD-Modul erfolgt über Port D und Port E des Microcontrollers. Die beiden Peripherie – Bausteine PCF8574 und PCF8583 benötigen serielle Datenübertragung  im I²C Mode mit Taktfrequenz &amp;lt;100kHz. Damit es nicht zu Kollisionen führt, haben die beiden Bausteine verschiedene Adressen. Achten Sie auch darauf, dass alle Bausteine der I²C Peripherie eigene Protokollspezifik haben. Z.B.:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;PCF8574_Read_Mode&#039;&#039;  [[Datei:8574_Read_Mode.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;PCF8574_Write_Mode&#039;&#039;  [[Datei:8574 Write Mode.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;PCF8583_Read_Mode&#039;&#039;  [[Datei:Clock_Read_Mode.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;PCF8583_Write_Mode&#039;&#039;  [[Datei:Clock_Write_Mode.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Fazit ==&lt;br /&gt;
Der Einstieg in die moderne Mikroprozessor- und Mikrocontroller-welt ist praktisch ohne Evaluations-Kits nicht möglich. An manchen Stellen ist die Simulationsprogramm ungenau, insbesondere ist sehr von der Prozessorbelastung abhängig,und lässt die äußere Einflüsse nicht simulieren.In dem Fall ist der Einsatz der Entwicklungsplatine unvermeidlich. Mehrere auf dem Markt vorgestellte Platten sind wegen ihren hohen Preisen nicht an einen durchschnittlichen Käufer(Studenten oder Schüler) gedacht und beziehen sich auf den konkreten Mikroprozessor, der nicht auszutauschen ist. In diesem Zusammenhang , bietet die angebotene Entwicklungsplatine die Universalität, kann leicht nachgebaut und erweitert werden. Der IC-Sockel ermöglicht den unkomplizierten MCU-Tausch, Upgrade oder Übergang zu dem MCU anderer Hersteller.  &lt;br /&gt;
&lt;br /&gt;
== Kontakt ==&lt;br /&gt;
Nach Anfrage kann ich auch die Quellcode, sowie PCB-Design und Programmierbeispiele zur Verfügung stellen.&lt;br /&gt;
Ihre Fragen bitte an : maiierok@t-online.de&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Videobeispiele ==&lt;br /&gt;
&#039;&#039;Video &amp;quot;Anwendung Real-Time Clock&amp;quot;&#039;&#039;&lt;br /&gt;
[http://www.youtube.com/watch?v=9R3alJx_ldA Simulation im Proteus]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Video &amp;quot;Versuch #1 LED&amp;amp; Buzzer- Steuerung&amp;quot;&#039;&#039;&lt;br /&gt;
[http://youtu.be/Yn8-Ny-1He0  LED&amp;amp;Buzzer TEST#1 ]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Beispiel 3 &amp;quot;Liebeserklärung&#039;&#039;&lt;br /&gt;
[http://youtu.be/26qt7u2WQ8s Mainboard + HD44780]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Beispiel 4 &amp;quot;Anschluß mit PC über USB&#039;&#039;&lt;br /&gt;
[http://www.youtube.com/watch?v=nqvd8O5QHOQ Mainboard+ Comm-Board+ HD44780]&lt;br /&gt;
&lt;br /&gt;
== Link ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;PIC18 Datasheet&#039;&#039;  [[Datei:Pic18f2420-2520-4420-4520.pdf]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;A200_ua7805&#039;&#039;  [[Datei:A200_ua7805.pdf]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;PCF8583&#039;&#039;  [[Datei:Clock and Calendar.pdf]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;PCF8574&#039;&#039;  [[Datei:PCF8574.pdf]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;I²C_ Temperature Sensor&#039;&#039;  [[Datei:Thermo_I²C.pdf]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Mcp23s17 SPI Expander&#039;&#039;  [[Datei:Mcp23s17.pdf]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;HD44780 Display&#039;&#039;  [http://www.adafruit.com/datasheets/HD44780.pdf  Datasheet]&lt;/div&gt;</summary>
		<author><name>Horha</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR_Arithmetik/Sinus_und_Cosinus_(Lineare_Interpolation)&amp;diff=65867</id>
		<title>AVR Arithmetik/Sinus und Cosinus (Lineare Interpolation)</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR_Arithmetik/Sinus_und_Cosinus_(Lineare_Interpolation)&amp;diff=65867"/>
		<updated>2012-04-22T16:52:41Z</updated>

		<summary type="html">&lt;p&gt;Horha: http://www.pmelms.de/bit/ws/berech_zweikompl.htmlng 65865 von 95.208.157.192 (Diskussion) wurde rückgängig gemacht.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von [[Benutzer:gjlayde|gjlayde]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:right; margin:1em;&amp;quot;&amp;gt;&lt;br /&gt;
{| {{Tabelle}} &lt;br /&gt;
|+ &#039;&#039;&#039;Lineare Interpolation: Ressourcenverbrauch&#039;&#039;&#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ffddbb&amp;quot;&lt;br /&gt;
! Größe || maximaler Verbrauch&lt;br /&gt;
|-&lt;br /&gt;
| Laufzeit Sinus || 60 Ticks (incl. CALL+RET)&lt;br /&gt;
|-&lt;br /&gt;
| Laufzeit Cosinus || 74 Ticks (incl. CALL+RET)&lt;br /&gt;
|-&lt;br /&gt;
| RAM (statisch) || 0 Bytes&lt;br /&gt;
|-&lt;br /&gt;
| RAM (Stack) || 2&amp;amp;ndash;3 Bytes&amp;lt;ref name=&amp;quot;pc&amp;quot;&amp;gt;Abhängig von der Größe des PC&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Flash || 300 Bytes&amp;lt;ref name=&amp;quot;3.4.6&amp;quot;&amp;gt;Übersetzt mit avr-gcc 3.4.6 für einen ATmega88&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|   || 318 Bytes (avr-gcc 4.3.3 für ATmega88)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Die AVR-Implementierung der linearen Interpolation von Sinus und Cosinus braucht mit 300 Bytes etwas mehr Platz als [[AVR Arithmetik/Sinus und Cosinus (CORDIC)|CORDIC]], arbeitet dafür aber deutlich schneller. Das Eingabeformat ist allerdings ein anderes als bei der obigen CORDIC-Implementierung. Die Werte streuen weniger als beim CORDIC, und sowohl Maximalfehler als auch Standardabweichungen sind kleiner.&lt;br /&gt;
&lt;br /&gt;
Der Algorithmus ist in GNU-C implementiert, greift jedoch auf Inline-Assembler zurück. Dennoch dürfte er leichter zu portieren und zu verstehen sein als eine reine Assembler-Implementierung. Er verwendet Befehle wie MUL, setzt also einen AVR aus der ATmega-Familie voraus.&lt;br /&gt;
&lt;br /&gt;
Der Algorithmus braucht für keine Berechnung (inclusive CALL und RET) länger als 60 Ticks&amp;lt;ref name=&amp;quot;3.4.6&amp;quot;/&amp;gt; für den Sinus bzw. 74 Ticks&amp;lt;ref name=&amp;quot;3.4.6&amp;quot;/&amp;gt; für den Cosinus. Für avr-gcc 4.x kommen u.U einige Ticks hinzu.&lt;br /&gt;
&lt;br /&gt;
{{Clear}}&lt;br /&gt;
&lt;br /&gt;
== Ein- und Ausgabe ==&lt;br /&gt;
&lt;br /&gt;
Die Eingabe ist so skaliert, daß ein Grad aus 256 Inkrementen besteht. Gültige Eingaben liegen also in einem Bereich von 0° bis 255.99° bzw. 0&amp;amp;middot;256...255&amp;amp;middot;256+255. Für die Berechnung von sin(45°) ist der Aufruf beispielsweise&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
// si = sin (45°)&lt;br /&gt;
// co = cos (45°)&lt;br /&gt;
int16_t si = linsin (45*256);&lt;br /&gt;
int16_t co = lincos (45*256);&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für die Ausgabe gilt das gleiche wie für [[AVR Arithmetik/Sinus und Cosinus (CORDIC)#Ein- und Ausgabe|CORDIC]]: Es sind vorzeichenbehaftete Werte im 1.15 Q-Format, wobei der kritische Wert 0x8000 bzw. &amp;amp;minus;32768 nicht produziert wird.&lt;br /&gt;
&lt;br /&gt;
== Quellcode ==&lt;br /&gt;
&lt;br /&gt;
=== linsin.h ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#ifndef LINSIN_H&lt;br /&gt;
#define LINSIN_H&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int16_t linsin (uint16_t);&lt;br /&gt;
int16_t lincos (uint16_t);&lt;br /&gt;
#endif // LINSIN_H&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== linsin.c ===&lt;br /&gt;
&lt;br /&gt;
{{Scrollbox|40ex;|&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/pgmspace.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;linsin.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// Nachguck-Tabelle für eine Sinus-Interpolante.&lt;br /&gt;
// Die Stützstellen sind volle °-Werte von 0°...90°.&lt;br /&gt;
// Die Werte sind so gewählt, daß die Polygonzug-Interpolante&lt;br /&gt;
// den Maximalfehler minimiert; daher sind die Werte in der&lt;br /&gt;
// Tabelle nicht die Funktionswerte des Sinus an den &lt;br /&gt;
// entsprechenden Stellen.&lt;br /&gt;
static const int16_t linsin_tab[91] PROGMEM = &lt;br /&gt;
{&lt;br /&gt;
	0x0000, 0x023c, 0x0478, 0x06b3, 0x08ee, 0x0b28, 0x0d61, 0x0f9a, 0x11d1, 0x1406,&lt;br /&gt;
	0x163a, 0x186d, 0x1a9d, 0x1ccb, 0x1ef8, 0x2121, 0x2348, 0x256d, 0x278e, 0x29ad,&lt;br /&gt;
	0x2bc8, 0x2ddf, 0x2ff4, 0x3204, 0x3410, 0x3619, 0x381d, 0x3a1d, 0x3c18, 0x3e0f,&lt;br /&gt;
	0x4001, 0x41ed, 0x43d5, 0x45b7, 0x4794, 0x496c, 0x4b3d, 0x4d09, 0x4ecf, 0x508e,&lt;br /&gt;
	0x5248, 0x53fb, 0x55a7, 0x574d, 0x58eb, 0x5a83, 0x5c14, 0x5d9e, 0x5f20, 0x609b,&lt;br /&gt;
	0x620f, 0x637a, 0x64df, 0x663b, 0x678f, 0x68db, 0x6a1f, 0x6b5b, 0x6c8e, 0x6db9,&lt;br /&gt;
	0x6edb, 0x6ff5, 0x7106, 0x720e, 0x730d, 0x7403, 0x74f0, 0x75d4, 0x76af, 0x7781,&lt;br /&gt;
	0x7849, 0x7908, 0x79bd, 0x7a69, 0x7b0c, 0x7ba5, 0x7c34, 0x7cb9, 0x7d35, 0x7da7,&lt;br /&gt;
	0x7e0f, 0x7e6e, 0x7ec2, 0x7f0d, 0x7f4e, 0x7f85, 0x7fb1, 0x7fd4, 0x7fed, 0x7ffc,&lt;br /&gt;
	0x7fff&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Ein Word per post-Increment aus dem Flash lesen.&lt;br /&gt;
// Dies ist besser als  pgm_read_word (p++)&lt;br /&gt;
#define pgm_read_word_inc(addr)             \&lt;br /&gt;
(__extension__({                            \&lt;br /&gt;
    uint16_t __result;                      \&lt;br /&gt;
    __asm__                                 \&lt;br /&gt;
    (                                       \&lt;br /&gt;
        &amp;quot;lpm %A0, Z+&amp;quot;   &amp;quot;\n\t&amp;quot;              \&lt;br /&gt;
        &amp;quot;lpm %B0, Z+&amp;quot;                       \&lt;br /&gt;
        : &amp;quot;=r&amp;quot; (__result), &amp;quot;+z&amp;quot; (addr)      \&lt;br /&gt;
    );                                      \&lt;br /&gt;
    __result;                               \&lt;br /&gt;
}))&lt;br /&gt;
&lt;br /&gt;
// Multiply-Accumulate &lt;br /&gt;
// return c + a*b&lt;br /&gt;
// c = 1.15 signed Q-Format&lt;br /&gt;
// a = 1.15 signed Q-Format&lt;br /&gt;
// b = 0.8 unsigned Q-Format&lt;br /&gt;
static inline int16_t fmac16_8 (int16_t c, int16_t a, uint8_t b)&lt;br /&gt;
{&lt;br /&gt;
    asm (&amp;quot;; fmac16_8: %B[c]:%A[c] += %B[a]:%A[a] * %[b]&amp;quot;  &amp;quot;\n\t&amp;quot;&lt;br /&gt;
        &amp;quot;mulsu  %B[a], %[b]&amp;quot;       &amp;quot;\n\t&amp;quot;      // ( (signed)ah * (unsigned)b ) &amp;lt;&amp;lt; 1&lt;br /&gt;
        &amp;quot;add    %A[c], R0&amp;quot;         &amp;quot;\n\t&amp;quot;&lt;br /&gt;
        &amp;quot;adc    %B[c], R1&amp;quot;         &amp;quot;\n\t&amp;quot;&lt;br /&gt;
        &amp;quot;mul    %[b], %A[a]&amp;quot;       &amp;quot;\n\t&amp;quot;      // ( (unsigned) b * al ) &amp;lt;&amp;lt; 1&lt;br /&gt;
        &amp;quot;add    %A[c], R1&amp;quot;         &amp;quot;\n\t&amp;quot;&lt;br /&gt;
        &amp;quot;clr    __zero_reg__&amp;quot;      &amp;quot;\n\t&amp;quot;&lt;br /&gt;
        &amp;quot;adc    %B[c], __zero_reg__&amp;quot;&lt;br /&gt;
        : [c] &amp;quot;+r&amp;quot; (c)&lt;br /&gt;
        : [a] &amp;quot;a&amp;quot; (a), [b] &amp;quot;a&amp;quot; (b)&lt;br /&gt;
    );&lt;br /&gt;
&lt;br /&gt;
    return c;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Sinus&lt;br /&gt;
// phi in [0°,256°) wobei 1° = 256&lt;br /&gt;
int16_t linsin (uint16_t phi)&lt;br /&gt;
{&lt;br /&gt;
    uint8_t neg = 0;&lt;br /&gt;
    uint16_t _180_grad = (uint16_t) 180*256;&lt;br /&gt;
    // Wir wollen diese Konstante in einem Register&lt;br /&gt;
    asm (&amp;quot;&amp;quot; : &amp;quot;+r&amp;quot; (_180_grad));&lt;br /&gt;
        &lt;br /&gt;
    if (phi &amp;gt;= _180_grad)&lt;br /&gt;
    {&lt;br /&gt;
        // sin(x) = -sin(x+pi)&lt;br /&gt;
        // phi in [0°,180°)&lt;br /&gt;
        phi -= _180_grad;&lt;br /&gt;
        neg = 1;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    if (phi &amp;gt; 90*256)&lt;br /&gt;
        // sin(x) = sin(pi-x)&lt;br /&gt;
        // phi in [0°,90°]&lt;br /&gt;
        phi = _180_grad - phi;&lt;br /&gt;
    &lt;br /&gt;
    // Stützpunkte aus Tabelle lesen.&lt;br /&gt;
    // Für phi = 90° ist das formal nicht 100% korrekt, &lt;br /&gt;
    // da über das Tabellenende hinausgelesen wird.&lt;br /&gt;
    // In diesem Falle ist aber phi.lo=0, so daß unten &lt;br /&gt;
    // dann data1-data0 mit 0 multipliziert wird.&lt;br /&gt;
    // Ausserdem gibt&#039;s auf AVR keine Segmentation Faults ;-)&lt;br /&gt;
    const int16_t * p = &amp;amp; linsin_tab[phi &amp;gt;&amp;gt; 8];&lt;br /&gt;
    uint16_t data0  = pgm_read_word_inc (p);&lt;br /&gt;
    uint16_t data1  = pgm_read_word (p);&lt;br /&gt;
    &lt;br /&gt;
    // sin = data0 + (data1-data0) * phi_lo&lt;br /&gt;
    int16_t si = fmac16_8 (data0, data1-data0, phi);&lt;br /&gt;
    &lt;br /&gt;
    return neg ? -si : si;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Cosinus&lt;br /&gt;
// phi in [0°,256°) wobei 1° = 256&lt;br /&gt;
int16_t lincos (uint16_t phi)&lt;br /&gt;
{&lt;br /&gt;
    uint16_t _90_grad = (uint16_t) 90*256;&lt;br /&gt;
    // Wir wollen diese Konstante in einem Register&lt;br /&gt;
    asm (&amp;quot;&amp;quot; : &amp;quot;+r&amp;quot; (_90_grad));&lt;br /&gt;
    &lt;br /&gt;
    if (phi &amp;lt;= _90_grad)&lt;br /&gt;
        // cos(x) = sin(pi/2 - x)&lt;br /&gt;
        return linsin (_90_grad - phi);&lt;br /&gt;
    else&lt;br /&gt;
        // cos(x) = -sin (x - pi/2)&lt;br /&gt;
        return -linsin (phi - _90_grad);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Aufbau der Tabelle ===&lt;br /&gt;
&lt;br /&gt;
Zur Erstellung der Tabelle gehen wir von äquidistanten Stützstellen im Abstand &amp;amp;delta; aus. Entwickeln wir die zu interpolierende Funktion in eine [http://de.wikipedia.org/wiki/Taylorreihe Taylor-Reihe] um den Mittelpunkt eines Teilintervalles der Breite &amp;amp;delta;, so erhalten wir für den absoluten Fehler&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\Delta = \frac{f&#039;&#039;(\xi)}2 \cdot \left(\frac\delta 2\right)^2 + \mathcal O(f&#039;&#039;&#039;\cdot\delta^3)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Indem wir durch eine Sekante annähern anstatt durch &amp;amp;ndash; wie durch die Taylor-Reihe gegeben &amp;amp;ndash; eine Tangente, können wir die Größenordnung des Fehlers halbieren und erhalten:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
|\Delta| \approx \tfrac1{16}\cdot |f&#039;&#039;|\cdot \delta^2 &lt;br /&gt;
 \;\leqslant\; \tfrac1{16} \cdot \delta^2 &lt;br /&gt;
 \;\stackrel!\leqslant\; 2^{-15}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Weil mit der Tabelle das Intervall [0..&amp;amp;pi;/2] interpoliert werden soll, brauchen wir mindestens&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
16\pi\sqrt{2} \approx 71&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Teilintervalle. Wir machen also die naheliegende Wahl von 90 Teilintervallen bzw. 91 Stützstellen von 0°...90° und damit&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\delta = \tfrac1{90} \cdot \tfrac\pi2 \approx 0.01745 = 571.9\cdot 2^{-15}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Damit wäre ein Eingabeformat von 512=2&amp;lt;sup&amp;gt;9&amp;lt;/sup&amp;gt; Inkrementen pro Grad zwar naheliegend (die Ableitung des Sinus/Cosinus ist höchstens 1), aus rechentechnischen Erwägungen unterteilen wir ein Grad jedoch nur in 256=2&amp;lt;sup&amp;gt;8&amp;lt;/sup&amp;gt; Inkremente und kommen damit zum vorliegenden Eingabeformat.&lt;br /&gt;
&lt;br /&gt;
== Genauigkeit ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:right; margin:1em;&amp;quot;&amp;gt;&lt;br /&gt;
{| {{Tabelle|text-align:center;}} &lt;br /&gt;
|+ &#039;&#039;&#039;Lineare Interpolation: Genauigkeit&#039;&#039;&#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ffddbb&amp;quot;&lt;br /&gt;
! Größe || Standardabweichung || Maximaler Fehler&lt;br /&gt;
|-&lt;br /&gt;
! sin   &lt;br /&gt;
| 2.2&amp;amp;middot;10&amp;lt;sup&amp;gt;-5&amp;lt;/sup&amp;gt; || 6.1&amp;amp;middot;10&amp;lt;sup&amp;gt;-5&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! cos&lt;br /&gt;
| 2.3&amp;amp;middot;10&amp;lt;sup&amp;gt;-5&amp;lt;/sup&amp;gt; || 6.1&amp;amp;middot;10&amp;lt;sup&amp;gt;-5&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Radius&lt;br /&gt;
| 2.9&amp;amp;middot;10&amp;lt;sup&amp;gt;-5&amp;lt;/sup&amp;gt; || 6.1&amp;amp;middot;10&amp;lt;sup&amp;gt;-5&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! &amp;amp;phi; &lt;br /&gt;
| 1.5&amp;amp;middot;10&amp;lt;sup&amp;gt;-5&amp;lt;/sup&amp;gt; || 3.1&amp;amp;middot;10&amp;lt;sup&amp;gt;-5&amp;lt;/sup&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
Die Güte der Ergebnisse kann aus der nebenstehenden Tabelle entnommen werden.&lt;br /&gt;
&lt;br /&gt;
Die Ergebnisse sind recht gut normalverteilt um das korrekte Ergebnis. Der maximale absolute Fehler liegt bei 2&amp;amp;nbsp;Inkrementen bzw. 0.00006, was einer effektiven Auflösung von 14&amp;amp;nbsp; Nachkomma-Bits bzw. insgesamt 15 Bits entspricht.&lt;br /&gt;
&lt;br /&gt;
Im Gegensatz zum CORDIC sind die Ergebnisse der linearen Interpolation per Konstruktion &#039;&#039;monoton&#039;&#039;: Im Intervall 0...&amp;amp;pi;/2 ist die Sinus-Funktion z.&amp;amp;nbsp;B. monoton wachsend, und das gilt auch für die hier berechneten Werte. Bei CORDIC sind die Ergebnisse &amp;quot;verrauscht&amp;quot;, so daß es auch bei etwas größerer Eingabe zu einem kleineren Wert kommen kann.&lt;br /&gt;
&lt;br /&gt;
Die untenstehenden Diagramme zeigen die Verteilungen der absoluten Fehler. In x-Richtung ist der Fehler aufgetragen, wieder in Einheiten von 1/32767. In y-Richtung ist die Anzahl der Werte aufgetragen, die mit dem entsprechenden absoluten Fehler behaftet sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery perrow=&amp;quot;2&amp;quot; caption=&amp;quot;Standard- und Maximalabweichungen in Einheiten von &amp;amp;nbsp;1/32767&amp;quot; widths=&amp;quot;260&amp;quot; heights=&amp;quot;130&amp;quot;&amp;gt;&lt;br /&gt;
Bild:Linsin-dsin.png|Sinus&lt;br /&gt;
Bild:Linsin-dcos.png|Cosinus&lt;br /&gt;
Bild:Linsin-dr.png|Radius&lt;br /&gt;
Bild:Linsin-dphi.png|Winkel&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[AVR-CORDIC]]&lt;br /&gt;
* [[AVR Arithmetik/Sinus und Cosinus (CORDIC)|Sinus und Cosinus mit CORDIC]]&lt;br /&gt;
&lt;br /&gt;
== Anmerkungen ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Arithmetik|S]]&lt;/div&gt;</summary>
		<author><name>Horha</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Kategorie_Diskussion:AVR-Boards&amp;diff=60557</id>
		<title>Kategorie Diskussion:AVR-Boards</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Kategorie_Diskussion:AVR-Boards&amp;diff=60557"/>
		<updated>2011-09-20T06:03:37Z</updated>

		<summary type="html">&lt;p&gt;Horha: Die Seite wurde neu angelegt: „Hallo,  ::::::::::::::: Aktuelle Version vom 23:00, 19. Sep. 2011 (Bearbeiten) (rückgängig) 173.180.202.160 (Diskussion)  (Ich schätze alle harte Arbeit der We…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hallo,&lt;br /&gt;
&lt;br /&gt;
:::::::::::::::&lt;br /&gt;
Aktuelle Version vom 23:00, 19. Sep. 2011 (Bearbeiten) (rückgängig)&lt;br /&gt;
173.180.202.160 (Diskussion) &lt;br /&gt;
(Ich schätze alle harte Arbeit der Webmaster dieser Blog)&lt;br /&gt;
 &lt;br /&gt;
Zeile 1:	Zeile 1:&lt;br /&gt;
-	In dieser Kategorie findest Du selbst entwickelte AVR-Entwicklungsboards und Beschreibungen zu käuflichen AVR-Entwicklungs-Kits.	+	Ich kann wirklich sagen , dass ich nie so viel gelesen nützliche Informationen über Bearbeiten von Kategorie:AVR-Boards - Mikrocontroller.net. Ich möchte meine Dankbarkeit an den Webmaster von diesem Blog zu äußern.&lt;br /&gt;
:::::::::::::::&lt;br /&gt;
&lt;br /&gt;
Es ist schön das Leute, wie auch ich, sehr dankbar für das Forum sind, &lt;br /&gt;
aber dabei dann die Links auf AVR Bootloader rauszuschmeissen, ist nicht die feine englische Art.&lt;br /&gt;
Ich hoffe 173.180.202.160 liest es.&lt;br /&gt;
Vielleicht fehlt eine Dankesrubrik im Forum ;-) Oder ein Knopf &amp;quot;Danke&amp;quot; und ein Zähler für erhaltene Danke.&lt;/div&gt;</summary>
		<author><name>Horha</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Kategorie:AVR-Boards&amp;diff=60556</id>
		<title>Kategorie:AVR-Boards</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Kategorie:AVR-Boards&amp;diff=60556"/>
		<updated>2011-09-20T05:51:43Z</updated>

		<summary type="html">&lt;p&gt;Horha: Änderung 60553 von 173.180.202.160 (Diskussion) wurde rückgängig gemacht.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In dieser Kategorie findest Du selbst entwickelte AVR-Entwicklungsboards und Beschreibungen zu käuflichen AVR-Entwicklungs-Kits.&lt;br /&gt;
&lt;br /&gt;
Siehe dazu auch [[:Kategorie:AVR-Programmer und -Bootloader]]&lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]]&lt;br /&gt;
[[Category:Boards]]&lt;/div&gt;</summary>
		<author><name>Horha</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Kategorie:AVR-Boards&amp;diff=60385</id>
		<title>Kategorie:AVR-Boards</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Kategorie:AVR-Boards&amp;diff=60385"/>
		<updated>2011-09-13T08:25:17Z</updated>

		<summary type="html">&lt;p&gt;Horha: Änderung 60384 von 173.183.73.202 (Diskussion) wurde rückgängig gemacht.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In dieser Kategorie findest Du selbst entwickelte AVR-Entwicklungsboards und Beschreibungen zu käuflichen AVR-Entwicklungs-Kits.&lt;br /&gt;
&lt;br /&gt;
Siehe dazu auch [[:Kategorie:AVR-Programmer und -Bootloader]]&lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]]&lt;br /&gt;
[[Category:Boards]]&lt;/div&gt;</summary>
		<author><name>Horha</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Liste_der_Wecker-_und_Uhrenprojekte&amp;diff=53041</id>
		<title>Liste der Wecker- und Uhrenprojekte</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Liste_der_Wecker-_und_Uhrenprojekte&amp;diff=53041"/>
		<updated>2010-11-29T08:32:45Z</updated>

		<summary type="html">&lt;p&gt;Horha: /* www */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Scheinbar dominiert unter Hobbyelektroniker neben dem Verstärkerbau noch ganz groß der selbst gebaute Wecker. Bevor nun jeder von vorne sein eigens Projekt startet, hier zur Anregung eine Sammlung ähnlich gelagerter Projekte.&lt;br /&gt;
&lt;br /&gt;
(Bitte nach Bedarf ergänzen)&lt;br /&gt;
&lt;br /&gt;
== www.mikrocontroller.net ==&lt;br /&gt;
&lt;br /&gt;
* [[Wake-Up Light]]&lt;br /&gt;
* [[DCF77-Funkwecker mit AVR]]&lt;br /&gt;
* [[Word Clock]]&lt;br /&gt;
* siehe auch Artikel in Kategorie [[:Kategorie:Timer und Uhren|&amp;quot;Timer und Uhren&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
== www ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.wiesolator.de/index.php?area=Projekte&amp;amp;topic=MP3-Wecker MP3-Wecker]&lt;br /&gt;
* [http://s-huehn.de/elektronik/tischuhr/tischuhr.htm Projekt: Tischuhr]&lt;br /&gt;
* [http://s-huehn.de/elektronik/multiuhr/multiuhr.htm Projekt: Multifunktionsuhr]&lt;br /&gt;
* [http://s-huehn.de/elektronik/wecker/wecker.htm Projekt: Wecker]&lt;br /&gt;
* [http://mosfetkiller.de/?s=funkwecker Funkwecker mosfetkiller.de]&lt;br /&gt;
* [http://www.mcamafia.de/nixie/ncp_dt/ncp.htm Mein Nixie Uhren Projekt]&lt;br /&gt;
* [http://www.kielnet.net/home/julien.thomas/tech/NETZUHR.htm Energieeffizienter Uhrenwecker mit Leuchtanzeige 0,25 W ohne Trafo/mit Kondensatornetzteil]&lt;br /&gt;
* [http://pic-projekte.de/dcf.html Mit LC-Touchdisplay]&lt;br /&gt;
* [http://www.elektronikbasteln.pl7.de/dcf77-uhr-mit-pic.html DCF77-Uhr mit PIC 16F84]&lt;br /&gt;
* [http://www.marwedels.de/malte/uhr/ DCF77-Uhr mit Atmega16 und RS232 Interface]&lt;br /&gt;
&lt;br /&gt;
== Zeitschriften ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.elektor.de/jahrgang/2004/marz/wecker-mit-pic.62739.lynkx Wecker mit PIC]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Timer und Uhren| ]]&lt;/div&gt;</summary>
		<author><name>Horha</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Liste_der_Wecker-_und_Uhrenprojekte&amp;diff=50190</id>
		<title>Liste der Wecker- und Uhrenprojekte</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Liste_der_Wecker-_und_Uhrenprojekte&amp;diff=50190"/>
		<updated>2010-08-28T06:00:28Z</updated>

		<summary type="html">&lt;p&gt;Horha: /* www */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Scheinbar dominiert unter Hobbyelektroniker neben dem Verstärkerbau noch ganz groß der selbst gebaute Wecker. Bevor nun jeder von vorne sein eigens Projekt startet, hier zur Anregung eine Sammlung ähnlich gelagerter Projekte.&lt;br /&gt;
&lt;br /&gt;
(Bitte nach Bedarf ergänzen)&lt;br /&gt;
&lt;br /&gt;
== www.mikrocontroller.net ==&lt;br /&gt;
&lt;br /&gt;
* [[Wake-Up Light]]&lt;br /&gt;
* [[DCF77-Funkwecker mit AVR]]&lt;br /&gt;
* [[Word Clock]]&lt;br /&gt;
&lt;br /&gt;
== www ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.wiesolator.de/index.php?area=Projekte&amp;amp;topic=MP3-Wecker MP3-Wecker]&lt;br /&gt;
* [http://s-huehn.de/elektronik/tischuhr/tischuhr.htm Projekt: Tischuhr]&lt;br /&gt;
* [http://s-huehn.de/elektronik/multiuhr/multiuhr.htm Projekt: Multifunktionsuhr]&lt;br /&gt;
* [http://s-huehn.de/elektronik/wecker/wecker.htm Projekt: Wecker]&lt;br /&gt;
* [http://mosfetkiller.de/?s=funkwecker Funkwerker mosfetkiller.de]&lt;br /&gt;
* [http://www.mcamafia.de/nixie/ncp_dt/ncp.htm Mein Nixie Uhren Projekt]&lt;br /&gt;
* [http://www.kielnet.net/home/julien.thomas/tech/NETZUHR.htm Energieeffizienter Uhrenwecker mit Leuchtanzeige 0,25 W ohne Trafo]&lt;br /&gt;
&lt;br /&gt;
== Zeitschriften ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.elektor.de/jahrgang/2004/marz/wecker-mit-pic.62739.lynkx Wecker mit PIC]&lt;/div&gt;</summary>
		<author><name>Horha</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Temperatursensor&amp;diff=49998</id>
		<title>Temperatursensor</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Temperatursensor&amp;diff=49998"/>
		<updated>2010-08-18T07:49:48Z</updated>

		<summary type="html">&lt;p&gt;Horha: /* NTC/PTC */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Will man mit einem [[Mikrocontroller]] Temperaturen messen, dann braucht man&lt;br /&gt;
* einen [[Sensor]], der die Temperatur z.&amp;amp;nbsp;B. in eine Spannung oder einen Strom umwandelt&lt;br /&gt;
* einen [[ADC | AD-Wandler]], der das Signal digitalisiert. Der kann auf dem Sensor oder dem Mikrocontroller integriert sein.&lt;br /&gt;
&lt;br /&gt;
Temperatursensoren gibt es nun in allen möglichen Varianten. Vom temperaturabhängigen [[Widerstand]] bis zum fertig abgeglichenen All-in-one-Bauteil mit digitalem Ausgang. Wie bei allen Sensoren sollte man auch hier genau hinschauen und [[Auflösung und Genauigkeit]] unterscheiden.&lt;br /&gt;
&lt;br /&gt;
== Analoge Temperatursensoren ==&lt;br /&gt;
&lt;br /&gt;
=== PT100 ===&lt;br /&gt;
&lt;br /&gt;
Unter einem PT100 versteht man einen Platinwiderstand, der bei 0°C einen Widerstand von 100 Ohm hat.&lt;br /&gt;
Platinwiderstände sind temperaturabhängige Widerstände mit hoher Wiederholgenauigkeit und Konstanz[http://de.wikipedia.org/wiki/Konstante].  Wegen der relativ geringen Widerstandsänderung von nur ca. 0,4 Ohm pro Grad ist etwas mehr Schaltungsaufwand erforderlich als bei anderen Sensoren. Genauere Formeln zur Temperaturbestimmung gibt es u.a. bei der [http://de.wikipedia.org/wiki/Pt100 Wikipedia]. Ein Schaltplan findet sich bei der [http://www.heise.de/ct/04/22/236/ c&#039;t].&lt;br /&gt;
&lt;br /&gt;
Die Sensoren gibt es auch mit anderen Widerstandswerten, z.&amp;amp;nbsp;B. mit 1000&amp;amp;Omega; und heißen dann entsprechend PT1000.&lt;br /&gt;
&lt;br /&gt;
Vorteil:&lt;br /&gt;
* genormt&lt;br /&gt;
* hohe Linearität&lt;br /&gt;
* hohe Wiederholgenauigkeit&lt;br /&gt;
* einfach austauschbar&lt;br /&gt;
&lt;br /&gt;
Nachteil:&lt;br /&gt;
* relativ teuer (bei segor.de ab 3,80&amp;amp;euro;)&lt;br /&gt;
* brauchen aufwendigere Auswerteschaltung&lt;br /&gt;
&lt;br /&gt;
Links:&lt;br /&gt;
* [http://www.heise.de/ct/04/22/236/ c&#039;t-Artikel: Mikrocontroller-Programmierung: Timer, Sensoren und Drehgeber (mit PT100 Schaltung)]&lt;br /&gt;
&lt;br /&gt;
=== NTC/PTC ===&lt;br /&gt;
&lt;br /&gt;
NTC und PTC sind temperaturabhängige Widerstände.&lt;br /&gt;
&lt;br /&gt;
* NTC (engl. &#039;&#039;&#039;N&#039;&#039;&#039;egative &#039;&#039;&#039;T&#039;&#039;&#039;emperature &#039;&#039;&#039;C&#039;&#039;&#039;oefficient, Heißleiter), hat bei hohen Temperaturen seinen niedrigsten Widerstand, z.&amp;amp;nbsp;B. Silizium&lt;br /&gt;
* PTC (engl. &#039;&#039;&#039;P&#039;&#039;&#039;ositive &#039;&#039;&#039;T&#039;&#039;&#039;emperature &#039;&#039;&#039;C&#039;&#039;&#039;oefficient, Kaltleiter), hat bei niedrigen Temperaturen seinen geringsten Widerstand, z.&amp;amp;nbsp;B. Glühlampe&lt;br /&gt;
&lt;br /&gt;
Um den Widerstandswert zu messen schaltet man sie mit einem normalen Widerstand oder einer [[Konstantstromquelle]] in Reihe zu einem [[Spannungsteiler]] und misst den Spannungsabfall. Eine Beispielschaltung findet sich [http://www.mathar.com/msp_thermo1.html hier].&lt;br /&gt;
&lt;br /&gt;
Vorteil:&lt;br /&gt;
* billig (Reichelt ~0,40&amp;amp;euro;)&lt;br /&gt;
&lt;br /&gt;
Nachteil:&lt;br /&gt;
* müssen abgeglichen werden&lt;br /&gt;
* brauchen A/D-Wandler&lt;br /&gt;
* sind nichtlinear&lt;br /&gt;
&lt;br /&gt;
Links:&lt;br /&gt;
* [http://www.sprut.de/electronic/temeratur/temp.htm Temperaturabhängige Stromquelle und NTC/PTC inclusive Linearisierung]&lt;br /&gt;
*[http://www.umnicom.de/Elektronik/Mikrokontroller/Atmel/AtFan/AtFan.html#2.2.2 Berechnung des Linearisierungswiderstandes für gewünschten Temperaturbereich] der fällt sonst immer vom Himmel&lt;br /&gt;
&lt;br /&gt;
=== LMx35 ===&lt;br /&gt;
&lt;br /&gt;
Eine IC-Familie, die pro Kelvin Temperaturänderung ihre Ausgangsspannung um 10&amp;amp;nbsp;mV ändert. Die ICs gibt es in verschiedenen Genauigkeiten und Temperaturbereichen mit den Bezeichnungen LM135(A), LM235(A) und LM335(A). Der günstigste ist der LM335 mit einem Temperaturbereich von −40 … +100°C.&lt;br /&gt;
In verschiedenen Bauformen erhältlich. Beispielschaltungen finden sich im [http://www.national.com/ds.cgi/LM/LM135.pdf Datenblatt] und [http://www.suessbrich.info/elek/elektherm1.html hier]&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* hat auch ohne Kalibrierung eine Genauigkeit von einem Grad (bei 25°C)&lt;br /&gt;
* relativ billig (LM335 bei Reichelt ab 0,50&amp;amp;nbsp;€)&lt;br /&gt;
&lt;br /&gt;
Nachteile:&lt;br /&gt;
* benötigt A/D-Wandler&lt;br /&gt;
* bei längerer Anschlussleitung störanfällig&lt;br /&gt;
&lt;br /&gt;
=== LM334 ===&lt;br /&gt;
&lt;br /&gt;
Ein IC ähnlich dem LM335 mit dem Unterschied, dass der durch das IC fließende Strom proportional von der Temperatur abhängt. Mit einer einfachen Schaltung aus nur zwei Widerständen kann man dann den Strom in einer Weise wandeln, dass pro Kelvin eine Spannungsänderung von 10mV ausgegeben wird. Da die Strom-Spannungswandlung auf der Platine (und damit nahe am AD-Wandler) stattfindet und die Übertragung des Messwerts durch einen Strom stattfindet, sind Störungen durch Netzbrumm etc. viel geringer als beim LM335&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
&amp;lt;!-- * hat auch ohne Kalibrierung eine Genauigkeit von einem Grad (bei 25°C) &lt;br /&gt;
Laut Datenblatt +-3°C&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
* relativ billig ([http://www.reichelt.de/?ARTICLE=10468 Reichelt 0,54 &amp;amp;euro;])&lt;br /&gt;
&lt;br /&gt;
Nachteile:&lt;br /&gt;
* benötigt A/D-Wandler&lt;br /&gt;
* Bereich 0°C-70°C&lt;br /&gt;
&lt;br /&gt;
Ähnliche ICs:&lt;br /&gt;
* AD592 (Ausgangsstrom 1µA pro Kelvin, absolute Temperatur) [http://www.reichelt.de/?ARTICLE=3825 Reichelt: 3,75 €], Conrad 174912 8,50 &amp;amp;euro;&lt;br /&gt;
&lt;br /&gt;
=== SMT160-30 ===&lt;br /&gt;
&lt;br /&gt;
Ist ein Zwischending zwischen Digital und Analog. Sein Ausgangssignal ist ein digitales PWM-Signal, zu dessen Messung man am besten den Input-Capture-Eingang eines Mikrocontrollers verwendet. Man kann ihn also wie einen analogen Sensor nur indirekt auslesen, anstatt über einen AD-Wandler hier über einen Timer.&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* Digitales PWM-Signal ist unempfindlich gegen Störeinflüsse&lt;br /&gt;
* gibt es in SO8, TO18, TO92 und &amp;lt;b&amp;gt;TO220&amp;lt;/b&amp;gt;, gut befestigbar, z.B am Kühlkörper&lt;br /&gt;
* linear&lt;br /&gt;
* kein Abgleich nötig&lt;br /&gt;
&lt;br /&gt;
Nachteile (viele):&lt;br /&gt;
* benötigt Timer&lt;br /&gt;
* jittert extrem, genaue Messungen nur über Mittelung / Filterung möglich&lt;br /&gt;
* nicht nur das PWM-Verhältnis, sondern auf die Frequenz ist temp-abhängig (1-4kHz)&lt;br /&gt;
* teuer (Farnell 10,90&amp;amp;euro; +16%, Conrad 9,xx&amp;amp;euro; , www.hy-line.de ??).&lt;br /&gt;
* TO92 Gehäuse ist günstiger, dafür weniger genau&lt;br /&gt;
&lt;br /&gt;
Links:&lt;br /&gt;
* http://www.hy-line.de/co/sensor-tec/hersteller/smartec/smt-160-30/index.html&lt;br /&gt;
&lt;br /&gt;
=== Thermoelement ===&lt;br /&gt;
&lt;br /&gt;
Ein Thermoelement besteht im einfachsten Fall aus zwei ungleichen Metallendrähten, die an einem Punkt miteinander verbunden sind und bei dem die Verbindungsstelle einer anderen Temperatur ausgesetzt ist als die offenen Enden der Drähte. An den offenen Enden der Drähten entsteht eine Spannung (Thermospannung). Dieser Effekt wurde 1821 von Thomas Seebeck entdeckt ([http://de.wikipedia.org/wiki/Seebeck-Effekt Seebeck-Effekt] bei Wikipedia). Eine weitere Anwendung ist der thermoelektrische Generator (&amp;quot;Thermogenerator&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Vorteil:&lt;br /&gt;
* über einen sehr weiten Temperaturbereich einsetzbar&lt;br /&gt;
&lt;br /&gt;
Nachteil:&lt;br /&gt;
* die sehr geringen Temperaturspannungen im Mikrovoltbereich benötigen eine sehr gute Auswertelektronik (guter Analogteil + AD-Wandler).&lt;br /&gt;
&lt;br /&gt;
Links:&lt;br /&gt;
* [http://digital.ni.com/worldwide/germany.nsf/web/all/7A4F02BAEFEC22AC802567F6003E0D6E  Temperaturmessung mit Thermoelementen] - Eine Einführung von David Potter (deutsche Überarbeitung: G.Sinkovic) (inkl. Erläuterung der Kaltstellenkompensation)&lt;br /&gt;
* [http://www.ipetronik.com/pdf/Newsletter/Ipetronik_NL2_2004_d.pdf Warum Thermoelemente Relativtemperaturen messen! oder Was ist eine Kaltstelle?] - Technische Information von www.ipetronik.com (PDF, 272 KB)&lt;br /&gt;
&lt;br /&gt;
== Digitale Temperatursensoren ==&lt;br /&gt;
&lt;br /&gt;
=== DS1621 ===&lt;br /&gt;
&lt;br /&gt;
Der DS1621 ist Temperatursensor und A/D-Wandler in einem. Er gibt seine Daten per [[I²C]]-[[Bus]] aus. Ein Schaltplan für einen elektronischen Thermometer mit diesem IC findet sich [http://www.myplace.nu/avr/thermo/ hier].&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* bereits kalibriert&lt;br /&gt;
* kein A/D-Wandler nötig&lt;br /&gt;
* da I²C ein Bus ist, kann man mehrere DS1621 und andere I²C-Bausteine zusammen anschließen und braucht dafür trotzdem nur zwei I/O-Ports.&lt;br /&gt;
* Messbereich -55°C to +125°C &lt;br /&gt;
* Genauigkeit +-0,5°&lt;br /&gt;
* Auflösung besser 0,01°, wenn man die beiden Zählerregister (Count-Remain und Count-per-C) auswertet&lt;br /&gt;
&lt;br /&gt;
Nachteile:&lt;br /&gt;
* teuer (Segor 5,80&amp;amp;euro;; RS 3,95&amp;amp;euro;; Conrad 5,22&amp;amp;euro;)&lt;br /&gt;
* obwohl die meisten Register [[Speicher#NVRAM | nichtflüchtig]] sind, kann man ihn nicht als Stand-Alone-Thermostat einsetzen, da er erst nach einem Start-Conversion-Befehl zu messen beginnt.&lt;br /&gt;
&lt;br /&gt;
Nachfolger:&lt;br /&gt;
* DS1631, DS1631A (Auto-Start-&amp;gt; Stand-Alone-Thermostat), DS1731&lt;br /&gt;
* weitere Stand-Alone-Thermostaten: DS1821, DS1629&lt;br /&gt;
&lt;br /&gt;
=== LM75 ===&lt;br /&gt;
&lt;br /&gt;
Der LM75 ist so ähnlich wie der DS1621, allerdings nur in SMD erhältlich und nicht so genau. Er ist aber öfters mal auf PC-Mainboards zu finden, so dass man beim Schlachten eines solchen günstig an einen Temperatursensor kommen kann. Einen Schaltplan findet man [http://www.mcselec.com/index.php?option=com_docman&amp;amp;task=cat_view&amp;amp;gid=83&amp;amp;limit=1&amp;amp;limitstart=35 hier].&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* bereits kalibriert&lt;br /&gt;
* kein A/D-Wandler nötig&lt;br /&gt;
* I²C-Bus Ausgang&lt;br /&gt;
* billiger als DS1621 (Reichelt 1,45 &amp;amp;euro;; RS 3V: 3,75&amp;amp;euro;; 5V: 2,72&amp;amp;euro;)&lt;br /&gt;
* Auflösung 0,5°&lt;br /&gt;
&lt;br /&gt;
Nachteile:&lt;br /&gt;
* nur im SMD-Gehäuse erhältlich&lt;br /&gt;
* relativ ungenau (+-2°), kann man jedoch kalibrieren / kompensieren&lt;br /&gt;
&lt;br /&gt;
Kompatible Typen:&lt;br /&gt;
* AD7415ART&lt;br /&gt;
&lt;br /&gt;
=== TMP175 / TMP75 ===&lt;br /&gt;
&lt;br /&gt;
Ähnelt dem LM75 stark! Temperatursensor von Texas Instruments.&lt;br /&gt;
&lt;br /&gt;
=== DS18S20 / DS18B20 ===&lt;br /&gt;
&lt;br /&gt;
Der DS18S20 (Nachfolger des DS1820) und DS18B20 sind scheinbar Temperatursensoren und A/D-Wandler in einem. Wenn man genauer hinschaut, stellt man fest, dass es sich um direktwandelnde Sensoren handelt. Die Temperatur wird ohne Umweg über eine analoge Zwischengröße (Spannung oder Strom) in ein digitales Signal überführt. Die Datenkommunikation erfolgt über ein 1-Wire-Interface, wodurch man am [[Mikrocontroller]] mit nur einen einzigen I/O-Pin auskommen kann. Außerdem beherrschen sie die parasitäre Stromversorgung, d.h. man braucht für Daten und Stromversorgung zusammen nur zwei Leitungen.  Der DS18B20 hat 12 Bit Auflösung gegenüber 9 Bit Auflösung beim DS18S20.&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* bereits kalibriert&lt;br /&gt;
* Genauigkeit +-0,5°&lt;br /&gt;
* 1-Wire-Ausgang&lt;br /&gt;
&lt;br /&gt;
Nachteil:&lt;br /&gt;
* relativ teuer: Reichelt: 2,50&amp;amp;euro; / CSD: 1,85&amp;amp;euro; / Conrad 5,08&amp;amp;euro;&lt;br /&gt;
&lt;br /&gt;
Links:&lt;br /&gt;
* [http://chaokhun.kmitl.ac.th/~kswichit/avrthermo/avrthermo.html Ein Schaltplan]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/6505 Code zur Ansteuerung ASM ATTiny12]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/14792 Code zur Ansteuerung AVR-GCC]&lt;br /&gt;
* [http://pdfserv.maxim-ic.com/en/ds/DS18S20.pdf Datenblatt DS18S20] &lt;br /&gt;
* [http://pdfserv.maxim-ic.com/en/ds/DS18B20.pdf Datenblatt DS18B20]&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/read-4-248219.html Webserver zur Ansteuerung von bis zu 63 Bausteinen]&lt;br /&gt;
* [http://www.teslabs.com/openplayer/docs/docs/other/ds18b20_pre1.pdf PDF Anleitung zur Beschaltung und Programmierung (C)]&lt;br /&gt;
&lt;br /&gt;
=== DS1822 ===&lt;br /&gt;
&lt;br /&gt;
Ähnlich wie DS18S20, aber weniger genau (+-2°) und in großen Stückzahlen billiger. Wegen der geringeren Verbreitung kommt der Preisvorteil aber bei Einzelstücken nicht beim Kunden an. So kostet er bei Reichelt mit 3,50&amp;amp;euro; mehr als der DS18S20.&lt;br /&gt;
&lt;br /&gt;
=== DS1921 / DS1922 ===&lt;br /&gt;
&lt;br /&gt;
Sind wie die DS1821 1-wire-Sensoren mit zusätzlicher Logging-Funktion.&lt;br /&gt;
Im iButton-Gehäuse befindet sich eine Lithium-Zelle, eine RTC, CMOS-RAM und der Temp-Sensor. Nach umfangreicher Progammierung startet der Button seine Mission (Aufzeichnung des Temperaturverlaufs).&lt;br /&gt;
Gibt es auch mit zusätzlicher Feuchtemessung (DS1923).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== TSic ===&lt;br /&gt;
&lt;br /&gt;
Die TSic Sensoren werden baugleich von 3 Herstellern angeboten:&lt;br /&gt;
* ZMD ([http://www.zmd.biz/temp.php?group=temp&amp;amp;content=products Homepage]) ([http://tarr.uspto.gov/servlet/tarr?regser=serial&amp;amp;entry=78673282 Trademark])&lt;br /&gt;
* IST AG ([http://www.ist-ag.com/eh/ist-ag/de/home.nsf/contentview/8F5D32432CAC53C2C1257405003C2433 Homepage])&lt;br /&gt;
* Hygrosens ([http://www.hygrosens.de/english/shop/list.html?tx_ttproducts_pi1%5Bcat%5D=11&amp;amp;cHash=dcd89b823b Homepage])&lt;br /&gt;
&lt;br /&gt;
Die TSic Sensoren ([http://www.zmd.biz/pdf/ZMD%20TSic%20Data%20Sheet%20V3%207.pdf Datenblatt]) geben ihre Temperaturmessdaten automatisch in einem festen Intervall aus. Daher muss der Host nur warten bis die nächsten Messdaten rausgeschickt werden. Die TSic Sensoren die es im freien Handel gibt, geben ihre Messdaten alle 100ms (10Hz) aus. &lt;br /&gt;
Zur Übertragung wird das [http://www.zmd.biz/pdf/IST_TSic_ZACwire_V2.3%20Digital%20Output_17-Oct-06.pdf ZACwire] Protokoll benutzt. Es handelt sich um eine einfach zwei Byte Übertragung per Manchester-Code. Diese zwei Byte repräsentieren den digital gewandelten Temperaturwert. Im Gegensatz zu Sensoren wie den DS18xxx von Dallas muss dieser Wert aber erst auf einen dezimalen Wert umgerechnet werden. &lt;br /&gt;
Die Sensoren kommen mit 3 Pins aus (VCC, GND, Dout).&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* Bereits kalibriert&lt;br /&gt;
* Verschiedene Genauigkeiten lieferbar&lt;br /&gt;
* Sehr einfaches Kommunikationsprotokoll&lt;br /&gt;
* Geringer Stromverbrauch&lt;br /&gt;
* Hochgenau: bis zu +/- 0.1°C (TSic 50x)&lt;br /&gt;
&lt;br /&gt;
Nachteil:&lt;br /&gt;
* Recht teuer (Reichelt: 4,70&amp;amp;euro; für den TSic206)&lt;br /&gt;
* Nur ein Sensor an einem I/O nutzbar (Kein Bussystem)&lt;br /&gt;
&lt;br /&gt;
Achtung! &lt;br /&gt;
Die TSic Sensoren gibt es auch als Version mit analog Ausgang. Bei der Typenbezeichnung gibt die 3. Stelle an ob es sich um die analog- oder Digitalversion handelt (1 = analog, 6 = digital). &lt;br /&gt;
Der TSic201 ist also analog, wärend der TSic206 ein digitaler ist.&lt;br /&gt;
&lt;br /&gt;
Links:&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/45573#347765 Ansatz zum Empfang der Daten]&lt;br /&gt;
* [http://ethersex.de/index.php/Zacwire Fertige Ansteuerung durch AVR in Ethersex]&lt;br /&gt;
* [http://www.zmd.biz/temp.php?group=temp&amp;amp;content=products Herstellerseite mit Datenblättern und FAQ]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/82087 Diskussion mit Beispielcode (MSP430, AVR, PIC)]&lt;br /&gt;
* [http://www.mikrocontroller.net/search?query=tsic* Suche in den Foren]&lt;br /&gt;
&lt;br /&gt;
=== SHT1x/SHT7x ===&lt;br /&gt;
&lt;br /&gt;
Der SHT1x/SHT7x (SHT10, SHT11, SHT15, STH71, SHT75) sind kombinierte Temperatur- und Feuchtesensoren von [http://www.sensirion.com Sensirion]. Sie unterscheiden sich in Bauform und Genauigkeit.&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* digitale Schnittstelle mit einfacher [[I²C]]-&#039;&#039;ähnlicher&#039;&#039; Ansteuerung&lt;br /&gt;
* keine Kalibrierung notwendig&lt;br /&gt;
* Beispielcode (C, MC51) auf der Sensirion-Seite verfügbar (relativ leicht portierbar)&lt;br /&gt;
* interne Heizelemente (Funktionsprüfung, &amp;quot;rauhe&amp;quot; Umgebung)&lt;br /&gt;
* Spannungsmonitor (&amp;quot;Battery fail&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Nachteile:&lt;br /&gt;
* kann nicht am [[I²C]] Bus betrieben werden, theoretisch gleiche Clockleitung möglich, fixe Adresse&lt;br /&gt;
* relativ teuer (Farnell 18,60&amp;amp;euro;)&lt;br /&gt;
&lt;br /&gt;
Es gibt jetzt einen Nachfolger SHT2x, der I²C-kompatibel ist.&lt;br /&gt;
&lt;br /&gt;
=== ADT7310 ===&lt;br /&gt;
&lt;br /&gt;
Der ADT7310 von [http://www.analog.com/en/sensors/digital-temperature-sensors/adt7310/products/product.html Analog Devices] besitzt eine Auflösung von 16 Bit und eine Genauigkeit von ±0.5°C im Bereich von −40°C bis +105°C.&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* Ansteuerung per [[SPI]]&lt;br /&gt;
* keine Kalibrierung notwendig&lt;br /&gt;
* hohe [[Auflösung und Genauigkeit]]&lt;br /&gt;
* programmierbarer [[Interrupt]]ausgang für Unter- und Übertemperatur&lt;br /&gt;
&lt;br /&gt;
Nachteile:&lt;br /&gt;
* zur Zeit noch schlecht erhältlich (z.B. bei Digikey für 4,39$)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Sensorik]]&lt;/div&gt;</summary>
		<author><name>Horha</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Diskussion:Royer_Converter&amp;diff=40353</id>
		<title>Diskussion:Royer Converter</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Diskussion:Royer_Converter&amp;diff=40353"/>
		<updated>2009-11-01T11:28:48Z</updated>

		<summary type="html">&lt;p&gt;Horha: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;quot;gt ??mA. ABER! Der Leerlaufstrom im Schwingkreis beträgt ???A! &amp;quot;&lt;br /&gt;
usw Ist das nur bei mir so oder sind einfach kaum Werte im Artikel?&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Der Artikel ist noch leicht im Betastadium. Die Exakten Zahlen + Bild folgen, wenn ich Zeit hab das mal aufzubauen und zu testen. ;-)&lt;br /&gt;
&lt;br /&gt;
MfG&lt;br /&gt;
Falk&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Okay, danke :)&lt;br /&gt;
----&lt;br /&gt;
Hallo,&lt;br /&gt;
&lt;br /&gt;
ich habe eine Verständnisfrage:&lt;br /&gt;
Wieso soll die Spannung in diesem Parallel-Resonanzkreis Up=  pi *V_in erreichen können? &lt;br /&gt;
Ich dachte, es gäbe nur eine Stromüberhöhung im Parallel-Resonanzkreis, die Spannung bliebe V_in.&lt;br /&gt;
http://de.wikipedia.org/wiki/Stromüberhöhung&lt;br /&gt;
Oder wirkt  (Lprim/2+L1)-(1/(1/C1+1/C2)) als Serien Resonanzkreis?&lt;br /&gt;
&lt;br /&gt;
Bei dem Link zu Epcos ( noch eine MOSFET-Variante, auch mit kleineren Fehlern im Text ) steht:&lt;br /&gt;
Speisespannung um ein Vielfaches übersteigen kann. Bei einer Eingangsspannung von 12 V können dabei Werte von bis zu 80 V auftreten..&lt;br /&gt;
&lt;br /&gt;
Gruß Horst&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Wieso soll die Spannung in diesem Parallel-Resonanzkreis Up=  pi *V_in erreichen können? &amp;quot;&lt;br /&gt;
&lt;br /&gt;
- Die Gleichspannung vor der Spule muss gleich sein dem Mittelwert der Spannung hinter der Spule (sonst würde an der Spule ein Gleichspannung anliegen, was ja nicht sein kann).&lt;br /&gt;
Das heißt also, der Mittelwert der Spannung Sinushalbkurve ist gleich der Betriebsspannung. Der Gleichrichtwert einer Sinusspannung ist 2/PI. Da es hier rückwärts geht, müsste die&lt;br /&gt;
Spitzenspannung nach der Spule Uspitze=Uein*PI/2 betragen.&lt;br /&gt;
- Durch die Mittelanzapfung verdoppelt sich die Spitzenspannung nochmals. Somit fällt der Faktor 1/2 raus: Uspitze=Uein*PI &lt;br /&gt;
&lt;br /&gt;
&amp;quot;Speisespannung um ein Vielfaches übersteigen kann. Bei einer Eingangsspannung von 12 V können dabei Werte von bis zu 80 V auftreten..&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Das ist einer der Fehler. 80V erreicht man nur als Spitze-Spitze-Spannung. Das muss nur der Kondensator  C2 aushalten.&lt;br /&gt;
&lt;br /&gt;
MfG&lt;br /&gt;
&lt;br /&gt;
Falk&lt;br /&gt;
----&lt;br /&gt;
Hallo,&lt;br /&gt;
&lt;br /&gt;
aha, also der Gleichrichtwert = Uein *2/pi  bringt pi ins Spiel.&lt;br /&gt;
Danke für die Aufklärung des Sachverhaltes.&lt;br /&gt;
&lt;br /&gt;
Gruß Horst&lt;/div&gt;</summary>
		<author><name>Horha</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Diskussion:Royer_Converter&amp;diff=40300</id>
		<title>Diskussion:Royer Converter</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Diskussion:Royer_Converter&amp;diff=40300"/>
		<updated>2009-10-31T13:15:41Z</updated>

		<summary type="html">&lt;p&gt;Horha: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;quot;gt ??mA. ABER! Der Leerlaufstrom im Schwingkreis beträgt ???A! &amp;quot;&lt;br /&gt;
usw Ist das nur bei mir so oder sind einfach kaum Werte im Artikel?&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Der Artikel ist noch leicht im Betastadium. Die Exakten Zahlen + Bild folgen, wenn ich Zeit hab das mal aufzubauen und zu testen. ;-)&lt;br /&gt;
&lt;br /&gt;
MfG&lt;br /&gt;
Falk&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Okay, danke :)&lt;br /&gt;
----&lt;br /&gt;
Hallo,&lt;br /&gt;
&lt;br /&gt;
ich habe eine Verständnisfrage:&lt;br /&gt;
Wieso soll die Spannung in diesem Parallel-Resonanzkreis Up=  pi *V_in erreichen können? &lt;br /&gt;
Ich dachte, es gäbe nur eine Stromüberhöhung im Parallel-Resonanzkreis, die Spannung bliebe V_in.&lt;br /&gt;
http://de.wikipedia.org/wiki/Stromüberhöhung&lt;br /&gt;
Oder wirkt  (Lprim/2+L1)-(1/(1/C1+1/C2)) als Serien Resonanzkreis?&lt;br /&gt;
&lt;br /&gt;
Bei dem Link zu Epcos ( noch eine MOSFET-Variante, auch mit kleineren Fehlern im Text ) steht:&lt;br /&gt;
Speisespannung um ein Vielfaches übersteigen kann. Bei einer Eingangsspannung von 12 V können dabei Werte von bis zu 80 V auftreten..&lt;br /&gt;
&lt;br /&gt;
Gruß Horst&lt;/div&gt;</summary>
		<author><name>Horha</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Diskussion:Uhr&amp;diff=39244</id>
		<title>Diskussion:Uhr</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Diskussion:Uhr&amp;diff=39244"/>
		<updated>2009-09-22T09:59:29Z</updated>

		<summary type="html">&lt;p&gt;Horha: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[[Benutzer:Sternst|Sternst]] 19:33, 11. Sep. 2009 (CEST)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Ich möchte ja nicht unbedingt den Miesmacher spielen, aber der Code ist nicht gerade ein Musterbeispiel. Vielleicht hättest du ihn vor Veröffentlichung als Artikel mal im Forum zur Diskussion stellen sollen.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;1)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
switch (Hunderter)&lt;br /&gt;
//Hier wird der jeweilige Zahlenwert in PORTB geschrieben&lt;br /&gt;
{&lt;br /&gt;
	case 0:		PORTB=Zahl[0];break;&lt;br /&gt;
	case 1:		PORTB=Zahl[1];break;		&lt;br /&gt;
	case 2:		PORTB=Zahl[2];break;&lt;br /&gt;
	case 3:		PORTB=Zahl[3];break;&lt;br /&gt;
	case 4:		PORTB=Zahl[4];break;&lt;br /&gt;
	case 5:		PORTB=Zahl[5];break;&lt;br /&gt;
	case 6:		PORTB=Zahl[6];break;&lt;br /&gt;
	case 7:		PORTB=Zahl[7];break;&lt;br /&gt;
	case 8:		PORTB=Zahl[8];break;&lt;br /&gt;
	case 9:		PORTB=Zahl[9];break;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Soll das etwa irgendeinen Vorteil gegenüber einem simplen&amp;lt;c&amp;gt;PORTB = Zahl[Hunderter];&amp;lt;/c&amp;gt;haben?&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;2)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;c&amp;gt;OCR1A  = 31250;  	//genau eine Sekunde (8000000Hz / 256 / 31250 = 1); &amp;lt;/c&amp;gt;&lt;br /&gt;
Für genau eine Sekunde im CTC-Modus müsste man 31250 - 1 (also 31249) ins Register laden.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;3)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;c&amp;gt;TCCR1B = 0b00001100;&amp;lt;/c&amp;gt;&lt;br /&gt;
Warum benutzt du nicht wie üblich die symbolischen Namen? Diese Zahlenkonstanten erschweren nur unnötig das Portieren auf einen anderen Controller.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;4)&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Etwas mehr Sorgfalt beim Formatieren (Einrückungen) wäre auch nicht schlecht.&lt;br /&gt;
----&lt;br /&gt;
1 und 2: das ist gut, korrigier ich sofort.&lt;br /&gt;
3: Ich finde die 0bxxxxxxxx Schreibweise übersichtlicher, ich denke das ist Geschmackssache.&lt;br /&gt;
4: Die Einrückungen hab ich im Code ja auch richtig, aber hier im Wiki ist das etwas komisch &amp;lt;br&amp;gt;&lt;br /&gt;
Danke nochmal für die Anregungen. Sind jetztf umgesetzt. Die Version mit den Defines hab ich rausgenommen, macht ja nun wirklich keinen Sinn.&lt;br /&gt;
&lt;br /&gt;
== Sekunden ist nicht ISR-sicher ==&lt;br /&gt;
&lt;br /&gt;
So wie das Programm momentan aufgebaut ist müsste auf &amp;quot;Sekunden&amp;quot; atomar zugegriffen werden. Ansonsten hat x bei&lt;br /&gt;
 x = Sekunden;&lt;br /&gt;
u.U keinen sinnvollen Wert! Dito für die Ausdrücke im Programm. (zumindest wenn long int nicht in einer Maschineninstruktion gelesen oder geschrieben werden kann.)&lt;br /&gt;
&lt;br /&gt;
Zudem ist es wesentlich einfacher (und in dieser ISR absolut unkritisch) die Sekunden bei 60 überlaufen zu lassen und dabei die Minuten um 1 zu erhöhen; die Minuten bei 60 überlaufen zu lassen und dabei die Stunden um 1 zu erhöhen; etc. --[[Benutzer:Gjlayde|Gjlayde]] 19:54, 20. Sep. 2009 (CEST)&lt;br /&gt;
&lt;br /&gt;
=== Etwa so ===&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
//32Bit Variable; 24Bit würdens auch tun&lt;br /&gt;
volatile long int Sekunden=86399;&lt;br /&gt;
unsigned char Tausender;&lt;br /&gt;
unsigned char Hunderter;&lt;br /&gt;
unsigned char Zehner;&lt;br /&gt;
unsigned char Einer;&lt;br /&gt;
unsigned char sek;&lt;br /&gt;
 &lt;br /&gt;
//Bei Compare-Match mit OCR1A (31249) wird Sekunden um eins erhöht.&lt;br /&gt;
ISR(TIMER1_COMPA_vect)&lt;br /&gt;
{&lt;br /&gt;
    Sekunden++;&lt;br /&gt;
&lt;br /&gt;
    if (++sek &amp;gt;= 60)&lt;br /&gt;
    {&lt;br /&gt;
        sek = 0;&lt;br /&gt;
        if (++Einer &amp;gt;= 10)&lt;br /&gt;
        {&lt;br /&gt;
            Einer = 0;&lt;br /&gt;
	    if (++Zehner &amp;gt;= 6 )&lt;br /&gt;
            {&lt;br /&gt;
                Zehner = 0;&lt;br /&gt;
	        Hunderter++;&lt;br /&gt;
                if ((Tausender &amp;gt;= 2) &amp;amp;&amp;amp; (Hunderter == 4))&lt;br /&gt;
                {&lt;br /&gt;
                    Sekunden = 0;&lt;br /&gt;
	            Tausender = 0;&lt;br /&gt;
	            Hunderter = 0;&lt;br /&gt;
                }&lt;br /&gt;
                else &lt;br /&gt;
                    if (Hunderter &amp;gt;= 10)&lt;br /&gt;
	            {&lt;br /&gt;
                        Hunderter = 0;&lt;br /&gt;
	                Tausender++;&lt;br /&gt;
                    }&lt;br /&gt;
            }  &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit dauert ein ISR Aufruf zwischen 50 und maximal 100 Takten (23:59:59)&lt;br /&gt;
Aber das Problem der ISR-Sicherheit bleibt.&lt;br /&gt;
Auch hier kann sich alles durch einen Interrupt während der Abfrage ändern.&lt;br /&gt;
Wie löst man das clever? ISR vor Abfrage mit CLI abschhalten, alle Daten kopieren und wieder einschalten mitttels SEI. Wird der mögliche Compare-Match mit OCR1A-Interrupt dann nachgeholt? Steht sicher in den PDF&#039;s&lt;br /&gt;
&lt;br /&gt;
: Ja, die ISR wird dann nachgeholt. --[[Benutzer:Gjlayde|Gjlayde]] 18:35, 21. Sep. 2009 (CEST)&lt;br /&gt;
&lt;br /&gt;
: Wenn ich am Wochenende Zeit hab, werde ich das mal ausprobieren zu integrieren. [[Benutzer:Inox5|Inox5]] 19:17, 21. Sep. 2009 (CEST)&lt;br /&gt;
&lt;br /&gt;
:: Es genügt, in der ISR ein Flag zu setzen, daß eine neue Sekunde angefangen hat. Alles andere kann in der (möglichst blockierfreien) Hauptschleife abgehandelt werden. Aber auch dort ist dieses hochzählen einfacher als Division+Modulo. --[[Benutzer:Gjlayde|Gjlayde]] 20:42, 21. Sep. 2009 (CEST)&lt;br /&gt;
:::Statt eines Flags vielleicht zur Sicherheit einen Zähler?&lt;br /&gt;
&amp;lt;c&amp;gt;unsigned char Tausender;&lt;br /&gt;
unsigned char Hunderter;&lt;br /&gt;
unsigned char Zehner;&lt;br /&gt;
unsigned char Einer;&lt;br /&gt;
unsigned char sek;&lt;br /&gt;
volatile unsigned char DeltaSek;&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect)			       //Bei Compare-Match mit OCR1A (31249) wird Sekunden um eins erhöht.&lt;br /&gt;
{DeltaSek++;}&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
void Berechnung (void)			      &lt;br /&gt;
{unsigned char temp;&lt;br /&gt;
 cli();&lt;br /&gt;
 temp = DeltaSek;   // deltaSek retten&lt;br /&gt;
 DeltaSek = 0;      // und direkt löschen   &lt;br /&gt;
 sei();&lt;br /&gt;
&lt;br /&gt;
 while (temp &amp;gt; 0 )&lt;br /&gt;
   {sek++;&lt;br /&gt;
    if (sek &amp;gt;= 60 )&lt;br /&gt;
      {sek = 0;&lt;br /&gt;
      Einer++;&lt;br /&gt;
      if ( Einer &amp;gt;= 10 )&lt;br /&gt;
        {Einer = 0;&lt;br /&gt;
         Zehner++;&lt;br /&gt;
	 if ( Zehner &amp;gt;= 6 )&lt;br /&gt;
           {Zehner = 0;&lt;br /&gt;
	    Hunderter++;&lt;br /&gt;
            if ((Hunderter == 4)&amp;amp;&amp;amp;(Tausender &amp;gt;= 2))&lt;br /&gt;
              {Tausender = 0;&lt;br /&gt;
	       Hunderter = 0;}&lt;br /&gt;
            else &lt;br /&gt;
              if ( Hunderter &amp;gt;= 10 )&lt;br /&gt;
	        {Hunderter = 0;&lt;br /&gt;
	        Tausender++;}&lt;br /&gt;
           }// Zehner&lt;br /&gt;
        }//if Einer&lt;br /&gt;
     }// if sek&lt;br /&gt;
   temp--;&lt;br /&gt;
   }//while&lt;br /&gt;
}&amp;lt;/c&amp;gt;&lt;br /&gt;
--[[Benutzer:Horha|Horha]] 11:59, 22. Sep. 2009 (CEST)&lt;/div&gt;</summary>
		<author><name>Horha</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Diskussion:Uhr&amp;diff=39190</id>
		<title>Diskussion:Uhr</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Diskussion:Uhr&amp;diff=39190"/>
		<updated>2009-09-21T14:34:00Z</updated>

		<summary type="html">&lt;p&gt;Horha: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[[Benutzer:Sternst|Sternst]] 19:33, 11. Sep. 2009 (CEST)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Ich möchte ja nicht unbedingt den Miesmacher spielen, aber der Code ist nicht gerade ein Musterbeispiel. Vielleicht hättest du ihn vor Veröffentlichung als Artikel mal im Forum zur Diskussion stellen sollen.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;1)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;c&amp;gt;	switch (Hunderter)								//Hier wird der jeweilige Zahlenwert in PORTB geschrieben&lt;br /&gt;
		{&lt;br /&gt;
		case 0:		PORTB=Zahl[0];break;&lt;br /&gt;
		case 1:		PORTB=Zahl[1];break;		&lt;br /&gt;
		case 2:		PORTB=Zahl[2];break;&lt;br /&gt;
		case 3:		PORTB=Zahl[3];break;&lt;br /&gt;
		case 4:		PORTB=Zahl[4];break;&lt;br /&gt;
		case 5:		PORTB=Zahl[5];break;&lt;br /&gt;
		case 6:		PORTB=Zahl[6];break;&lt;br /&gt;
		case 7:		PORTB=Zahl[7];break;&lt;br /&gt;
		case 8:		PORTB=Zahl[8];break;&lt;br /&gt;
		case 9:		PORTB=Zahl[9];break;&lt;br /&gt;
		}&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Soll das etwa irgendeinen Vorteil gegenüber einem simplen&amp;lt;c&amp;gt;PORTB = Zahl[Hunderter];&amp;lt;/c&amp;gt;haben?&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;2)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;c&amp;gt;OCR1A  = 31250;  	//genau eine Sekunde (8000000Hz / 256 / 31250 = 1); &amp;lt;/c&amp;gt;&lt;br /&gt;
Für genau eine Sekunde im CTC-Modus müsste man 31250 - 1 (also 31249) ins Register laden.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;3)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;c&amp;gt;TCCR1B = 0b00001100;&amp;lt;/c&amp;gt;&lt;br /&gt;
Warum benutzt du nicht wie üblich die symbolischen Namen? Diese Zahlenkonstanten erschweren nur unnötig das Portieren auf einen anderen Controller.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;4)&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Etwas mehr Sorgfalt beim Formatieren (Einrückungen) wäre auch nicht schlecht.&lt;br /&gt;
----&lt;br /&gt;
1 und 2: das ist gut, korrigier ich sofort.&lt;br /&gt;
3: Ich finde die 0bxxxxxxxx Schreibweise übersichtlicher, ich denke das ist Geschmackssache.&lt;br /&gt;
4: Die Einrückungen hab ich im Code ja auch richtig, aber hier im Wiki ist das etwas komisch &amp;lt;br&amp;gt;&lt;br /&gt;
Danke nochmal für die Anregungen. Sind jetztf umgesetzt. Die Version mit den Defines hab ich rausgenommen, macht ja nun wirklich keinen Sinn.&lt;br /&gt;
&lt;br /&gt;
== Sekunden ist nicht ISR-sicher ==&lt;br /&gt;
&lt;br /&gt;
So wie das Programm momentan aufgebaut ist müsste auf &amp;quot;Sekunden&amp;quot; atomar zugegriffen werden. Ansonsten hat x bei&lt;br /&gt;
 x = Sekunden;&lt;br /&gt;
u.U keinen sinnvollen Wert! Dito für die Ausdrücke im Programm. (zumindest wenn long int nicht in einer Maschineninstruktion gelesen oder geschrieben werden kann.)&lt;br /&gt;
&lt;br /&gt;
Zudem ist es wesentlich einfacher (und in dieser ISR absolut unkritisch) die Sekunden bei 60 überlaufen zu lassen und dabei die Minuten um 1 zu erhöhen; die Minuten bei 60 überlaufen zu lassen und dabei die Stunden um 1 zu erhöhen; etc. --[[Benutzer:Gjlayde|Gjlayde]] 19:54, 20. Sep. 2009 (CEST)&lt;br /&gt;
&lt;br /&gt;
== Etwa so ==&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
volatile long int Sekunden=86399;	        //32Bit Variable; 24Bit würdens auch tun&lt;br /&gt;
unsigned char Tausender;&lt;br /&gt;
unsigned char Hunderter;&lt;br /&gt;
unsigned char Zehner;&lt;br /&gt;
unsigned char Einer;&lt;br /&gt;
unsigned char sek;&lt;br /&gt;
 &lt;br /&gt;
ISR(TIMER1_COMPA_vect)			       //Bei Compare-Match mit OCR1A (31249) wird Sekunden um eins erhöht.&lt;br /&gt;
{&lt;br /&gt;
Sekunden++;&lt;br /&gt;
sek++;&lt;br /&gt;
if (sek &amp;gt;= 60 )&lt;br /&gt;
  {sek = 0;&lt;br /&gt;
  Einer++;&lt;br /&gt;
  if ( Einer &amp;gt;= 10 )&lt;br /&gt;
    {Einer = 0;&lt;br /&gt;
	 Zehner++;&lt;br /&gt;
	 if ( Zehner &amp;gt;= 6 )&lt;br /&gt;
       {Zehner = 0;&lt;br /&gt;
	   Hunderter++;&lt;br /&gt;
       if ((Tausender &amp;gt;= 2)&amp;amp;&amp;amp;(Hunderter == 4))&lt;br /&gt;
         {Sekunden = 0;&lt;br /&gt;
	      Tausender = 0;&lt;br /&gt;
	      Hunderter = 0;}&lt;br /&gt;
       else &lt;br /&gt;
         if ( Hunderter &amp;gt;= 10 )&lt;br /&gt;
	       {Hunderter = 0;&lt;br /&gt;
	       Tausender++;}&lt;br /&gt;
         }  &lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
}&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit dauert ein ISR Aufruf zwischen 50 und maximal 100 Takten (23:59:59)&lt;br /&gt;
Aber das Problem der ISR-Sicherheit bleibt.&lt;br /&gt;
Auch hier kann sich alles durch einen Interrupt während der Abfrage ändern.&lt;br /&gt;
Wie löst man das clever? ISR vor Abfrage mit CLI abschhalten, alle Daten kopieren und wieder einschalten mitttels SEI. Wird der mögliche Compare-Match mit OCR1A-Interrupt dann nachgeholt? Steht sicher in den PDF&#039;s&lt;/div&gt;</summary>
		<author><name>Horha</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=CAN&amp;diff=38991</id>
		<title>CAN</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=CAN&amp;diff=38991"/>
		<updated>2009-09-12T12:57:42Z</updated>

		<summary type="html">&lt;p&gt;Horha: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Eine ausführliche Liste: http://www.mjschofield.com/devices.htm&lt;br /&gt;
&lt;br /&gt;
==Mikrocontroller mit CAN==&lt;br /&gt;
&lt;br /&gt;
=== Atmel AT90CAN128===&lt;br /&gt;
* Atmel AVR Controller mit CAN-Schnittstelle (ein Kanal) &lt;br /&gt;
* 15 CAN &amp;quot;Message Objects&amp;quot;, jedes individuell konfigurierbar.&lt;br /&gt;
* 128kByte Flash, 4kByte RAM&lt;br /&gt;
* Bis auf die CAN-Funktionen weitestgehend identisch mit dem ATmega128 (vgl. Migration-Guide ATmega128-&amp;gt;AT90CAN128 bei atmel.com)&lt;br /&gt;
* Beispielcode inkl. CAN für den IAR-C-Compiler findet sich bei atmel.com. Autobaud-Routinen in Assembler (etwas Aufwand bei der Portierung nach avr-gcc/avr-as).&lt;br /&gt;
* Für die ISP-Programmierung schliesst man Ihn wie den ATmega128 an. MOSI-2 ; MISO-3 ; SCK-11 ; /Reset-20 ;  GND-22,53,63 ; Vcc-21,52,(62),(64). Auf die übliche &amp;quot;ATmega64/128-Problematik&amp;quot; achten: MISO/MOSI der Programmierschnittstelle sind nicht identisch mit der SPI-Schnittstelle.&lt;br /&gt;
* Im Auslieferungszustand ist nur der interne RC-Oszillator aktiv (wie üblich bei allen modernen AVRs mit internem R/C-Oszillator vgl. [[AVR Checkliste]]). Umschalten auf externe Taktquelle über die AVR-Fusebits.&lt;br /&gt;
* Dieser MC ist für nicht-gewerbliche Endanwender einzeln z.B. bei Reichelt, CSD und Segor erhältlich (ca. 9EUR). Beim Bestellen des MC sollte man einen CAN-BUS-Treiber gleich mitbestellen: z.B. Philips PCA82C250. Jedoch auf vorhandene Versorgungsspannungen achten (AT90CAN128 &amp;quot;kann mit&amp;quot; VCC=2,7...5,5V, PCA82C250 lt. Datenblatt für VCC=4,5...5V).&lt;br /&gt;
* die aktuelle Hardware-Version (Stand 4/2005) hat einen &amp;quot;silicon bug&amp;quot; (Hardwarefehler, vgl. avrfreaks-Forum): Liegt der Stack im &#039;&#039;externen&#039;&#039; RAM, führt dies zu Fehlern in der Stackverwaltung (push/pop/rcall etc.). Details in aktuellen Fassungen des Datenblatts. Abhilfe/Workaround: Stack im internen RAM (&amp;lt;0x1001) verwalten. Dies ist ohnehin sinnvoll, da der Stackzugriff dann schneller ist. &lt;br /&gt;
* CANopen software protocol stacks at http://www.port.de/Atmel.html&lt;br /&gt;
* Freier CANopen stack: http://www.canfestival.org/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- *Als Programmieradapter braucht man einen, der eine gewisse Intelligenz beinhaltet. Vergebens waren auch bei mir die Versuche,   mit dem &#039;Kanda&#039;-Dongle vom STK200-Board und ähnliche Nachbauten.  -&amp;gt; www.mikrocontroller-projekte.de [- Einzeltest mit Stickprobenumfang 1 - sollte schon funktionieren, auskommentiert bis nochmals belegt - mt] --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Atmel AT91SAM7X, AT91SAM7A ===&lt;br /&gt;
* ARM7TDMI-Kern&lt;br /&gt;
&lt;br /&gt;
=== Luminary Micro Stellaris LM3S8xxx ===&lt;br /&gt;
* ARM Cortex-M3&lt;br /&gt;
* bis 64kByte RAM und 256kByte Flash&lt;br /&gt;
* CAN und Ethernet&lt;br /&gt;
&lt;br /&gt;
=== Microchip PIC18Fxx8 PIC18Fxx8x ===&lt;br /&gt;
* Mikrocontroller mit CAN Schnittstelle&lt;br /&gt;
* [http://www.microchip.com/ParamChartSearch/chart.aspx?branchID=50&amp;amp;mid=10&amp;amp;lang=en&amp;amp;pageId=74 Herstellerseite]&lt;br /&gt;
&lt;br /&gt;
=== Mitsubishi / Renesas R8C / M16C / M32C ===&lt;br /&gt;
&lt;br /&gt;
R8C/23, M16C/6Nx&lt;br /&gt;
&lt;br /&gt;
=== Motorola / Freescale DSP56F8xx ===&lt;br /&gt;
* Clock des CAN-Moduls von PLL speisen, nicht von XTAL, sonst gibt es sporadische Aussetzer&lt;br /&gt;
* Bei hohen Datenraten ist es notwendig die CAN-TX-Leitung vom Controller mit einem PullUp-Widerstand zu beschalten. Sonst stimmt das Bit-Timing nicht, weil die Anstiegszeit des TX-Signals zu schlecht ist.&lt;br /&gt;
&lt;br /&gt;
=== Freescale MC9S08 ===&lt;br /&gt;
* D Serie&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Freescale MC9S12 ===&lt;br /&gt;
* B, C, D und H Serie&lt;br /&gt;
&lt;br /&gt;
=== NXP (ex. Philips) LPC2129 LPC2194 LPC2290 LPC2292 LPC2294 ===&lt;br /&gt;
* Mikrocontroller mit ARM7TDMI-S-Kern (vgl. [[LPC2000 Philips ARM7TDMI-Familie]])&lt;br /&gt;
* 2 - 4 CAN Schnittstellen&lt;br /&gt;
* CAN-Modul angelehnt an Philips SJA1000 (aber mit recht langer und deftig gewürzter Bug-Liste)&lt;br /&gt;
* Herstellerseite: [http://www.nxp.com Philips Semiconductors]&lt;br /&gt;
* LPC2194 erhältlich bei http://www.microcontroller-starterkits.de und http://de.digikey.com/&lt;br /&gt;
* CANopen software protocol stacks at [http://www.port.de/Philips.html]&lt;br /&gt;
&lt;br /&gt;
=== NXP LPC23xx ===&lt;br /&gt;
* Mikrocontroller mit ARM7TDMI-S-Kern (vgl. [[LPC2000 Philips ARM7TDMI-Familie]])&lt;br /&gt;
* 2 CAN Schnittstellen&lt;br /&gt;
&lt;br /&gt;
=== NXP P80C591 P80C592 P80C598 ===&lt;br /&gt;
* 8-Bit Mikrocontroller mit 8051-Kern&lt;br /&gt;
* P80C591 ist neuer und beherrscht CAN2.0B&lt;br /&gt;
* P80C592: CAN2.0A, P80C598 ist die Automotive-Version vom &#039;592&lt;br /&gt;
&lt;br /&gt;
=== STMicroelectronics STM8S20  ===&lt;br /&gt;
* STM8 Kern [http://www.st.com/stonline/products/literature/ds/14733/stm8s208c6.pdf] DIV/MUL -Befehle &lt;br /&gt;
* SPI mit automatischer CRC Berechnung&lt;br /&gt;
* 1 beCAN Schnittstelle CAN2.0B &lt;br /&gt;
* sehr preiswert (128 kFlash/6K RAM ) 3,30 bis 4,80 &amp;amp;#8364; ([http://search.digikey.com/scripts/DkSearch/dksus.dll?vendor=0&amp;amp;keywords=CAN+STM8]  aber SMD LQFP &lt;br /&gt;
&lt;br /&gt;
=== STMicroelectronics STR730 STR750 ===&lt;br /&gt;
* ARM7TDMI-Kern&lt;br /&gt;
* 1-3 CAN Schnittstellen&lt;br /&gt;
&lt;br /&gt;
=== STMicroelectronics STR910FM32, STR910FW32, STR911FM42, STR911FM44, STR912FW42, STR912FW44 ===&lt;br /&gt;
* 96MHz ARM966E-S CPU Kern&lt;br /&gt;
&lt;br /&gt;
=== TI TMS470 ===&lt;br /&gt;
* ARM7TDMI-Kern&lt;br /&gt;
&lt;br /&gt;
==CAN Controller==&lt;br /&gt;
&lt;br /&gt;
===MCP2515 ===&lt;br /&gt;
&amp;quot;Stand-alone&amp;quot; CAN-Controller von Microchip. &lt;br /&gt;
* SPI Schnittstelle&lt;br /&gt;
* 2 Empfangs- und 3 Sendepuffer jeweils individuell konfigurierbar (ID, Masken/Filter etc.)&lt;br /&gt;
* ein gemeinsamer Interruptpin (RX)&lt;br /&gt;
* ein Interruptpin pro Empfangspuffer, umkonfigurierbar als GPO&lt;br /&gt;
* ein Triggerpin pro Sendepuffer, umkonfigurierbar als GPI&lt;br /&gt;
* Stromsparmodus&lt;br /&gt;
* auch für 3,3V-Betrieb geeignet.&lt;br /&gt;
* Diverse C- und Assembler Beispielcodes verfügbar (z.B. bei microchip.com und kvaser, Assembler meist für PICs). Auch Software für Direktanschluss an die parallele Schnittstelle eines PC verfügbar (&amp;quot;bit-bang Interface&amp;quot;).&lt;br /&gt;
* erhältlich z.B. bei Reichelt (ca. 2&amp;amp;#8364;)&lt;br /&gt;
&lt;br /&gt;
====Links====&lt;br /&gt;
*[http://www.kreatives-chaos.com/index.php?seite=mcp2515 Ansteuerung eines MCP2515] gcc&lt;br /&gt;
*[http://www.intrepidcs.com/BitCindex.htm Bit Timing Calculator]&lt;br /&gt;
*[http://mcp2510btc.berlios.de/ Bit Timing Calculator für Linux]&lt;br /&gt;
&lt;br /&gt;
===SJA1000===&lt;br /&gt;
&amp;quot;Stand-alone&amp;quot; CAN-Controller von Philips&lt;br /&gt;
* Parallele Schnittstelle ca. 12 Leitungen&lt;br /&gt;
* erhältlich z.B. bei Reichelt (ca. 4 Euro)&lt;br /&gt;
&lt;br /&gt;
===AN82526===&lt;br /&gt;
&amp;quot;Stand-alone&amp;quot; CAN-Controller von Intel (entwickelt von Bosch)&lt;br /&gt;
* Vorgänger des AN82527&lt;br /&gt;
&lt;br /&gt;
===AN82527===&lt;br /&gt;
&amp;quot;Stand-alone&amp;quot; CAN-Controller von Intel (entwickelt von Bosch)&lt;br /&gt;
* Nachfolger des AN82526&lt;br /&gt;
* parallele  UND  SPI-Schnittstelle&lt;br /&gt;
* 8- oder 16-Bit Multiplex Bus, oder 8-Bit Non-Multiplexed Bus&lt;br /&gt;
* 14 Tx/Rx Puffer&lt;br /&gt;
* bis zu 16 IO-Pins (je nach Controlleranbindung)&lt;br /&gt;
* erhältlich z.B. bei Reichelt (ca. 5&amp;amp;#8364;)&lt;br /&gt;
&lt;br /&gt;
===Bosch CC170 / CC750 / CC770===&lt;br /&gt;
* kompatibel zum AN82527&lt;br /&gt;
* mehr Debug-Register&lt;br /&gt;
* CC750 im SOIC16-W Gehäuse ohne Parallel-Interface, nur SPI&lt;br /&gt;
* erhältlich bei Rutronik (ca. 8 Euro)&lt;br /&gt;
&lt;br /&gt;
===SAE81C9x===&lt;br /&gt;
* SPI und Busanschluss möglich.&lt;br /&gt;
* PLCC44 und PLCC28, letzteres allerdings in ungebräuchlicher Bauform&lt;br /&gt;
* Nur CAN 2.0A, beherrscht also keine Extended IDs.&lt;br /&gt;
&lt;br /&gt;
==Bustreiber (CAN-Transceiver)==&lt;br /&gt;
&lt;br /&gt;
=== High-Speed ===&lt;br /&gt;
&lt;br /&gt;
====MCP2551====&lt;br /&gt;
* von Microchip&lt;br /&gt;
* PDIP8 und SOIC&lt;br /&gt;
* VCC = 4,5...5,5V&lt;br /&gt;
* kostet rund 1&amp;amp;#8364;&lt;br /&gt;
&lt;br /&gt;
====PCA 82C250====&lt;br /&gt;
* von NXP (ex. Philips)&lt;br /&gt;
* PDIP8 und SO8&lt;br /&gt;
* VCC = 4,5...5,5V&lt;br /&gt;
* V-CAN: -8V..+18V   -&amp;gt; &amp;quot;TTL-kompatible&amp;quot; Bus-Spannung&lt;br /&gt;
* erhältlich z.B. bei Reichelt (ca. 1,50&amp;amp;#8364;)&lt;br /&gt;
&lt;br /&gt;
====PCA 82C251====&lt;br /&gt;
* von NXP (ex. Philips)&lt;br /&gt;
* PDIP8 und SO8&lt;br /&gt;
* VCC = 4,5...5,5V&lt;br /&gt;
* V-CAN: -40V..+40V   -&amp;gt; +24V Bus-Spannung&lt;br /&gt;
* erhältlich z.B. bei Reichelt (ca. 1,50&amp;amp;#8364;)&lt;br /&gt;
&lt;br /&gt;
====TJA 1050====&lt;br /&gt;
* von NXP (ex. Philips)&lt;br /&gt;
* SO8, pinkompatibel&lt;br /&gt;
* VCC = 4,75...5,25V&lt;br /&gt;
* 3. Generation, Nachfolger der PCA82C25x&lt;br /&gt;
* http://www.semiconductors.philips.com/pip/TJA1050&lt;br /&gt;
&lt;br /&gt;
====ATA6660====&lt;br /&gt;
* von Atmel&lt;br /&gt;
* SO8&lt;br /&gt;
* VCC = 4,75...5,25V&lt;br /&gt;
&lt;br /&gt;
====SN65HVD23x====&lt;br /&gt;
* von Texas Instruments&lt;br /&gt;
* SO8&lt;br /&gt;
* VCC = 3,0V...3,6V&lt;br /&gt;
* erhältlich z.B. bei Reichelt (SN65HVD230, SN65HVD231)&lt;br /&gt;
&lt;br /&gt;
=== Fault-Tolerant / Low-Speed ===&lt;br /&gt;
&lt;br /&gt;
==== TJA1054 ====&lt;br /&gt;
* von NXP (ex. Philips)&lt;br /&gt;
* bis 125 &amp;quot;kBaud&amp;quot;&lt;br /&gt;
* SO14&lt;br /&gt;
* ähnliche Funktionen, gleicher Hersteller: TJA1053, TJA1055&lt;br /&gt;
&lt;br /&gt;
== CAN Repeater ==&lt;br /&gt;
&lt;br /&gt;
==== AMIS-42700 ====&lt;br /&gt;
* Dual High-Speed CAN Transceiver&lt;br /&gt;
* High speed (up to 1Mbit/s)&lt;br /&gt;
* SOIC-20&lt;br /&gt;
* vgl. http://www.mikrocontroller.net/topic/53799&lt;br /&gt;
&lt;br /&gt;
==== Alternative ====&lt;br /&gt;
* zwei Transceiver&lt;br /&gt;
* [http://www.mikrocontroller.net/attachment/9353/CANREPEATER.JPG Schaltung]&lt;br /&gt;
* Anmerkung: Diese Schaltung ist Quatsch und funktioniert nicht.&lt;br /&gt;
* -Zum Senden eines Zeichen, muss beim CAN paralell auf dem Bus gelesen werden.&lt;br /&gt;
  -Die TRansceiver tun dies nicht, mach nur der Controller.&lt;br /&gt;
  -Die gelesene Nachricht muss also durch einen Controller erneut gesendet werden, wenn der Bus frei ist...&lt;br /&gt;
&lt;br /&gt;
==== CAN Hub ====&lt;br /&gt;
CAN Hub mit standard Knoten&lt;br /&gt;
* http://www.oschmid.ch/mt/can-hub/can-hub.php&lt;br /&gt;
CAN Hub mit getrennten Rx und Tx Leitungen&lt;br /&gt;
* http://www.oschmid.ch/mt/can-hub4/can-hub4.php&lt;br /&gt;
&lt;br /&gt;
==SLIO-CAN==&lt;br /&gt;
&lt;br /&gt;
Preisgünstigste Bausteine sind die Serial Linked I/O Bausteine (SLIO). Diese Bausteine ermöglichen den Aufbau von Ein- und Ausgabeknoten ohne lokalen Prozessor. Auf der Basis dieser Bausteine lässt sich eine dezentrale Signal-Ein-Ausgabe mit minimalem Kostenaufwand realisieren.&lt;br /&gt;
&lt;br /&gt;
=== Philips P82C150===&lt;br /&gt;
* Single-Chip-I/O-Einheit mit integriertem CAN-Controller&lt;br /&gt;
* mögliche Busdatenrate 20kBd bis 125kBd&lt;br /&gt;
* interner RC-Oszillator wird durch den Bitstrom auf den Bus synchronisiert&lt;br /&gt;
* Kalibrierungsnachricht alle 8000 Bitzeiten erforderlich&lt;br /&gt;
** 4-Bit des Identifiers über Port-Pins einstellbar &lt;br /&gt;
* maximal 16 P82C150 in einem CAN-Segment&lt;br /&gt;
** 16 Port-Pins mit unterschiedlichen Konfigurationsmöglichkeiten&lt;br /&gt;
*** 16 mal als digitale Eingänge&lt;br /&gt;
*** 16 mal als digitale Ausgänge&lt;br /&gt;
*** 2 mal als analoger Ausgang ( 10-Bit, DPM )&lt;br /&gt;
*** 6 mal als analoger Eingang ( 10-Bit, multiplex )&lt;br /&gt;
*** 2 mal als Komparator &lt;br /&gt;
&lt;br /&gt;
* [http://www.htw-dresden.de/fe/labor/mikror/projects/slio_can/ slio-CAN]&lt;br /&gt;
&lt;br /&gt;
Anmerkung: Philips stellt die SLIO nicht mehr her! Es ist auch &amp;quot;nichts&amp;quot; mehr am Markt beschaffbar, wenn, dann zu horrenden Preisen (um die 60,-EUR/Stück zur Zeit). --[[Benutzer:OldBug|Patrick]] 09:08, 25. Jan 2005 (CET)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;obsolete&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===DS 36001M===&lt;br /&gt;
&#039;&#039;&#039;Obsolete&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===MCP2502X/5X===&lt;br /&gt;
[http://ww1.microchip.com/downloads/en/devicedoc/21664c.pdf Datenblatt]&lt;br /&gt;
&lt;br /&gt;
== Verkabelung ==&lt;br /&gt;
* auf beidseitige Busterminierung achten (typisch 2x 124 Ohm bei &amp;quot;high-speed&amp;quot;)&lt;br /&gt;
* Standardbelegung für diverse Steckverbindungen vgl. CANOpen-Dokumentation http://www.can-cia.de/index.php?id=440 (CiA 303-1);  erfordert Anmeldung&lt;br /&gt;
* Schaltplan für galvanische Trennung z.B. nach Datenblatt des PCA82C250&lt;br /&gt;
* für einfache Testaufbauten über sehr kurze Strecken oder &amp;quot;on-board-CAN&amp;quot; kann auf die Bustreiber verzichtet werden (vgl. Siemens Application-Note [http://www.mikrocontroller.net/attachment/28831/siemens_AP2921.pdf AP2921])&lt;br /&gt;
&lt;br /&gt;
Es gibt auch CAN mit &lt;br /&gt;
* einpoliger unsymmetrischer Verbindung (SAE J2411 single wire)&lt;br /&gt;
* optischer Verbindung (Faser, Glasfaser)&lt;br /&gt;
&lt;br /&gt;
Für einfache Tests genügt auch eine direkte wired-and-Verbindung ohne Treiber:&lt;br /&gt;
http://www.mikrocontroller.net/forum/read-1-325202.html?reload=yes#325962&lt;br /&gt;
&lt;br /&gt;
== Debugging ==&lt;br /&gt;
Hersteller von Debug-Geräten&lt;br /&gt;
* Vector-Informatik CANscope (Pegeltester) http://www.vector-informatik.de/deutsch/  - ca. 3300EUR&lt;br /&gt;
* Gemac CBT (CanBusTester) testet auch Pegel, Reflexionen ... (Treiber etc. etwas ältlich, von 2002, was ist mit Weiterentwicklung?), auch leihweise http://www.gemac-chemnitz.de/pages/d_html/produkte/bus-tester/new-de-can-bust.html http://www.brandt-data.de/canbus/can_intro.html  - ca. 2400EUR&lt;br /&gt;
* ixxat bietet ebenfalls den Gemac-cbt an, auch leihweise&lt;br /&gt;
&lt;br /&gt;
Oszilloskope mit CAN-Analyse (manche auch SPI, LIN, RS232, SATA ...):&lt;br /&gt;
* LeCroy WaveRunner 6040 wird mit Vector-CANcaseXL (externer CAN-Trigger) geliefert (sehr gut, ab ca.9000 EUR)&lt;br /&gt;
* LeCroy WaveSurfer 424 wird mit Vector-CANcaseXL (externer CAN-Trigger) geliefert (sehr gut, ab ca.8000 EUR)&lt;br /&gt;
* Yokogawa DL1640 und DL9040 (CAN-Trigger ist intern)  ähnliche Preise wie LeCroy, Bedienung gewöhnungsbedürftig, geht mit etwas Übung besser&lt;br /&gt;
* Tektronix&lt;br /&gt;
* HP / Agilent&lt;br /&gt;
* LogicPort http://www.pctestinstruments.com/&lt;br /&gt;
&lt;br /&gt;
Triggermöglichkeiten: SOF, CAN-ID, CAN-Data, ErrorFrame, RTR, Ack, NoAck  - alle verknüpfbar (gleich ungleich kleiner größer inRange outofRange)&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
&lt;br /&gt;
==Intern==&lt;br /&gt;
[[CAN als Hausbus]]&lt;br /&gt;
&lt;br /&gt;
==Allgemein==&lt;br /&gt;
* [http://can-wiki.info CAN-WIKI] - spezielle Wiki Site für CAN bus (Englisch)&lt;br /&gt;
* [http://de.wikipedia.org/wiki/Controller_Area_Network Wikipedia - CAN]&lt;br /&gt;
* [http://www.thomas-wedemeyer.de/elektronik/CAN-Bus/can-bus.html Grundlagen zum CAN-Bus] - Kurze Zusammenfassung der Funktionsweise und Einsatzmöglichkeiten vom CAN-Bus&lt;br /&gt;
* [http://www.canbus.cz CAN] - Controller_Area_Network (Czech)&lt;br /&gt;
&lt;br /&gt;
==Hardware==&lt;br /&gt;
*[http://www.mjschofield.com/devices.htm ausführliche Liste mit CAN-Chips und -Controllern]&lt;br /&gt;
&lt;br /&gt;
===Testboards===&lt;br /&gt;
*[http://www.kreatives-chaos.com/artikel/can-testboard  ATmega8 CAN Testboard und  MCP2515 Tutorial]&lt;br /&gt;
&lt;br /&gt;
===Dongles===&lt;br /&gt;
*[http://private.addcom.de/horo/can200/ Can200 Selbstbauprojekt]&lt;br /&gt;
*[http://www.mhs-elektronik.de/tiny_can.html MHS-Elektronik Low-Cost USB-CAN-Adapter (60,- EUR) + Open Source CAN-Monitor für Windows und Linux]&lt;br /&gt;
*[http://www.cantronik.com/ cantronik]&lt;br /&gt;
*[http://www.kopfweb.de/automotive_3.htm usb-can]&lt;br /&gt;
*[http://www.mictronics.de Open Source USB&amp;lt;&amp;gt;CAN Bus Interface mit AVR ATmega162]&lt;br /&gt;
*[http://www.ixxat.de IXXAT u.a. USB&amp;lt;&amp;gt;CAN Bus Interface ca. 200 Eur]&lt;br /&gt;
*[http://www.peak-system.com Peak-System u.a. USB&amp;lt;&amp;gt;CAN Bus Interface ca. 200 EUR]&lt;br /&gt;
*[http://www.ems-wuensche.com EMS Dr. Thomas Wünsche u.a.] [http://www.ems-wuensche.com/product/datasheet/html/can-usb-adapter-converter-interface-cpcusb.html USB to CAN Bus Interface ca. 180 EUR]&lt;br /&gt;
*[http://www.systec-electronic.com/html/index.pl/en_product_can_interfaces SYS TEC electronic - USB-CANmodul Serie mit Unterstützung von 1, 2, 8, oder 16 CAN Kanälen (ab 129,- Eur)]&lt;br /&gt;
&lt;br /&gt;
*[http://www.edevices.lt USB2CAN USB to CAN bus converter 65 EUR]&lt;br /&gt;
&lt;br /&gt;
*[http://www.lawicel.com Lawicel RS232/V24&amp;lt;&amp;gt;CAN Bus Interface]&lt;br /&gt;
*[http://www.canusb.com/ canusb USB&amp;lt;&amp;gt;CAN über V24-Treiber von Lawicel]&lt;br /&gt;
*[http://www.canusb.com/projects.htm freie Software für canusb]&lt;br /&gt;
&lt;br /&gt;
*[http://www.port.de/engl/canprod/hw_ethercan.html PORT CAN-LAN-Bridge mit ARM und Linux]&lt;br /&gt;
&lt;br /&gt;
*[http://www.anagate.de/products/can-ethernet-gateways.htm AnaGate CAN-Ethernet Gateways (LowCost Lösung und Professionelle Varianten mit Linux System für eigene Anwendungen) (Shop)]&lt;br /&gt;
&lt;br /&gt;
*[http://www.pp2can.wz.cz PP2CAN:LPT-CAN bus interface]&lt;br /&gt;
*[http://www.pp2can.wz.cz/CAN2MMC.htm CAN2MMC: datalogger(CAN,RS232-GPS)]&lt;br /&gt;
*[http://www.usb2can.wz.cz USB2CAN: USB-CAN bus interface (80 Eur)]&lt;br /&gt;
&lt;br /&gt;
*[http://www.canhack.de/viewtopic.php?t=137 CANHACK CANUSB Interface, High Speed CAN + OBD2 (79,- Euro; inkl. CAN Monitor)]&lt;br /&gt;
&lt;br /&gt;
*[http://www.pp2can.wz.cz PP2CAN:LPT-CAN bus interface]&lt;br /&gt;
&lt;br /&gt;
*[http://oschmid.home.solnet.ch/mt/can-hub/can-hub.php CAN Bus HUB]&lt;br /&gt;
&lt;br /&gt;
*[http://martinsuniverse.de/projekte/caninterceptor/caninterceptor.html CAN-Interceptor]&lt;br /&gt;
&lt;br /&gt;
*[http://www.microcontroller-starterkits.de USB-zu-CAN-Interface mit verschiedenen Transceivern (LOW-Speed / HIGH-Speed) Beschreibung/Schaltplan im Online-Magazin. Leerplatinen dazu preiswert im Online-Shop erhältlich]&lt;br /&gt;
&lt;br /&gt;
==Software==&lt;br /&gt;
&lt;br /&gt;
*[http://canhack.de/viewtopic.php?f=25&amp;amp;t=135 CAN Monitor und Tracer für Peak USB, Lawicel CANUSB+CAN232 und kompatible]&lt;br /&gt;
*[http://www.mhs-elektronik.de/tiny_can.html GNU – Open Source CAN Monitor, Makro und Filter Funktion, Plugin fähig, unter GTK+ entwickelt]&lt;br /&gt;
&lt;br /&gt;
===Protokolle===&lt;br /&gt;
====CANOpen====&lt;br /&gt;
&lt;br /&gt;
*[http://canopen.sourceforge.net/index.html CANopen free software resource center]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:CAN]]&lt;br /&gt;
[[Kategorie:Bauteile]]&lt;/div&gt;</summary>
		<author><name>Horha</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Diskussion:Sinus_berechnung&amp;diff=38158</id>
		<title>Diskussion:Sinus berechnung</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Diskussion:Sinus_berechnung&amp;diff=38158"/>
		<updated>2009-07-31T15:00:12Z</updated>

		<summary type="html">&lt;p&gt;Horha: Die Seite wurde neu angelegt: Hallo,  wieviele Multiplikationen brauchst Du, um einen beliegen Wert zu bestimmen?# Wenn Dein Eingabe FOrmat wie bei linearer Näherung: http://www.mikrocontroller.net...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hallo,&lt;br /&gt;
&lt;br /&gt;
wieviele Multiplikationen brauchst Du, um einen beliegen Wert zu bestimmen?#&lt;br /&gt;
Wenn Dein Eingabe FOrmat wie bei linearer Näherung:&lt;br /&gt;
http://www.mikrocontroller.net/articles/AVR_Arithmetik/Sinus_und_Cosinus_(Lineare_Interpolation)&lt;br /&gt;
High Byte = ganzzahliger Winkel in Grad&lt;br /&gt;
Low Byte = Vielfach von 1/256 Grad also Dein DX ist&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 dx=DX*math.pi/2.0/n              | * Konstante 1&lt;br /&gt;
 dx2=dx**2                        |             1&lt;br /&gt;
  si=sin[k]*(1.0-0.5*dx2)         |             2&lt;br /&gt;
  co=sin[n-k]*dx*(1.0-1.0/6.0*dx2)|             3&lt;br /&gt;
  return (si+co)/float(div)       | *Konstante  1&amp;lt;/pre&amp;gt;&lt;br /&gt;
Sind 8 Multiplikationen und 5 Konstante &lt;br /&gt;
Aber wie http://www.mikrocontroller.net/articles/Benutzer:Gjlayde schon schrieb.&lt;br /&gt;
Wofür braucht man das noch.&lt;br /&gt;
Lineare Näherung ist wesentlich schneller und Cordic wäre auch für Attiny&#039;s ohne Mul Befehle geeignet und überhaupt, wer braucht diese Genauigkeit.&lt;br /&gt;
&lt;br /&gt;
Ein ATxmega könnte ja 12-Bit Sinus-Schwingungen auf seinem DAC ausgeben mit fast 500.000 Werten in der Sekunde bei 32 Mhz&lt;br /&gt;
20 Khz also mit 25 Stützstellen.&lt;/div&gt;</summary>
		<author><name>Horha</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Diskussion:AVR_Arithmetik/Sinus_und_Cosinus_(Lineare_Interpolation)&amp;diff=38068</id>
		<title>Diskussion:AVR Arithmetik/Sinus und Cosinus (Lineare Interpolation)</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Diskussion:AVR_Arithmetik/Sinus_und_Cosinus_(Lineare_Interpolation)&amp;diff=38068"/>
		<updated>2009-07-27T16:00:37Z</updated>

		<summary type="html">&lt;p&gt;Horha: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hallo,&lt;br /&gt;
&lt;br /&gt;
ich dachte mir schon, dass jetzt das Übergabeformat für lineare Interpolation sich gegenüber Cordic ändert, um leichter rechnen zu können ;-)&lt;br /&gt;
Mein Vorschlag von 0.16 als Zahlenformat bei der Cordic-Diskussion [[Diskussion:AVR Arithmetik/Sinus und Cosinus (CORDIC)]],&lt;br /&gt;
 bezog sich nur auf die Tabelle selbst linsin_tab: &lt;br /&gt;
&lt;br /&gt;
..const int16_t linsin_tab[91] PROGMEM = ...&lt;br /&gt;
Damit wäre ein Bit Genauigkeit gewonnen, ohne am Platzbedarf etwas zu ändern.&lt;br /&gt;
&lt;br /&gt;
Eine quadratische Interpolation mit den Werten:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a := sintable[i];&lt;br /&gt;
b := sintable[i+1] /2;&lt;br /&gt;
c := sintable[i-1] /2;&lt;br /&gt;
  // Parabel durch sintable[i-1],sintable[i],sintable[i+1] &lt;br /&gt;
  sinquadratNaeh := ((b+c-a)*frak + b-c)*frak+a; //oder &lt;br /&gt;
  sinquadratNaeh := (Diff2*frak + Diff1)*frak+a;&lt;br /&gt;
Ließe sich auch in einer Tabelle speichern, in der a,diff1,diff2 in einer Reihe stehen, speichern&lt;br /&gt;
type &lt;br /&gt;
  tfloat =  1.15;&lt;br /&gt;
  tquaTab = record&lt;br /&gt;
              Diff2,Diff1,a: Tfloat;&lt;br /&gt;
            end;&lt;br /&gt;
const&lt;br /&gt;
  quaTable = array [-1,16] of tquaTab;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das schöne daran ist, man kann mit frak im Bereich -1..1 rechnen.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sinquadratNaeh(i,Frak=-1) = sintable[i-1];&lt;br /&gt;
sinquadratNaeh(i,Frak=0) = sintable[i];&lt;br /&gt;
sinquadratNaeh(i,Frak=1) = sintable[i+1];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Man kommt also mit einer halben Tabelle aus.&lt;br /&gt;
Wenn man Tabelle [1,frak=0] rechnen will, kann man  man Tabelle[0,frak=1] oder Tabelle[2,frak=-1] rechnen, oder Tabelle[1,frak=0.7]=Tabelle[2,frak=0.7-1]&lt;br /&gt;
Damit kann Tabelle[1] wegfallen. Weil aber die Genauigkeit etwas darunter leidet, braucht man vielleicht einen Tabellenplatz mehr. Ausserdem müssen die Konstanten anders skaliert sein, da Diff2&amp;gt;0 und Werte im Bereich von -0.004815..0 hat müßte um -256 erweitert werden, damit daraus noch etwas vernünftiges wird.&lt;br /&gt;
&lt;br /&gt;
Nun fehlt noch die klassische Taylor-Reihe, mit weniger Konstanten:&lt;br /&gt;
&lt;br /&gt;
Taylor Reihe für x im Bogennmass:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sin(x) = x-x^3/3!+x^5/5!-x^7/7!+..-..+&lt;br /&gt;
mittels Horner Schema, wenn man weiß wann man aufhören will.&lt;br /&gt;
sin(x) = x*(1/1 - x^2/(2*3)*(1-x^2/(4*5)*(1-x^2/(6*7)*(1-x^2...-x^2/((2*n-2))*(2*n-1)){n-fach}))&lt;br /&gt;
&lt;br /&gt;
function SinTaylor(x:float):float;&lt;br /&gt;
var&lt;br /&gt;
  x2 : float; &lt;br /&gt;
  i,n,n2_1:integer; &lt;br /&gt;
begin &lt;br /&gt;
n := 7; // anpassen an geforderte Genauigkeit&lt;br /&gt;
x2 := x*x; &lt;br /&gt;
n2_1 := n+n-1; &lt;br /&gt;
result := 1.0; &lt;br /&gt;
For i := n downto 2 do &lt;br /&gt;
  begin &lt;br /&gt;
  result := 1-x2/((n2_1-1)*n2_1)*result; &lt;br /&gt;
  n2_1 := n2_1-2; &lt;br /&gt;
  end; &lt;br /&gt;
//den Rest mal x &lt;br /&gt;
result := x*result;&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
oder schneller mit Tabelle der Kehrwerte:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function SinTaylor(x:float):float;&lt;br /&gt;
const&lt;br /&gt;
  rezSinFakt : array[0..4] of float(oder 1.15/0.16 ... ) =&lt;br /&gt;
            (1/(2*3), 1/(4*5) ,1/(6*7) ,1/(8*9) ,1/(10*11));&lt;br /&gt;
  rezCosFakt : array[0..4] of float = (1/(1*2), 1/(3*4) ,1/(5*6) ,1/(7*8) ,1/(9*10));&lt;br /&gt;
&lt;br /&gt;
var&lt;br /&gt;
  x2 : float; &lt;br /&gt;
  i:integer; &lt;br /&gt;
begin &lt;br /&gt;
Umwandeln von x in Bogenmass&lt;br /&gt;
x Auf den Bereich 0..pi/2 bringen, passendes Vorzeichen merken&lt;br /&gt;
falls x &amp;gt;= 1 dann&lt;br /&gt;
  x = pi/2-x -&amp;gt; cos_rechnen = true damit bleibt x&amp;lt; 1 und x^2&amp;lt;1&lt;br /&gt;
  da man bei sin_rechnen ab x=0.69 sowieso schon dreimal durch die Schleife muss&lt;br /&gt;
  und für x = 1 die Genauigkeit dann bei 17.5 Bit liegt (Taschenrechner)&lt;br /&gt;
&lt;br /&gt;
x2 := x*x; &lt;br /&gt;
result := 1.0; &lt;br /&gt;
if not(cos_rechnen) then&lt;br /&gt;
  begin&lt;br /&gt;
  For i := 4 downto 0 do &lt;br /&gt;
    begin&lt;br /&gt;
    result := 1-x2*result*rezSinFakt[i]&lt;br /&gt;
    end;&lt;br /&gt;
  result := x*result;&lt;br /&gt;
  end&lt;br /&gt;
else&lt;br /&gt;
  //cos_rechnen&lt;br /&gt;
  begin&lt;br /&gt;
  For i := 4 downto 0 do &lt;br /&gt;
    begin&lt;br /&gt;
    result := 1-x2*result*rezCosFakt[i]&lt;br /&gt;
    end;&lt;br /&gt;
  end; &lt;br /&gt;
Vorzeichen anpassen&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Da es eine alternierende Reihe ist, wird der Abbruchfehler kleiner als das erste weggelassene Glied. Hier also delta &amp;lt; x^13/13! (x= 1 &amp;amp;rarr; delta &amp;lt; 1.6 e-10 (auf meinem Aldi-Taschenrechner 2.17e-10) )&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Für eine Genauigkeit von 2^-15 reicht für sin Rechnung:&lt;br /&gt;
bis x[rad] = 0.23 For i := 0 downto 0 &lt;br /&gt;
bis x[rad] = 0.69 For i := 1 downto 0&lt;br /&gt;
bis x[rad] = 1.19 For i := 2 downto 0&lt;br /&gt;
Multiplikationen ( 1.15 x 1.15-&amp;gt; 1.15) : 1 (x^2)+1 (x*result) + 2*Anzahl Schleifendurchläufe &lt;br /&gt;
Multiplikationen : (1+Anzahl Schleifendurchläufe)*2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Also statt 16 Multiplkationen wie bei Cordic (aber nur, weil es keinen schnellen Shifter gibt) maximal 8 für sin+cos Berechnung also etwa gleich schnell oder schneller.&lt;br /&gt;
&lt;br /&gt;
Ich schon sagen, dass Du Dir ausgesprochen viel Mühe gibst.&lt;br /&gt;
&lt;br /&gt;
Heisst das heute chapeau oder Hut ab ?&lt;br /&gt;
&lt;br /&gt;
:Wie an der Abschätzung für die linsin_tab zu erkennen, wird der Fehler dominiert durch den Eingabefehler im Bereich von 2 Inkrementen, nicht durch den Interpolationsfehler. Dementsprechend wird eine Umstellung auf eine 0.16-Tabelle keine wesentliche Verkleinerung des Fehlers bringen. Eine Probeimplementierung bestätigt dies: die Standardabweichungen werden zwar was kleiner, aber die Maximalfehler bleiben unverändert.&lt;br /&gt;
&lt;br /&gt;
:Die Implementierungen habe ich aus Interesse gemacht &amp;amp;ndash; es ging mit nicht darum, den ganzen Zoo von denkbaren sin-Implementierungen für AVR durchzunudeln. Meine mathematische Intuition sagt mir immer noch, daß Taylor nicht sinnvoll ist (u.a. gerade &#039;&#039;weil&#039;&#039; die Reihe alternierend ist) und quadratische Interpolation mit unangenehmen Fußangeln aufwartet.&lt;br /&gt;
&lt;br /&gt;
:Im übrigen rechnet man nicht im Intervell [-1,1] sondern in [-1,1) bzw. hier &amp;amp;ndash; da zunächst keine negativen Werte auftauchen &amp;amp;ndash; in [0,1).&lt;br /&gt;
&lt;br /&gt;
:Da mit der linearen Interpolation eine Implementierung mit halbwegs akzeptabler Laufzeit zur Verfügung steht, wäre eher zu überlegen, CORDIC auf Codegröße zu optimieren anstatt auf Geschwindigkeit. Ohne Fallunterscheidungen und mit Schiebeschleifen anstatt Multiplikation solle deutlich an Flash gespart werden können &amp;amp;ndash; natürlich auf Kosten der Laufzeit. --[[Benutzer:Gjlayde|Gjlayde]] 10:08, 26. Jul. 2009 (CEST)&lt;br /&gt;
&lt;br /&gt;
Hallo,&lt;br /&gt;
&lt;br /&gt;
ich habe es mal mit Taylor simuliert( mit smallint ) und vorerst nur Winkel von 0..32787 /32767 also von 0..1 im Bogenmass betrachtet.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
abs. Abweichung: Anzahl&lt;br /&gt;
-2:    0  &lt;br /&gt;
-1: 2791&lt;br /&gt;
 0:27291&lt;br /&gt;
 1: 2686&lt;br /&gt;
 2:    0&amp;lt;/pre&amp;gt;&lt;br /&gt;
bis 590 keine Iteration, bis 8100 ( 14.16° ) eine, bis 18000 (31.47°) zwei und dann drei bis 57.29°.&lt;br /&gt;
Also kommt nie eine Abweichung von +-2 zustande.&lt;br /&gt;
&lt;br /&gt;
Lange Rede keinen Sinn. Warum sollte man Cordic nutzen, wenn es Abweichungen bis +-7  hat und nicht schneller rechnet?&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
program TayLorTest;&lt;br /&gt;
&lt;br /&gt;
type&lt;br /&gt;
  tfloat = smallint;&lt;br /&gt;
var&lt;br /&gt;
 i : smallint;&lt;br /&gt;
 count: longint;&lt;br /&gt;
 Fehler :array[-10..10] of longint;&lt;br /&gt;
&lt;br /&gt;
function SinTaylor(x:tfloat):tfloat;&lt;br /&gt;
const&lt;br /&gt;
//  (1/(2*3), 1/(4*5) ,1/(6*7) ,1/(8*9) ,1/(10*11) *65536);&lt;br /&gt;
  rezSinFakt : array[0..2] of smallint = (10923,3277,1560);&lt;br /&gt;
var&lt;br /&gt;
  x2 : longint;&lt;br /&gt;
  i : shortint;&lt;br /&gt;
  cos_rechnen:boolean;&lt;br /&gt;
begin&lt;br /&gt;
If x &amp;gt; 590 then&lt;br /&gt;
  begin&lt;br /&gt;
  result := $7FFF;//= 1&lt;br /&gt;
  IF (x &amp;gt;= 0) AND (x &amp;lt;= 32767) then&lt;br /&gt;
    begin&lt;br /&gt;
    x2 := (x*x ) shr 15;&lt;br /&gt;
    i := 2;&lt;br /&gt;
    if x &amp;lt; 18000 then&lt;br /&gt;
      i := 1;&lt;br /&gt;
    if x &amp;lt; 8100 then&lt;br /&gt;
      i := 0;&lt;br /&gt;
    while i&amp;gt;= 0 do&lt;br /&gt;
      begin&lt;br /&gt;
      result := $7FFF -  result*((x2*rezSinFakt[i]) shr 16 ) shr 15;&lt;br /&gt;
      dec(i);&lt;br /&gt;
      end;&lt;br /&gt;
    result := x*result shr 15;&lt;br /&gt;
    end;&lt;br /&gt;
  // else cos (90-alpha) = 51472-x rechnen &lt;br /&gt;
  end;&lt;br /&gt;
else&lt;br /&gt;
 // x &amp;lt; 590 &lt;br /&gt;
  result := x-1;&lt;br /&gt;
inc(count);&lt;br /&gt;
inc(Fehler[round(result-int(32768*sin(x/32768)))]);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
begin&lt;br /&gt;
for i := -10 to 10 do&lt;br /&gt;
  Fehler[i]:= 0;&lt;br /&gt;
count:= 0 ;&lt;br /&gt;
for i := 0 to 32767 do&lt;br /&gt;
  sinTaylor(i);&lt;br /&gt;
for i := -10 to 10 do&lt;br /&gt;
  write(i:4,Fehler[i]:12);&lt;br /&gt;
writeln(count)&lt;br /&gt;
end.&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Horha</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Diskussion:AVR_Arithmetik/Sinus_und_Cosinus_(Lineare_Interpolation)&amp;diff=38032</id>
		<title>Diskussion:AVR Arithmetik/Sinus und Cosinus (Lineare Interpolation)</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Diskussion:AVR_Arithmetik/Sinus_und_Cosinus_(Lineare_Interpolation)&amp;diff=38032"/>
		<updated>2009-07-25T09:42:13Z</updated>

		<summary type="html">&lt;p&gt;Horha: Quadratische INterpolation / Taylorreihe&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hallo,&lt;br /&gt;
&lt;br /&gt;
ich dachte mir schon, dass jetzt das Übergabeformat für lineare Interpolation sich gegenüber Cordic ändert, um leichter rechnen zu können ;-)&lt;br /&gt;
&lt;br /&gt;
Mein Vorschlag von 0.16 als Zahlenformat bei der Cordic-Diskussion http://www.mikrocontroller.net/articles/Diskussion:AVR_Arithmetik/Sinus_und_Cosinus_(CORDIC) ,&lt;br /&gt;
 bezog sich nur auf die Tabelle selbst linsin_tab: &lt;br /&gt;
&lt;br /&gt;
..const int16_t linsin_tab[91] PROGMEM = ...&lt;br /&gt;
Damit wäre ein Bit Genauigkeit gewonnen, ohne am Platzbedarf etwas zu ändern.&lt;br /&gt;
&lt;br /&gt;
Eine quadratische Interpolation mit den Werten:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a := sintable[i];&lt;br /&gt;
b := sintable[i+1] /2;&lt;br /&gt;
c := sintable[i-1] /2;&lt;br /&gt;
  // Parabel durch sintable[i-1],sintable[i],sintable[i+1] &lt;br /&gt;
  sinquadratNaeh := ((b+c-a)*frak + b-c)*frak+a; //oder &lt;br /&gt;
  sinquadratNaeh := (Diff2*frak + Diff1)*frak+a;&lt;br /&gt;
Ließe sich auch in einer Tabelle speichern, in der a,diff1,diff2 in einer Reihe stehen, speichern&lt;br /&gt;
type &lt;br /&gt;
  tfloat =  1.15;&lt;br /&gt;
  tquaTab = record&lt;br /&gt;
              Diff2,Diff1,a: Tfloat;&lt;br /&gt;
            end;&lt;br /&gt;
const&lt;br /&gt;
  quaTable = array [-1,16] of tquaTab;&lt;br /&gt;
&lt;br /&gt;
Das schöne daran ist, man kann mit frak im Bereich -1..1 rechnen.&lt;br /&gt;
&lt;br /&gt;
sinquadratNaeh(i,Frak=-1) = sintable[i-1];&lt;br /&gt;
sinquadratNaeh(i,Frak=0) = sintable[i];&lt;br /&gt;
sinquadratNaeh(i,Frak=1) = sintable[i+1];&lt;br /&gt;
&lt;br /&gt;
Man kommt also mit einer halben Tabelle aus.&lt;br /&gt;
Wenn man Tabelle[1,frak=0] rechnen will, kann man  man Tabelle[0,frak=1] oder Tabelle[2,frak=-1] rechnen,&lt;br /&gt;
 oder Tabelle[1,frak=0.7]= Tabelle[2,frak=0.7-1]&lt;br /&gt;
Damit kann Tabelle[1] wegfallen.&lt;br /&gt;
Weil aber die Genauigkeit etwas darunter leidet, braucht man vielleicht einen Tabellenplatz mehr.&lt;br /&gt;
Ausserdem müssen die Konstanten anders skaliert sein, da Diff2&amp;gt;0 und Werte im Bereich von -0.004815..0 hat &lt;br /&gt;
müßte um -256 erweitert werden, damit daraus noch etwas vernünftiges wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nun fehlt noch die klassische Taylor-Reihe, mit weniger Konstanten:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Taylor Reihe für x im Bogennmass:&lt;br /&gt;
sin(x) = x-x^3/3!+x^5/5!-x^7/7!+..-..+&lt;br /&gt;
mittels Horner Schema, wenn man weiß wann man aufhören will.&lt;br /&gt;
sin(x) = x*(1/1 - x^2/(2*3)*(1-x^2/(4*5)*(1-x^2/(6*7)*(1-x^2...-x^2/((2*n-2))*(2*n-1)){n-fach}))&lt;br /&gt;
&lt;br /&gt;
function SinTaylor(x:float):float;&lt;br /&gt;
var&lt;br /&gt;
  x2 : float; &lt;br /&gt;
  i,n,n2_1:integer; &lt;br /&gt;
begin &lt;br /&gt;
n := 7; // anpassen an geforderte Genauigkeit&lt;br /&gt;
x2 := x*x; &lt;br /&gt;
n2_1 := n+n-1; &lt;br /&gt;
result := 1.0; &lt;br /&gt;
For i := n downto 2 do &lt;br /&gt;
  begin &lt;br /&gt;
  result := 1-x2/((n2_1-1)*n2_1)*result; &lt;br /&gt;
  n2_1 := n2_1-2; &lt;br /&gt;
  end; &lt;br /&gt;
//den Rest mal x &lt;br /&gt;
result := x*result;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
oder schneller mit Tabelle der Kehrwerte:&lt;br /&gt;
function SinTaylor(x:float):float;&lt;br /&gt;
const&lt;br /&gt;
  rezSinFakt : array[0..4] of float(oder 1.15/0.16 ... ) =&lt;br /&gt;
            (1/(2*3), 1/(4*5) ,1/(6*7) ,1/(8*9) ,1/(10*11));&lt;br /&gt;
  rezCosFakt : array[0..4] of float = (1/(1*2), 1/(3*4) ,1/(5*6) ,1/(7*8) ,1/(9*10));&lt;br /&gt;
&lt;br /&gt;
var&lt;br /&gt;
  x2 : float; &lt;br /&gt;
  i:integer; &lt;br /&gt;
begin &lt;br /&gt;
Umwandeln von x in Bogenmass&lt;br /&gt;
x Auf den Bereich 0..pi/2 bringen, passendes Vorzeichen merken&lt;br /&gt;
falls x &amp;gt;= 1 dann&lt;br /&gt;
  x = pi/2-x -&amp;gt;cos_rechnen = true damit bleibt x&amp;lt; 1 und x^2&amp;lt;1&lt;br /&gt;
  da man bei sin_rechnen ab x=0.69 sowieso schon dreimal durch die Schleife muss&lt;br /&gt;
  und für x = 1 die Genauigkeit dann bei 17.5 Bit liegt (Taschenrechner)&lt;br /&gt;
&lt;br /&gt;
x2 := x*x; &lt;br /&gt;
result := 1.0; &lt;br /&gt;
if not(cos_rechnen) then&lt;br /&gt;
  begin&lt;br /&gt;
  For i := 4 downto 0 do &lt;br /&gt;
    begin&lt;br /&gt;
    result := 1-x2*result*rezSinFakt[i]&lt;br /&gt;
    end;&lt;br /&gt;
  result := x*result;&lt;br /&gt;
  end&lt;br /&gt;
else&lt;br /&gt;
  //cos_rechnen&lt;br /&gt;
  begin&lt;br /&gt;
  For i := 4 downto 0 do &lt;br /&gt;
    begin&lt;br /&gt;
    result := 1-x2*result*rezCosFakt[i]&lt;br /&gt;
    end;&lt;br /&gt;
  end; &lt;br /&gt;
Vorzeichen anpassen&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Da es eine alternierende Reihe ist, wird der Abbruchfehler kleiner als das erste weggelassene Glied.Hier also delta &amp;lt; x^13/13! (x= 1 -&amp;gt; delta &amp;lt; 1.6 e-10 (auf meinem Aldi-Taschenrechner 2.17e-10) )&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Für eine Genauigkeit von 2^-15 reicht für sin Rechnung:&lt;br /&gt;
bis x[rad] = 0.23 For i := 0 downto 0 &lt;br /&gt;
bis x[rad] = 0.69 For i := 1 downto 0&lt;br /&gt;
bis x[rad] = 1.19 For i := 2 downto 0&lt;br /&gt;
Multiplikationen ( 1.15 x 1.15-&amp;gt; 1.15) : 1 (x^2)+1 (x*result) + 2*Anzahl Schleifendurchläufe &lt;br /&gt;
Multiplikationen : (1+Anzahl Schleifendurchläufe)*2&lt;br /&gt;
Also statt 16 Multiplkationen wie bei Cordic (aber nur, weil es keinen schnellen Shifter gibt) maximal 8 für sin+cos Berechnung also etwa gleich schnell oder schneller.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ich schon sagen, dass Du Dir ausgesprochen viel Mühe gibst.&lt;br /&gt;
&lt;br /&gt;
Heisst das heute chapeau oder Hut ab ?&lt;/div&gt;</summary>
		<author><name>Horha</name></author>
	</entry>
</feed>