<?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=Dario</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=Dario"/>
	<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/articles/Spezial:Beitr%C3%A4ge/Dario"/>
	<updated>2026-05-17T18:44:16Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:Wordclock-schmal-schaltung-2.0.png&amp;diff=78192</id>
		<title>Datei:Wordclock-schmal-schaltung-2.0.png</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:Wordclock-schmal-schaltung-2.0.png&amp;diff=78192"/>
		<updated>2013-08-26T21:27:09Z</updated>

		<summary type="html">&lt;p&gt;Dario: Dario lud eine neue Version von „Datei:Wordclock-schmal-schaltung-2.0.png“ hoch: verklickt tschuldigung&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Dario</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:Wordclock-schmal-schaltung-2.0.png&amp;diff=78191</id>
		<title>Datei:Wordclock-schmal-schaltung-2.0.png</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:Wordclock-schmal-schaltung-2.0.png&amp;diff=78191"/>
		<updated>2013-08-26T21:26:10Z</updated>

		<summary type="html">&lt;p&gt;Dario: Dario lud eine neue Version von „Datei:Wordclock-schmal-schaltung-2.0.png“ hoch: verklickt tschuldigung&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Dario</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:Wordclock-schmal-schaltung-2.0.png&amp;diff=78190</id>
		<title>Datei:Wordclock-schmal-schaltung-2.0.png</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:Wordclock-schmal-schaltung-2.0.png&amp;diff=78190"/>
		<updated>2013-08-26T21:25:42Z</updated>

		<summary type="html">&lt;p&gt;Dario: Dario lud eine neue Version von „Datei:Wordclock-schmal-schaltung-2.0.png“ hoch: Zurückgesetzt auf die Version vom 16. März 2012, 09:32 Uhr&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Dario</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Benutzer:Dario&amp;diff=72305</id>
		<title>Benutzer:Dario</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Benutzer:Dario&amp;diff=72305"/>
		<updated>2013-02-12T18:16:13Z</updated>

		<summary type="html">&lt;p&gt;Dario: Die Seite wurde neu angelegt: „www.carluccio.de“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;www.carluccio.de&lt;/div&gt;</summary>
		<author><name>Dario</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=32806</id>
		<title>Heizungssteuerung mit Honeywell HR20</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=32806"/>
		<updated>2008-11-29T17:50:01Z</updated>

		<summary type="html">&lt;p&gt;Dario: /* print status */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von DarioC&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Wie alles begann =&lt;br /&gt;
&lt;br /&gt;
Nachdem von Uwe Felgentreu vor nunmehr vor über vier Jahren (genau am 17.11.2004 um 11:26) hier in diesem Forum den Thread mit dem Titel &#039;&#039;Honeywell Rondostat HR20E per AVR steuern und konfigurieren&#039;&#039; gestartet hat ist es nun langsam soweit, dass das Ganze auch ein Projekt wird. &lt;br /&gt;
&lt;br /&gt;
Den Thread dazu kann der interessierte Leser [http://www.mikrocontroller.net/topic/17603 hier nachlesen]&lt;br /&gt;
&lt;br /&gt;
= Projektziel =&lt;br /&gt;
&lt;br /&gt;
Wir konzentrieren uns in erster Linie auf den Honeywell Rondostat HR20E mit ausgelieferten Softwareversion 2.04. Dass es ähnliche andere Geräte gibt behalten wir bei der Entwicklung im Hinterkopf.&lt;br /&gt;
&lt;br /&gt;
Basierend auf dieser Hardware wollen wir eine neue Software entwickeln. &lt;br /&gt;
Dabei können wir ausser der Hardware nichts weiter verwenden, da die Originalsoftware geschützt ist und nicht ausgelesen werden kann.&lt;br /&gt;
&lt;br /&gt;
== Phase 1 ==&lt;br /&gt;
Die Software soll die Funktionen bieten, die die Originalsoftware auch bietet, später können dies dann um zusätzliche Funktionen erweitert werden. Die wichtigsten Funktionen sind:&lt;br /&gt;
&lt;br /&gt;
* Temperaturregelung&lt;br /&gt;
* Echtzeituhr&lt;br /&gt;
* Ausnutzen der Sleep Funktion&lt;br /&gt;
* Anzeige Soll-Temperatur und der Uhrzeit&lt;br /&gt;
* Einstellung der Soll-Temperatur&lt;br /&gt;
* Uhrzeitgesteuerte Einstellung der Soll-Temperatur &lt;br /&gt;
* Fenster-Offen-Erkennung&lt;br /&gt;
* Ventilfreispülungsfunktion&lt;br /&gt;
&lt;br /&gt;
== Phase 2 ==&lt;br /&gt;
&lt;br /&gt;
Hier liegt der Sinn des ganzen Projektes: Durch diese zusätzlichen Funktionen wollen wir den Nutzwert des Thermostaten erheblich steigern:&lt;br /&gt;
&lt;br /&gt;
* Programmierung der Schaltzeiten und Temperaturen über externe Schnittstelle&lt;br /&gt;
* Abfrage der Messwerte und Parameter über externe Schnittstelle&lt;br /&gt;
* Vernetzung der Thermostaten untereinander&lt;br /&gt;
* Zusätzliche externe Schnittstellen (neben UART auch CAN und Funk)&lt;br /&gt;
* Erweiterung der Anzeige um&lt;br /&gt;
** Ist-Temperatur &lt;br /&gt;
** Ventilstellung&lt;br /&gt;
** Funkschnittstelle&lt;br /&gt;
*** RFM12 http://www.hoperf.com/rf_fsk.asp&lt;br /&gt;
**** Library dazu im [https://roulette.das-labor.org/trac/browser/microcontroller/src-atmel/lib/rfm12/ SVN], [http://www.das-labor.org/wiki/Datenfunk_mit_dem_AVR Doku hier]&lt;br /&gt;
*** Zigbee http://www.meshnetics.com/zigbee-modules&lt;br /&gt;
** ...&lt;br /&gt;
* Bootloader, damit Leute mitarbeiten können, die keine JTAG haben. Mit einem JTAG könnte man den Bootloader Flashen, ohne den Thermostaten öffnen zu müssen. Von da an kann man über den Programmierstecker mit einem umgebauten Handykabel den Thermostaten neu flashen.&lt;br /&gt;
&lt;br /&gt;
= Lizenz =&lt;br /&gt;
Die Software wird unter GPL v2 gestellt.&lt;br /&gt;
&lt;br /&gt;
= Subversion Repository =&lt;br /&gt;
Das alte SVN Repository auf https://opensvn.csie.org war zu lahm, &amp;lt;BR&amp;gt;&lt;br /&gt;
daher haben wir ein Projekt auf Sourcefore angelegt.&lt;br /&gt;
=== Zugangsdaten ===&lt;br /&gt;
Projektseite:         http://sourceforge.net/projects/openhr20/ &amp;lt;BR&amp;gt;&lt;br /&gt;
Repository Location: https://openhr20.svn.sourceforge.net/svnroot/openhr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
Browse Repository:    http://openhr20.svn.sourceforge.net/viewvc/openhr20/ &amp;lt;BR&amp;gt;&lt;br /&gt;
=== Policy ===&lt;br /&gt;
Anonymous check out ist erlaubt. &amp;lt;br&amp;gt;&lt;br /&gt;
Wer was committen will muss freigeschaltet werden. &amp;lt;br&amp;gt;&lt;br /&gt;
Dazu brauche ich den Sourceforge Accountnamen.&amp;lt;br&amp;gt;&lt;br /&gt;
Einfch eine Email mit username und password an hr20[at]carluccio[dot]de&amp;lt;br&amp;gt;&lt;br /&gt;
Das mache ich dann von Hand und da ich nicht alle 10 Minuten Mails bearbeite kann das auch schon mal einen oder zwei Tage dauern. &amp;lt;br&amp;gt;&lt;br /&gt;
Wenn sich ein Maintainer findet, gebe ich die Zugangsdaten gerne weiter.&lt;br /&gt;
&lt;br /&gt;
=== SVN Client und Anleitung ===&lt;br /&gt;
Windows-User nutzen am besten den Tortoise-SVN-Client, den man kostenfrei [http://tortoisesvn.tigris.org hier runterladen] kann. &amp;lt;br&amp;gt;&lt;br /&gt;
Dort gibt es auch eine Anleitung zum Arbeiten mit SVN.&lt;br /&gt;
&lt;br /&gt;
= Analyse der Hardware =&lt;br /&gt;
Die Analyse hat der Dario schon gemacht, zu finden ist die jeweils aktuelle Version &lt;br /&gt;
[http://carluccio.de/images/e/e1/Hr20-analyse.pdf als PDF hier] oder [https://opensvn.csie.org/viewcvs.cgi/doc/analyse.pdf hier im SVN].&lt;br /&gt;
== Fuses ==&lt;br /&gt;
Here the settings of the fuses:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! width=&amp;quot;100&amp;quot; | &lt;br /&gt;
! width=&amp;quot;150&amp;quot; | Original    &lt;br /&gt;
! width=&amp;quot;150&amp;quot; | OpenHR20&lt;br /&gt;
|-&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | Extended&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 0xFD&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 0xFD&lt;br /&gt;
|-&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | High&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 0x91&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 0x9B&lt;br /&gt;
|-&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | Low&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 0x62&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 0xE2&lt;br /&gt;
|-&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | EESAVE&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | enabled&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | disabled&lt;br /&gt;
|-&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | BOOTSZ&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 1024 Words (1E00)      &lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 512 Words (1C00)&lt;br /&gt;
|-&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | CKDIV8 &lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 1           &lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= TODOs =&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Task&lt;br /&gt;
! Remark&lt;br /&gt;
! Responsible&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Code Review&lt;br /&gt;
| Check the code, complete doxygen coments&lt;br /&gt;
| &lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| UserManual&lt;br /&gt;
| Write a User Manual, Screenshots are in \trunk\doc\Screenshots\&lt;br /&gt;
| &lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| PC-Software&lt;br /&gt;
| Write PC-Program to: &amp;lt;BR&amp;gt;- Read and Write OpenHR20 Settings &amp;lt;BR&amp;gt;- Log Status from OpenHR20&amp;lt;BR&amp;gt;- Visualize Logfile&amp;lt;BR&amp;gt; &lt;br /&gt;
| &lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Bootloader&lt;br /&gt;
| Do we still need a Bootloader ?&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= API Beschreibung =&lt;br /&gt;
Das Projekt wird mit doxygen dokumentiert, &lt;br /&gt;
die API-Beschreibung kann aus dem Source-Code generiert werden.&lt;br /&gt;
= UART Protocoll =&lt;br /&gt;
&lt;br /&gt;
This is the documentation for the UART Protocol in Release 74 of the SVN hosted on Sourceforge:&lt;br /&gt;
&lt;br /&gt;
== Com-Port Params ==&lt;br /&gt;
* BAUD: 9600&lt;br /&gt;
* Data: 8&lt;br /&gt;
* Parity: N&lt;br /&gt;
* Stop: 1&lt;br /&gt;
&lt;br /&gt;
== Automatic calibration ==&lt;br /&gt;
When the HR20 is mounted, then the automatic calibration is started. &lt;br /&gt;
The Debug-Info during the callibration is printed to the com-interface like this:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
+ 0210&lt;br /&gt;
+ 047e&lt;br /&gt;
+ 0437&lt;br /&gt;
[... many lines deleted ...]&lt;br /&gt;
- 0681&lt;br /&gt;
- 0695&lt;br /&gt;
- 0694&lt;br /&gt;
+ 0210&lt;br /&gt;
+ 047e&lt;br /&gt;
+ 0437&lt;br /&gt;
+ 0417&lt;br /&gt;
+ 0454&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Commands ==&lt;br /&gt;
All commands have FIXED format.&lt;br /&gt;
* command &#039;&#039;&#039;X.....\n &#039;&#039;&#039; termination char&lt;br /&gt;
* X is upcase char as commad name&lt;br /&gt;
* hex numbers use ONLY lowcase chars&lt;br /&gt;
=== print version information ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 V&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 V: OpenHR20 SW version V.VV build DDDD $Rev: REV $&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Where:&lt;br /&gt;
* V.VV  Version&lt;br /&gt;
* DDDD  Date at compilition &lt;br /&gt;
* REV   SVN Revision&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 V: OpenHR20 SW version 0.21 build Nov 13 2008 23:22:08 $Rev: 72 $&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
=== print status ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 D&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 D: dW DD.DD.DDDD TT:TT:TT V: VV I: IIII S: SSSS B: BBBB E: EE XW&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Where:&lt;br /&gt;
* &#039;&#039;&#039;W&#039;&#039;&#039; Day of Week (monday=1)&lt;br /&gt;
* &#039;&#039;&#039;DD.DD.DDDD&#039;&#039;&#039; actual date &lt;br /&gt;
* &#039;&#039;&#039;TT:TT:TT&#039;&#039;&#039; actual time &lt;br /&gt;
* &#039;&#039;&#039;VV&#039;&#039;&#039; actual position of valve [%] (00=closed, 100=opened)&lt;br /&gt;
* &#039;&#039;&#039;IIII&#039;&#039;&#039; actual temperature&lt;br /&gt;
* &#039;&#039;&#039;SSSS&#039;&#039;&#039; desired temperature&lt;br /&gt;
* &#039;&#039;&#039;BBBB&#039;&#039;&#039; battary voltage [mV]&lt;br /&gt;
* &#039;&#039;&#039;EE&#039;&#039;&#039; Error Code&lt;br /&gt;
* &#039;&#039;&#039;X&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;W&#039;&#039;&#039; Window Open detected&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 D: d3 01.10.08 12:00:16 V: 00 I: 2103 S: 1700 B: 3259 E:04 X&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== print watched wariable ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Taa&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;aa&#039;&#039;&#039; watched wariable see &#039;&#039;watch.c&#039;&#039;&lt;br /&gt;
Response:&lt;br /&gt;
(return 2 or 4 hex numbers) &lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 T[aa]=VVVV&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Where:&lt;br /&gt;
* &#039;&#039;&#039;aa&#039;&#039;&#039; watched wariable see &#039;&#039;watch.c&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;VVVV&#039;&#039;&#039; value of watched wariable &lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 T[01]=0cca&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
=== get configuration byte ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Gaa&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;aa&#039;&#039;&#039; hex address of configuration byte see eeprom.h&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 G[aa]=VV&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Where:&lt;br /&gt;
* &#039;&#039;&#039;aa&#039;&#039;&#039; hex address of configuration byte see eeprom.h&lt;br /&gt;
* &#039;&#039;&#039;VV&#039;&#039;&#039; value of configuration byte &lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 G[13]=2d&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
=== set configuration byte ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 SaaVV&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;aa&#039;&#039;&#039; hex address of configuration byte see eeprom.h&lt;br /&gt;
* &#039;&#039;&#039;VV&#039;&#039;&#039; hex value for configuration byte (hex)&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 S[aa]=VV&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Where:&lt;br /&gt;
* &#039;&#039;&#039;aa&#039;&#039;&#039; hex address of configuration byte see eeprom.h&lt;br /&gt;
* &#039;&#039;&#039;VV&#039;&#039;&#039; value of configuration byte &lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 S[13]=2d&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
=== get timer ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Rab&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;a&#039;&#039;&#039; day &lt;br /&gt;
* &#039;&#039;&#039;b&#039;&#039;&#039; slot&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 R[ab]=cddd&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Where:&lt;br /&gt;
* &#039;&#039;&#039;c&#039;&#039;&#039; timermode &lt;br /&gt;
: &#039;&#039;&#039;0&#039;&#039;&#039; frost protection&lt;br /&gt;
: &#039;&#039;&#039;1&#039;&#039;&#039; energy save&lt;br /&gt;
: &#039;&#039;&#039;2&#039;&#039;&#039; comfort&lt;br /&gt;
: &#039;&#039;&#039;3&#039;&#039;&#039; supercomfort&lt;br /&gt;
* &#039;&#039;&#039;ddd&#039;&#039;&#039; time (minutes since 00:00, hex) &lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 R[10]=21a4&lt;br /&gt;
 R[11]=121c&lt;br /&gt;
 R[12]=23c0&lt;br /&gt;
 R[13]=14ec&lt;br /&gt;
 R[14]=2fff&lt;br /&gt;
 R[15]=1fff&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
comfort at 0x1a4  = 420 / 60 = 7&lt;br /&gt;
energy save at 0x21c  = 540 / 60 = 9&lt;br /&gt;
comfort at 0x3c0  = 960 / 60 = 16&lt;br /&gt;
energy save at 0x4ec  = 1260 / 60 = 21&lt;br /&gt;
Slot 5+6 not used.&lt;br /&gt;
&lt;br /&gt;
=== set timer ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Wabcddd&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;a&#039;&#039;&#039; day &lt;br /&gt;
* &#039;&#039;&#039;b&#039;&#039;&#039; slot&lt;br /&gt;
* &#039;&#039;&#039;c&#039;&#039;&#039; timermode (0 to 3) &lt;br /&gt;
* &#039;&#039;&#039;d&#039;&#039;&#039; time time (minutes since 00:00, hex) &lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 W[ab]=cddd&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 W[10]=21a4&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Reboot ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 B1324&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;1234&#039;&#039;&#039; password (fixed at this moment)&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== set date ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Yyymmdd&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;yy&#039;&#039;&#039; year&lt;br /&gt;
* &#039;&#039;&#039;mm&#039;&#039;&#039; month&lt;br /&gt;
* &#039;&#039;&#039;dd&#039;&#039;&#039; day&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 D: WW DDDDDDDD TTTTTTTT V: VV I: IIII S: SSSS B: BBBB E:EE X&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
=== set time ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Hhhmmss&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;hh&#039;&#039;&#039; hour&lt;br /&gt;
* &#039;&#039;&#039;mm&#039;&#039;&#039; minute&lt;br /&gt;
* &#039;&#039;&#039;ss&#039;&#039;&#039; seconds&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 D: WW DDDDDDDD TTTTTTTT V: VV I: IIII S: SSSS B: BBBB E:EE X&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== set wanted temperature ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Axx&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;xx&#039;&#039;&#039; temperature [unit 0.5C] (hex)&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 D: WW DDDDDDDD TTTTTTTT V: VV I: IIII S: SSSS B: BBBB E:EE X&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Example:&lt;br /&gt;
20°C = 40 * 0,5 °C = 28 (hex)&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 A28&amp;lt;CR&amp;gt;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039;Attention: The value in the response is not the new value.&amp;lt;BR&amp;gt;The new value is updated some secondes later, so be patient and wait.&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== set mode ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Mxx&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;xx&#039;&#039;&#039; mode &lt;br /&gt;
: 00 = manu&lt;br /&gt;
: 01 = auto&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 D: WW DDDDDDDD TTTTTTTT V: VV I: IIII S: SSSS B: BBBB E:EE X&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Bootloader =&lt;br /&gt;
Um ein einfaches Update der Software, auch ohne Programmer und Zerlegen des HR20E zu ermöglichen, sollte ein Bootloader implementiert werden.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Grundsatzproblem:&#039;&#039;&#039; Fuer ein erstes Umflashen eines eben aus der Verpackung genommenen HR20s braucht man &#039;&#039;immer&#039;&#039; einen JTAG-Programmer um ueberhaupt erstmal den Bootlader selber draufzukriegen.&lt;br /&gt;
&lt;br /&gt;
== Anforderungen ==&lt;br /&gt;
* Einfaches Update ohne öffnen des HR20E&amp;lt;br&amp;gt;&lt;br /&gt;
* Nutzen bestehender Programme (Terminalprogramm), das erspart das schreiben von Update Software&amp;lt;br&amp;gt;&lt;br /&gt;
* HR20E sollte nach dem Start prüfen ob Programm gültig und nur dann das Anwenderprogramm starten&lt;br /&gt;
* Protokoll sollte Updatevorgang aus dem laufenden Betrieb unterstützen (Sprung in den Bootloader)&lt;br /&gt;
&lt;br /&gt;
== Vorschlag 1 ==&lt;br /&gt;
X-Modem Protokoll (mit CRC)&amp;lt;br&amp;gt;&lt;br /&gt;
Hier gibt es eine fertige Lösung für das Etherboot projekt, deren übername gestattet ist.&amp;lt;br&amp;gt; &lt;br /&gt;
Größe ist hier kleiner 1kb und wohl verkraftbar.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vorteil:&amp;lt;br&amp;gt;&lt;br /&gt;
* etablierte Technik&lt;br /&gt;
* von anderen Herstellern Verwendet&lt;br /&gt;
* wird von den meisten Terminal Programmen unterstützt&lt;br /&gt;
* Gesichert durch Checksumme&lt;br /&gt;
Nachteil:&amp;lt;br&amp;gt;&lt;br /&gt;
* Aufwendige Checksummen Berechnung oder Lookup Tabelle Notwendig&lt;br /&gt;
&lt;br /&gt;
== Vorschlag 2 ==&lt;br /&gt;
Verwendung des [[AVR_Bootloader_FastBoot_von_Peter_Dannegger]]:&lt;br /&gt;
Der ist sehr klein, erprobt, leicht anwendbar und funzt auch sehr gut. Die Windows-Software fuer den Upload ist auch sehr gelungen. Auf Grund des o.g. Grundsatzproblems und der Tatsache dass die Neuentwicklung eines Bootladers sehr anspruchsvoll ist, halte ich es an dieser Stelle fuer besser, das Rad nicht neu zu erfinden.&lt;br /&gt;
&lt;br /&gt;
= Entwicklungsumgebung =&lt;br /&gt;
* Editor, Debugger, Compiler&lt;br /&gt;
** WinAVR version (20071221), sprich GCC 4.2.2 sowie avr-libc 1.6.0&lt;br /&gt;
** AVR Studio 4 &lt;br /&gt;
* JTAG ICE&lt;br /&gt;
** Atmel AVR JTAGICE MK2 &lt;br /&gt;
** AVR Dragon (z.B. http://elmicro.com/de/atavrdragon.html)&lt;br /&gt;
** Olimex-Seriell http://www.olimex.com/dev/avr-jtag.html  &lt;br /&gt;
** Olimex-USB http://www.olimex.com/dev/avr-usb-jtag.html &lt;br /&gt;
&lt;br /&gt;
= Sonstiges =&lt;br /&gt;
== Altes Protokoll ==&lt;br /&gt;
[[HR20_Protocol_V2 | Hier ]] hat mal einer ein Protokoll eingegeben.&lt;br /&gt;
Das scheint aber nicht zu der Version 2.04 zu passen. &lt;br /&gt;
Ich habe es nicht gelöscht, falls es jemanden interessiert.&lt;br /&gt;
&lt;br /&gt;
[[Category:Projekte|!]]&lt;/div&gt;</summary>
		<author><name>Dario</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=32672</id>
		<title>Heizungssteuerung mit Honeywell HR20</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=32672"/>
		<updated>2008-11-23T12:26:33Z</updated>

		<summary type="html">&lt;p&gt;Dario: Änderung 32671 von Dario (Diskussion) wurde rückgängig gemacht.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von DarioC&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Wie alles begann =&lt;br /&gt;
&lt;br /&gt;
Nachdem von Uwe Felgentreu vor nunmehr vor über drei Jahren (genau am 17.11.2004 um 11:26) hier in diesem Forum den Thread mit dem Titel &#039;&#039;Honeywell Rondostat HR20E per AVR steuern und konfigurieren&#039;&#039; gestartet hat ist es nun langsam soweit, dass das Ganze auch ein Projekt wird. &lt;br /&gt;
&lt;br /&gt;
Den Thread dazu kann der interessierte Leser [http://www.mikrocontroller.net/topic/17603 hier nachlesen] &lt;br /&gt;
&lt;br /&gt;
= Projektziel =&lt;br /&gt;
&lt;br /&gt;
Wir konzentrieren uns in erster Linie auf den Honeywell Rondostat HR20E mit ausgelieferten Softwareversion 2.04. Dass es ähnliche andere Geräte gibt behalten wir bei der Entwicklung im Hinterkopf.&lt;br /&gt;
&lt;br /&gt;
Basierend auf dieser Hardware wollen wir eine neue Software entwickeln. &lt;br /&gt;
Dabei können wir ausser der Hardware nichts weiter verwenden, da die Originalsoftware geschützt ist und nicht ausgelesen werden kann.&lt;br /&gt;
&lt;br /&gt;
== Phase 1 ==&lt;br /&gt;
Die Software soll die Funktionen bieten, die die Originalsoftware auch bietet, später können dies dann um zusätzliche Funktionen erweitert werden. Die wichtigsten Funktionen sind:&lt;br /&gt;
&lt;br /&gt;
* Temperaturregelung&lt;br /&gt;
* Echtzeituhr&lt;br /&gt;
* Ausnutzen der Sleep Funktion&lt;br /&gt;
* Anzeige Soll-Temperatur und der Uhrzeit&lt;br /&gt;
* Einstellung der Soll-Temperatur&lt;br /&gt;
* Uhrzeitgesteuerte Einstellung der Soll-Temperatur &lt;br /&gt;
* Fenster-Offen-Erkennung&lt;br /&gt;
* Ventilfreispülungsfunktion&lt;br /&gt;
&lt;br /&gt;
== Phase 2 ==&lt;br /&gt;
&lt;br /&gt;
Hier liegt der Sinn des ganzen Projektes: Durch diese zusätzlichen Funktionen wollen wir den Nutzwert des Thermostaten erheblich steigern:&lt;br /&gt;
&lt;br /&gt;
* Programmierung der Schaltzeiten und Temperaturen über externe Schnittstelle&lt;br /&gt;
* Abfrage der Messwerte und Parameter über externe Schnittstelle&lt;br /&gt;
* Vernetzung der Thermostaten untereinander&lt;br /&gt;
* Zusätzliche externe Schnittstellen (neben UART auch CAN und Funk)&lt;br /&gt;
* Erweiterung der Anzeige um&lt;br /&gt;
** Ist-Temperatur &lt;br /&gt;
** Ventilstellung&lt;br /&gt;
** Funkschnittstelle&lt;br /&gt;
*** RFM12 http://www.hoperf.com/rf_fsk.asp&lt;br /&gt;
**** Library dazu im [https://roulette.das-labor.org/trac/browser/microcontroller/src-atmel/lib/rfm12/ SVN], [http://www.das-labor.org/wiki/Datenfunk_mit_dem_AVR Doku hier]&lt;br /&gt;
*** Zigbee http://www.meshnetics.com/zigbee-modules&lt;br /&gt;
** ...&lt;br /&gt;
* Bootloader, damit Leute mitarbeiten können, die keine JTAG haben. Mit einem JTAG könnte man den Bootloader Flashen, ohne den Thermostaten öffnen zu müssen. Von da an kann man über den Programmierstecker mit einem umgebauten Handykabel den Thermostaten neu flashen.&lt;br /&gt;
&lt;br /&gt;
= Lizenz =&lt;br /&gt;
Die Software wird unter GPL v2 gestellt.&lt;br /&gt;
&lt;br /&gt;
= Subversion Repository =&lt;br /&gt;
Das alte SVN Repository auf https://opensvn.csie.org war zu lahm, &amp;lt;BR&amp;gt;&lt;br /&gt;
daher haben wir ein Projekt auf Sourcefore angelegt.&lt;br /&gt;
=== Zugangsdaten ===&lt;br /&gt;
Projektseite:         http://sourceforge.net/projects/openhr20/ &amp;lt;BR&amp;gt;&lt;br /&gt;
Repository Location: https://openhr20.svn.sourceforge.net/svnroot/openhr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
Browse Repository:    http://openhr20.svn.sourceforge.net/viewvc/openhr20/ &amp;lt;BR&amp;gt;&lt;br /&gt;
=== Policy ===&lt;br /&gt;
Anonymous check out ist erlaubt. &amp;lt;br&amp;gt;&lt;br /&gt;
Wer was committen will muss freigeschaltet werden. &amp;lt;br&amp;gt;&lt;br /&gt;
Dazu brauche ich den Sourceforge Accountnamen.&amp;lt;br&amp;gt;&lt;br /&gt;
Einfch eine Email mit username und password an hr20[at]carluccio[dot]de&amp;lt;br&amp;gt;&lt;br /&gt;
Das mache ich dann von Hand und da ich nicht alle 10 Minuten Mails bearbeite kann das auch schon mal einen oder zwei Tage dauern. &amp;lt;br&amp;gt;&lt;br /&gt;
Wenn sich ein Maintainer findet, gebe ich die Zugangsdaten gerne weiter.&lt;br /&gt;
&lt;br /&gt;
=== SVN Client und Anleitung ===&lt;br /&gt;
Windows-User nutzen am besten den Tortoise-SVN-Client, den man kostenfrei [http://tortoisesvn.tigris.org hier runterladen] kann. &amp;lt;br&amp;gt;&lt;br /&gt;
Dort gibt es auch eine Anleitung zum Arbeiten mit SVN.&lt;br /&gt;
&lt;br /&gt;
= Analyse der Hardware =&lt;br /&gt;
Die Analyse hat der Dario schon gemacht, zu finden ist die jeweils aktuelle Version &lt;br /&gt;
[http://carluccio.de/images/e/e1/Hr20-analyse.pdf als PDF hier] oder [https://opensvn.csie.org/viewcvs.cgi/doc/analyse.pdf hier im SVN].&lt;br /&gt;
== Fuses ==&lt;br /&gt;
Here the settings of the fuses:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! width=&amp;quot;100&amp;quot; | &lt;br /&gt;
! width=&amp;quot;150&amp;quot; | Original    &lt;br /&gt;
! width=&amp;quot;150&amp;quot; | OpenHR20&lt;br /&gt;
|-&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | Extended&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 0xFD&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 0xFD&lt;br /&gt;
|-&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | High&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 0x91&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 0x9B&lt;br /&gt;
|-&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | Low&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 0x62&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 0xE2&lt;br /&gt;
|-&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | EESAVE&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | enabled&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | disabled&lt;br /&gt;
|-&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | BOOTSZ&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 1024 Words (1E00)      &lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 512 Words (1C00)&lt;br /&gt;
|-&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | CKDIV8 &lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 1           &lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= TODOs =&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Task&lt;br /&gt;
! Remark&lt;br /&gt;
! Responsible&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Code Review&lt;br /&gt;
| Check the code, complete doxygen coments&lt;br /&gt;
| &lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| UserManual&lt;br /&gt;
| Write a User Manual, Screenshots are in \trunk\doc\Screenshots\&lt;br /&gt;
| &lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| PC-Software&lt;br /&gt;
| Write PC-Program to: &amp;lt;BR&amp;gt;- Read and Write OpenHR20 Settings &amp;lt;BR&amp;gt;- Log Status from OpenHR20&amp;lt;BR&amp;gt;- Visualize Logfile&amp;lt;BR&amp;gt; &lt;br /&gt;
| &lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Bootloader&lt;br /&gt;
| Do we still need a Bootloader ?&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= API Beschreibung =&lt;br /&gt;
Das Projekt wird mit doxygen dokumentiert, &lt;br /&gt;
die API-Beschreibung kann aus dem Source-Code generiert werden.&lt;br /&gt;
= UART Protocoll =&lt;br /&gt;
&lt;br /&gt;
This is the documentation for the UART Protocol in Release 74 of the SVN hosted on Sourceforge:&lt;br /&gt;
&lt;br /&gt;
== Com-Port Params ==&lt;br /&gt;
* BAUD: 9600&lt;br /&gt;
* Data: 8&lt;br /&gt;
* Parity: N&lt;br /&gt;
* Stop: 1&lt;br /&gt;
&lt;br /&gt;
== Automatic calibration ==&lt;br /&gt;
When the HR20 is mounted, then the automatic calibration is started. &lt;br /&gt;
The Debug-Info during the callibration is printed to the com-interface like this:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
+ 0210&lt;br /&gt;
+ 047e&lt;br /&gt;
+ 0437&lt;br /&gt;
[... many lines deleted ...]&lt;br /&gt;
- 0681&lt;br /&gt;
- 0695&lt;br /&gt;
- 0694&lt;br /&gt;
+ 0210&lt;br /&gt;
+ 047e&lt;br /&gt;
+ 0437&lt;br /&gt;
+ 0417&lt;br /&gt;
+ 0454&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Commands ==&lt;br /&gt;
All commands have FIXED format.&lt;br /&gt;
* command &#039;&#039;&#039;X.....\n &#039;&#039;&#039; termination char&lt;br /&gt;
* X is upcase char as commad name&lt;br /&gt;
* hex numbers use ONLY lowcase chars&lt;br /&gt;
=== print version information ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 V&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 V: OpenHR20 SW version V.VV build DDDD $Rev: REV $&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Where:&lt;br /&gt;
* V.VV  Version&lt;br /&gt;
* DDDD  Date at compilition &lt;br /&gt;
* REV   SVN Revision&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 V: OpenHR20 SW version 0.21 build Nov 13 2008 23:22:08 $Rev: 72 $&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
=== print status ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 D&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 D: WW DDDDDDDD TTTTTTTT V: VV I: IIII S: SSSS B: BBBB E:EE X&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Where:&lt;br /&gt;
* &#039;&#039;&#039;WW&#039;&#039;&#039; Day of Week (monday=1)&lt;br /&gt;
* &#039;&#039;&#039;DDDDDDDD&#039;&#039;&#039; actual date &lt;br /&gt;
* &#039;&#039;&#039;TTTTTTTT&#039;&#039;&#039; actual time &lt;br /&gt;
* &#039;&#039;&#039;VV&#039;&#039;&#039; actual position of valve [%] (00=closed, 100=opened)&lt;br /&gt;
* &#039;&#039;&#039;IIII&#039;&#039;&#039; actual temperature&lt;br /&gt;
* &#039;&#039;&#039;SSSS&#039;&#039;&#039; desired temperature&lt;br /&gt;
* &#039;&#039;&#039;BBBB&#039;&#039;&#039; battary voltage [mV]&lt;br /&gt;
* &#039;&#039;&#039;EE&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;X&#039;&#039;&#039;&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 D: d3 01.10.08 12:00:16 V: 00 I: 2103 S: 1700 B: 3259 E:04 X&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== print watched wariable ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Taa&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;aa&#039;&#039;&#039; watched wariable see &#039;&#039;watch.c&#039;&#039;&lt;br /&gt;
Response:&lt;br /&gt;
(return 2 or 4 hex numbers) &lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 T[aa]=VVVV&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Where:&lt;br /&gt;
* &#039;&#039;&#039;aa&#039;&#039;&#039; watched wariable see &#039;&#039;watch.c&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;VVVV&#039;&#039;&#039; value of watched wariable &lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 T[01]=0cca&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
=== get configuration byte ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Gaa&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;aa&#039;&#039;&#039; hex address of configuration byte see eeprom.h&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 G[aa]=VV&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Where:&lt;br /&gt;
* &#039;&#039;&#039;aa&#039;&#039;&#039; hex address of configuration byte see eeprom.h&lt;br /&gt;
* &#039;&#039;&#039;VV&#039;&#039;&#039; value of configuration byte &lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 G[13]=2d&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
=== set configuration byte ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 SaaVV&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;aa&#039;&#039;&#039; hex address of configuration byte see eeprom.h&lt;br /&gt;
* &#039;&#039;&#039;VV&#039;&#039;&#039; hex value for configuration byte (hex)&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 S[aa]=VV&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Where:&lt;br /&gt;
* &#039;&#039;&#039;aa&#039;&#039;&#039; hex address of configuration byte see eeprom.h&lt;br /&gt;
* &#039;&#039;&#039;VV&#039;&#039;&#039; value of configuration byte &lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 S[13]=2d&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
=== get timer ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Rab&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;a&#039;&#039;&#039; day &lt;br /&gt;
* &#039;&#039;&#039;b&#039;&#039;&#039; slot&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 R[ab]=cddd&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Where:&lt;br /&gt;
* &#039;&#039;&#039;c&#039;&#039;&#039; timermode &lt;br /&gt;
: &#039;&#039;&#039;0&#039;&#039;&#039; frost protection&lt;br /&gt;
: &#039;&#039;&#039;1&#039;&#039;&#039; energy save&lt;br /&gt;
: &#039;&#039;&#039;2&#039;&#039;&#039; comfort&lt;br /&gt;
: &#039;&#039;&#039;3&#039;&#039;&#039; supercomfort&lt;br /&gt;
* &#039;&#039;&#039;ddd&#039;&#039;&#039; time (minutes since 00:00, hex) &lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 R[10]=21a4&lt;br /&gt;
 R[11]=121c&lt;br /&gt;
 R[12]=23c0&lt;br /&gt;
 R[13]=14ec&lt;br /&gt;
 R[14]=2fff&lt;br /&gt;
 R[15]=1fff&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
comfort at 0x1a4  = 420 / 60 = 7&lt;br /&gt;
energy save at 0x21c  = 540 / 60 = 9&lt;br /&gt;
comfort at 0x3c0  = 960 / 60 = 16&lt;br /&gt;
energy save at 0x4ec  = 1260 / 60 = 21&lt;br /&gt;
Slot 5+6 not used.&lt;br /&gt;
&lt;br /&gt;
=== set timer ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Wabcddd&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;a&#039;&#039;&#039; day &lt;br /&gt;
* &#039;&#039;&#039;b&#039;&#039;&#039; slot&lt;br /&gt;
* &#039;&#039;&#039;c&#039;&#039;&#039; timermode (0 to 3) &lt;br /&gt;
* &#039;&#039;&#039;d&#039;&#039;&#039; time time (minutes since 00:00, hex) &lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 W[ab]=cddd&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 W[10]=21a4&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Reboot ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 B1324&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;1234&#039;&#039;&#039; password (fixed at this moment)&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== set date ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Yyymmdd&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;yy&#039;&#039;&#039; year&lt;br /&gt;
* &#039;&#039;&#039;mm&#039;&#039;&#039; month&lt;br /&gt;
* &#039;&#039;&#039;dd&#039;&#039;&#039; day&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 D: WW DDDDDDDD TTTTTTTT V: VV I: IIII S: SSSS B: BBBB E:EE X&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
=== set time ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Hhhmmss&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;hh&#039;&#039;&#039; hour&lt;br /&gt;
* &#039;&#039;&#039;mm&#039;&#039;&#039; minute&lt;br /&gt;
* &#039;&#039;&#039;ss&#039;&#039;&#039; seconds&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 D: WW DDDDDDDD TTTTTTTT V: VV I: IIII S: SSSS B: BBBB E:EE X&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== set wanted temperature ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Axx&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;xx&#039;&#039;&#039; temperature [unit 0.5C] (hex)&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 D: WW DDDDDDDD TTTTTTTT V: VV I: IIII S: SSSS B: BBBB E:EE X&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Example:&lt;br /&gt;
20°C = 40 * 0,5 °C = 28 (hex)&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 A28&amp;lt;CR&amp;gt;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039;Attention: The value in the response is not the new value.&amp;lt;BR&amp;gt;The new value is updated some secondes later, so be patient and wait.&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== set mode ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Mxx&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;xx&#039;&#039;&#039; mode &lt;br /&gt;
: 00 = manu&lt;br /&gt;
: 01 = auto&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 D: WW DDDDDDDD TTTTTTTT V: VV I: IIII S: SSSS B: BBBB E:EE X&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Bootloader =&lt;br /&gt;
Um ein einfaches Update der Software, auch ohne Programmer und Zerlegen des HR20E zu ermöglichen, sollte ein Bootloader implementiert werden.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Grundsatzproblem:&#039;&#039;&#039; Fuer ein erstes Umflashen eines eben aus der Verpackung genommenen HR20s braucht man &#039;&#039;immer&#039;&#039; einen JTAG-Programmer um ueberhaupt erstmal den Bootlader selber draufzukriegen.&lt;br /&gt;
&lt;br /&gt;
== Anforderungen ==&lt;br /&gt;
* Einfaches Update ohne öffnen des HR20E&amp;lt;br&amp;gt;&lt;br /&gt;
* Nutzen bestehender Programme (Terminalprogramm), das erspart das schreiben von Update Software&amp;lt;br&amp;gt;&lt;br /&gt;
* HR20E sollte nach dem Start prüfen ob Programm gültig und nur dann das Anwenderprogramm starten&lt;br /&gt;
* Protokoll sollte Updatevorgang aus dem laufenden Betrieb unterstützen (Sprung in den Bootloader)&lt;br /&gt;
&lt;br /&gt;
== Vorschlag 1 ==&lt;br /&gt;
X-Modem Protokoll (mit CRC)&amp;lt;br&amp;gt;&lt;br /&gt;
Hier gibt es eine fertige Lösung für das Etherboot projekt, deren übername gestattet ist.&amp;lt;br&amp;gt; &lt;br /&gt;
Größe ist hier kleiner 1kb und wohl verkraftbar.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vorteil:&amp;lt;br&amp;gt;&lt;br /&gt;
* etablierte Technik&lt;br /&gt;
* von anderen Herstellern Verwendet&lt;br /&gt;
* wird von den meisten Terminal Programmen unterstützt&lt;br /&gt;
* Gesichert durch Checksumme&lt;br /&gt;
Nachteil:&amp;lt;br&amp;gt;&lt;br /&gt;
* Aufwendige Checksummen Berechnung oder Lookup Tabelle Notwendig&lt;br /&gt;
&lt;br /&gt;
== Vorschlag 2 ==&lt;br /&gt;
Verwendung des [[AVR_Bootloader_FastBoot_von_Peter_Dannegger]]:&lt;br /&gt;
Der ist sehr klein, erprobt, leicht anwendbar und funzt auch sehr gut. Die Windows-Software fuer den Upload ist auch sehr gelungen. Auf Grund des o.g. Grundsatzproblems und der Tatsache dass die Neuentwicklung eines Bootladers sehr anspruchsvoll ist, halte ich es an dieser Stelle fuer besser, das Rad nicht neu zu erfinden.&lt;br /&gt;
&lt;br /&gt;
= Entwicklungsumgebung =&lt;br /&gt;
* Editor, Debugger, Compiler&lt;br /&gt;
** WinAVR version (20071221), sprich GCC 4.2.2 sowie avr-libc 1.6.0&lt;br /&gt;
** AVR Studio 4 &lt;br /&gt;
* JTAG ICE&lt;br /&gt;
** Atmel AVR JTAGICE MK2 &lt;br /&gt;
** AVR Dragon (z.B. http://elmicro.com/de/atavrdragon.html)&lt;br /&gt;
** Olimex-Seriell http://www.olimex.com/dev/avr-jtag.html  &lt;br /&gt;
** Olimex-USB http://www.olimex.com/dev/avr-usb-jtag.html &lt;br /&gt;
&lt;br /&gt;
= Sonstiges =&lt;br /&gt;
== Altes Protokoll ==&lt;br /&gt;
[[HR20_Protocol_V2 | Hier ]] hat mal einer ein Protokoll eingegeben.&lt;br /&gt;
Das scheint aber nicht zu der Version 2.04 zu passen. &lt;br /&gt;
Ich habe es nicht gelöscht, falls es jemanden interessiert.&lt;br /&gt;
&lt;br /&gt;
[[Category:Projekte|!]]&lt;/div&gt;</summary>
		<author><name>Dario</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=32671</id>
		<title>Heizungssteuerung mit Honeywell HR20</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=32671"/>
		<updated>2008-11-23T12:25:59Z</updated>

		<summary type="html">&lt;p&gt;Dario: /* print status */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von DarioC&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Wie alles begann =&lt;br /&gt;
&lt;br /&gt;
Nachdem von Uwe Felgentreu vor nunmehr vor über drei Jahren (genau am 17.11.2004 um 11:26) hier in diesem Forum den Thread mit dem Titel &#039;&#039;Honeywell Rondostat HR20E per AVR steuern und konfigurieren&#039;&#039; gestartet hat ist es nun langsam soweit, dass das Ganze auch ein Projekt wird. &lt;br /&gt;
&lt;br /&gt;
Den Thread dazu kann der interessierte Leser [http://www.mikrocontroller.net/topic/17603 hier nachlesen] &lt;br /&gt;
&lt;br /&gt;
= Projektziel =&lt;br /&gt;
&lt;br /&gt;
Wir konzentrieren uns in erster Linie auf den Honeywell Rondostat HR20E mit ausgelieferten Softwareversion 2.04. Dass es ähnliche andere Geräte gibt behalten wir bei der Entwicklung im Hinterkopf.&lt;br /&gt;
&lt;br /&gt;
Basierend auf dieser Hardware wollen wir eine neue Software entwickeln. &lt;br /&gt;
Dabei können wir ausser der Hardware nichts weiter verwenden, da die Originalsoftware geschützt ist und nicht ausgelesen werden kann.&lt;br /&gt;
&lt;br /&gt;
== Phase 1 ==&lt;br /&gt;
Die Software soll die Funktionen bieten, die die Originalsoftware auch bietet, später können dies dann um zusätzliche Funktionen erweitert werden. Die wichtigsten Funktionen sind:&lt;br /&gt;
&lt;br /&gt;
* Temperaturregelung&lt;br /&gt;
* Echtzeituhr&lt;br /&gt;
* Ausnutzen der Sleep Funktion&lt;br /&gt;
* Anzeige Soll-Temperatur und der Uhrzeit&lt;br /&gt;
* Einstellung der Soll-Temperatur&lt;br /&gt;
* Uhrzeitgesteuerte Einstellung der Soll-Temperatur &lt;br /&gt;
* Fenster-Offen-Erkennung&lt;br /&gt;
* Ventilfreispülungsfunktion&lt;br /&gt;
&lt;br /&gt;
== Phase 2 ==&lt;br /&gt;
&lt;br /&gt;
Hier liegt der Sinn des ganzen Projektes: Durch diese zusätzlichen Funktionen wollen wir den Nutzwert des Thermostaten erheblich steigern:&lt;br /&gt;
&lt;br /&gt;
* Programmierung der Schaltzeiten und Temperaturen über externe Schnittstelle&lt;br /&gt;
* Abfrage der Messwerte und Parameter über externe Schnittstelle&lt;br /&gt;
* Vernetzung der Thermostaten untereinander&lt;br /&gt;
* Zusätzliche externe Schnittstellen (neben UART auch CAN und Funk)&lt;br /&gt;
* Erweiterung der Anzeige um&lt;br /&gt;
** Ist-Temperatur &lt;br /&gt;
** Ventilstellung&lt;br /&gt;
** Funkschnittstelle&lt;br /&gt;
*** RFM12 http://www.hoperf.com/rf_fsk.asp&lt;br /&gt;
**** Library dazu im [https://roulette.das-labor.org/trac/browser/microcontroller/src-atmel/lib/rfm12/ SVN], [http://www.das-labor.org/wiki/Datenfunk_mit_dem_AVR Doku hier]&lt;br /&gt;
*** Zigbee http://www.meshnetics.com/zigbee-modules&lt;br /&gt;
** ...&lt;br /&gt;
* Bootloader, damit Leute mitarbeiten können, die keine JTAG haben. Mit einem JTAG könnte man den Bootloader Flashen, ohne den Thermostaten öffnen zu müssen. Von da an kann man über den Programmierstecker mit einem umgebauten Handykabel den Thermostaten neu flashen.&lt;br /&gt;
&lt;br /&gt;
= Lizenz =&lt;br /&gt;
Die Software wird unter GPL v2 gestellt.&lt;br /&gt;
&lt;br /&gt;
= Subversion Repository =&lt;br /&gt;
Das alte SVN Repository auf https://opensvn.csie.org war zu lahm, &amp;lt;BR&amp;gt;&lt;br /&gt;
daher haben wir ein Projekt auf Sourcefore angelegt.&lt;br /&gt;
=== Zugangsdaten ===&lt;br /&gt;
Projektseite:         http://sourceforge.net/projects/openhr20/ &amp;lt;BR&amp;gt;&lt;br /&gt;
Repository Location: https://openhr20.svn.sourceforge.net/svnroot/openhr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
Browse Repository:    http://openhr20.svn.sourceforge.net/viewvc/openhr20/ &amp;lt;BR&amp;gt;&lt;br /&gt;
=== Policy ===&lt;br /&gt;
Anonymous check out ist erlaubt. &amp;lt;br&amp;gt;&lt;br /&gt;
Wer was committen will muss freigeschaltet werden. &amp;lt;br&amp;gt;&lt;br /&gt;
Dazu brauche ich den Sourceforge Accountnamen.&amp;lt;br&amp;gt;&lt;br /&gt;
Einfch eine Email mit username und password an hr20[at]carluccio[dot]de&amp;lt;br&amp;gt;&lt;br /&gt;
Das mache ich dann von Hand und da ich nicht alle 10 Minuten Mails bearbeite kann das auch schon mal einen oder zwei Tage dauern. &amp;lt;br&amp;gt;&lt;br /&gt;
Wenn sich ein Maintainer findet, gebe ich die Zugangsdaten gerne weiter.&lt;br /&gt;
&lt;br /&gt;
=== SVN Client und Anleitung ===&lt;br /&gt;
Windows-User nutzen am besten den Tortoise-SVN-Client, den man kostenfrei [http://tortoisesvn.tigris.org hier runterladen] kann. &amp;lt;br&amp;gt;&lt;br /&gt;
Dort gibt es auch eine Anleitung zum Arbeiten mit SVN.&lt;br /&gt;
&lt;br /&gt;
= Analyse der Hardware =&lt;br /&gt;
Die Analyse hat der Dario schon gemacht, zu finden ist die jeweils aktuelle Version &lt;br /&gt;
[http://carluccio.de/images/e/e1/Hr20-analyse.pdf als PDF hier] oder [https://opensvn.csie.org/viewcvs.cgi/doc/analyse.pdf hier im SVN].&lt;br /&gt;
== Fuses ==&lt;br /&gt;
Here the settings of the fuses:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! width=&amp;quot;100&amp;quot; | &lt;br /&gt;
! width=&amp;quot;150&amp;quot; | Original    &lt;br /&gt;
! width=&amp;quot;150&amp;quot; | OpenHR20&lt;br /&gt;
|-&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | Extended&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 0xFD&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 0xFD&lt;br /&gt;
|-&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | High&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 0x91&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 0x9B&lt;br /&gt;
|-&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | Low&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 0x62&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 0xE2&lt;br /&gt;
|-&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | EESAVE&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | enabled&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | disabled&lt;br /&gt;
|-&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | BOOTSZ&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 1024 Words (1E00)      &lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 512 Words (1C00)&lt;br /&gt;
|-&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | CKDIV8 &lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 1           &lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= TODOs =&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Task&lt;br /&gt;
! Remark&lt;br /&gt;
! Responsible&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Code Review&lt;br /&gt;
| Check the code, complete doxygen coments&lt;br /&gt;
| &lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| UserManual&lt;br /&gt;
| Write a User Manual, Screenshots are in \trunk\doc\Screenshots\&lt;br /&gt;
| &lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| PC-Software&lt;br /&gt;
| Write PC-Program to: &amp;lt;BR&amp;gt;- Read and Write OpenHR20 Settings &amp;lt;BR&amp;gt;- Log Status from OpenHR20&amp;lt;BR&amp;gt;- Visualize Logfile&amp;lt;BR&amp;gt; &lt;br /&gt;
| &lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Bootloader&lt;br /&gt;
| Do we still need a Bootloader ?&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= API Beschreibung =&lt;br /&gt;
Das Projekt wird mit doxygen dokumentiert, &lt;br /&gt;
die API-Beschreibung kann aus dem Source-Code generiert werden.&lt;br /&gt;
= UART Protocoll =&lt;br /&gt;
&lt;br /&gt;
This is the documentation for the UART Protocol in Release 74 of the SVN hosted on Sourceforge:&lt;br /&gt;
&lt;br /&gt;
== Com-Port Params ==&lt;br /&gt;
* BAUD: 9600&lt;br /&gt;
* Data: 8&lt;br /&gt;
* Parity: N&lt;br /&gt;
* Stop: 1&lt;br /&gt;
&lt;br /&gt;
== Automatic calibration ==&lt;br /&gt;
When the HR20 is mounted, then the automatic calibration is started. &lt;br /&gt;
The Debug-Info during the callibration is printed to the com-interface like this:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
+ 0210&lt;br /&gt;
+ 047e&lt;br /&gt;
+ 0437&lt;br /&gt;
[... many lines deleted ...]&lt;br /&gt;
- 0681&lt;br /&gt;
- 0695&lt;br /&gt;
- 0694&lt;br /&gt;
+ 0210&lt;br /&gt;
+ 047e&lt;br /&gt;
+ 0437&lt;br /&gt;
+ 0417&lt;br /&gt;
+ 0454&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Commands ==&lt;br /&gt;
All commands have FIXED format.&lt;br /&gt;
* command &#039;&#039;&#039;X.....\n &#039;&#039;&#039; termination char&lt;br /&gt;
* X is upcase char as commad name&lt;br /&gt;
* hex numbers use ONLY lowcase chars&lt;br /&gt;
=== print version information ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 V&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 V: OpenHR20 SW version V.VV build DDDD $Rev: REV $&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Where:&lt;br /&gt;
* V.VV  Version&lt;br /&gt;
* DDDD  Date at compilition &lt;br /&gt;
* REV   SVN Revision&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 V: OpenHR20 SW version 0.21 build Nov 13 2008 23:22:08 $Rev: 72 $&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
=== print status ===&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
! width=&amp;quot;100&amp;quot; | Cmd&lt;br /&gt;
! width=&amp;quot;500&amp;quot; | Response&lt;br /&gt;
! width=&amp;quot;500&amp;quot; | Params&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
 D&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
 D: WW DDDDDDDD TTTTTTTT V: VV I: IIII S: SSSS B: BBBB E:EE X&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
 WW        Day of Week (monday=1)&lt;br /&gt;
 DDDDDDDD  actual date &lt;br /&gt;
 TTTTTTTT  actual time &lt;br /&gt;
 VV        actual position of valve [%] (00=closed, 100=opened)&lt;br /&gt;
 IIII      actual temperature&lt;br /&gt;
 SSSS      desired temperature&lt;br /&gt;
 BBBB      battary voltage [mV]&lt;br /&gt;
 EE&lt;br /&gt;
 X&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
 D&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
 D: WW DDDDDDDD TTTTTTTT V: VV I: IIII S: SSSS B: BBBB E:EE X&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
 WW        Day of Week (monday=1)&lt;br /&gt;
 DDDDDDDD  actual date &lt;br /&gt;
 TTTTTTTT  actual time &lt;br /&gt;
 VV        actual position of valve [%] (00=closed, 100=opened)&lt;br /&gt;
 IIII      actual temperature&lt;br /&gt;
 SSSS      desired temperature&lt;br /&gt;
 BBBB      battary voltage [mV]&lt;br /&gt;
 EE&lt;br /&gt;
 X&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== print watched wariable ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Taa&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;aa&#039;&#039;&#039; watched wariable see &#039;&#039;watch.c&#039;&#039;&lt;br /&gt;
Response:&lt;br /&gt;
(return 2 or 4 hex numbers) &lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 T[aa]=VVVV&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Where:&lt;br /&gt;
* &#039;&#039;&#039;aa&#039;&#039;&#039; watched wariable see &#039;&#039;watch.c&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;VVVV&#039;&#039;&#039; value of watched wariable &lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 T[01]=0cca&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
=== get configuration byte ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Gaa&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;aa&#039;&#039;&#039; hex address of configuration byte see eeprom.h&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 G[aa]=VV&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Where:&lt;br /&gt;
* &#039;&#039;&#039;aa&#039;&#039;&#039; hex address of configuration byte see eeprom.h&lt;br /&gt;
* &#039;&#039;&#039;VV&#039;&#039;&#039; value of configuration byte &lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 G[13]=2d&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
=== set configuration byte ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 SaaVV&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;aa&#039;&#039;&#039; hex address of configuration byte see eeprom.h&lt;br /&gt;
* &#039;&#039;&#039;VV&#039;&#039;&#039; hex value for configuration byte (hex)&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 S[aa]=VV&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Where:&lt;br /&gt;
* &#039;&#039;&#039;aa&#039;&#039;&#039; hex address of configuration byte see eeprom.h&lt;br /&gt;
* &#039;&#039;&#039;VV&#039;&#039;&#039; value of configuration byte &lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 S[13]=2d&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
=== get timer ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Rab&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;a&#039;&#039;&#039; day &lt;br /&gt;
* &#039;&#039;&#039;b&#039;&#039;&#039; slot&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 R[ab]=cddd&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Where:&lt;br /&gt;
* &#039;&#039;&#039;c&#039;&#039;&#039; timermode &lt;br /&gt;
: &#039;&#039;&#039;0&#039;&#039;&#039; frost protection&lt;br /&gt;
: &#039;&#039;&#039;1&#039;&#039;&#039; energy save&lt;br /&gt;
: &#039;&#039;&#039;2&#039;&#039;&#039; comfort&lt;br /&gt;
: &#039;&#039;&#039;3&#039;&#039;&#039; supercomfort&lt;br /&gt;
* &#039;&#039;&#039;ddd&#039;&#039;&#039; time (minutes since 00:00, hex) &lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 R[10]=21a4&lt;br /&gt;
 R[11]=121c&lt;br /&gt;
 R[12]=23c0&lt;br /&gt;
 R[13]=14ec&lt;br /&gt;
 R[14]=2fff&lt;br /&gt;
 R[15]=1fff&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
comfort at 0x1a4  = 420 / 60 = 7&lt;br /&gt;
energy save at 0x21c  = 540 / 60 = 9&lt;br /&gt;
comfort at 0x3c0  = 960 / 60 = 16&lt;br /&gt;
energy save at 0x4ec  = 1260 / 60 = 21&lt;br /&gt;
Slot 5+6 not used.&lt;br /&gt;
&lt;br /&gt;
=== set timer ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Wabcddd&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;a&#039;&#039;&#039; day &lt;br /&gt;
* &#039;&#039;&#039;b&#039;&#039;&#039; slot&lt;br /&gt;
* &#039;&#039;&#039;c&#039;&#039;&#039; timermode (0 to 3) &lt;br /&gt;
* &#039;&#039;&#039;d&#039;&#039;&#039; time time (minutes since 00:00, hex) &lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 W[ab]=cddd&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 W[10]=21a4&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Reboot ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 B1324&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;1234&#039;&#039;&#039; password (fixed at this moment)&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== set date ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Yyymmdd&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;yy&#039;&#039;&#039; year&lt;br /&gt;
* &#039;&#039;&#039;mm&#039;&#039;&#039; month&lt;br /&gt;
* &#039;&#039;&#039;dd&#039;&#039;&#039; day&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 D: WW DDDDDDDD TTTTTTTT V: VV I: IIII S: SSSS B: BBBB E:EE X&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
=== set time ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Hhhmmss&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;hh&#039;&#039;&#039; hour&lt;br /&gt;
* &#039;&#039;&#039;mm&#039;&#039;&#039; minute&lt;br /&gt;
* &#039;&#039;&#039;ss&#039;&#039;&#039; seconds&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 D: WW DDDDDDDD TTTTTTTT V: VV I: IIII S: SSSS B: BBBB E:EE X&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== set wanted temperature ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Axx&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;xx&#039;&#039;&#039; temperature [unit 0.5C] (hex)&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 D: WW DDDDDDDD TTTTTTTT V: VV I: IIII S: SSSS B: BBBB E:EE X&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Example:&lt;br /&gt;
20°C = 40 * 0,5 °C = 28 (hex)&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 A28&amp;lt;CR&amp;gt;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039;Attention: The value in the response is not the new value.&amp;lt;BR&amp;gt;The new value is updated some secondes later, so be patient and wait.&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== set mode ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Mxx&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;xx&#039;&#039;&#039; mode &lt;br /&gt;
: 00 = manu&lt;br /&gt;
: 01 = auto&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 D: WW DDDDDDDD TTTTTTTT V: VV I: IIII S: SSSS B: BBBB E:EE X&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Bootloader =&lt;br /&gt;
Um ein einfaches Update der Software, auch ohne Programmer und Zerlegen des HR20E zu ermöglichen, sollte ein Bootloader implementiert werden.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Grundsatzproblem:&#039;&#039;&#039; Fuer ein erstes Umflashen eines eben aus der Verpackung genommenen HR20s braucht man &#039;&#039;immer&#039;&#039; einen JTAG-Programmer um ueberhaupt erstmal den Bootlader selber draufzukriegen.&lt;br /&gt;
&lt;br /&gt;
== Anforderungen ==&lt;br /&gt;
* Einfaches Update ohne öffnen des HR20E&amp;lt;br&amp;gt;&lt;br /&gt;
* Nutzen bestehender Programme (Terminalprogramm), das erspart das schreiben von Update Software&amp;lt;br&amp;gt;&lt;br /&gt;
* HR20E sollte nach dem Start prüfen ob Programm gültig und nur dann das Anwenderprogramm starten&lt;br /&gt;
* Protokoll sollte Updatevorgang aus dem laufenden Betrieb unterstützen (Sprung in den Bootloader)&lt;br /&gt;
&lt;br /&gt;
== Vorschlag 1 ==&lt;br /&gt;
X-Modem Protokoll (mit CRC)&amp;lt;br&amp;gt;&lt;br /&gt;
Hier gibt es eine fertige Lösung für das Etherboot projekt, deren übername gestattet ist.&amp;lt;br&amp;gt; &lt;br /&gt;
Größe ist hier kleiner 1kb und wohl verkraftbar.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vorteil:&amp;lt;br&amp;gt;&lt;br /&gt;
* etablierte Technik&lt;br /&gt;
* von anderen Herstellern Verwendet&lt;br /&gt;
* wird von den meisten Terminal Programmen unterstützt&lt;br /&gt;
* Gesichert durch Checksumme&lt;br /&gt;
Nachteil:&amp;lt;br&amp;gt;&lt;br /&gt;
* Aufwendige Checksummen Berechnung oder Lookup Tabelle Notwendig&lt;br /&gt;
&lt;br /&gt;
== Vorschlag 2 ==&lt;br /&gt;
Verwendung des [[AVR_Bootloader_FastBoot_von_Peter_Dannegger]]:&lt;br /&gt;
Der ist sehr klein, erprobt, leicht anwendbar und funzt auch sehr gut. Die Windows-Software fuer den Upload ist auch sehr gelungen. Auf Grund des o.g. Grundsatzproblems und der Tatsache dass die Neuentwicklung eines Bootladers sehr anspruchsvoll ist, halte ich es an dieser Stelle fuer besser, das Rad nicht neu zu erfinden.&lt;br /&gt;
&lt;br /&gt;
= Entwicklungsumgebung =&lt;br /&gt;
* Editor, Debugger, Compiler&lt;br /&gt;
** WinAVR version (20071221), sprich GCC 4.2.2 sowie avr-libc 1.6.0&lt;br /&gt;
** AVR Studio 4 &lt;br /&gt;
* JTAG ICE&lt;br /&gt;
** Atmel AVR JTAGICE MK2 &lt;br /&gt;
** AVR Dragon (z.B. http://elmicro.com/de/atavrdragon.html)&lt;br /&gt;
** Olimex-Seriell http://www.olimex.com/dev/avr-jtag.html  &lt;br /&gt;
** Olimex-USB http://www.olimex.com/dev/avr-usb-jtag.html &lt;br /&gt;
&lt;br /&gt;
= Sonstiges =&lt;br /&gt;
== Altes Protokoll ==&lt;br /&gt;
[[HR20_Protocol_V2 | Hier ]] hat mal einer ein Protokoll eingegeben.&lt;br /&gt;
Das scheint aber nicht zu der Version 2.04 zu passen. &lt;br /&gt;
Ich habe es nicht gelöscht, falls es jemanden interessiert.&lt;br /&gt;
&lt;br /&gt;
[[Category:Projekte|!]]&lt;/div&gt;</summary>
		<author><name>Dario</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=32670</id>
		<title>Heizungssteuerung mit Honeywell HR20</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=32670"/>
		<updated>2008-11-23T12:17:49Z</updated>

		<summary type="html">&lt;p&gt;Dario: /* Commands */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von DarioC&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Wie alles begann =&lt;br /&gt;
&lt;br /&gt;
Nachdem von Uwe Felgentreu vor nunmehr vor über drei Jahren (genau am 17.11.2004 um 11:26) hier in diesem Forum den Thread mit dem Titel &#039;&#039;Honeywell Rondostat HR20E per AVR steuern und konfigurieren&#039;&#039; gestartet hat ist es nun langsam soweit, dass das Ganze auch ein Projekt wird. &lt;br /&gt;
&lt;br /&gt;
Den Thread dazu kann der interessierte Leser [http://www.mikrocontroller.net/topic/17603 hier nachlesen] &lt;br /&gt;
&lt;br /&gt;
= Projektziel =&lt;br /&gt;
&lt;br /&gt;
Wir konzentrieren uns in erster Linie auf den Honeywell Rondostat HR20E mit ausgelieferten Softwareversion 2.04. Dass es ähnliche andere Geräte gibt behalten wir bei der Entwicklung im Hinterkopf.&lt;br /&gt;
&lt;br /&gt;
Basierend auf dieser Hardware wollen wir eine neue Software entwickeln. &lt;br /&gt;
Dabei können wir ausser der Hardware nichts weiter verwenden, da die Originalsoftware geschützt ist und nicht ausgelesen werden kann.&lt;br /&gt;
&lt;br /&gt;
== Phase 1 ==&lt;br /&gt;
Die Software soll die Funktionen bieten, die die Originalsoftware auch bietet, später können dies dann um zusätzliche Funktionen erweitert werden. Die wichtigsten Funktionen sind:&lt;br /&gt;
&lt;br /&gt;
* Temperaturregelung&lt;br /&gt;
* Echtzeituhr&lt;br /&gt;
* Ausnutzen der Sleep Funktion&lt;br /&gt;
* Anzeige Soll-Temperatur und der Uhrzeit&lt;br /&gt;
* Einstellung der Soll-Temperatur&lt;br /&gt;
* Uhrzeitgesteuerte Einstellung der Soll-Temperatur &lt;br /&gt;
* Fenster-Offen-Erkennung&lt;br /&gt;
* Ventilfreispülungsfunktion&lt;br /&gt;
&lt;br /&gt;
== Phase 2 ==&lt;br /&gt;
&lt;br /&gt;
Hier liegt der Sinn des ganzen Projektes: Durch diese zusätzlichen Funktionen wollen wir den Nutzwert des Thermostaten erheblich steigern:&lt;br /&gt;
&lt;br /&gt;
* Programmierung der Schaltzeiten und Temperaturen über externe Schnittstelle&lt;br /&gt;
* Abfrage der Messwerte und Parameter über externe Schnittstelle&lt;br /&gt;
* Vernetzung der Thermostaten untereinander&lt;br /&gt;
* Zusätzliche externe Schnittstellen (neben UART auch CAN und Funk)&lt;br /&gt;
* Erweiterung der Anzeige um&lt;br /&gt;
** Ist-Temperatur &lt;br /&gt;
** Ventilstellung&lt;br /&gt;
** Funkschnittstelle&lt;br /&gt;
*** RFM12 http://www.hoperf.com/rf_fsk.asp&lt;br /&gt;
**** Library dazu im [https://roulette.das-labor.org/trac/browser/microcontroller/src-atmel/lib/rfm12/ SVN], [http://www.das-labor.org/wiki/Datenfunk_mit_dem_AVR Doku hier]&lt;br /&gt;
*** Zigbee http://www.meshnetics.com/zigbee-modules&lt;br /&gt;
** ...&lt;br /&gt;
* Bootloader, damit Leute mitarbeiten können, die keine JTAG haben. Mit einem JTAG könnte man den Bootloader Flashen, ohne den Thermostaten öffnen zu müssen. Von da an kann man über den Programmierstecker mit einem umgebauten Handykabel den Thermostaten neu flashen.&lt;br /&gt;
&lt;br /&gt;
= Lizenz =&lt;br /&gt;
Die Software wird unter GPL v2 gestellt.&lt;br /&gt;
&lt;br /&gt;
= Subversion Repository =&lt;br /&gt;
Das alte SVN Repository auf https://opensvn.csie.org war zu lahm, &amp;lt;BR&amp;gt;&lt;br /&gt;
daher haben wir ein Projekt auf Sourcefore angelegt.&lt;br /&gt;
=== Zugangsdaten ===&lt;br /&gt;
Projektseite:         http://sourceforge.net/projects/openhr20/ &amp;lt;BR&amp;gt;&lt;br /&gt;
Repository Location: https://openhr20.svn.sourceforge.net/svnroot/openhr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
Browse Repository:    http://openhr20.svn.sourceforge.net/viewvc/openhr20/ &amp;lt;BR&amp;gt;&lt;br /&gt;
=== Policy ===&lt;br /&gt;
Anonymous check out ist erlaubt. &amp;lt;br&amp;gt;&lt;br /&gt;
Wer was committen will muss freigeschaltet werden. &amp;lt;br&amp;gt;&lt;br /&gt;
Dazu brauche ich den Sourceforge Accountnamen.&amp;lt;br&amp;gt;&lt;br /&gt;
Einfch eine Email mit username und password an hr20[at]carluccio[dot]de&amp;lt;br&amp;gt;&lt;br /&gt;
Das mache ich dann von Hand und da ich nicht alle 10 Minuten Mails bearbeite kann das auch schon mal einen oder zwei Tage dauern. &amp;lt;br&amp;gt;&lt;br /&gt;
Wenn sich ein Maintainer findet, gebe ich die Zugangsdaten gerne weiter.&lt;br /&gt;
&lt;br /&gt;
=== SVN Client und Anleitung ===&lt;br /&gt;
Windows-User nutzen am besten den Tortoise-SVN-Client, den man kostenfrei [http://tortoisesvn.tigris.org hier runterladen] kann. &amp;lt;br&amp;gt;&lt;br /&gt;
Dort gibt es auch eine Anleitung zum Arbeiten mit SVN.&lt;br /&gt;
&lt;br /&gt;
= Analyse der Hardware =&lt;br /&gt;
Die Analyse hat der Dario schon gemacht, zu finden ist die jeweils aktuelle Version &lt;br /&gt;
[http://carluccio.de/images/e/e1/Hr20-analyse.pdf als PDF hier] oder [https://opensvn.csie.org/viewcvs.cgi/doc/analyse.pdf hier im SVN].&lt;br /&gt;
== Fuses ==&lt;br /&gt;
Here the settings of the fuses:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! width=&amp;quot;100&amp;quot; | &lt;br /&gt;
! width=&amp;quot;150&amp;quot; | Original    &lt;br /&gt;
! width=&amp;quot;150&amp;quot; | OpenHR20&lt;br /&gt;
|-&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | Extended&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 0xFD&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 0xFD&lt;br /&gt;
|-&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | High&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 0x91&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 0x9B&lt;br /&gt;
|-&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | Low&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 0x62&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 0xE2&lt;br /&gt;
|-&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | EESAVE&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | enabled&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | disabled&lt;br /&gt;
|-&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | BOOTSZ&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 1024 Words (1E00)      &lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 512 Words (1C00)&lt;br /&gt;
|-&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | CKDIV8 &lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 1           &lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= TODOs =&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Task&lt;br /&gt;
! Remark&lt;br /&gt;
! Responsible&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Code Review&lt;br /&gt;
| Check the code, complete doxygen coments&lt;br /&gt;
| &lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| UserManual&lt;br /&gt;
| Write a User Manual, Screenshots are in \trunk\doc\Screenshots\&lt;br /&gt;
| &lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| PC-Software&lt;br /&gt;
| Write PC-Program to: &amp;lt;BR&amp;gt;- Read and Write OpenHR20 Settings &amp;lt;BR&amp;gt;- Log Status from OpenHR20&amp;lt;BR&amp;gt;- Visualize Logfile&amp;lt;BR&amp;gt; &lt;br /&gt;
| &lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Bootloader&lt;br /&gt;
| Do we still need a Bootloader ?&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= API Beschreibung =&lt;br /&gt;
Das Projekt wird mit doxygen dokumentiert, &lt;br /&gt;
die API-Beschreibung kann aus dem Source-Code generiert werden.&lt;br /&gt;
= UART Protocoll =&lt;br /&gt;
&lt;br /&gt;
This is the documentation for the UART Protocol in Release 74 of the SVN hosted on Sourceforge:&lt;br /&gt;
&lt;br /&gt;
== Com-Port Params ==&lt;br /&gt;
* BAUD: 9600&lt;br /&gt;
* Data: 8&lt;br /&gt;
* Parity: N&lt;br /&gt;
* Stop: 1&lt;br /&gt;
&lt;br /&gt;
== Automatic calibration ==&lt;br /&gt;
When the HR20 is mounted, then the automatic calibration is started. &lt;br /&gt;
The Debug-Info during the callibration is printed to the com-interface like this:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
+ 0210&lt;br /&gt;
+ 047e&lt;br /&gt;
+ 0437&lt;br /&gt;
[... many lines deleted ...]&lt;br /&gt;
- 0681&lt;br /&gt;
- 0695&lt;br /&gt;
- 0694&lt;br /&gt;
+ 0210&lt;br /&gt;
+ 047e&lt;br /&gt;
+ 0437&lt;br /&gt;
+ 0417&lt;br /&gt;
+ 0454&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Commands ==&lt;br /&gt;
All commands have FIXED format.&lt;br /&gt;
* command &#039;&#039;&#039;X.....\n &#039;&#039;&#039; termination char&lt;br /&gt;
* X is upcase char as commad name&lt;br /&gt;
* hex numbers use ONLY lowcase chars&lt;br /&gt;
=== print version information ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 V&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 V: OpenHR20 SW version V.VV build DDDD $Rev: REV $&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Where:&lt;br /&gt;
* V.VV  Version&lt;br /&gt;
* DDDD  Date at compilition &lt;br /&gt;
* REV   SVN Revision&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 V: OpenHR20 SW version 0.21 build Nov 13 2008 23:22:08 $Rev: 72 $&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
=== print status ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 D&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 D: WW DDDDDDDD TTTTTTTT V: VV I: IIII S: SSSS B: BBBB E:EE X&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Where:&lt;br /&gt;
* &#039;&#039;&#039;WW&#039;&#039;&#039; Day of Week (monday=1)&lt;br /&gt;
* &#039;&#039;&#039;DDDDDDDD&#039;&#039;&#039; actual date &lt;br /&gt;
* &#039;&#039;&#039;TTTTTTTT&#039;&#039;&#039; actual time &lt;br /&gt;
* &#039;&#039;&#039;VV&#039;&#039;&#039; actual position of valve [%] (00=closed, 100=opened)&lt;br /&gt;
* &#039;&#039;&#039;IIII&#039;&#039;&#039; actual temperature&lt;br /&gt;
* &#039;&#039;&#039;SSSS&#039;&#039;&#039; desired temperature&lt;br /&gt;
* &#039;&#039;&#039;BBBB&#039;&#039;&#039; battary voltage [mV]&lt;br /&gt;
* &#039;&#039;&#039;EE&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;X&#039;&#039;&#039;&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 D: d3 01.10.08 12:00:16 V: 00 I: 2103 S: 1700 B: 3259 E:04 X&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== print watched wariable ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Taa&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;aa&#039;&#039;&#039; watched wariable see &#039;&#039;watch.c&#039;&#039;&lt;br /&gt;
Response:&lt;br /&gt;
(return 2 or 4 hex numbers) &lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 T[aa]=VVVV&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Where:&lt;br /&gt;
* &#039;&#039;&#039;aa&#039;&#039;&#039; watched wariable see &#039;&#039;watch.c&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;VVVV&#039;&#039;&#039; value of watched wariable &lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 T[01]=0cca&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
=== get configuration byte ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Gaa&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;aa&#039;&#039;&#039; hex address of configuration byte see eeprom.h&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 G[aa]=VV&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Where:&lt;br /&gt;
* &#039;&#039;&#039;aa&#039;&#039;&#039; hex address of configuration byte see eeprom.h&lt;br /&gt;
* &#039;&#039;&#039;VV&#039;&#039;&#039; value of configuration byte &lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 G[13]=2d&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
=== set configuration byte ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 SaaVV&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;aa&#039;&#039;&#039; hex address of configuration byte see eeprom.h&lt;br /&gt;
* &#039;&#039;&#039;VV&#039;&#039;&#039; hex value for configuration byte (hex)&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 S[aa]=VV&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Where:&lt;br /&gt;
* &#039;&#039;&#039;aa&#039;&#039;&#039; hex address of configuration byte see eeprom.h&lt;br /&gt;
* &#039;&#039;&#039;VV&#039;&#039;&#039; value of configuration byte &lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 S[13]=2d&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
=== get timer ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Rab&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;a&#039;&#039;&#039; day &lt;br /&gt;
* &#039;&#039;&#039;b&#039;&#039;&#039; slot&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 R[ab]=cddd&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Where:&lt;br /&gt;
* &#039;&#039;&#039;c&#039;&#039;&#039; timermode &lt;br /&gt;
: &#039;&#039;&#039;0&#039;&#039;&#039; frost protection&lt;br /&gt;
: &#039;&#039;&#039;1&#039;&#039;&#039; energy save&lt;br /&gt;
: &#039;&#039;&#039;2&#039;&#039;&#039; comfort&lt;br /&gt;
: &#039;&#039;&#039;3&#039;&#039;&#039; supercomfort&lt;br /&gt;
* &#039;&#039;&#039;ddd&#039;&#039;&#039; time (minutes since 00:00, hex) &lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 R[10]=21a4&lt;br /&gt;
 R[11]=121c&lt;br /&gt;
 R[12]=23c0&lt;br /&gt;
 R[13]=14ec&lt;br /&gt;
 R[14]=2fff&lt;br /&gt;
 R[15]=1fff&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
comfort at 0x1a4  = 420 / 60 = 7&lt;br /&gt;
energy save at 0x21c  = 540 / 60 = 9&lt;br /&gt;
comfort at 0x3c0  = 960 / 60 = 16&lt;br /&gt;
energy save at 0x4ec  = 1260 / 60 = 21&lt;br /&gt;
Slot 5+6 not used.&lt;br /&gt;
&lt;br /&gt;
=== set timer ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Wabcddd&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;a&#039;&#039;&#039; day &lt;br /&gt;
* &#039;&#039;&#039;b&#039;&#039;&#039; slot&lt;br /&gt;
* &#039;&#039;&#039;c&#039;&#039;&#039; timermode (0 to 3) &lt;br /&gt;
* &#039;&#039;&#039;d&#039;&#039;&#039; time time (minutes since 00:00, hex) &lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 W[ab]=cddd&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 W[10]=21a4&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Reboot ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 B1324&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;1234&#039;&#039;&#039; password (fixed at this moment)&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== set date ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Yyymmdd&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;yy&#039;&#039;&#039; year&lt;br /&gt;
* &#039;&#039;&#039;mm&#039;&#039;&#039; month&lt;br /&gt;
* &#039;&#039;&#039;dd&#039;&#039;&#039; day&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 D: WW DDDDDDDD TTTTTTTT V: VV I: IIII S: SSSS B: BBBB E:EE X&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
=== set time ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Hhhmmss&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;hh&#039;&#039;&#039; hour&lt;br /&gt;
* &#039;&#039;&#039;mm&#039;&#039;&#039; minute&lt;br /&gt;
* &#039;&#039;&#039;ss&#039;&#039;&#039; seconds&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 D: WW DDDDDDDD TTTTTTTT V: VV I: IIII S: SSSS B: BBBB E:EE X&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== set wanted temperature ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Axx&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;xx&#039;&#039;&#039; temperature [unit 0.5C] (hex)&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 D: WW DDDDDDDD TTTTTTTT V: VV I: IIII S: SSSS B: BBBB E:EE X&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Example:&lt;br /&gt;
20°C = 40 * 0,5 °C = 28 (hex)&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 A28&amp;lt;CR&amp;gt;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039;Attention: The value in the response is not the new value.&amp;lt;BR&amp;gt;The new value is updated some secondes later, so be patient and wait.&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== set mode ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Mxx&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;xx&#039;&#039;&#039; mode &lt;br /&gt;
: 00 = manu&lt;br /&gt;
: 01 = auto&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 D: WW DDDDDDDD TTTTTTTT V: VV I: IIII S: SSSS B: BBBB E:EE X&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Bootloader =&lt;br /&gt;
Um ein einfaches Update der Software, auch ohne Programmer und Zerlegen des HR20E zu ermöglichen, sollte ein Bootloader implementiert werden.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Grundsatzproblem:&#039;&#039;&#039; Fuer ein erstes Umflashen eines eben aus der Verpackung genommenen HR20s braucht man &#039;&#039;immer&#039;&#039; einen JTAG-Programmer um ueberhaupt erstmal den Bootlader selber draufzukriegen.&lt;br /&gt;
&lt;br /&gt;
== Anforderungen ==&lt;br /&gt;
* Einfaches Update ohne öffnen des HR20E&amp;lt;br&amp;gt;&lt;br /&gt;
* Nutzen bestehender Programme (Terminalprogramm), das erspart das schreiben von Update Software&amp;lt;br&amp;gt;&lt;br /&gt;
* HR20E sollte nach dem Start prüfen ob Programm gültig und nur dann das Anwenderprogramm starten&lt;br /&gt;
* Protokoll sollte Updatevorgang aus dem laufenden Betrieb unterstützen (Sprung in den Bootloader)&lt;br /&gt;
&lt;br /&gt;
== Vorschlag 1 ==&lt;br /&gt;
X-Modem Protokoll (mit CRC)&amp;lt;br&amp;gt;&lt;br /&gt;
Hier gibt es eine fertige Lösung für das Etherboot projekt, deren übername gestattet ist.&amp;lt;br&amp;gt; &lt;br /&gt;
Größe ist hier kleiner 1kb und wohl verkraftbar.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vorteil:&amp;lt;br&amp;gt;&lt;br /&gt;
* etablierte Technik&lt;br /&gt;
* von anderen Herstellern Verwendet&lt;br /&gt;
* wird von den meisten Terminal Programmen unterstützt&lt;br /&gt;
* Gesichert durch Checksumme&lt;br /&gt;
Nachteil:&amp;lt;br&amp;gt;&lt;br /&gt;
* Aufwendige Checksummen Berechnung oder Lookup Tabelle Notwendig&lt;br /&gt;
&lt;br /&gt;
== Vorschlag 2 ==&lt;br /&gt;
Verwendung des [[AVR_Bootloader_FastBoot_von_Peter_Dannegger]]:&lt;br /&gt;
Der ist sehr klein, erprobt, leicht anwendbar und funzt auch sehr gut. Die Windows-Software fuer den Upload ist auch sehr gelungen. Auf Grund des o.g. Grundsatzproblems und der Tatsache dass die Neuentwicklung eines Bootladers sehr anspruchsvoll ist, halte ich es an dieser Stelle fuer besser, das Rad nicht neu zu erfinden.&lt;br /&gt;
&lt;br /&gt;
= Entwicklungsumgebung =&lt;br /&gt;
* Editor, Debugger, Compiler&lt;br /&gt;
** WinAVR version (20071221), sprich GCC 4.2.2 sowie avr-libc 1.6.0&lt;br /&gt;
** AVR Studio 4 &lt;br /&gt;
* JTAG ICE&lt;br /&gt;
** Atmel AVR JTAGICE MK2 &lt;br /&gt;
** AVR Dragon (z.B. http://elmicro.com/de/atavrdragon.html)&lt;br /&gt;
** Olimex-Seriell http://www.olimex.com/dev/avr-jtag.html  &lt;br /&gt;
** Olimex-USB http://www.olimex.com/dev/avr-usb-jtag.html &lt;br /&gt;
&lt;br /&gt;
= Sonstiges =&lt;br /&gt;
== Altes Protokoll ==&lt;br /&gt;
[[HR20_Protocol_V2 | Hier ]] hat mal einer ein Protokoll eingegeben.&lt;br /&gt;
Das scheint aber nicht zu der Version 2.04 zu passen. &lt;br /&gt;
Ich habe es nicht gelöscht, falls es jemanden interessiert.&lt;br /&gt;
&lt;br /&gt;
[[Category:Projekte|!]]&lt;/div&gt;</summary>
		<author><name>Dario</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=32669</id>
		<title>Heizungssteuerung mit Honeywell HR20</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=32669"/>
		<updated>2008-11-23T12:16:30Z</updated>

		<summary type="html">&lt;p&gt;Dario: /* print status line */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von DarioC&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Wie alles begann =&lt;br /&gt;
&lt;br /&gt;
Nachdem von Uwe Felgentreu vor nunmehr vor über drei Jahren (genau am 17.11.2004 um 11:26) hier in diesem Forum den Thread mit dem Titel &#039;&#039;Honeywell Rondostat HR20E per AVR steuern und konfigurieren&#039;&#039; gestartet hat ist es nun langsam soweit, dass das Ganze auch ein Projekt wird. &lt;br /&gt;
&lt;br /&gt;
Den Thread dazu kann der interessierte Leser [http://www.mikrocontroller.net/topic/17603 hier nachlesen] &lt;br /&gt;
&lt;br /&gt;
= Projektziel =&lt;br /&gt;
&lt;br /&gt;
Wir konzentrieren uns in erster Linie auf den Honeywell Rondostat HR20E mit ausgelieferten Softwareversion 2.04. Dass es ähnliche andere Geräte gibt behalten wir bei der Entwicklung im Hinterkopf.&lt;br /&gt;
&lt;br /&gt;
Basierend auf dieser Hardware wollen wir eine neue Software entwickeln. &lt;br /&gt;
Dabei können wir ausser der Hardware nichts weiter verwenden, da die Originalsoftware geschützt ist und nicht ausgelesen werden kann.&lt;br /&gt;
&lt;br /&gt;
== Phase 1 ==&lt;br /&gt;
Die Software soll die Funktionen bieten, die die Originalsoftware auch bietet, später können dies dann um zusätzliche Funktionen erweitert werden. Die wichtigsten Funktionen sind:&lt;br /&gt;
&lt;br /&gt;
* Temperaturregelung&lt;br /&gt;
* Echtzeituhr&lt;br /&gt;
* Ausnutzen der Sleep Funktion&lt;br /&gt;
* Anzeige Soll-Temperatur und der Uhrzeit&lt;br /&gt;
* Einstellung der Soll-Temperatur&lt;br /&gt;
* Uhrzeitgesteuerte Einstellung der Soll-Temperatur &lt;br /&gt;
* Fenster-Offen-Erkennung&lt;br /&gt;
* Ventilfreispülungsfunktion&lt;br /&gt;
&lt;br /&gt;
== Phase 2 ==&lt;br /&gt;
&lt;br /&gt;
Hier liegt der Sinn des ganzen Projektes: Durch diese zusätzlichen Funktionen wollen wir den Nutzwert des Thermostaten erheblich steigern:&lt;br /&gt;
&lt;br /&gt;
* Programmierung der Schaltzeiten und Temperaturen über externe Schnittstelle&lt;br /&gt;
* Abfrage der Messwerte und Parameter über externe Schnittstelle&lt;br /&gt;
* Vernetzung der Thermostaten untereinander&lt;br /&gt;
* Zusätzliche externe Schnittstellen (neben UART auch CAN und Funk)&lt;br /&gt;
* Erweiterung der Anzeige um&lt;br /&gt;
** Ist-Temperatur &lt;br /&gt;
** Ventilstellung&lt;br /&gt;
** Funkschnittstelle&lt;br /&gt;
*** RFM12 http://www.hoperf.com/rf_fsk.asp&lt;br /&gt;
**** Library dazu im [https://roulette.das-labor.org/trac/browser/microcontroller/src-atmel/lib/rfm12/ SVN], [http://www.das-labor.org/wiki/Datenfunk_mit_dem_AVR Doku hier]&lt;br /&gt;
*** Zigbee http://www.meshnetics.com/zigbee-modules&lt;br /&gt;
** ...&lt;br /&gt;
* Bootloader, damit Leute mitarbeiten können, die keine JTAG haben. Mit einem JTAG könnte man den Bootloader Flashen, ohne den Thermostaten öffnen zu müssen. Von da an kann man über den Programmierstecker mit einem umgebauten Handykabel den Thermostaten neu flashen.&lt;br /&gt;
&lt;br /&gt;
= Lizenz =&lt;br /&gt;
Die Software wird unter GPL v2 gestellt.&lt;br /&gt;
&lt;br /&gt;
= Subversion Repository =&lt;br /&gt;
Das alte SVN Repository auf https://opensvn.csie.org war zu lahm, &amp;lt;BR&amp;gt;&lt;br /&gt;
daher haben wir ein Projekt auf Sourcefore angelegt.&lt;br /&gt;
=== Zugangsdaten ===&lt;br /&gt;
Projektseite:         http://sourceforge.net/projects/openhr20/ &amp;lt;BR&amp;gt;&lt;br /&gt;
Repository Location: https://openhr20.svn.sourceforge.net/svnroot/openhr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
Browse Repository:    http://openhr20.svn.sourceforge.net/viewvc/openhr20/ &amp;lt;BR&amp;gt;&lt;br /&gt;
=== Policy ===&lt;br /&gt;
Anonymous check out ist erlaubt. &amp;lt;br&amp;gt;&lt;br /&gt;
Wer was committen will muss freigeschaltet werden. &amp;lt;br&amp;gt;&lt;br /&gt;
Dazu brauche ich den Sourceforge Accountnamen.&amp;lt;br&amp;gt;&lt;br /&gt;
Einfch eine Email mit username und password an hr20[at]carluccio[dot]de&amp;lt;br&amp;gt;&lt;br /&gt;
Das mache ich dann von Hand und da ich nicht alle 10 Minuten Mails bearbeite kann das auch schon mal einen oder zwei Tage dauern. &amp;lt;br&amp;gt;&lt;br /&gt;
Wenn sich ein Maintainer findet, gebe ich die Zugangsdaten gerne weiter.&lt;br /&gt;
&lt;br /&gt;
=== SVN Client und Anleitung ===&lt;br /&gt;
Windows-User nutzen am besten den Tortoise-SVN-Client, den man kostenfrei [http://tortoisesvn.tigris.org hier runterladen] kann. &amp;lt;br&amp;gt;&lt;br /&gt;
Dort gibt es auch eine Anleitung zum Arbeiten mit SVN.&lt;br /&gt;
&lt;br /&gt;
= Analyse der Hardware =&lt;br /&gt;
Die Analyse hat der Dario schon gemacht, zu finden ist die jeweils aktuelle Version &lt;br /&gt;
[http://carluccio.de/images/e/e1/Hr20-analyse.pdf als PDF hier] oder [https://opensvn.csie.org/viewcvs.cgi/doc/analyse.pdf hier im SVN].&lt;br /&gt;
== Fuses ==&lt;br /&gt;
Here the settings of the fuses:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! width=&amp;quot;100&amp;quot; | &lt;br /&gt;
! width=&amp;quot;150&amp;quot; | Original    &lt;br /&gt;
! width=&amp;quot;150&amp;quot; | OpenHR20&lt;br /&gt;
|-&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | Extended&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 0xFD&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 0xFD&lt;br /&gt;
|-&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | High&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 0x91&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 0x9B&lt;br /&gt;
|-&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | Low&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 0x62&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 0xE2&lt;br /&gt;
|-&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | EESAVE&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | enabled&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | disabled&lt;br /&gt;
|-&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | BOOTSZ&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 1024 Words (1E00)      &lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 512 Words (1C00)&lt;br /&gt;
|-&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | CKDIV8 &lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 1           &lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= TODOs =&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Task&lt;br /&gt;
! Remark&lt;br /&gt;
! Responsible&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Code Review&lt;br /&gt;
| Check the code, complete doxygen coments&lt;br /&gt;
| &lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| UserManual&lt;br /&gt;
| Write a User Manual, Screenshots are in \trunk\doc\Screenshots\&lt;br /&gt;
| &lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| PC-Software&lt;br /&gt;
| Write PC-Program to: &amp;lt;BR&amp;gt;- Read and Write OpenHR20 Settings &amp;lt;BR&amp;gt;- Log Status from OpenHR20&amp;lt;BR&amp;gt;- Visualize Logfile&amp;lt;BR&amp;gt; &lt;br /&gt;
| &lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Bootloader&lt;br /&gt;
| Do we still need a Bootloader ?&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= API Beschreibung =&lt;br /&gt;
Das Projekt wird mit doxygen dokumentiert, &lt;br /&gt;
die API-Beschreibung kann aus dem Source-Code generiert werden.&lt;br /&gt;
= UART Protocoll =&lt;br /&gt;
&lt;br /&gt;
This is the documentation for the UART Protocol in Release 74 of the SVN hosted on Sourceforge:&lt;br /&gt;
&lt;br /&gt;
== Com-Port Params ==&lt;br /&gt;
* BAUD: 9600&lt;br /&gt;
* Data: 8&lt;br /&gt;
* Parity: N&lt;br /&gt;
* Stop: 1&lt;br /&gt;
&lt;br /&gt;
== Automatic calibration ==&lt;br /&gt;
When the HR20 is mounted, then the automatic calibration is started. &lt;br /&gt;
The Debug-Info during the callibration is printed to the com-interface like this:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
+ 0210&lt;br /&gt;
+ 047e&lt;br /&gt;
+ 0437&lt;br /&gt;
[... many lines deleted ...]&lt;br /&gt;
- 0681&lt;br /&gt;
- 0695&lt;br /&gt;
- 0694&lt;br /&gt;
+ 0210&lt;br /&gt;
+ 047e&lt;br /&gt;
+ 0437&lt;br /&gt;
+ 0417&lt;br /&gt;
+ 0454&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Commands ==&lt;br /&gt;
All commands have FIXED format.&lt;br /&gt;
* command &#039;&#039;&#039;X.....\n &#039;&#039;&#039; termination char&lt;br /&gt;
* X is upcase char as commad name&lt;br /&gt;
* hex numbers use ONLY lowcase chars&lt;br /&gt;
* upcase is reserved for commands&lt;br /&gt;
=== print version information ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 V&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 V: OpenHR20 SW version V.VV build DDDD $Rev: REV $&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Where:&lt;br /&gt;
* V.VV  Version&lt;br /&gt;
* DDDD  Date at compilition &lt;br /&gt;
* REV   SVN Revision&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 V: OpenHR20 SW version 0.21 build Nov 13 2008 23:22:08 $Rev: 72 $&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
=== print status ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 D&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 D: WW DDDDDDDD TTTTTTTT V: VV I: IIII S: SSSS B: BBBB E:EE X&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Where:&lt;br /&gt;
* &#039;&#039;&#039;WW&#039;&#039;&#039; Day of Week (monday=1)&lt;br /&gt;
* &#039;&#039;&#039;DDDDDDDD&#039;&#039;&#039; actual date &lt;br /&gt;
* &#039;&#039;&#039;TTTTTTTT&#039;&#039;&#039; actual time &lt;br /&gt;
* &#039;&#039;&#039;VV&#039;&#039;&#039; actual position of valve [%] (00=closed, 100=opened)&lt;br /&gt;
* &#039;&#039;&#039;IIII&#039;&#039;&#039; actual temperature&lt;br /&gt;
* &#039;&#039;&#039;SSSS&#039;&#039;&#039; desired temperature&lt;br /&gt;
* &#039;&#039;&#039;BBBB&#039;&#039;&#039; battary voltage [mV]&lt;br /&gt;
* &#039;&#039;&#039;EE&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;X&#039;&#039;&#039;&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 D: d3 01.10.08 12:00:16 V: 00 I: 2103 S: 1700 B: 3259 E:04 X&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== print watched wariable ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Taa&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;aa&#039;&#039;&#039; watched wariable see &#039;&#039;watch.c&#039;&#039;&lt;br /&gt;
Response:&lt;br /&gt;
(return 2 or 4 hex numbers) &lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 T[aa]=VVVV&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Where:&lt;br /&gt;
* &#039;&#039;&#039;aa&#039;&#039;&#039; watched wariable see &#039;&#039;watch.c&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;VVVV&#039;&#039;&#039; value of watched wariable &lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 T[01]=0cca&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
=== get configuration byte ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Gaa&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;aa&#039;&#039;&#039; hex address of configuration byte see eeprom.h&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 G[aa]=VV&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Where:&lt;br /&gt;
* &#039;&#039;&#039;aa&#039;&#039;&#039; hex address of configuration byte see eeprom.h&lt;br /&gt;
* &#039;&#039;&#039;VV&#039;&#039;&#039; value of configuration byte &lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 G[13]=2d&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
=== set configuration byte ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 SaaVV&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;aa&#039;&#039;&#039; hex address of configuration byte see eeprom.h&lt;br /&gt;
* &#039;&#039;&#039;VV&#039;&#039;&#039; hex value for configuration byte (hex)&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 S[aa]=VV&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Where:&lt;br /&gt;
* &#039;&#039;&#039;aa&#039;&#039;&#039; hex address of configuration byte see eeprom.h&lt;br /&gt;
* &#039;&#039;&#039;VV&#039;&#039;&#039; value of configuration byte &lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 S[13]=2d&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
=== get timer ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Rab&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;a&#039;&#039;&#039; day &lt;br /&gt;
* &#039;&#039;&#039;b&#039;&#039;&#039; slot&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 R[ab]=cddd&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Where:&lt;br /&gt;
* &#039;&#039;&#039;c&#039;&#039;&#039; timermode &lt;br /&gt;
: &#039;&#039;&#039;0&#039;&#039;&#039; frost protection&lt;br /&gt;
: &#039;&#039;&#039;1&#039;&#039;&#039; energy save&lt;br /&gt;
: &#039;&#039;&#039;2&#039;&#039;&#039; comfort&lt;br /&gt;
: &#039;&#039;&#039;3&#039;&#039;&#039; supercomfort&lt;br /&gt;
* &#039;&#039;&#039;ddd&#039;&#039;&#039; time (minutes since 00:00, hex) &lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 R[10]=21a4&lt;br /&gt;
 R[11]=121c&lt;br /&gt;
 R[12]=23c0&lt;br /&gt;
 R[13]=14ec&lt;br /&gt;
 R[14]=2fff&lt;br /&gt;
 R[15]=1fff&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
comfort at 0x1a4  = 420 / 60 = 7&lt;br /&gt;
energy save at 0x21c  = 540 / 60 = 9&lt;br /&gt;
comfort at 0x3c0  = 960 / 60 = 16&lt;br /&gt;
energy save at 0x4ec  = 1260 / 60 = 21&lt;br /&gt;
Slot 5+6 not used.&lt;br /&gt;
&lt;br /&gt;
=== set timer ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Wabcddd&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;a&#039;&#039;&#039; day &lt;br /&gt;
* &#039;&#039;&#039;b&#039;&#039;&#039; slot&lt;br /&gt;
* &#039;&#039;&#039;c&#039;&#039;&#039; timermode (0 to 3) &lt;br /&gt;
* &#039;&#039;&#039;d&#039;&#039;&#039; time time (minutes since 00:00, hex) &lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 W[ab]=cddd&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 W[10]=21a4&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Reboot ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 B1324&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;1234&#039;&#039;&#039; password (fixed at this moment)&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== set date ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Yyymmdd&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;yy&#039;&#039;&#039; year&lt;br /&gt;
* &#039;&#039;&#039;mm&#039;&#039;&#039; month&lt;br /&gt;
* &#039;&#039;&#039;dd&#039;&#039;&#039; day&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 D: WW DDDDDDDD TTTTTTTT V: VV I: IIII S: SSSS B: BBBB E:EE X&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
=== set time ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Hhhmmss&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;hh&#039;&#039;&#039; hour&lt;br /&gt;
* &#039;&#039;&#039;mm&#039;&#039;&#039; minute&lt;br /&gt;
* &#039;&#039;&#039;ss&#039;&#039;&#039; seconds&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 D: WW DDDDDDDD TTTTTTTT V: VV I: IIII S: SSSS B: BBBB E:EE X&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== set wanted temperature ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Axx&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;xx&#039;&#039;&#039; temperature [unit 0.5C] (hex)&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 D: WW DDDDDDDD TTTTTTTT V: VV I: IIII S: SSSS B: BBBB E:EE X&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Example:&lt;br /&gt;
20°C = 40 * 0,5 °C = 28 (hex)&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 A28&amp;lt;CR&amp;gt;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039;Attention: The value in the response is not the new value.&amp;lt;BR&amp;gt;The new value is updated some secondes later, so be patient and wait.&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== set mode ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Mxx&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;xx&#039;&#039;&#039; mode &lt;br /&gt;
: 00 = manu&lt;br /&gt;
: 01 = auto&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 D: WW DDDDDDDD TTTTTTTT V: VV I: IIII S: SSSS B: BBBB E:EE X&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Bootloader =&lt;br /&gt;
Um ein einfaches Update der Software, auch ohne Programmer und Zerlegen des HR20E zu ermöglichen, sollte ein Bootloader implementiert werden.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Grundsatzproblem:&#039;&#039;&#039; Fuer ein erstes Umflashen eines eben aus der Verpackung genommenen HR20s braucht man &#039;&#039;immer&#039;&#039; einen JTAG-Programmer um ueberhaupt erstmal den Bootlader selber draufzukriegen.&lt;br /&gt;
&lt;br /&gt;
== Anforderungen ==&lt;br /&gt;
* Einfaches Update ohne öffnen des HR20E&amp;lt;br&amp;gt;&lt;br /&gt;
* Nutzen bestehender Programme (Terminalprogramm), das erspart das schreiben von Update Software&amp;lt;br&amp;gt;&lt;br /&gt;
* HR20E sollte nach dem Start prüfen ob Programm gültig und nur dann das Anwenderprogramm starten&lt;br /&gt;
* Protokoll sollte Updatevorgang aus dem laufenden Betrieb unterstützen (Sprung in den Bootloader)&lt;br /&gt;
&lt;br /&gt;
== Vorschlag 1 ==&lt;br /&gt;
X-Modem Protokoll (mit CRC)&amp;lt;br&amp;gt;&lt;br /&gt;
Hier gibt es eine fertige Lösung für das Etherboot projekt, deren übername gestattet ist.&amp;lt;br&amp;gt; &lt;br /&gt;
Größe ist hier kleiner 1kb und wohl verkraftbar.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vorteil:&amp;lt;br&amp;gt;&lt;br /&gt;
* etablierte Technik&lt;br /&gt;
* von anderen Herstellern Verwendet&lt;br /&gt;
* wird von den meisten Terminal Programmen unterstützt&lt;br /&gt;
* Gesichert durch Checksumme&lt;br /&gt;
Nachteil:&amp;lt;br&amp;gt;&lt;br /&gt;
* Aufwendige Checksummen Berechnung oder Lookup Tabelle Notwendig&lt;br /&gt;
&lt;br /&gt;
== Vorschlag 2 ==&lt;br /&gt;
Verwendung des [[AVR_Bootloader_FastBoot_von_Peter_Dannegger]]:&lt;br /&gt;
Der ist sehr klein, erprobt, leicht anwendbar und funzt auch sehr gut. Die Windows-Software fuer den Upload ist auch sehr gelungen. Auf Grund des o.g. Grundsatzproblems und der Tatsache dass die Neuentwicklung eines Bootladers sehr anspruchsvoll ist, halte ich es an dieser Stelle fuer besser, das Rad nicht neu zu erfinden.&lt;br /&gt;
&lt;br /&gt;
= Entwicklungsumgebung =&lt;br /&gt;
* Editor, Debugger, Compiler&lt;br /&gt;
** WinAVR version (20071221), sprich GCC 4.2.2 sowie avr-libc 1.6.0&lt;br /&gt;
** AVR Studio 4 &lt;br /&gt;
* JTAG ICE&lt;br /&gt;
** Atmel AVR JTAGICE MK2 &lt;br /&gt;
** AVR Dragon (z.B. http://elmicro.com/de/atavrdragon.html)&lt;br /&gt;
** Olimex-Seriell http://www.olimex.com/dev/avr-jtag.html  &lt;br /&gt;
** Olimex-USB http://www.olimex.com/dev/avr-usb-jtag.html &lt;br /&gt;
&lt;br /&gt;
= Sonstiges =&lt;br /&gt;
== Altes Protokoll ==&lt;br /&gt;
[[HR20_Protocol_V2 | Hier ]] hat mal einer ein Protokoll eingegeben.&lt;br /&gt;
Das scheint aber nicht zu der Version 2.04 zu passen. &lt;br /&gt;
Ich habe es nicht gelöscht, falls es jemanden interessiert.&lt;br /&gt;
&lt;br /&gt;
[[Category:Projekte|!]]&lt;/div&gt;</summary>
		<author><name>Dario</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=32668</id>
		<title>Heizungssteuerung mit Honeywell HR20</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=32668"/>
		<updated>2008-11-23T11:51:17Z</updated>

		<summary type="html">&lt;p&gt;Dario: /* Subversion Repository */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von DarioC&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Wie alles begann =&lt;br /&gt;
&lt;br /&gt;
Nachdem von Uwe Felgentreu vor nunmehr vor über drei Jahren (genau am 17.11.2004 um 11:26) hier in diesem Forum den Thread mit dem Titel &#039;&#039;Honeywell Rondostat HR20E per AVR steuern und konfigurieren&#039;&#039; gestartet hat ist es nun langsam soweit, dass das Ganze auch ein Projekt wird. &lt;br /&gt;
&lt;br /&gt;
Den Thread dazu kann der interessierte Leser [http://www.mikrocontroller.net/topic/17603 hier nachlesen] &lt;br /&gt;
&lt;br /&gt;
= Projektziel =&lt;br /&gt;
&lt;br /&gt;
Wir konzentrieren uns in erster Linie auf den Honeywell Rondostat HR20E mit ausgelieferten Softwareversion 2.04. Dass es ähnliche andere Geräte gibt behalten wir bei der Entwicklung im Hinterkopf.&lt;br /&gt;
&lt;br /&gt;
Basierend auf dieser Hardware wollen wir eine neue Software entwickeln. &lt;br /&gt;
Dabei können wir ausser der Hardware nichts weiter verwenden, da die Originalsoftware geschützt ist und nicht ausgelesen werden kann.&lt;br /&gt;
&lt;br /&gt;
== Phase 1 ==&lt;br /&gt;
Die Software soll die Funktionen bieten, die die Originalsoftware auch bietet, später können dies dann um zusätzliche Funktionen erweitert werden. Die wichtigsten Funktionen sind:&lt;br /&gt;
&lt;br /&gt;
* Temperaturregelung&lt;br /&gt;
* Echtzeituhr&lt;br /&gt;
* Ausnutzen der Sleep Funktion&lt;br /&gt;
* Anzeige Soll-Temperatur und der Uhrzeit&lt;br /&gt;
* Einstellung der Soll-Temperatur&lt;br /&gt;
* Uhrzeitgesteuerte Einstellung der Soll-Temperatur &lt;br /&gt;
* Fenster-Offen-Erkennung&lt;br /&gt;
* Ventilfreispülungsfunktion&lt;br /&gt;
&lt;br /&gt;
== Phase 2 ==&lt;br /&gt;
&lt;br /&gt;
Hier liegt der Sinn des ganzen Projektes: Durch diese zusätzlichen Funktionen wollen wir den Nutzwert des Thermostaten erheblich steigern:&lt;br /&gt;
&lt;br /&gt;
* Programmierung der Schaltzeiten und Temperaturen über externe Schnittstelle&lt;br /&gt;
* Abfrage der Messwerte und Parameter über externe Schnittstelle&lt;br /&gt;
* Vernetzung der Thermostaten untereinander&lt;br /&gt;
* Zusätzliche externe Schnittstellen (neben UART auch CAN und Funk)&lt;br /&gt;
* Erweiterung der Anzeige um&lt;br /&gt;
** Ist-Temperatur &lt;br /&gt;
** Ventilstellung&lt;br /&gt;
** Funkschnittstelle&lt;br /&gt;
*** RFM12 http://www.hoperf.com/rf_fsk.asp&lt;br /&gt;
**** Library dazu im [https://roulette.das-labor.org/trac/browser/microcontroller/src-atmel/lib/rfm12/ SVN], [http://www.das-labor.org/wiki/Datenfunk_mit_dem_AVR Doku hier]&lt;br /&gt;
*** Zigbee http://www.meshnetics.com/zigbee-modules&lt;br /&gt;
** ...&lt;br /&gt;
* Bootloader, damit Leute mitarbeiten können, die keine JTAG haben. Mit einem JTAG könnte man den Bootloader Flashen, ohne den Thermostaten öffnen zu müssen. Von da an kann man über den Programmierstecker mit einem umgebauten Handykabel den Thermostaten neu flashen.&lt;br /&gt;
&lt;br /&gt;
= Lizenz =&lt;br /&gt;
Die Software wird unter GPL v2 gestellt.&lt;br /&gt;
&lt;br /&gt;
= Subversion Repository =&lt;br /&gt;
Das alte SVN Repository auf https://opensvn.csie.org war zu lahm, &amp;lt;BR&amp;gt;&lt;br /&gt;
daher haben wir ein Projekt auf Sourcefore angelegt.&lt;br /&gt;
=== Zugangsdaten ===&lt;br /&gt;
Projektseite:         http://sourceforge.net/projects/openhr20/ &amp;lt;BR&amp;gt;&lt;br /&gt;
Repository Location: https://openhr20.svn.sourceforge.net/svnroot/openhr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
Browse Repository:    http://openhr20.svn.sourceforge.net/viewvc/openhr20/ &amp;lt;BR&amp;gt;&lt;br /&gt;
=== Policy ===&lt;br /&gt;
Anonymous check out ist erlaubt. &amp;lt;br&amp;gt;&lt;br /&gt;
Wer was committen will muss freigeschaltet werden. &amp;lt;br&amp;gt;&lt;br /&gt;
Dazu brauche ich den Sourceforge Accountnamen.&amp;lt;br&amp;gt;&lt;br /&gt;
Einfch eine Email mit username und password an hr20[at]carluccio[dot]de&amp;lt;br&amp;gt;&lt;br /&gt;
Das mache ich dann von Hand und da ich nicht alle 10 Minuten Mails bearbeite kann das auch schon mal einen oder zwei Tage dauern. &amp;lt;br&amp;gt;&lt;br /&gt;
Wenn sich ein Maintainer findet, gebe ich die Zugangsdaten gerne weiter.&lt;br /&gt;
&lt;br /&gt;
=== SVN Client und Anleitung ===&lt;br /&gt;
Windows-User nutzen am besten den Tortoise-SVN-Client, den man kostenfrei [http://tortoisesvn.tigris.org hier runterladen] kann. &amp;lt;br&amp;gt;&lt;br /&gt;
Dort gibt es auch eine Anleitung zum Arbeiten mit SVN.&lt;br /&gt;
&lt;br /&gt;
= Analyse der Hardware =&lt;br /&gt;
Die Analyse hat der Dario schon gemacht, zu finden ist die jeweils aktuelle Version &lt;br /&gt;
[http://carluccio.de/images/e/e1/Hr20-analyse.pdf als PDF hier] oder [https://opensvn.csie.org/viewcvs.cgi/doc/analyse.pdf hier im SVN].&lt;br /&gt;
== Fuses ==&lt;br /&gt;
Here the settings of the fuses:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! width=&amp;quot;100&amp;quot; | &lt;br /&gt;
! width=&amp;quot;150&amp;quot; | Original    &lt;br /&gt;
! width=&amp;quot;150&amp;quot; | OpenHR20&lt;br /&gt;
|-&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | Extended&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 0xFD&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 0xFD&lt;br /&gt;
|-&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | High&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 0x91&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 0x9B&lt;br /&gt;
|-&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | Low&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 0x62&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 0xE2&lt;br /&gt;
|-&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | EESAVE&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | enabled&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | disabled&lt;br /&gt;
|-&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | BOOTSZ&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 1024 Words (1E00)      &lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 512 Words (1C00)&lt;br /&gt;
|-&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | CKDIV8 &lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 1           &lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= TODOs =&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Task&lt;br /&gt;
! Remark&lt;br /&gt;
! Responsible&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Code Review&lt;br /&gt;
| Check the code, complete doxygen coments&lt;br /&gt;
| &lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| UserManual&lt;br /&gt;
| Write a User Manual, Screenshots are in \trunk\doc\Screenshots\&lt;br /&gt;
| &lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| PC-Software&lt;br /&gt;
| Write PC-Program to: &amp;lt;BR&amp;gt;- Read and Write OpenHR20 Settings &amp;lt;BR&amp;gt;- Log Status from OpenHR20&amp;lt;BR&amp;gt;- Visualize Logfile&amp;lt;BR&amp;gt; &lt;br /&gt;
| &lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Bootloader&lt;br /&gt;
| Do we still need a Bootloader ?&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= API Beschreibung =&lt;br /&gt;
Das Projekt wird mit doxygen dokumentiert, &lt;br /&gt;
die API-Beschreibung kann aus dem Source-Code generiert werden.&lt;br /&gt;
= UART Protocoll =&lt;br /&gt;
&lt;br /&gt;
This is the documentation for the UART Protocol in Release 74 of the SVN hosted on Sourceforge:&lt;br /&gt;
&lt;br /&gt;
== Com-Port Params ==&lt;br /&gt;
* BAUD: 9600&lt;br /&gt;
* Data: 8&lt;br /&gt;
* Parity: N&lt;br /&gt;
* Stop: 1&lt;br /&gt;
&lt;br /&gt;
== Automatic calibration ==&lt;br /&gt;
When the HR20 is mounted, then the automatic calibration is started. &lt;br /&gt;
The Debug-Info during the callibration is printed to the com-interface like this:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
+ 0210&lt;br /&gt;
+ 047e&lt;br /&gt;
+ 0437&lt;br /&gt;
[... many lines deleted ...]&lt;br /&gt;
- 0681&lt;br /&gt;
- 0695&lt;br /&gt;
- 0694&lt;br /&gt;
+ 0210&lt;br /&gt;
+ 047e&lt;br /&gt;
+ 0437&lt;br /&gt;
+ 0417&lt;br /&gt;
+ 0454&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Commands ==&lt;br /&gt;
All commands have FIXED format.&lt;br /&gt;
* command &#039;&#039;&#039;X.....\n &#039;&#039;&#039; termination char&lt;br /&gt;
* X is upcase char as commad name&lt;br /&gt;
* hex numbers use ONLY lowcase chars&lt;br /&gt;
* upcase is reserved for commands&lt;br /&gt;
=== print version information ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 V&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 V: OpenHR20 SW version V.VV build DDDD $Rev: REV $&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Where:&lt;br /&gt;
* V.VV  Version&lt;br /&gt;
* DDDD  Date at compilition &lt;br /&gt;
* REV   SVN Revision&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 V: OpenHR20 SW version 0.21 build Nov 13 2008 23:22:08 $Rev: 72 $&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
=== print status line  ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 D&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 D: WW DDDDDDDD TTTTTTTT V: VV I: IIII S: SSSS B: BBBB E:EE X&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Where:&lt;br /&gt;
* &#039;&#039;&#039;WW&#039;&#039;&#039; Day of Week (monday=1)&lt;br /&gt;
* &#039;&#039;&#039;DDDDDDDD&#039;&#039;&#039; actual date &lt;br /&gt;
* &#039;&#039;&#039;TTTTTTTT&#039;&#039;&#039; actual time &lt;br /&gt;
* &#039;&#039;&#039;VV&#039;&#039;&#039; actual position of valve [%] (00=closed, 100=opened)&lt;br /&gt;
* &#039;&#039;&#039;IIII&#039;&#039;&#039; actual temperature&lt;br /&gt;
* &#039;&#039;&#039;SSSS&#039;&#039;&#039; desired temperature&lt;br /&gt;
* &#039;&#039;&#039;BBBB&#039;&#039;&#039; battary voltage [mV]&lt;br /&gt;
* &#039;&#039;&#039;EE&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;X&#039;&#039;&#039;&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 D: d3 01.10.08 12:00:16 V: 00 I: 2103 S: 1700 B: 3259 E:04 X&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
=== print watched wariable ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Taa&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;aa&#039;&#039;&#039; watched wariable see &#039;&#039;watch.c&#039;&#039;&lt;br /&gt;
Response:&lt;br /&gt;
(return 2 or 4 hex numbers) &lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 T[aa]=VVVV&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Where:&lt;br /&gt;
* &#039;&#039;&#039;aa&#039;&#039;&#039; watched wariable see &#039;&#039;watch.c&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;VVVV&#039;&#039;&#039; value of watched wariable &lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 T[01]=0cca&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
=== get configuration byte ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Gaa&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;aa&#039;&#039;&#039; hex address of configuration byte see eeprom.h&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 G[aa]=VV&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Where:&lt;br /&gt;
* &#039;&#039;&#039;aa&#039;&#039;&#039; hex address of configuration byte see eeprom.h&lt;br /&gt;
* &#039;&#039;&#039;VV&#039;&#039;&#039; value of configuration byte &lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 G[13]=2d&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
=== set configuration byte ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 SaaVV&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;aa&#039;&#039;&#039; hex address of configuration byte see eeprom.h&lt;br /&gt;
* &#039;&#039;&#039;VV&#039;&#039;&#039; hex value for configuration byte (hex)&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 S[aa]=VV&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Where:&lt;br /&gt;
* &#039;&#039;&#039;aa&#039;&#039;&#039; hex address of configuration byte see eeprom.h&lt;br /&gt;
* &#039;&#039;&#039;VV&#039;&#039;&#039; value of configuration byte &lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 S[13]=2d&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
=== get timer ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Rab&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;a&#039;&#039;&#039; day &lt;br /&gt;
* &#039;&#039;&#039;b&#039;&#039;&#039; slot&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 R[ab]=cddd&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Where:&lt;br /&gt;
* &#039;&#039;&#039;c&#039;&#039;&#039; timermode &lt;br /&gt;
: &#039;&#039;&#039;0&#039;&#039;&#039; frost protection&lt;br /&gt;
: &#039;&#039;&#039;1&#039;&#039;&#039; energy save&lt;br /&gt;
: &#039;&#039;&#039;2&#039;&#039;&#039; comfort&lt;br /&gt;
: &#039;&#039;&#039;3&#039;&#039;&#039; supercomfort&lt;br /&gt;
* &#039;&#039;&#039;ddd&#039;&#039;&#039; time (minutes since 00:00, hex) &lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 R[10]=21a4&lt;br /&gt;
 R[11]=121c&lt;br /&gt;
 R[12]=23c0&lt;br /&gt;
 R[13]=14ec&lt;br /&gt;
 R[14]=2fff&lt;br /&gt;
 R[15]=1fff&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
comfort at 0x1a4  = 420 / 60 = 7&lt;br /&gt;
energy save at 0x21c  = 540 / 60 = 9&lt;br /&gt;
comfort at 0x3c0  = 960 / 60 = 16&lt;br /&gt;
energy save at 0x4ec  = 1260 / 60 = 21&lt;br /&gt;
Slot 5+6 not used.&lt;br /&gt;
&lt;br /&gt;
=== set timer ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Wabcddd&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;a&#039;&#039;&#039; day &lt;br /&gt;
* &#039;&#039;&#039;b&#039;&#039;&#039; slot&lt;br /&gt;
* &#039;&#039;&#039;c&#039;&#039;&#039; timermode (0 to 3) &lt;br /&gt;
* &#039;&#039;&#039;d&#039;&#039;&#039; time time (minutes since 00:00, hex) &lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 W[ab]=cddd&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 W[10]=21a4&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Reboot ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 B1324&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;1234&#039;&#039;&#039; password (fixed at this moment)&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== set date ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Yyymmdd&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;yy&#039;&#039;&#039; year&lt;br /&gt;
* &#039;&#039;&#039;mm&#039;&#039;&#039; month&lt;br /&gt;
* &#039;&#039;&#039;dd&#039;&#039;&#039; day&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 D: WW DDDDDDDD TTTTTTTT V: VV I: IIII S: SSSS B: BBBB E:EE X&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
=== set time ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Hhhmmss&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;hh&#039;&#039;&#039; hour&lt;br /&gt;
* &#039;&#039;&#039;mm&#039;&#039;&#039; minute&lt;br /&gt;
* &#039;&#039;&#039;ss&#039;&#039;&#039; seconds&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 D: WW DDDDDDDD TTTTTTTT V: VV I: IIII S: SSSS B: BBBB E:EE X&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== set wanted temperature ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Axx&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;xx&#039;&#039;&#039; temperature [unit 0.5C] (hex)&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 D: WW DDDDDDDD TTTTTTTT V: VV I: IIII S: SSSS B: BBBB E:EE X&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Example:&lt;br /&gt;
20°C = 40 * 0,5 °C = 28 (hex)&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 A28&amp;lt;CR&amp;gt;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039;Attention: The value in the response is not the new value.&amp;lt;BR&amp;gt;The new value is updated some secondes later, so be patient and wait.&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== set mode ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Mxx&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;xx&#039;&#039;&#039; mode &lt;br /&gt;
: 00 = manu&lt;br /&gt;
: 01 = auto&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 D: WW DDDDDDDD TTTTTTTT V: VV I: IIII S: SSSS B: BBBB E:EE X&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Bootloader =&lt;br /&gt;
Um ein einfaches Update der Software, auch ohne Programmer und Zerlegen des HR20E zu ermöglichen, sollte ein Bootloader implementiert werden.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Grundsatzproblem:&#039;&#039;&#039; Fuer ein erstes Umflashen eines eben aus der Verpackung genommenen HR20s braucht man &#039;&#039;immer&#039;&#039; einen JTAG-Programmer um ueberhaupt erstmal den Bootlader selber draufzukriegen.&lt;br /&gt;
&lt;br /&gt;
== Anforderungen ==&lt;br /&gt;
* Einfaches Update ohne öffnen des HR20E&amp;lt;br&amp;gt;&lt;br /&gt;
* Nutzen bestehender Programme (Terminalprogramm), das erspart das schreiben von Update Software&amp;lt;br&amp;gt;&lt;br /&gt;
* HR20E sollte nach dem Start prüfen ob Programm gültig und nur dann das Anwenderprogramm starten&lt;br /&gt;
* Protokoll sollte Updatevorgang aus dem laufenden Betrieb unterstützen (Sprung in den Bootloader)&lt;br /&gt;
&lt;br /&gt;
== Vorschlag 1 ==&lt;br /&gt;
X-Modem Protokoll (mit CRC)&amp;lt;br&amp;gt;&lt;br /&gt;
Hier gibt es eine fertige Lösung für das Etherboot projekt, deren übername gestattet ist.&amp;lt;br&amp;gt; &lt;br /&gt;
Größe ist hier kleiner 1kb und wohl verkraftbar.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vorteil:&amp;lt;br&amp;gt;&lt;br /&gt;
* etablierte Technik&lt;br /&gt;
* von anderen Herstellern Verwendet&lt;br /&gt;
* wird von den meisten Terminal Programmen unterstützt&lt;br /&gt;
* Gesichert durch Checksumme&lt;br /&gt;
Nachteil:&amp;lt;br&amp;gt;&lt;br /&gt;
* Aufwendige Checksummen Berechnung oder Lookup Tabelle Notwendig&lt;br /&gt;
&lt;br /&gt;
== Vorschlag 2 ==&lt;br /&gt;
Verwendung des [[AVR_Bootloader_FastBoot_von_Peter_Dannegger]]:&lt;br /&gt;
Der ist sehr klein, erprobt, leicht anwendbar und funzt auch sehr gut. Die Windows-Software fuer den Upload ist auch sehr gelungen. Auf Grund des o.g. Grundsatzproblems und der Tatsache dass die Neuentwicklung eines Bootladers sehr anspruchsvoll ist, halte ich es an dieser Stelle fuer besser, das Rad nicht neu zu erfinden.&lt;br /&gt;
&lt;br /&gt;
= Entwicklungsumgebung =&lt;br /&gt;
* Editor, Debugger, Compiler&lt;br /&gt;
** WinAVR version (20071221), sprich GCC 4.2.2 sowie avr-libc 1.6.0&lt;br /&gt;
** AVR Studio 4 &lt;br /&gt;
* JTAG ICE&lt;br /&gt;
** Atmel AVR JTAGICE MK2 &lt;br /&gt;
** AVR Dragon (z.B. http://elmicro.com/de/atavrdragon.html)&lt;br /&gt;
** Olimex-Seriell http://www.olimex.com/dev/avr-jtag.html  &lt;br /&gt;
** Olimex-USB http://www.olimex.com/dev/avr-usb-jtag.html &lt;br /&gt;
&lt;br /&gt;
= Sonstiges =&lt;br /&gt;
== Altes Protokoll ==&lt;br /&gt;
[[HR20_Protocol_V2 | Hier ]] hat mal einer ein Protokoll eingegeben.&lt;br /&gt;
Das scheint aber nicht zu der Version 2.04 zu passen. &lt;br /&gt;
Ich habe es nicht gelöscht, falls es jemanden interessiert.&lt;br /&gt;
&lt;br /&gt;
[[Category:Projekte|!]]&lt;/div&gt;</summary>
		<author><name>Dario</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=32667</id>
		<title>Heizungssteuerung mit Honeywell HR20</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=32667"/>
		<updated>2008-11-23T11:50:46Z</updated>

		<summary type="html">&lt;p&gt;Dario: /* Benötigte Module */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von DarioC&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Wie alles begann =&lt;br /&gt;
&lt;br /&gt;
Nachdem von Uwe Felgentreu vor nunmehr vor über drei Jahren (genau am 17.11.2004 um 11:26) hier in diesem Forum den Thread mit dem Titel &#039;&#039;Honeywell Rondostat HR20E per AVR steuern und konfigurieren&#039;&#039; gestartet hat ist es nun langsam soweit, dass das Ganze auch ein Projekt wird. &lt;br /&gt;
&lt;br /&gt;
Den Thread dazu kann der interessierte Leser [http://www.mikrocontroller.net/topic/17603 hier nachlesen] &lt;br /&gt;
&lt;br /&gt;
= Projektziel =&lt;br /&gt;
&lt;br /&gt;
Wir konzentrieren uns in erster Linie auf den Honeywell Rondostat HR20E mit ausgelieferten Softwareversion 2.04. Dass es ähnliche andere Geräte gibt behalten wir bei der Entwicklung im Hinterkopf.&lt;br /&gt;
&lt;br /&gt;
Basierend auf dieser Hardware wollen wir eine neue Software entwickeln. &lt;br /&gt;
Dabei können wir ausser der Hardware nichts weiter verwenden, da die Originalsoftware geschützt ist und nicht ausgelesen werden kann.&lt;br /&gt;
&lt;br /&gt;
== Phase 1 ==&lt;br /&gt;
Die Software soll die Funktionen bieten, die die Originalsoftware auch bietet, später können dies dann um zusätzliche Funktionen erweitert werden. Die wichtigsten Funktionen sind:&lt;br /&gt;
&lt;br /&gt;
* Temperaturregelung&lt;br /&gt;
* Echtzeituhr&lt;br /&gt;
* Ausnutzen der Sleep Funktion&lt;br /&gt;
* Anzeige Soll-Temperatur und der Uhrzeit&lt;br /&gt;
* Einstellung der Soll-Temperatur&lt;br /&gt;
* Uhrzeitgesteuerte Einstellung der Soll-Temperatur &lt;br /&gt;
* Fenster-Offen-Erkennung&lt;br /&gt;
* Ventilfreispülungsfunktion&lt;br /&gt;
&lt;br /&gt;
== Phase 2 ==&lt;br /&gt;
&lt;br /&gt;
Hier liegt der Sinn des ganzen Projektes: Durch diese zusätzlichen Funktionen wollen wir den Nutzwert des Thermostaten erheblich steigern:&lt;br /&gt;
&lt;br /&gt;
* Programmierung der Schaltzeiten und Temperaturen über externe Schnittstelle&lt;br /&gt;
* Abfrage der Messwerte und Parameter über externe Schnittstelle&lt;br /&gt;
* Vernetzung der Thermostaten untereinander&lt;br /&gt;
* Zusätzliche externe Schnittstellen (neben UART auch CAN und Funk)&lt;br /&gt;
* Erweiterung der Anzeige um&lt;br /&gt;
** Ist-Temperatur &lt;br /&gt;
** Ventilstellung&lt;br /&gt;
** Funkschnittstelle&lt;br /&gt;
*** RFM12 http://www.hoperf.com/rf_fsk.asp&lt;br /&gt;
**** Library dazu im [https://roulette.das-labor.org/trac/browser/microcontroller/src-atmel/lib/rfm12/ SVN], [http://www.das-labor.org/wiki/Datenfunk_mit_dem_AVR Doku hier]&lt;br /&gt;
*** Zigbee http://www.meshnetics.com/zigbee-modules&lt;br /&gt;
** ...&lt;br /&gt;
* Bootloader, damit Leute mitarbeiten können, die keine JTAG haben. Mit einem JTAG könnte man den Bootloader Flashen, ohne den Thermostaten öffnen zu müssen. Von da an kann man über den Programmierstecker mit einem umgebauten Handykabel den Thermostaten neu flashen.&lt;br /&gt;
&lt;br /&gt;
= Lizenz =&lt;br /&gt;
Die Software wird unter GPL v2 gestellt.&lt;br /&gt;
&lt;br /&gt;
= Subversion Repository =&lt;br /&gt;
Das alte SVN Repository auf https://opensvn.csie.org war zu lahm, &amp;lt;BR&amp;gt;&lt;br /&gt;
daher haben wir ein Projekt auf Sourcefore angelegt.&lt;br /&gt;
== Zugangsdaten ==&lt;br /&gt;
Projektseite:         http://sourceforge.net/projects/openhr20/ &amp;lt;BR&amp;gt;&lt;br /&gt;
Repository Location: https://openhr20.svn.sourceforge.net/svnroot/openhr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
Browse Repository:    http://openhr20.svn.sourceforge.net/viewvc/openhr20/ &amp;lt;BR&amp;gt;&lt;br /&gt;
== Policy ==&lt;br /&gt;
Anonymous check out ist erlaubt. &amp;lt;br&amp;gt;&lt;br /&gt;
Wer was committen will muss freigeschaltet werden. &amp;lt;br&amp;gt;&lt;br /&gt;
Dazu brauche ich den Sourceforge Accountnamen.&amp;lt;br&amp;gt;&lt;br /&gt;
Einfch eine Email mit username und password an hr20[at]carluccio[dot]de&amp;lt;br&amp;gt;&lt;br /&gt;
Das mache ich dann von Hand und da ich nicht alle 10 Minuten Mails bearbeite kann das auch schon mal einen oder zwei Tage dauern. &amp;lt;br&amp;gt;&lt;br /&gt;
Wenn sich ein Maintainer findet, gebe ich die Zugangsdaten gerne weiter.&lt;br /&gt;
&lt;br /&gt;
== SVN Client und Anleitung ==&lt;br /&gt;
Windows-User nutzen am besten den Tortoise-SVN-Client, den man kostenfrei [http://tortoisesvn.tigris.org hier runterladen] kann. &amp;lt;br&amp;gt;&lt;br /&gt;
Dort gibt es auch eine Anleitung zum Arbeiten mit SVN.&lt;br /&gt;
&lt;br /&gt;
= Analyse der Hardware =&lt;br /&gt;
Die Analyse hat der Dario schon gemacht, zu finden ist die jeweils aktuelle Version &lt;br /&gt;
[http://carluccio.de/images/e/e1/Hr20-analyse.pdf als PDF hier] oder [https://opensvn.csie.org/viewcvs.cgi/doc/analyse.pdf hier im SVN].&lt;br /&gt;
== Fuses ==&lt;br /&gt;
Here the settings of the fuses:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! width=&amp;quot;100&amp;quot; | &lt;br /&gt;
! width=&amp;quot;150&amp;quot; | Original    &lt;br /&gt;
! width=&amp;quot;150&amp;quot; | OpenHR20&lt;br /&gt;
|-&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | Extended&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 0xFD&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 0xFD&lt;br /&gt;
|-&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | High&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 0x91&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 0x9B&lt;br /&gt;
|-&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | Low&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 0x62&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 0xE2&lt;br /&gt;
|-&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | EESAVE&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | enabled&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | disabled&lt;br /&gt;
|-&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | BOOTSZ&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 1024 Words (1E00)      &lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 512 Words (1C00)&lt;br /&gt;
|-&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | CKDIV8 &lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 1           &lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= TODOs =&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Task&lt;br /&gt;
! Remark&lt;br /&gt;
! Responsible&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Code Review&lt;br /&gt;
| Check the code, complete doxygen coments&lt;br /&gt;
| &lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| UserManual&lt;br /&gt;
| Write a User Manual, Screenshots are in \trunk\doc\Screenshots\&lt;br /&gt;
| &lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| PC-Software&lt;br /&gt;
| Write PC-Program to: &amp;lt;BR&amp;gt;- Read and Write OpenHR20 Settings &amp;lt;BR&amp;gt;- Log Status from OpenHR20&amp;lt;BR&amp;gt;- Visualize Logfile&amp;lt;BR&amp;gt; &lt;br /&gt;
| &lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Bootloader&lt;br /&gt;
| Do we still need a Bootloader ?&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= API Beschreibung =&lt;br /&gt;
Das Projekt wird mit doxygen dokumentiert, &lt;br /&gt;
die API-Beschreibung kann aus dem Source-Code generiert werden.&lt;br /&gt;
= UART Protocoll =&lt;br /&gt;
&lt;br /&gt;
This is the documentation for the UART Protocol in Release 74 of the SVN hosted on Sourceforge:&lt;br /&gt;
&lt;br /&gt;
== Com-Port Params ==&lt;br /&gt;
* BAUD: 9600&lt;br /&gt;
* Data: 8&lt;br /&gt;
* Parity: N&lt;br /&gt;
* Stop: 1&lt;br /&gt;
&lt;br /&gt;
== Automatic calibration ==&lt;br /&gt;
When the HR20 is mounted, then the automatic calibration is started. &lt;br /&gt;
The Debug-Info during the callibration is printed to the com-interface like this:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
+ 0210&lt;br /&gt;
+ 047e&lt;br /&gt;
+ 0437&lt;br /&gt;
[... many lines deleted ...]&lt;br /&gt;
- 0681&lt;br /&gt;
- 0695&lt;br /&gt;
- 0694&lt;br /&gt;
+ 0210&lt;br /&gt;
+ 047e&lt;br /&gt;
+ 0437&lt;br /&gt;
+ 0417&lt;br /&gt;
+ 0454&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Commands ==&lt;br /&gt;
All commands have FIXED format.&lt;br /&gt;
* command &#039;&#039;&#039;X.....\n &#039;&#039;&#039; termination char&lt;br /&gt;
* X is upcase char as commad name&lt;br /&gt;
* hex numbers use ONLY lowcase chars&lt;br /&gt;
* upcase is reserved for commands&lt;br /&gt;
=== print version information ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 V&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 V: OpenHR20 SW version V.VV build DDDD $Rev: REV $&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Where:&lt;br /&gt;
* V.VV  Version&lt;br /&gt;
* DDDD  Date at compilition &lt;br /&gt;
* REV   SVN Revision&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 V: OpenHR20 SW version 0.21 build Nov 13 2008 23:22:08 $Rev: 72 $&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
=== print status line  ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 D&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 D: WW DDDDDDDD TTTTTTTT V: VV I: IIII S: SSSS B: BBBB E:EE X&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Where:&lt;br /&gt;
* &#039;&#039;&#039;WW&#039;&#039;&#039; Day of Week (monday=1)&lt;br /&gt;
* &#039;&#039;&#039;DDDDDDDD&#039;&#039;&#039; actual date &lt;br /&gt;
* &#039;&#039;&#039;TTTTTTTT&#039;&#039;&#039; actual time &lt;br /&gt;
* &#039;&#039;&#039;VV&#039;&#039;&#039; actual position of valve [%] (00=closed, 100=opened)&lt;br /&gt;
* &#039;&#039;&#039;IIII&#039;&#039;&#039; actual temperature&lt;br /&gt;
* &#039;&#039;&#039;SSSS&#039;&#039;&#039; desired temperature&lt;br /&gt;
* &#039;&#039;&#039;BBBB&#039;&#039;&#039; battary voltage [mV]&lt;br /&gt;
* &#039;&#039;&#039;EE&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;X&#039;&#039;&#039;&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 D: d3 01.10.08 12:00:16 V: 00 I: 2103 S: 1700 B: 3259 E:04 X&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
=== print watched wariable ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Taa&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;aa&#039;&#039;&#039; watched wariable see &#039;&#039;watch.c&#039;&#039;&lt;br /&gt;
Response:&lt;br /&gt;
(return 2 or 4 hex numbers) &lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 T[aa]=VVVV&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Where:&lt;br /&gt;
* &#039;&#039;&#039;aa&#039;&#039;&#039; watched wariable see &#039;&#039;watch.c&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;VVVV&#039;&#039;&#039; value of watched wariable &lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 T[01]=0cca&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
=== get configuration byte ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Gaa&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;aa&#039;&#039;&#039; hex address of configuration byte see eeprom.h&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 G[aa]=VV&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Where:&lt;br /&gt;
* &#039;&#039;&#039;aa&#039;&#039;&#039; hex address of configuration byte see eeprom.h&lt;br /&gt;
* &#039;&#039;&#039;VV&#039;&#039;&#039; value of configuration byte &lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 G[13]=2d&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
=== set configuration byte ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 SaaVV&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;aa&#039;&#039;&#039; hex address of configuration byte see eeprom.h&lt;br /&gt;
* &#039;&#039;&#039;VV&#039;&#039;&#039; hex value for configuration byte (hex)&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 S[aa]=VV&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Where:&lt;br /&gt;
* &#039;&#039;&#039;aa&#039;&#039;&#039; hex address of configuration byte see eeprom.h&lt;br /&gt;
* &#039;&#039;&#039;VV&#039;&#039;&#039; value of configuration byte &lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 S[13]=2d&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
=== get timer ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Rab&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;a&#039;&#039;&#039; day &lt;br /&gt;
* &#039;&#039;&#039;b&#039;&#039;&#039; slot&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 R[ab]=cddd&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Where:&lt;br /&gt;
* &#039;&#039;&#039;c&#039;&#039;&#039; timermode &lt;br /&gt;
: &#039;&#039;&#039;0&#039;&#039;&#039; frost protection&lt;br /&gt;
: &#039;&#039;&#039;1&#039;&#039;&#039; energy save&lt;br /&gt;
: &#039;&#039;&#039;2&#039;&#039;&#039; comfort&lt;br /&gt;
: &#039;&#039;&#039;3&#039;&#039;&#039; supercomfort&lt;br /&gt;
* &#039;&#039;&#039;ddd&#039;&#039;&#039; time (minutes since 00:00, hex) &lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 R[10]=21a4&lt;br /&gt;
 R[11]=121c&lt;br /&gt;
 R[12]=23c0&lt;br /&gt;
 R[13]=14ec&lt;br /&gt;
 R[14]=2fff&lt;br /&gt;
 R[15]=1fff&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
comfort at 0x1a4  = 420 / 60 = 7&lt;br /&gt;
energy save at 0x21c  = 540 / 60 = 9&lt;br /&gt;
comfort at 0x3c0  = 960 / 60 = 16&lt;br /&gt;
energy save at 0x4ec  = 1260 / 60 = 21&lt;br /&gt;
Slot 5+6 not used.&lt;br /&gt;
&lt;br /&gt;
=== set timer ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Wabcddd&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;a&#039;&#039;&#039; day &lt;br /&gt;
* &#039;&#039;&#039;b&#039;&#039;&#039; slot&lt;br /&gt;
* &#039;&#039;&#039;c&#039;&#039;&#039; timermode (0 to 3) &lt;br /&gt;
* &#039;&#039;&#039;d&#039;&#039;&#039; time time (minutes since 00:00, hex) &lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 W[ab]=cddd&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 W[10]=21a4&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Reboot ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 B1324&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;1234&#039;&#039;&#039; password (fixed at this moment)&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== set date ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Yyymmdd&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;yy&#039;&#039;&#039; year&lt;br /&gt;
* &#039;&#039;&#039;mm&#039;&#039;&#039; month&lt;br /&gt;
* &#039;&#039;&#039;dd&#039;&#039;&#039; day&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 D: WW DDDDDDDD TTTTTTTT V: VV I: IIII S: SSSS B: BBBB E:EE X&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
=== set time ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Hhhmmss&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;hh&#039;&#039;&#039; hour&lt;br /&gt;
* &#039;&#039;&#039;mm&#039;&#039;&#039; minute&lt;br /&gt;
* &#039;&#039;&#039;ss&#039;&#039;&#039; seconds&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 D: WW DDDDDDDD TTTTTTTT V: VV I: IIII S: SSSS B: BBBB E:EE X&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== set wanted temperature ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Axx&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;xx&#039;&#039;&#039; temperature [unit 0.5C] (hex)&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 D: WW DDDDDDDD TTTTTTTT V: VV I: IIII S: SSSS B: BBBB E:EE X&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Example:&lt;br /&gt;
20°C = 40 * 0,5 °C = 28 (hex)&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 A28&amp;lt;CR&amp;gt;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039;Attention: The value in the response is not the new value.&amp;lt;BR&amp;gt;The new value is updated some secondes later, so be patient and wait.&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== set mode ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Mxx&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;xx&#039;&#039;&#039; mode &lt;br /&gt;
: 00 = manu&lt;br /&gt;
: 01 = auto&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 D: WW DDDDDDDD TTTTTTTT V: VV I: IIII S: SSSS B: BBBB E:EE X&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Bootloader =&lt;br /&gt;
Um ein einfaches Update der Software, auch ohne Programmer und Zerlegen des HR20E zu ermöglichen, sollte ein Bootloader implementiert werden.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Grundsatzproblem:&#039;&#039;&#039; Fuer ein erstes Umflashen eines eben aus der Verpackung genommenen HR20s braucht man &#039;&#039;immer&#039;&#039; einen JTAG-Programmer um ueberhaupt erstmal den Bootlader selber draufzukriegen.&lt;br /&gt;
&lt;br /&gt;
== Anforderungen ==&lt;br /&gt;
* Einfaches Update ohne öffnen des HR20E&amp;lt;br&amp;gt;&lt;br /&gt;
* Nutzen bestehender Programme (Terminalprogramm), das erspart das schreiben von Update Software&amp;lt;br&amp;gt;&lt;br /&gt;
* HR20E sollte nach dem Start prüfen ob Programm gültig und nur dann das Anwenderprogramm starten&lt;br /&gt;
* Protokoll sollte Updatevorgang aus dem laufenden Betrieb unterstützen (Sprung in den Bootloader)&lt;br /&gt;
&lt;br /&gt;
== Vorschlag 1 ==&lt;br /&gt;
X-Modem Protokoll (mit CRC)&amp;lt;br&amp;gt;&lt;br /&gt;
Hier gibt es eine fertige Lösung für das Etherboot projekt, deren übername gestattet ist.&amp;lt;br&amp;gt; &lt;br /&gt;
Größe ist hier kleiner 1kb und wohl verkraftbar.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vorteil:&amp;lt;br&amp;gt;&lt;br /&gt;
* etablierte Technik&lt;br /&gt;
* von anderen Herstellern Verwendet&lt;br /&gt;
* wird von den meisten Terminal Programmen unterstützt&lt;br /&gt;
* Gesichert durch Checksumme&lt;br /&gt;
Nachteil:&amp;lt;br&amp;gt;&lt;br /&gt;
* Aufwendige Checksummen Berechnung oder Lookup Tabelle Notwendig&lt;br /&gt;
&lt;br /&gt;
== Vorschlag 2 ==&lt;br /&gt;
Verwendung des [[AVR_Bootloader_FastBoot_von_Peter_Dannegger]]:&lt;br /&gt;
Der ist sehr klein, erprobt, leicht anwendbar und funzt auch sehr gut. Die Windows-Software fuer den Upload ist auch sehr gelungen. Auf Grund des o.g. Grundsatzproblems und der Tatsache dass die Neuentwicklung eines Bootladers sehr anspruchsvoll ist, halte ich es an dieser Stelle fuer besser, das Rad nicht neu zu erfinden.&lt;br /&gt;
&lt;br /&gt;
= Entwicklungsumgebung =&lt;br /&gt;
* Editor, Debugger, Compiler&lt;br /&gt;
** WinAVR version (20071221), sprich GCC 4.2.2 sowie avr-libc 1.6.0&lt;br /&gt;
** AVR Studio 4 &lt;br /&gt;
* JTAG ICE&lt;br /&gt;
** Atmel AVR JTAGICE MK2 &lt;br /&gt;
** AVR Dragon (z.B. http://elmicro.com/de/atavrdragon.html)&lt;br /&gt;
** Olimex-Seriell http://www.olimex.com/dev/avr-jtag.html  &lt;br /&gt;
** Olimex-USB http://www.olimex.com/dev/avr-usb-jtag.html &lt;br /&gt;
&lt;br /&gt;
= Sonstiges =&lt;br /&gt;
== Altes Protokoll ==&lt;br /&gt;
[[HR20_Protocol_V2 | Hier ]] hat mal einer ein Protokoll eingegeben.&lt;br /&gt;
Das scheint aber nicht zu der Version 2.04 zu passen. &lt;br /&gt;
Ich habe es nicht gelöscht, falls es jemanden interessiert.&lt;br /&gt;
&lt;br /&gt;
[[Category:Projekte|!]]&lt;/div&gt;</summary>
		<author><name>Dario</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=32666</id>
		<title>Heizungssteuerung mit Honeywell HR20</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=32666"/>
		<updated>2008-11-23T11:38:42Z</updated>

		<summary type="html">&lt;p&gt;Dario: /* Subversion Repository */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von DarioC&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Wie alles begann =&lt;br /&gt;
&lt;br /&gt;
Nachdem von Uwe Felgentreu vor nunmehr vor über drei Jahren (genau am 17.11.2004 um 11:26) hier in diesem Forum den Thread mit dem Titel &#039;&#039;Honeywell Rondostat HR20E per AVR steuern und konfigurieren&#039;&#039; gestartet hat ist es nun langsam soweit, dass das Ganze auch ein Projekt wird. &lt;br /&gt;
&lt;br /&gt;
Den Thread dazu kann der interessierte Leser [http://www.mikrocontroller.net/topic/17603 hier nachlesen] &lt;br /&gt;
&lt;br /&gt;
= Projektziel =&lt;br /&gt;
&lt;br /&gt;
Wir konzentrieren uns in erster Linie auf den Honeywell Rondostat HR20E mit ausgelieferten Softwareversion 2.04. Dass es ähnliche andere Geräte gibt behalten wir bei der Entwicklung im Hinterkopf.&lt;br /&gt;
&lt;br /&gt;
Basierend auf dieser Hardware wollen wir eine neue Software entwickeln. &lt;br /&gt;
Dabei können wir ausser der Hardware nichts weiter verwenden, da die Originalsoftware geschützt ist und nicht ausgelesen werden kann.&lt;br /&gt;
&lt;br /&gt;
== Phase 1 ==&lt;br /&gt;
Die Software soll die Funktionen bieten, die die Originalsoftware auch bietet, später können dies dann um zusätzliche Funktionen erweitert werden. Die wichtigsten Funktionen sind:&lt;br /&gt;
&lt;br /&gt;
* Temperaturregelung&lt;br /&gt;
* Echtzeituhr&lt;br /&gt;
* Ausnutzen der Sleep Funktion&lt;br /&gt;
* Anzeige Soll-Temperatur und der Uhrzeit&lt;br /&gt;
* Einstellung der Soll-Temperatur&lt;br /&gt;
* Uhrzeitgesteuerte Einstellung der Soll-Temperatur &lt;br /&gt;
* Fenster-Offen-Erkennung&lt;br /&gt;
* Ventilfreispülungsfunktion&lt;br /&gt;
&lt;br /&gt;
== Phase 2 ==&lt;br /&gt;
&lt;br /&gt;
Hier liegt der Sinn des ganzen Projektes: Durch diese zusätzlichen Funktionen wollen wir den Nutzwert des Thermostaten erheblich steigern:&lt;br /&gt;
&lt;br /&gt;
* Programmierung der Schaltzeiten und Temperaturen über externe Schnittstelle&lt;br /&gt;
* Abfrage der Messwerte und Parameter über externe Schnittstelle&lt;br /&gt;
* Vernetzung der Thermostaten untereinander&lt;br /&gt;
* Zusätzliche externe Schnittstellen (neben UART auch CAN und Funk)&lt;br /&gt;
* Erweiterung der Anzeige um&lt;br /&gt;
** Ist-Temperatur &lt;br /&gt;
** Ventilstellung&lt;br /&gt;
** Funkschnittstelle&lt;br /&gt;
*** RFM12 http://www.hoperf.com/rf_fsk.asp&lt;br /&gt;
**** Library dazu im [https://roulette.das-labor.org/trac/browser/microcontroller/src-atmel/lib/rfm12/ SVN], [http://www.das-labor.org/wiki/Datenfunk_mit_dem_AVR Doku hier]&lt;br /&gt;
*** Zigbee http://www.meshnetics.com/zigbee-modules&lt;br /&gt;
** ...&lt;br /&gt;
* Bootloader, damit Leute mitarbeiten können, die keine JTAG haben. Mit einem JTAG könnte man den Bootloader Flashen, ohne den Thermostaten öffnen zu müssen. Von da an kann man über den Programmierstecker mit einem umgebauten Handykabel den Thermostaten neu flashen.&lt;br /&gt;
&lt;br /&gt;
= Lizenz =&lt;br /&gt;
Die Software wird unter GPL v2 gestellt.&lt;br /&gt;
&lt;br /&gt;
= Subversion Repository =&lt;br /&gt;
Das alte SVN Repository auf https://opensvn.csie.org war zu lahm, &amp;lt;BR&amp;gt;&lt;br /&gt;
daher haben wir ein Projekt auf Sourcefore angelegt.&lt;br /&gt;
== Zugangsdaten ==&lt;br /&gt;
Projektseite:         http://sourceforge.net/projects/openhr20/ &amp;lt;BR&amp;gt;&lt;br /&gt;
Repository Location: https://openhr20.svn.sourceforge.net/svnroot/openhr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
Browse Repository:    http://openhr20.svn.sourceforge.net/viewvc/openhr20/ &amp;lt;BR&amp;gt;&lt;br /&gt;
== Policy ==&lt;br /&gt;
Anonymous check out ist erlaubt. &amp;lt;br&amp;gt;&lt;br /&gt;
Wer was committen will muss freigeschaltet werden. &amp;lt;br&amp;gt;&lt;br /&gt;
Dazu brauche ich den Sourceforge Accountnamen.&amp;lt;br&amp;gt;&lt;br /&gt;
Einfch eine Email mit username und password an hr20[at]carluccio[dot]de&amp;lt;br&amp;gt;&lt;br /&gt;
Das mache ich dann von Hand und da ich nicht alle 10 Minuten Mails bearbeite kann das auch schon mal einen oder zwei Tage dauern. &amp;lt;br&amp;gt;&lt;br /&gt;
Wenn sich ein Maintainer findet, gebe ich die Zugangsdaten gerne weiter.&lt;br /&gt;
&lt;br /&gt;
== SVN Client und Anleitung ==&lt;br /&gt;
Windows-User nutzen am besten den Tortoise-SVN-Client, den man kostenfrei [http://tortoisesvn.tigris.org hier runterladen] kann. &amp;lt;br&amp;gt;&lt;br /&gt;
Dort gibt es auch eine Anleitung zum Arbeiten mit SVN.&lt;br /&gt;
&lt;br /&gt;
= Analyse der Hardware =&lt;br /&gt;
Die Analyse hat der Dario schon gemacht, zu finden ist die jeweils aktuelle Version &lt;br /&gt;
[http://carluccio.de/images/e/e1/Hr20-analyse.pdf als PDF hier] oder [https://opensvn.csie.org/viewcvs.cgi/doc/analyse.pdf hier im SVN].&lt;br /&gt;
== Fuses ==&lt;br /&gt;
Here the settings of the fuses:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! width=&amp;quot;100&amp;quot; | &lt;br /&gt;
! width=&amp;quot;150&amp;quot; | Original    &lt;br /&gt;
! width=&amp;quot;150&amp;quot; | OpenHR20&lt;br /&gt;
|-&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | Extended&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 0xFD&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 0xFD&lt;br /&gt;
|-&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | High&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 0x91&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 0x9B&lt;br /&gt;
|-&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | Low&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 0x62&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 0xE2&lt;br /&gt;
|-&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | EESAVE&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | enabled&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | disabled&lt;br /&gt;
|-&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | BOOTSZ&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 1024 Words (1E00)      &lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 512 Words (1C00)&lt;br /&gt;
|-&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | CKDIV8 &lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 1           &lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Benötigte Module =&lt;br /&gt;
&lt;br /&gt;
Um das Ganze nun etwas zu koordinieren hier eine Liste der benötigten Module und deren Funktionen. &amp;lt;br&amp;gt;&lt;br /&gt;
Diese dient dazu später die Aufgaben zu verteilen:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Module&lt;br /&gt;
! Function&lt;br /&gt;
! Developer&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| LCD&lt;br /&gt;
| Display Driver:&amp;lt;BR&amp;gt;&lt;br /&gt;
* Init Display - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Set Segments - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Print HEX, DEC, TEMP, DayofWeek - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Blink - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* e.t.c&lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; DONE &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| LCD Simulation&lt;br /&gt;
| Simulation for display in AVR Studio:&amp;lt;BR&amp;gt;&lt;br /&gt;
* Defining Display - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Assign Segments to register bits - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Providing samplecode - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
| louk&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; 95% &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| RTC&lt;br /&gt;
| Time and Date Handler&lt;br /&gt;
* init timer - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* use IRQ with 32kHz crystal - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* handle time and date - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** daylight saving - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** consult leapyear  - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* calc day of week out of date - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Only one Byte for Year -&amp;gt; (2000 to 2255)&lt;br /&gt;
* Day of week timer with callback - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* Tick counter (seconds since reboot) - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** used to detect long keypress&lt;br /&gt;
** used to detect motor blocked&lt;br /&gt;
** used for additional timer &lt;br /&gt;
* Additional timer based on tick counter value - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* corretion for external Crystal - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* calibrate internal RC - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE, but not tested &#039;&#039;&#039;&amp;lt;/span&amp;gt; &lt;br /&gt;
| &#039;&#039;&#039; dario &#039;&#039;&#039; &lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; 95% &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| COM&lt;br /&gt;
| COM-Driver&lt;br /&gt;
* menue (Debug und Steuerung)&lt;br /&gt;
** show and set desired temperature &lt;br /&gt;
** show and set Time and Date&lt;br /&gt;
** show actual temperature&lt;br /&gt;
** show (and set) actual valveposition &lt;br /&gt;
** show and set timetable and temperatures&lt;br /&gt;
* optional &lt;br /&gt;
** adressierung of HR20 (for BUS, RF)&lt;br /&gt;
** authentication end encryption&lt;br /&gt;
| style=&amp;quot;background-color:blue;&amp;quot; | &#039;&#039;&#039; jsachs &#039;&#039;&#039; &lt;br /&gt;
&#039;&#039;&#039; active &#039;&#039;&#039; &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039; (50%) &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| CONFIG &lt;br /&gt;
| Save Config in EEPROM&lt;br /&gt;
* driver for EEPROM access&lt;br /&gt;
* save values to EEPROM &lt;br /&gt;
* load values from EEPROM &lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| MENU &lt;br /&gt;
| Control Menu State Machine&lt;br /&gt;
* show values on display&lt;br /&gt;
* functionality:&lt;br /&gt;
** show and set desired temperature&lt;br /&gt;
** show and set time and date &lt;br /&gt;
** show actual temperature&lt;br /&gt;
** show actual valveposition &lt;br /&gt;
** show and set timetable and temperatures&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| MAIN&lt;br /&gt;
| Main Loop&lt;br /&gt;
* init everything&lt;br /&gt;
** global vars - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** rtc - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** lcd - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** motor - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** tempsensor &lt;br /&gt;
* get keystate - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE (ISR in main.c)&#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** debounce - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039;not needed&#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** multi keypress (needed for hidden menue?) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039;can be checked by main loop&#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
* get position of wheel (incremental counter) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE (ISR in main.c)&#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* call menue&lt;br /&gt;
* detect longer keypress / double click - needed?&lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; (70%)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| MOTOR&lt;br /&gt;
| Motor-Driver &lt;br /&gt;
* set desired valveposition  - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** quick, asympthotic, quiet - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE (speed can be chosen) &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* callibrate for Valve - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt; &lt;br /&gt;
** optimised (less motor consumption depending on desired final position) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Stop motor if not turning (blocked) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* stop calibration if valve is removed - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN  &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Genereate ERROR if motor is not turning (blocked or low energy) - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; (95%)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| ADC&lt;br /&gt;
| ADC-Driver (measure Temp and U_Bat)&lt;br /&gt;
* init Sensor  - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
* start A/D conversion (Temp and U_Bat) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
* calc temperature in 1/100 degree Celsius - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
* calc battery voltage in mV - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
* calibration for sensor (needed?) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
* IRQ driven (IRQ generated by RTC or LCD, called from main.c)&lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; (95%)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| PID&lt;br /&gt;
| PID Algorithm&lt;br /&gt;
* calculate desired valveposition out of&lt;br /&gt;
** last valveposition(s) &lt;br /&gt;
** last temperature(s)&lt;br /&gt;
** actual temperature&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| LOG&lt;br /&gt;
| Datalogger&lt;br /&gt;
* Operating Hours&lt;br /&gt;
** motor in action&lt;br /&gt;
** ODOmeter&lt;br /&gt;
** since Battery Exchange&lt;br /&gt;
* Errors&lt;br /&gt;
* Logfiles (only with additional hardware)&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UID&lt;br /&gt;
| Unique ID for identification&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| BOOT&lt;br /&gt;
| Bootloader&lt;br /&gt;
we need a bootloader so that the developers can flash the software &lt;br /&gt;
without a JTAG cable and without disassembling the HR20.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039; I have a working XModem bootloader. We should discuss if we want to use it. &#039;&#039;&#039; &amp;lt;br&amp;gt;&lt;br /&gt;
Still need some size optimisation&amp;lt;br&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color:blue;&amp;quot; | &#039;&#039;&#039; jsachs &#039;&#039;&#039; &lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; |&lt;br /&gt;
&#039;&#039;&#039; (95%) &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= API Beschreibung =&lt;br /&gt;
Das Projekt wird mit doxygen dokumentiert, &lt;br /&gt;
die API-Beschreibung kann aus dem Source-Code generiert werden.&lt;br /&gt;
= UART Protocoll =&lt;br /&gt;
&lt;br /&gt;
This is the documentation for the UART Protocol in Release 74 of the SVN hosted on Sourceforge:&lt;br /&gt;
&lt;br /&gt;
== Com-Port Params ==&lt;br /&gt;
* BAUD: 9600&lt;br /&gt;
* Data: 8&lt;br /&gt;
* Parity: N&lt;br /&gt;
* Stop: 1&lt;br /&gt;
&lt;br /&gt;
== Automatic calibration ==&lt;br /&gt;
When the HR20 is mounted, then the automatic calibration is started. &lt;br /&gt;
The Debug-Info during the callibration is printed to the com-interface like this:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
+ 0210&lt;br /&gt;
+ 047e&lt;br /&gt;
+ 0437&lt;br /&gt;
[... many lines deleted ...]&lt;br /&gt;
- 0681&lt;br /&gt;
- 0695&lt;br /&gt;
- 0694&lt;br /&gt;
+ 0210&lt;br /&gt;
+ 047e&lt;br /&gt;
+ 0437&lt;br /&gt;
+ 0417&lt;br /&gt;
+ 0454&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Commands ==&lt;br /&gt;
All commands have FIXED format.&lt;br /&gt;
* command &#039;&#039;&#039;X.....\n &#039;&#039;&#039; termination char&lt;br /&gt;
* X is upcase char as commad name&lt;br /&gt;
* hex numbers use ONLY lowcase chars&lt;br /&gt;
* upcase is reserved for commands&lt;br /&gt;
=== print version information ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 V&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 V: OpenHR20 SW version V.VV build DDDD $Rev: REV $&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Where:&lt;br /&gt;
* V.VV  Version&lt;br /&gt;
* DDDD  Date at compilition &lt;br /&gt;
* REV   SVN Revision&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 V: OpenHR20 SW version 0.21 build Nov 13 2008 23:22:08 $Rev: 72 $&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
=== print status line  ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 D&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 D: WW DDDDDDDD TTTTTTTT V: VV I: IIII S: SSSS B: BBBB E:EE X&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Where:&lt;br /&gt;
* &#039;&#039;&#039;WW&#039;&#039;&#039; Day of Week (monday=1)&lt;br /&gt;
* &#039;&#039;&#039;DDDDDDDD&#039;&#039;&#039; actual date &lt;br /&gt;
* &#039;&#039;&#039;TTTTTTTT&#039;&#039;&#039; actual time &lt;br /&gt;
* &#039;&#039;&#039;VV&#039;&#039;&#039; actual position of valve [%] (00=closed, 100=opened)&lt;br /&gt;
* &#039;&#039;&#039;IIII&#039;&#039;&#039; actual temperature&lt;br /&gt;
* &#039;&#039;&#039;SSSS&#039;&#039;&#039; desired temperature&lt;br /&gt;
* &#039;&#039;&#039;BBBB&#039;&#039;&#039; battary voltage [mV]&lt;br /&gt;
* &#039;&#039;&#039;EE&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;X&#039;&#039;&#039;&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 D: d3 01.10.08 12:00:16 V: 00 I: 2103 S: 1700 B: 3259 E:04 X&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
=== print watched wariable ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Taa&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;aa&#039;&#039;&#039; watched wariable see &#039;&#039;watch.c&#039;&#039;&lt;br /&gt;
Response:&lt;br /&gt;
(return 2 or 4 hex numbers) &lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 T[aa]=VVVV&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Where:&lt;br /&gt;
* &#039;&#039;&#039;aa&#039;&#039;&#039; watched wariable see &#039;&#039;watch.c&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;VVVV&#039;&#039;&#039; value of watched wariable &lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 T[01]=0cca&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
=== get configuration byte ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Gaa&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;aa&#039;&#039;&#039; hex address of configuration byte see eeprom.h&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 G[aa]=VV&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Where:&lt;br /&gt;
* &#039;&#039;&#039;aa&#039;&#039;&#039; hex address of configuration byte see eeprom.h&lt;br /&gt;
* &#039;&#039;&#039;VV&#039;&#039;&#039; value of configuration byte &lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 G[13]=2d&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
=== set configuration byte ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 SaaVV&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;aa&#039;&#039;&#039; hex address of configuration byte see eeprom.h&lt;br /&gt;
* &#039;&#039;&#039;VV&#039;&#039;&#039; hex value for configuration byte (hex)&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 S[aa]=VV&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Where:&lt;br /&gt;
* &#039;&#039;&#039;aa&#039;&#039;&#039; hex address of configuration byte see eeprom.h&lt;br /&gt;
* &#039;&#039;&#039;VV&#039;&#039;&#039; value of configuration byte &lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 S[13]=2d&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
=== get timer ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Rab&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;a&#039;&#039;&#039; day &lt;br /&gt;
* &#039;&#039;&#039;b&#039;&#039;&#039; slot&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 R[ab]=cddd&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Where:&lt;br /&gt;
* &#039;&#039;&#039;c&#039;&#039;&#039; timermode &lt;br /&gt;
: &#039;&#039;&#039;0&#039;&#039;&#039; frost protection&lt;br /&gt;
: &#039;&#039;&#039;1&#039;&#039;&#039; energy save&lt;br /&gt;
: &#039;&#039;&#039;2&#039;&#039;&#039; comfort&lt;br /&gt;
: &#039;&#039;&#039;3&#039;&#039;&#039; supercomfort&lt;br /&gt;
* &#039;&#039;&#039;ddd&#039;&#039;&#039; time (minutes since 00:00, hex) &lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 R[10]=21a4&lt;br /&gt;
 R[11]=121c&lt;br /&gt;
 R[12]=23c0&lt;br /&gt;
 R[13]=14ec&lt;br /&gt;
 R[14]=2fff&lt;br /&gt;
 R[15]=1fff&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
comfort at 0x1a4  = 420 / 60 = 7&lt;br /&gt;
energy save at 0x21c  = 540 / 60 = 9&lt;br /&gt;
comfort at 0x3c0  = 960 / 60 = 16&lt;br /&gt;
energy save at 0x4ec  = 1260 / 60 = 21&lt;br /&gt;
Slot 5+6 not used.&lt;br /&gt;
&lt;br /&gt;
=== set timer ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Wabcddd&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;a&#039;&#039;&#039; day &lt;br /&gt;
* &#039;&#039;&#039;b&#039;&#039;&#039; slot&lt;br /&gt;
* &#039;&#039;&#039;c&#039;&#039;&#039; timermode (0 to 3) &lt;br /&gt;
* &#039;&#039;&#039;d&#039;&#039;&#039; time time (minutes since 00:00, hex) &lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 W[ab]=cddd&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 W[10]=21a4&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Reboot ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 B1324&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;1234&#039;&#039;&#039; password (fixed at this moment)&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== set date ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Yyymmdd&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;yy&#039;&#039;&#039; year&lt;br /&gt;
* &#039;&#039;&#039;mm&#039;&#039;&#039; month&lt;br /&gt;
* &#039;&#039;&#039;dd&#039;&#039;&#039; day&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 D: WW DDDDDDDD TTTTTTTT V: VV I: IIII S: SSSS B: BBBB E:EE X&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
=== set time ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Hhhmmss&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;hh&#039;&#039;&#039; hour&lt;br /&gt;
* &#039;&#039;&#039;mm&#039;&#039;&#039; minute&lt;br /&gt;
* &#039;&#039;&#039;ss&#039;&#039;&#039; seconds&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 D: WW DDDDDDDD TTTTTTTT V: VV I: IIII S: SSSS B: BBBB E:EE X&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== set wanted temperature ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Axx&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;xx&#039;&#039;&#039; temperature [unit 0.5C] (hex)&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 D: WW DDDDDDDD TTTTTTTT V: VV I: IIII S: SSSS B: BBBB E:EE X&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Example:&lt;br /&gt;
20°C = 40 * 0,5 °C = 28 (hex)&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 A28&amp;lt;CR&amp;gt;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039;Attention: The value in the response is not the new value.&amp;lt;BR&amp;gt;The new value is updated some secondes later, so be patient and wait.&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== set mode ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Mxx&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;xx&#039;&#039;&#039; mode &lt;br /&gt;
: 00 = manu&lt;br /&gt;
: 01 = auto&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 D: WW DDDDDDDD TTTTTTTT V: VV I: IIII S: SSSS B: BBBB E:EE X&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Bootloader =&lt;br /&gt;
Um ein einfaches Update der Software, auch ohne Programmer und Zerlegen des HR20E zu ermöglichen, sollte ein Bootloader implementiert werden.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Grundsatzproblem:&#039;&#039;&#039; Fuer ein erstes Umflashen eines eben aus der Verpackung genommenen HR20s braucht man &#039;&#039;immer&#039;&#039; einen JTAG-Programmer um ueberhaupt erstmal den Bootlader selber draufzukriegen.&lt;br /&gt;
&lt;br /&gt;
== Anforderungen ==&lt;br /&gt;
* Einfaches Update ohne öffnen des HR20E&amp;lt;br&amp;gt;&lt;br /&gt;
* Nutzen bestehender Programme (Terminalprogramm), das erspart das schreiben von Update Software&amp;lt;br&amp;gt;&lt;br /&gt;
* HR20E sollte nach dem Start prüfen ob Programm gültig und nur dann das Anwenderprogramm starten&lt;br /&gt;
* Protokoll sollte Updatevorgang aus dem laufenden Betrieb unterstützen (Sprung in den Bootloader)&lt;br /&gt;
&lt;br /&gt;
== Vorschlag 1 ==&lt;br /&gt;
X-Modem Protokoll (mit CRC)&amp;lt;br&amp;gt;&lt;br /&gt;
Hier gibt es eine fertige Lösung für das Etherboot projekt, deren übername gestattet ist.&amp;lt;br&amp;gt; &lt;br /&gt;
Größe ist hier kleiner 1kb und wohl verkraftbar.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vorteil:&amp;lt;br&amp;gt;&lt;br /&gt;
* etablierte Technik&lt;br /&gt;
* von anderen Herstellern Verwendet&lt;br /&gt;
* wird von den meisten Terminal Programmen unterstützt&lt;br /&gt;
* Gesichert durch Checksumme&lt;br /&gt;
Nachteil:&amp;lt;br&amp;gt;&lt;br /&gt;
* Aufwendige Checksummen Berechnung oder Lookup Tabelle Notwendig&lt;br /&gt;
&lt;br /&gt;
== Vorschlag 2 ==&lt;br /&gt;
Verwendung des [[AVR_Bootloader_FastBoot_von_Peter_Dannegger]]:&lt;br /&gt;
Der ist sehr klein, erprobt, leicht anwendbar und funzt auch sehr gut. Die Windows-Software fuer den Upload ist auch sehr gelungen. Auf Grund des o.g. Grundsatzproblems und der Tatsache dass die Neuentwicklung eines Bootladers sehr anspruchsvoll ist, halte ich es an dieser Stelle fuer besser, das Rad nicht neu zu erfinden.&lt;br /&gt;
&lt;br /&gt;
= Entwicklungsumgebung =&lt;br /&gt;
* Editor, Debugger, Compiler&lt;br /&gt;
** WinAVR version (20071221), sprich GCC 4.2.2 sowie avr-libc 1.6.0&lt;br /&gt;
** AVR Studio 4 &lt;br /&gt;
* JTAG ICE&lt;br /&gt;
** Atmel AVR JTAGICE MK2 &lt;br /&gt;
** AVR Dragon (z.B. http://elmicro.com/de/atavrdragon.html)&lt;br /&gt;
** Olimex-Seriell http://www.olimex.com/dev/avr-jtag.html  &lt;br /&gt;
** Olimex-USB http://www.olimex.com/dev/avr-usb-jtag.html &lt;br /&gt;
&lt;br /&gt;
= Sonstiges =&lt;br /&gt;
== Altes Protokoll ==&lt;br /&gt;
[[HR20_Protocol_V2 | Hier ]] hat mal einer ein Protokoll eingegeben.&lt;br /&gt;
Das scheint aber nicht zu der Version 2.04 zu passen. &lt;br /&gt;
Ich habe es nicht gelöscht, falls es jemanden interessiert.&lt;br /&gt;
&lt;br /&gt;
[[Category:Projekte|!]]&lt;/div&gt;</summary>
		<author><name>Dario</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=32665</id>
		<title>Heizungssteuerung mit Honeywell HR20</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=32665"/>
		<updated>2008-11-23T11:38:19Z</updated>

		<summary type="html">&lt;p&gt;Dario: /* Subversion Repository */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von DarioC&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Wie alles begann =&lt;br /&gt;
&lt;br /&gt;
Nachdem von Uwe Felgentreu vor nunmehr vor über drei Jahren (genau am 17.11.2004 um 11:26) hier in diesem Forum den Thread mit dem Titel &#039;&#039;Honeywell Rondostat HR20E per AVR steuern und konfigurieren&#039;&#039; gestartet hat ist es nun langsam soweit, dass das Ganze auch ein Projekt wird. &lt;br /&gt;
&lt;br /&gt;
Den Thread dazu kann der interessierte Leser [http://www.mikrocontroller.net/topic/17603 hier nachlesen] &lt;br /&gt;
&lt;br /&gt;
= Projektziel =&lt;br /&gt;
&lt;br /&gt;
Wir konzentrieren uns in erster Linie auf den Honeywell Rondostat HR20E mit ausgelieferten Softwareversion 2.04. Dass es ähnliche andere Geräte gibt behalten wir bei der Entwicklung im Hinterkopf.&lt;br /&gt;
&lt;br /&gt;
Basierend auf dieser Hardware wollen wir eine neue Software entwickeln. &lt;br /&gt;
Dabei können wir ausser der Hardware nichts weiter verwenden, da die Originalsoftware geschützt ist und nicht ausgelesen werden kann.&lt;br /&gt;
&lt;br /&gt;
== Phase 1 ==&lt;br /&gt;
Die Software soll die Funktionen bieten, die die Originalsoftware auch bietet, später können dies dann um zusätzliche Funktionen erweitert werden. Die wichtigsten Funktionen sind:&lt;br /&gt;
&lt;br /&gt;
* Temperaturregelung&lt;br /&gt;
* Echtzeituhr&lt;br /&gt;
* Ausnutzen der Sleep Funktion&lt;br /&gt;
* Anzeige Soll-Temperatur und der Uhrzeit&lt;br /&gt;
* Einstellung der Soll-Temperatur&lt;br /&gt;
* Uhrzeitgesteuerte Einstellung der Soll-Temperatur &lt;br /&gt;
* Fenster-Offen-Erkennung&lt;br /&gt;
* Ventilfreispülungsfunktion&lt;br /&gt;
&lt;br /&gt;
== Phase 2 ==&lt;br /&gt;
&lt;br /&gt;
Hier liegt der Sinn des ganzen Projektes: Durch diese zusätzlichen Funktionen wollen wir den Nutzwert des Thermostaten erheblich steigern:&lt;br /&gt;
&lt;br /&gt;
* Programmierung der Schaltzeiten und Temperaturen über externe Schnittstelle&lt;br /&gt;
* Abfrage der Messwerte und Parameter über externe Schnittstelle&lt;br /&gt;
* Vernetzung der Thermostaten untereinander&lt;br /&gt;
* Zusätzliche externe Schnittstellen (neben UART auch CAN und Funk)&lt;br /&gt;
* Erweiterung der Anzeige um&lt;br /&gt;
** Ist-Temperatur &lt;br /&gt;
** Ventilstellung&lt;br /&gt;
** Funkschnittstelle&lt;br /&gt;
*** RFM12 http://www.hoperf.com/rf_fsk.asp&lt;br /&gt;
**** Library dazu im [https://roulette.das-labor.org/trac/browser/microcontroller/src-atmel/lib/rfm12/ SVN], [http://www.das-labor.org/wiki/Datenfunk_mit_dem_AVR Doku hier]&lt;br /&gt;
*** Zigbee http://www.meshnetics.com/zigbee-modules&lt;br /&gt;
** ...&lt;br /&gt;
* Bootloader, damit Leute mitarbeiten können, die keine JTAG haben. Mit einem JTAG könnte man den Bootloader Flashen, ohne den Thermostaten öffnen zu müssen. Von da an kann man über den Programmierstecker mit einem umgebauten Handykabel den Thermostaten neu flashen.&lt;br /&gt;
&lt;br /&gt;
= Lizenz =&lt;br /&gt;
Die Software wird unter GPL v2 gestellt.&lt;br /&gt;
&lt;br /&gt;
= Subversion Repository =&lt;br /&gt;
Das alte SVN Repository auf https://opensvn.csie.org war zu lahm, &lt;br /&gt;
daher haben wir eine Projekt auf Sourcefore angelegt.&lt;br /&gt;
== Zugangsdaten ==&lt;br /&gt;
Projektseite:         http://sourceforge.net/projects/openhr20/ &amp;lt;BR&amp;gt;&lt;br /&gt;
Repository Location: https://openhr20.svn.sourceforge.net/svnroot/openhr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
Browse Repository:    http://openhr20.svn.sourceforge.net/viewvc/openhr20/ &amp;lt;BR&amp;gt;&lt;br /&gt;
== Policy ==&lt;br /&gt;
Anonymous check out ist erlaubt. &amp;lt;br&amp;gt;&lt;br /&gt;
Wer was committen will muss freigeschaltet werden. &amp;lt;br&amp;gt;&lt;br /&gt;
Dazu brauche ich den Sourceforge Accountnamen.&amp;lt;br&amp;gt;&lt;br /&gt;
Einfch eine Email mit username und password an hr20[at]carluccio[dot]de&amp;lt;br&amp;gt;&lt;br /&gt;
Das mache ich dann von Hand und da ich nicht alle 10 Minuten Mails bearbeite kann das auch schon mal einen oder zwei Tage dauern. &amp;lt;br&amp;gt;&lt;br /&gt;
Wenn sich ein Maintainer findet, gebe ich die Zugangsdaten gerne weiter.&lt;br /&gt;
&lt;br /&gt;
== SVN Client und Anleitung ==&lt;br /&gt;
Windows-User nutzen am besten den Tortoise-SVN-Client, den man kostenfrei [http://tortoisesvn.tigris.org hier runterladen] kann. &amp;lt;br&amp;gt;&lt;br /&gt;
Dort gibt es auch eine Anleitung zum Arbeiten mit SVN.&lt;br /&gt;
&lt;br /&gt;
= Analyse der Hardware =&lt;br /&gt;
Die Analyse hat der Dario schon gemacht, zu finden ist die jeweils aktuelle Version &lt;br /&gt;
[http://carluccio.de/images/e/e1/Hr20-analyse.pdf als PDF hier] oder [https://opensvn.csie.org/viewcvs.cgi/doc/analyse.pdf hier im SVN].&lt;br /&gt;
== Fuses ==&lt;br /&gt;
Here the settings of the fuses:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! width=&amp;quot;100&amp;quot; | &lt;br /&gt;
! width=&amp;quot;150&amp;quot; | Original    &lt;br /&gt;
! width=&amp;quot;150&amp;quot; | OpenHR20&lt;br /&gt;
|-&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | Extended&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 0xFD&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 0xFD&lt;br /&gt;
|-&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | High&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 0x91&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 0x9B&lt;br /&gt;
|-&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | Low&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 0x62&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 0xE2&lt;br /&gt;
|-&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | EESAVE&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | enabled&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | disabled&lt;br /&gt;
|-&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | BOOTSZ&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 1024 Words (1E00)      &lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 512 Words (1C00)&lt;br /&gt;
|-&lt;br /&gt;
| align =&amp;quot;center&amp;quot; | CKDIV8 &lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 1           &lt;br /&gt;
| align =&amp;quot;center&amp;quot; | 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Benötigte Module =&lt;br /&gt;
&lt;br /&gt;
Um das Ganze nun etwas zu koordinieren hier eine Liste der benötigten Module und deren Funktionen. &amp;lt;br&amp;gt;&lt;br /&gt;
Diese dient dazu später die Aufgaben zu verteilen:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Module&lt;br /&gt;
! Function&lt;br /&gt;
! Developer&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| LCD&lt;br /&gt;
| Display Driver:&amp;lt;BR&amp;gt;&lt;br /&gt;
* Init Display - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Set Segments - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Print HEX, DEC, TEMP, DayofWeek - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Blink - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* e.t.c&lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; DONE &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| LCD Simulation&lt;br /&gt;
| Simulation for display in AVR Studio:&amp;lt;BR&amp;gt;&lt;br /&gt;
* Defining Display - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Assign Segments to register bits - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Providing samplecode - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
| louk&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; 95% &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| RTC&lt;br /&gt;
| Time and Date Handler&lt;br /&gt;
* init timer - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* use IRQ with 32kHz crystal - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* handle time and date - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** daylight saving - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** consult leapyear  - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* calc day of week out of date - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Only one Byte for Year -&amp;gt; (2000 to 2255)&lt;br /&gt;
* Day of week timer with callback - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* Tick counter (seconds since reboot) - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** used to detect long keypress&lt;br /&gt;
** used to detect motor blocked&lt;br /&gt;
** used for additional timer &lt;br /&gt;
* Additional timer based on tick counter value - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* corretion for external Crystal - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* calibrate internal RC - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE, but not tested &#039;&#039;&#039;&amp;lt;/span&amp;gt; &lt;br /&gt;
| &#039;&#039;&#039; dario &#039;&#039;&#039; &lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; 95% &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| COM&lt;br /&gt;
| COM-Driver&lt;br /&gt;
* menue (Debug und Steuerung)&lt;br /&gt;
** show and set desired temperature &lt;br /&gt;
** show and set Time and Date&lt;br /&gt;
** show actual temperature&lt;br /&gt;
** show (and set) actual valveposition &lt;br /&gt;
** show and set timetable and temperatures&lt;br /&gt;
* optional &lt;br /&gt;
** adressierung of HR20 (for BUS, RF)&lt;br /&gt;
** authentication end encryption&lt;br /&gt;
| style=&amp;quot;background-color:blue;&amp;quot; | &#039;&#039;&#039; jsachs &#039;&#039;&#039; &lt;br /&gt;
&#039;&#039;&#039; active &#039;&#039;&#039; &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039; (50%) &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| CONFIG &lt;br /&gt;
| Save Config in EEPROM&lt;br /&gt;
* driver for EEPROM access&lt;br /&gt;
* save values to EEPROM &lt;br /&gt;
* load values from EEPROM &lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| MENU &lt;br /&gt;
| Control Menu State Machine&lt;br /&gt;
* show values on display&lt;br /&gt;
* functionality:&lt;br /&gt;
** show and set desired temperature&lt;br /&gt;
** show and set time and date &lt;br /&gt;
** show actual temperature&lt;br /&gt;
** show actual valveposition &lt;br /&gt;
** show and set timetable and temperatures&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| MAIN&lt;br /&gt;
| Main Loop&lt;br /&gt;
* init everything&lt;br /&gt;
** global vars - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** rtc - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** lcd - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** motor - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** tempsensor &lt;br /&gt;
* get keystate - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE (ISR in main.c)&#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** debounce - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039;not needed&#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** multi keypress (needed for hidden menue?) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039;can be checked by main loop&#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
* get position of wheel (incremental counter) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE (ISR in main.c)&#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* call menue&lt;br /&gt;
* detect longer keypress / double click - needed?&lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; (70%)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| MOTOR&lt;br /&gt;
| Motor-Driver &lt;br /&gt;
* set desired valveposition  - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** quick, asympthotic, quiet - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE (speed can be chosen) &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* callibrate for Valve - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt; &lt;br /&gt;
** optimised (less motor consumption depending on desired final position) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Stop motor if not turning (blocked) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* stop calibration if valve is removed - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN  &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Genereate ERROR if motor is not turning (blocked or low energy) - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; (95%)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| ADC&lt;br /&gt;
| ADC-Driver (measure Temp and U_Bat)&lt;br /&gt;
* init Sensor  - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
* start A/D conversion (Temp and U_Bat) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
* calc temperature in 1/100 degree Celsius - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
* calc battery voltage in mV - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
* calibration for sensor (needed?) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
* IRQ driven (IRQ generated by RTC or LCD, called from main.c)&lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; (95%)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| PID&lt;br /&gt;
| PID Algorithm&lt;br /&gt;
* calculate desired valveposition out of&lt;br /&gt;
** last valveposition(s) &lt;br /&gt;
** last temperature(s)&lt;br /&gt;
** actual temperature&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| LOG&lt;br /&gt;
| Datalogger&lt;br /&gt;
* Operating Hours&lt;br /&gt;
** motor in action&lt;br /&gt;
** ODOmeter&lt;br /&gt;
** since Battery Exchange&lt;br /&gt;
* Errors&lt;br /&gt;
* Logfiles (only with additional hardware)&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UID&lt;br /&gt;
| Unique ID for identification&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| BOOT&lt;br /&gt;
| Bootloader&lt;br /&gt;
we need a bootloader so that the developers can flash the software &lt;br /&gt;
without a JTAG cable and without disassembling the HR20.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039; I have a working XModem bootloader. We should discuss if we want to use it. &#039;&#039;&#039; &amp;lt;br&amp;gt;&lt;br /&gt;
Still need some size optimisation&amp;lt;br&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color:blue;&amp;quot; | &#039;&#039;&#039; jsachs &#039;&#039;&#039; &lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; |&lt;br /&gt;
&#039;&#039;&#039; (95%) &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= API Beschreibung =&lt;br /&gt;
Das Projekt wird mit doxygen dokumentiert, &lt;br /&gt;
die API-Beschreibung kann aus dem Source-Code generiert werden.&lt;br /&gt;
= UART Protocoll =&lt;br /&gt;
&lt;br /&gt;
This is the documentation for the UART Protocol in Release 74 of the SVN hosted on Sourceforge:&lt;br /&gt;
&lt;br /&gt;
== Com-Port Params ==&lt;br /&gt;
* BAUD: 9600&lt;br /&gt;
* Data: 8&lt;br /&gt;
* Parity: N&lt;br /&gt;
* Stop: 1&lt;br /&gt;
&lt;br /&gt;
== Automatic calibration ==&lt;br /&gt;
When the HR20 is mounted, then the automatic calibration is started. &lt;br /&gt;
The Debug-Info during the callibration is printed to the com-interface like this:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
+ 0210&lt;br /&gt;
+ 047e&lt;br /&gt;
+ 0437&lt;br /&gt;
[... many lines deleted ...]&lt;br /&gt;
- 0681&lt;br /&gt;
- 0695&lt;br /&gt;
- 0694&lt;br /&gt;
+ 0210&lt;br /&gt;
+ 047e&lt;br /&gt;
+ 0437&lt;br /&gt;
+ 0417&lt;br /&gt;
+ 0454&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Commands ==&lt;br /&gt;
All commands have FIXED format.&lt;br /&gt;
* command &#039;&#039;&#039;X.....\n &#039;&#039;&#039; termination char&lt;br /&gt;
* X is upcase char as commad name&lt;br /&gt;
* hex numbers use ONLY lowcase chars&lt;br /&gt;
* upcase is reserved for commands&lt;br /&gt;
=== print version information ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 V&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 V: OpenHR20 SW version V.VV build DDDD $Rev: REV $&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Where:&lt;br /&gt;
* V.VV  Version&lt;br /&gt;
* DDDD  Date at compilition &lt;br /&gt;
* REV   SVN Revision&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 V: OpenHR20 SW version 0.21 build Nov 13 2008 23:22:08 $Rev: 72 $&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
=== print status line  ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 D&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 D: WW DDDDDDDD TTTTTTTT V: VV I: IIII S: SSSS B: BBBB E:EE X&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Where:&lt;br /&gt;
* &#039;&#039;&#039;WW&#039;&#039;&#039; Day of Week (monday=1)&lt;br /&gt;
* &#039;&#039;&#039;DDDDDDDD&#039;&#039;&#039; actual date &lt;br /&gt;
* &#039;&#039;&#039;TTTTTTTT&#039;&#039;&#039; actual time &lt;br /&gt;
* &#039;&#039;&#039;VV&#039;&#039;&#039; actual position of valve [%] (00=closed, 100=opened)&lt;br /&gt;
* &#039;&#039;&#039;IIII&#039;&#039;&#039; actual temperature&lt;br /&gt;
* &#039;&#039;&#039;SSSS&#039;&#039;&#039; desired temperature&lt;br /&gt;
* &#039;&#039;&#039;BBBB&#039;&#039;&#039; battary voltage [mV]&lt;br /&gt;
* &#039;&#039;&#039;EE&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;X&#039;&#039;&#039;&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 D: d3 01.10.08 12:00:16 V: 00 I: 2103 S: 1700 B: 3259 E:04 X&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
=== print watched wariable ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Taa&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;aa&#039;&#039;&#039; watched wariable see &#039;&#039;watch.c&#039;&#039;&lt;br /&gt;
Response:&lt;br /&gt;
(return 2 or 4 hex numbers) &lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 T[aa]=VVVV&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Where:&lt;br /&gt;
* &#039;&#039;&#039;aa&#039;&#039;&#039; watched wariable see &#039;&#039;watch.c&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;VVVV&#039;&#039;&#039; value of watched wariable &lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 T[01]=0cca&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
=== get configuration byte ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Gaa&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;aa&#039;&#039;&#039; hex address of configuration byte see eeprom.h&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 G[aa]=VV&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Where:&lt;br /&gt;
* &#039;&#039;&#039;aa&#039;&#039;&#039; hex address of configuration byte see eeprom.h&lt;br /&gt;
* &#039;&#039;&#039;VV&#039;&#039;&#039; value of configuration byte &lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 G[13]=2d&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
=== set configuration byte ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 SaaVV&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;aa&#039;&#039;&#039; hex address of configuration byte see eeprom.h&lt;br /&gt;
* &#039;&#039;&#039;VV&#039;&#039;&#039; hex value for configuration byte (hex)&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 S[aa]=VV&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Where:&lt;br /&gt;
* &#039;&#039;&#039;aa&#039;&#039;&#039; hex address of configuration byte see eeprom.h&lt;br /&gt;
* &#039;&#039;&#039;VV&#039;&#039;&#039; value of configuration byte &lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 S[13]=2d&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
=== get timer ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Rab&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;a&#039;&#039;&#039; day &lt;br /&gt;
* &#039;&#039;&#039;b&#039;&#039;&#039; slot&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 R[ab]=cddd&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Where:&lt;br /&gt;
* &#039;&#039;&#039;c&#039;&#039;&#039; timermode &lt;br /&gt;
: &#039;&#039;&#039;0&#039;&#039;&#039; frost protection&lt;br /&gt;
: &#039;&#039;&#039;1&#039;&#039;&#039; energy save&lt;br /&gt;
: &#039;&#039;&#039;2&#039;&#039;&#039; comfort&lt;br /&gt;
: &#039;&#039;&#039;3&#039;&#039;&#039; supercomfort&lt;br /&gt;
* &#039;&#039;&#039;ddd&#039;&#039;&#039; time (minutes since 00:00, hex) &lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 R[10]=21a4&lt;br /&gt;
 R[11]=121c&lt;br /&gt;
 R[12]=23c0&lt;br /&gt;
 R[13]=14ec&lt;br /&gt;
 R[14]=2fff&lt;br /&gt;
 R[15]=1fff&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
comfort at 0x1a4  = 420 / 60 = 7&lt;br /&gt;
energy save at 0x21c  = 540 / 60 = 9&lt;br /&gt;
comfort at 0x3c0  = 960 / 60 = 16&lt;br /&gt;
energy save at 0x4ec  = 1260 / 60 = 21&lt;br /&gt;
Slot 5+6 not used.&lt;br /&gt;
&lt;br /&gt;
=== set timer ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Wabcddd&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;a&#039;&#039;&#039; day &lt;br /&gt;
* &#039;&#039;&#039;b&#039;&#039;&#039; slot&lt;br /&gt;
* &#039;&#039;&#039;c&#039;&#039;&#039; timermode (0 to 3) &lt;br /&gt;
* &#039;&#039;&#039;d&#039;&#039;&#039; time time (minutes since 00:00, hex) &lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 W[ab]=cddd&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 W[10]=21a4&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Reboot ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 B1324&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;1234&#039;&#039;&#039; password (fixed at this moment)&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== set date ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Yyymmdd&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;yy&#039;&#039;&#039; year&lt;br /&gt;
* &#039;&#039;&#039;mm&#039;&#039;&#039; month&lt;br /&gt;
* &#039;&#039;&#039;dd&#039;&#039;&#039; day&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 D: WW DDDDDDDD TTTTTTTT V: VV I: IIII S: SSSS B: BBBB E:EE X&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
=== set time ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Hhhmmss&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;hh&#039;&#039;&#039; hour&lt;br /&gt;
* &#039;&#039;&#039;mm&#039;&#039;&#039; minute&lt;br /&gt;
* &#039;&#039;&#039;ss&#039;&#039;&#039; seconds&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 D: WW DDDDDDDD TTTTTTTT V: VV I: IIII S: SSSS B: BBBB E:EE X&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== set wanted temperature ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Axx&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;xx&#039;&#039;&#039; temperature [unit 0.5C] (hex)&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 D: WW DDDDDDDD TTTTTTTT V: VV I: IIII S: SSSS B: BBBB E:EE X&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Example:&lt;br /&gt;
20°C = 40 * 0,5 °C = 28 (hex)&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 A28&amp;lt;CR&amp;gt;&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039;Attention: The value in the response is not the new value.&amp;lt;BR&amp;gt;The new value is updated some secondes later, so be patient and wait.&#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== set mode ===&lt;br /&gt;
Command:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 Mxx&amp;lt;CR&amp;gt; &lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;xx&#039;&#039;&#039; mode &lt;br /&gt;
: 00 = manu&lt;br /&gt;
: 01 = auto&lt;br /&gt;
Response:&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
 D: WW DDDDDDDD TTTTTTTT V: VV I: IIII S: SSSS B: BBBB E:EE X&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Bootloader =&lt;br /&gt;
Um ein einfaches Update der Software, auch ohne Programmer und Zerlegen des HR20E zu ermöglichen, sollte ein Bootloader implementiert werden.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Grundsatzproblem:&#039;&#039;&#039; Fuer ein erstes Umflashen eines eben aus der Verpackung genommenen HR20s braucht man &#039;&#039;immer&#039;&#039; einen JTAG-Programmer um ueberhaupt erstmal den Bootlader selber draufzukriegen.&lt;br /&gt;
&lt;br /&gt;
== Anforderungen ==&lt;br /&gt;
* Einfaches Update ohne öffnen des HR20E&amp;lt;br&amp;gt;&lt;br /&gt;
* Nutzen bestehender Programme (Terminalprogramm), das erspart das schreiben von Update Software&amp;lt;br&amp;gt;&lt;br /&gt;
* HR20E sollte nach dem Start prüfen ob Programm gültig und nur dann das Anwenderprogramm starten&lt;br /&gt;
* Protokoll sollte Updatevorgang aus dem laufenden Betrieb unterstützen (Sprung in den Bootloader)&lt;br /&gt;
&lt;br /&gt;
== Vorschlag 1 ==&lt;br /&gt;
X-Modem Protokoll (mit CRC)&amp;lt;br&amp;gt;&lt;br /&gt;
Hier gibt es eine fertige Lösung für das Etherboot projekt, deren übername gestattet ist.&amp;lt;br&amp;gt; &lt;br /&gt;
Größe ist hier kleiner 1kb und wohl verkraftbar.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vorteil:&amp;lt;br&amp;gt;&lt;br /&gt;
* etablierte Technik&lt;br /&gt;
* von anderen Herstellern Verwendet&lt;br /&gt;
* wird von den meisten Terminal Programmen unterstützt&lt;br /&gt;
* Gesichert durch Checksumme&lt;br /&gt;
Nachteil:&amp;lt;br&amp;gt;&lt;br /&gt;
* Aufwendige Checksummen Berechnung oder Lookup Tabelle Notwendig&lt;br /&gt;
&lt;br /&gt;
== Vorschlag 2 ==&lt;br /&gt;
Verwendung des [[AVR_Bootloader_FastBoot_von_Peter_Dannegger]]:&lt;br /&gt;
Der ist sehr klein, erprobt, leicht anwendbar und funzt auch sehr gut. Die Windows-Software fuer den Upload ist auch sehr gelungen. Auf Grund des o.g. Grundsatzproblems und der Tatsache dass die Neuentwicklung eines Bootladers sehr anspruchsvoll ist, halte ich es an dieser Stelle fuer besser, das Rad nicht neu zu erfinden.&lt;br /&gt;
&lt;br /&gt;
= Entwicklungsumgebung =&lt;br /&gt;
* Editor, Debugger, Compiler&lt;br /&gt;
** WinAVR version (20071221), sprich GCC 4.2.2 sowie avr-libc 1.6.0&lt;br /&gt;
** AVR Studio 4 &lt;br /&gt;
* JTAG ICE&lt;br /&gt;
** Atmel AVR JTAGICE MK2 &lt;br /&gt;
** AVR Dragon (z.B. http://elmicro.com/de/atavrdragon.html)&lt;br /&gt;
** Olimex-Seriell http://www.olimex.com/dev/avr-jtag.html  &lt;br /&gt;
** Olimex-USB http://www.olimex.com/dev/avr-usb-jtag.html &lt;br /&gt;
&lt;br /&gt;
= Sonstiges =&lt;br /&gt;
== Altes Protokoll ==&lt;br /&gt;
[[HR20_Protocol_V2 | Hier ]] hat mal einer ein Protokoll eingegeben.&lt;br /&gt;
Das scheint aber nicht zu der Version 2.04 zu passen. &lt;br /&gt;
Ich habe es nicht gelöscht, falls es jemanden interessiert.&lt;br /&gt;
&lt;br /&gt;
[[Category:Projekte|!]]&lt;/div&gt;</summary>
		<author><name>Dario</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=27270</id>
		<title>Heizungssteuerung mit Honeywell HR20</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=27270"/>
		<updated>2008-04-06T22:22:16Z</updated>

		<summary type="html">&lt;p&gt;Dario: /* Benötigte Module */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von DarioC&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Wie alles begann =&lt;br /&gt;
&lt;br /&gt;
Nachdem von Uwe Felgentreu vor nunmehr vor über drei Jahren (genau am 17.11.2004 um 11:26) hier in diesem Forum den Thread mit dem Titel &#039;&#039;Honeywell Rondostat HR20E per AVR steuern und konfigurieren&#039;&#039; gestartet hat ist es nun langsam soweit, dass das Ganze auch ein Projekt wird. &lt;br /&gt;
&lt;br /&gt;
Den Thread dazu kann der interessierte Leser [http://www.mikrocontroller.net/topic/17603 hier nachlesen] &lt;br /&gt;
&lt;br /&gt;
= Projektziel =&lt;br /&gt;
&lt;br /&gt;
Wir konzentrieren uns in erster Linie auf den Honeywell Rondostat HR20E mit ausgelieferten Softwareversion 2.04. Dass es ähnliche andere Geräte gibt behalten wir bei der Entwicklung im Hinterkopf.&lt;br /&gt;
&lt;br /&gt;
Basierend auf dieser Hardware wollen wir eine neue Software entwickeln. &lt;br /&gt;
Dabei können wir ausser der Hardware nichts weiter verwenden, da die Originalsoftware geschützt ist und nicht ausgelesen werden kann.&lt;br /&gt;
&lt;br /&gt;
== Phase 1 ==&lt;br /&gt;
Die Software soll die Funktionen bieten, die die Originalsoftware auch bietet, später können dies dann um zusätzliche Funktionen erweitert werden. Die wichtigsten Funktionen sind:&lt;br /&gt;
&lt;br /&gt;
* Temperaturregelung&lt;br /&gt;
* Echtzeituhr&lt;br /&gt;
* Ausnutzen der Sleep Funktion&lt;br /&gt;
* Anzeige Soll-Temperatur und der Uhrzeit&lt;br /&gt;
* Einstellung der Soll-Temperatur&lt;br /&gt;
* Uhrzeitgesteuerte Einstellung der Soll-Temperatur &lt;br /&gt;
* Fenster-Offen-Erkennung&lt;br /&gt;
* Ventilfreispülungsfunktion&lt;br /&gt;
&lt;br /&gt;
== Phase 2 ==&lt;br /&gt;
&lt;br /&gt;
Hier liegt der Sinn des ganzen Projektes: Durch diese zusätzlichen Funktionen wollen wir den Nutzwert des Thermostaten erheblich steigern:&lt;br /&gt;
&lt;br /&gt;
* Programmierung der Schaltzeiten und Temperaturen über externe Schnittstelle&lt;br /&gt;
* Abfrage der Messwerte und Parameter über externe Schnittstelle&lt;br /&gt;
* Vernetzung der Thermostaten untereinander&lt;br /&gt;
* Zusätzliche externe Schnittstellen (neben UART auch CAN und Funk)&lt;br /&gt;
* Erweiterung der Anzeige um&lt;br /&gt;
** Ist-Temperatur &lt;br /&gt;
** Ventilstellung&lt;br /&gt;
** Funkschnittstelle&lt;br /&gt;
*** RFM12 http://www.hoperf.com/rf_fsk.asp&lt;br /&gt;
*** Zigbee http://www.meshnetics.com/zigbee-modules&lt;br /&gt;
** ...&lt;br /&gt;
* Bootloader, damit Leute mitarbeiten können, die keine JTAG haben. Mit einem JTAG könnte man den Bootloader Flashen, ohne den Thermostaten öffnen zu müssen. Von da an kann man über den Programmierstecker mit einem umgebauten Handykabel den Thermostaten neu flashen.&lt;br /&gt;
&lt;br /&gt;
= Lizenz =&lt;br /&gt;
Die Software wird unter GPL v2 gestellt.&lt;br /&gt;
&lt;br /&gt;
= Subversion Repository =&lt;br /&gt;
Ein SVN Repository liegt auf dem freien SVN Server: https://opensvn.csie.org&lt;br /&gt;
== Zugangsdaten ==&lt;br /&gt;
Repository Location: https://OpenSVN.csie.org/hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
Browse Repository: https://OpenSVN.csie.org/viewcvs.cgi/?root=hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
TRAC: https://opensvn.csie.org/traccgi/hr20&lt;br /&gt;
== Policy ==&lt;br /&gt;
Anonymous check out ist erlaubt. &amp;lt;br&amp;gt;&lt;br /&gt;
Wer was committen will muss freigeschaltet werden. &amp;lt;br&amp;gt;&lt;br /&gt;
Dazu brauche ich ein &#039;&#039;Usernamen, Passwort&#039;&#039; und eine &#039;&#039;Mailadresse&#039;&#039;, dann kann ich das einrichten. &amp;lt;br&amp;gt;&lt;br /&gt;
Tragt Euch dazu einfach selber in die Tabelle ein, ich erledige dann den Rest.&amp;lt;br&amp;gt;&lt;br /&gt;
Oder einfch eine Email mit username und password an hr20[at]carluccio[dot]de&amp;lt;br&amp;gt;&lt;br /&gt;
Das mache ich dann von Hand und da ich nicht alle 10 Minuten Mails bearbeite kann das auch schon mal einen oder zwei Tage dauern. &amp;lt;br&amp;gt;&lt;br /&gt;
Wenn sich ein Maintainer findet, gebe ich die Zugangsdaten gerne weiter.&lt;br /&gt;
&lt;br /&gt;
== Entwickler ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! width=&amp;quot;150&amp;quot; | Entwickler&lt;br /&gt;
! width=&amp;quot;150&amp;quot; | svn Status&lt;br /&gt;
|-&lt;br /&gt;
| darioc&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|-&lt;br /&gt;
| louk&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|-&lt;br /&gt;
| jsachs&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Verzeichnisstruktur ==&lt;br /&gt;
Eine Verzeichnisstruktur ist auch schon angelegt und die ersten Daten auch drin. Hier die Verzeichnisse:&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
| &#039;&#039;&#039;/doc&#039;&#039;&#039;&lt;br /&gt;
| Für alles an Dokumenten, die selbst erstellt wurden. &amp;lt;br&amp;gt;&lt;br /&gt;
Specs, die man im Internet bekommen kann gehören hier nicht rein, &amp;lt;br&amp;gt;&lt;br /&gt;
die machen das alles nur unnötig gross und das auschecken dauert länger.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/playground&#039;&#039;&#039; &lt;br /&gt;
| Wie der Name schon sagt, zum rumspielen und testen. &amp;lt;br&amp;gt;&lt;br /&gt;
Hier kommt jegliche art von Codeschnipseln hin, die zu Testen da sind &amp;lt;br&amp;gt;&lt;br /&gt;
und (derzeit) noch nicht Teil des Programmes sind.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/source&#039;&#039;&#039; &lt;br /&gt;
| Hier kommt die Applikation rein mit allen Modulen und makefiles.&amp;lt;br&amp;gt;&lt;br /&gt;
Bitte haltet das Repository sauber und checkt nur Dateien ein, &amp;lt;br&amp;gt;&lt;br /&gt;
die auch Sinn  machen, &amp;quot;thumbs.db&amp;quot; oder andere Temp-Dateien gehören hier nicht rein.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SVN Client und Anleitung ==&lt;br /&gt;
Windows-User nutzen am besten den Tortoise-SVN-Client, den man kostenfrei [http://tortoisesvn.tigris.org hier runterladen] kann. &amp;lt;br&amp;gt;&lt;br /&gt;
Dort gibt es auch eine Anleitung zum Arbeiten mit SVN.&lt;br /&gt;
&lt;br /&gt;
= Analyse der Hardware =&lt;br /&gt;
Die Analyse hat der Dario schon gemacht, zu finden ist die jeweils aktuelle Version &lt;br /&gt;
[http://www.carluccio.de/img/hr20/analyse.pdf als PDF hier] oder [https://opensvn.csie.org/viewcvs.cgi/doc/analyse.pdf hier im SVN].&lt;br /&gt;
&lt;br /&gt;
= Benötigte Module =&lt;br /&gt;
&lt;br /&gt;
Um das Ganze nun etwas zu koordinieren hier eine Liste der benötigten Module und deren Funktionen. &amp;lt;br&amp;gt;&lt;br /&gt;
Diese dient dazu später die Aufgaben zu verteilen:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Module&lt;br /&gt;
! Function&lt;br /&gt;
! Developer&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| LCD&lt;br /&gt;
| Display Driver:&amp;lt;BR&amp;gt;&lt;br /&gt;
* Init Display - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Set Segments - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Print HEX, DEC, TEMP, DayofWeek - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Blink - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* e.t.c&lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; DONE &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| LCD Simulation&lt;br /&gt;
| Simulation for display in AVR Studio:&amp;lt;BR&amp;gt;&lt;br /&gt;
* Defining Display - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Assign Segments to register bits - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Providing samplecode - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
| louk&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; 95% &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| RTC&lt;br /&gt;
| Time and Date Handler&lt;br /&gt;
* init timer - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* use IRQ with 32kHz crystal - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* handle time and date - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** daylight saving - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** consult leapyear  - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* calc day of week out of date - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Only one Byte for Year -&amp;gt; (2000 to 2255)&lt;br /&gt;
* Day of week timer with callback - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* Tick counter (seconds since reboot) - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** used to detect long keypress&lt;br /&gt;
** used to detect motor blocked&lt;br /&gt;
** used for additional timer &lt;br /&gt;
* Additional timer based on tick counter value - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* corretion for external Crystal - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* calibrate internal RC - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE, but not tested &#039;&#039;&#039;&amp;lt;/span&amp;gt; &lt;br /&gt;
| &#039;&#039;&#039; dario &#039;&#039;&#039; &lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; 95% &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| COM&lt;br /&gt;
| COM-Driver&lt;br /&gt;
* menue (Debug und Steuerung)&lt;br /&gt;
** show and set desired temperature &lt;br /&gt;
** show and set Time and Date&lt;br /&gt;
** show actual temperature&lt;br /&gt;
** show (and set) actual valveposition &lt;br /&gt;
** show and set timetable and temperatures&lt;br /&gt;
* optional &lt;br /&gt;
** adressierung of HR20 (for BUS, RF)&lt;br /&gt;
** authentication end encryption&lt;br /&gt;
| style=&amp;quot;background-color:blue;&amp;quot; | &#039;&#039;&#039; jsachs &#039;&#039;&#039; &lt;br /&gt;
&#039;&#039;&#039; active &#039;&#039;&#039; &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039; (50%) &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| CONFIG &lt;br /&gt;
| Save Config in EEPROM&lt;br /&gt;
* driver for EEPROM access&lt;br /&gt;
* save values to EEPROM &lt;br /&gt;
* load values from EEPROM &lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| MENU &lt;br /&gt;
| Control Menu State Machine&lt;br /&gt;
* show values on display&lt;br /&gt;
* functionality:&lt;br /&gt;
** show and set desired temperature&lt;br /&gt;
** show and set time and date &lt;br /&gt;
** show actual temperature&lt;br /&gt;
** show actual valveposition &lt;br /&gt;
** show and set timetable and temperatures&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| MAIN&lt;br /&gt;
| Main Loop&lt;br /&gt;
* init everything&lt;br /&gt;
** global vars - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** rtc - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** lcd - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** motor - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** tempsensor &lt;br /&gt;
* get keystate - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE (ISR in main.c)&#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** debounce - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039;not needed&#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** multi keypress (needed for hidden menue?) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039;can be checked by main loop&#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
* get position of wheel (incremental counter) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE (ISR in main.c)&#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* call menue&lt;br /&gt;
* detect longer keypress / double click - needed?&lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; (70%)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| MOTOR&lt;br /&gt;
| Motor-Driver &lt;br /&gt;
* set desired valveposition  - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** quick, asympthotic, quiet - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE (speed can be chosen) &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* callibrate for Valve - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt; &lt;br /&gt;
** optimised (less motor consumption depending on desired final position) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Stop motor if not turning (blocked) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* stop calibration if valve is removed - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN  &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Genereate ERROR if motor is not turning (blocked or low energy) - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; (95%)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| ADC&lt;br /&gt;
| ADC-Driver (measure Temp and U_Bat)&lt;br /&gt;
* init Sensor  - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
* start A/D conversion (Temp and U_Bat) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
* calc temperature in 1/100 degree Celsius - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
* calc battery voltage in mV - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
* calibration for sensor (needed?) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
* IRQ driven (IRQ generated by RTC or LCD, called from main.c)&lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; (95%)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| PID&lt;br /&gt;
| PID Algorithm&lt;br /&gt;
* calculate desired valveposition out of&lt;br /&gt;
** last valveposition(s) &lt;br /&gt;
** last temperature(s)&lt;br /&gt;
** actual temperature&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| LOG&lt;br /&gt;
| Datalogger&lt;br /&gt;
* Operating Hours&lt;br /&gt;
** motor in action&lt;br /&gt;
** ODOmeter&lt;br /&gt;
** since Battery Exchange&lt;br /&gt;
* Errors&lt;br /&gt;
* Logfiles (only with additional hardware)&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UID&lt;br /&gt;
| Unique ID for identification&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| BOOT&lt;br /&gt;
| Bootloader&lt;br /&gt;
we need a bootloader so that the developers can flash the software &lt;br /&gt;
without a JTAG cable and without disassembling the HR20.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039; I have a working XModem bootloader. We should discuss if we want to use it. &#039;&#039;&#039; &amp;lt;br&amp;gt;&lt;br /&gt;
Still need some size optimisation&amp;lt;br&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color:blue;&amp;quot; | &#039;&#039;&#039; jsachs &#039;&#039;&#039; &lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; |&lt;br /&gt;
&#039;&#039;&#039; (95%) &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= API Beschreibung =&lt;br /&gt;
Das Projekt wird mit doxygen dokumentiert, &lt;br /&gt;
die API-Beschreibung kann aus dem Source-Code generiert werden.&lt;br /&gt;
= UART Protokoll =&lt;br /&gt;
Es soll möglich sein den Thermostaten über eine Schnittstelle anzusteuern.&lt;br /&gt;
An dem externen Stecker liegt schon die Serielle Schnittstelle an.&lt;br /&gt;
Wir definieren ein Protokoll, welches dem Datenaustausch zwischen einem HR20 und einem externen Gerät dienst. So kann man einen PC direkt (über einen 3V Pegelwandler) anschließen. &lt;br /&gt;
Wenn man ein anderes Medium nutzen will, muss man dafür sorgen, dass genau diese &lt;br /&gt;
Pakete an den Kommandohandler übergeben werden. So kann man darüber oder darunter, je nach Sichtweise jedes Medium (Kabel, Funk, IR) und jedes Protokoll legen.&lt;br /&gt;
== Nachrichten ==&lt;br /&gt;
Folgede Anforderungen werden an das Nachrichtenformat gestellt.&lt;br /&gt;
* Jeder Befehl soll zu jedem Zeitpunkt möglich sein (nicht state orientiert)&lt;br /&gt;
* Befehle sollen eingetippt werden können (z.B. am Terminalprogramm)&lt;br /&gt;
* Es soll einfach möglich sein, das Protokoll um neue Befehle zu erweitern.&lt;br /&gt;
* Der Parser läuft im Mikrocontroller, er sollte wirklich klein sein. Es wäre nicht schön, wenn dazu jede Menge Strings gespeichert werden müssen.&lt;br /&gt;
&lt;br /&gt;
== Protokoll Umfang ==&lt;br /&gt;
Folgende Befehle sollten verfügbar sein:&amp;lt;br&amp;gt;&lt;br /&gt;
* Soll Temperatur setzen und lesen&lt;br /&gt;
* Programm Manuell / Auto Umschaltung, setzen und lesen&lt;br /&gt;
* Datum / Zeit Einstellung, setzen und lesen&lt;br /&gt;
* Sommer Winterzeit setzen und lesen&lt;br /&gt;
* Programm für die Wochentage 1-7, vermute hier auch 2 Zeiten pro Tag wie beim Original ?&lt;br /&gt;
* Temperatur für Absenk Temperatur und Normal Temperatur setzen und lesen&lt;br /&gt;
* Version lesen&lt;br /&gt;
* Batteriespannung (Zustand) lesen&lt;br /&gt;
* Ventilstellung setzen und lesen&lt;br /&gt;
* Kalibrierung auslösen&lt;br /&gt;
* Bootloader starten für Update über RS232&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Generell sollten alle Veränderungen automatisch gemeldet werden (Notify) um ein Polling zu vermeiden.&amp;lt;br&lt;br /&gt;
&lt;br /&gt;
=== 1. Vorschlag ===&lt;br /&gt;
Byte1: Befehl&lt;br /&gt;
Byte2: Länge Daten&lt;br /&gt;
Byte3: Daten&lt;br /&gt;
Maximal 16 oder 32 Byte, wegen Buffergröße.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
Befehle: &lt;br /&gt;
* 00 OK&lt;br /&gt;
* 01 Gettime&lt;br /&gt;
* 02 Get SollTemp&lt;br /&gt;
* 03 Get IstTemp&lt;br /&gt;
* 04 Get Ventilpos&lt;br /&gt;
* 81 Settime&lt;br /&gt;
* 82 Set SollTemp&lt;br /&gt;
* 83 n/a&lt;br /&gt;
* 84 n/a&lt;br /&gt;
* FF NOK&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
-&amp;gt; 81,03,12,30,17  &lt;br /&gt;
&amp;lt;- 00&lt;br /&gt;
-&amp;gt; 01,00&lt;br /&gt;
&amp;lt;- time: 12:30:17&lt;br /&gt;
-&amp;gt; 02,00&lt;br /&gt;
&amp;lt;- soll: 20.0&lt;br /&gt;
-&amp;gt; 03,00&lt;br /&gt;
&amp;lt;- ist: 19.95&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Richtig zufrieden bin ich damit nicht, hat jemand bessere Vorschlage, dann hier eintragen:&lt;br /&gt;
&lt;br /&gt;
=== 2. Vorschlag ===&lt;br /&gt;
* Einfaches ASCII Protokoll.&amp;lt;br&amp;gt;&lt;br /&gt;
* Die Kommandos müssen kurz aber Aussagekräftig sein.&amp;lt;br&amp;gt;&lt;br /&gt;
* Alle Strings müssen im Flash liegen um Speicher zu sparen.&amp;lt;br&amp;gt;&lt;br /&gt;
* Rückmeldungen und Notifys müssen eindeutig unterscheidbar sein&amp;lt;br&amp;gt;&lt;br /&gt;
Eine kleine Protokollbeschreibung ist im SVN zusammengepackt unter &amp;quot;doc/protokoll/&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Beispiel :&amp;lt;/B&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;quot;!VER\r&amp;quot; -&amp;gt; &amp;quot;$VER-1.2.17&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;quot;?TEMP\r&amp;quot; -&amp;gt; &amp;quot;$TEMP-CUR=20.5,MIN=16.3,MAX=24.5\r&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;quot;!SET-TIME=17:30:55\&amp;quot; -&amp;gt; &amp;quot;$SET-TIME=OK\r&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Notify: &amp;quot;@TEMP-CUR=20.5,MIN=16.3,MAX=24.5\r&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Der Aufbau ist ja im SVN Erklärt.&amp;lt;br&amp;gt;&lt;br /&gt;
Der Aufwand fürs Parsen hält sich mehr als in grenzen.&amp;lt;br&amp;gt;&lt;br /&gt;
Die Strings alle ins Flash.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Bootloader ist hier außen vor. Der wird nur per Kommando angestoßen und fährt dann ein eigenes Protokoll. Hier würde ich XModem vorschlagen. Kompakt und mit Prüfsumme. Zum Upload kann jedes Terminalprogramm genutzt werden.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;quot;BOOTLOAD\r&amp;quot; -&amp;gt; &amp;quot;BOOTLOAD-OK\r&amp;quot; dann sendet der Controller die XModem start Sequenz und es geht los.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Vorschlag ===&lt;br /&gt;
=== 4. Vorschlag ===&lt;br /&gt;
&lt;br /&gt;
= Bootloader =&lt;br /&gt;
Um ein einfaches Update der Software, auch ohne Programmer und Zerlegen des HR20E zu ermöglichen, sollte ein Bootloader implementiert werden.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Anforderungen ==&lt;br /&gt;
* Einfaches Update ohne öffnen des HR20E&amp;lt;br&amp;gt;&lt;br /&gt;
* Nutzen bestehender Programme (Terminalprogramm), das erspart das schreiben von Update Software&amp;lt;br&amp;gt;&lt;br /&gt;
* HR20E sollte nach dem Start prüfen ob Programm gültig und nur dann das Anwenderprogramm starten&lt;br /&gt;
* Protokoll sollte Updatevorgang aus dem laufenden Betrieb unterstützen (Sprung in den Bootloader)&lt;br /&gt;
&lt;br /&gt;
== Vorschlag 1 ==&lt;br /&gt;
X-Modem Protokoll (mit CRC)&amp;lt;br&amp;gt;&lt;br /&gt;
Hier gibt es eine fertige Lösung für das Etherboot projekt, deren übername gestattet ist.&amp;lt;br&amp;gt; &lt;br /&gt;
Größe ist hier kleiner 1kb und wohl verkraftbar.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vorteil:&amp;lt;br&amp;gt;&lt;br /&gt;
* etablierte Technik&lt;br /&gt;
* von anderen Herstellern Verwendet&lt;br /&gt;
* wird von den meisten Terminal Programmen unterstützt&lt;br /&gt;
* Gesichert durch Checksumme&lt;br /&gt;
Nachteil:&amp;lt;br&amp;gt;&lt;br /&gt;
* Aufwendige Checksummen Berechnung oder Lookup Tabelle Notwendig&lt;br /&gt;
&lt;br /&gt;
= Entwicklungsumgebung =&lt;br /&gt;
* Editor, Debugger, Compiler&lt;br /&gt;
** WinAVR version (20071221), sprich GCC 4.2.2 sowie avr-libc 1.6.0&lt;br /&gt;
** AVR Studio 4 &lt;br /&gt;
* JTAG ICE&lt;br /&gt;
** Atmel AVR JTAGICE MK2 &lt;br /&gt;
** AVR Dragon (z.B. http://elmicro.com/de/atavrdragon.html)&lt;br /&gt;
** Olimex-Seriell http://www.olimex.com/dev/avr-jtag.html  &lt;br /&gt;
** Olimex-USB http://www.olimex.com/dev/avr-usb-jtag.html &lt;br /&gt;
&lt;br /&gt;
= Sonstiges =&lt;br /&gt;
== Altes Protokoll ==&lt;br /&gt;
[[HR20_Protocol_V2 | Hier ]] hat mal einer ein Protokoll eingegeben.&lt;br /&gt;
Das scheint aber nicht zu der Version 2.04 zu passen. &lt;br /&gt;
Ich habe es nicht gelöscht, falls es jemanden interessiert.&lt;br /&gt;
&lt;br /&gt;
[[Category:Projekte|!]]&lt;/div&gt;</summary>
		<author><name>Dario</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=27269</id>
		<title>Heizungssteuerung mit Honeywell HR20</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=27269"/>
		<updated>2008-04-06T22:20:09Z</updated>

		<summary type="html">&lt;p&gt;Dario: /* Benötigte Module */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von DarioC&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Wie alles begann =&lt;br /&gt;
&lt;br /&gt;
Nachdem von Uwe Felgentreu vor nunmehr vor über drei Jahren (genau am 17.11.2004 um 11:26) hier in diesem Forum den Thread mit dem Titel &#039;&#039;Honeywell Rondostat HR20E per AVR steuern und konfigurieren&#039;&#039; gestartet hat ist es nun langsam soweit, dass das Ganze auch ein Projekt wird. &lt;br /&gt;
&lt;br /&gt;
Den Thread dazu kann der interessierte Leser [http://www.mikrocontroller.net/topic/17603 hier nachlesen] &lt;br /&gt;
&lt;br /&gt;
= Projektziel =&lt;br /&gt;
&lt;br /&gt;
Wir konzentrieren uns in erster Linie auf den Honeywell Rondostat HR20E mit ausgelieferten Softwareversion 2.04. Dass es ähnliche andere Geräte gibt behalten wir bei der Entwicklung im Hinterkopf.&lt;br /&gt;
&lt;br /&gt;
Basierend auf dieser Hardware wollen wir eine neue Software entwickeln. &lt;br /&gt;
Dabei können wir ausser der Hardware nichts weiter verwenden, da die Originalsoftware geschützt ist und nicht ausgelesen werden kann.&lt;br /&gt;
&lt;br /&gt;
== Phase 1 ==&lt;br /&gt;
Die Software soll die Funktionen bieten, die die Originalsoftware auch bietet, später können dies dann um zusätzliche Funktionen erweitert werden. Die wichtigsten Funktionen sind:&lt;br /&gt;
&lt;br /&gt;
* Temperaturregelung&lt;br /&gt;
* Echtzeituhr&lt;br /&gt;
* Ausnutzen der Sleep Funktion&lt;br /&gt;
* Anzeige Soll-Temperatur und der Uhrzeit&lt;br /&gt;
* Einstellung der Soll-Temperatur&lt;br /&gt;
* Uhrzeitgesteuerte Einstellung der Soll-Temperatur &lt;br /&gt;
* Fenster-Offen-Erkennung&lt;br /&gt;
* Ventilfreispülungsfunktion&lt;br /&gt;
&lt;br /&gt;
== Phase 2 ==&lt;br /&gt;
&lt;br /&gt;
Hier liegt der Sinn des ganzen Projektes: Durch diese zusätzlichen Funktionen wollen wir den Nutzwert des Thermostaten erheblich steigern:&lt;br /&gt;
&lt;br /&gt;
* Programmierung der Schaltzeiten und Temperaturen über externe Schnittstelle&lt;br /&gt;
* Abfrage der Messwerte und Parameter über externe Schnittstelle&lt;br /&gt;
* Vernetzung der Thermostaten untereinander&lt;br /&gt;
* Zusätzliche externe Schnittstellen (neben UART auch CAN und Funk)&lt;br /&gt;
* Erweiterung der Anzeige um&lt;br /&gt;
** Ist-Temperatur &lt;br /&gt;
** Ventilstellung&lt;br /&gt;
** Funkschnittstelle&lt;br /&gt;
*** RFM12 http://www.hoperf.com/rf_fsk.asp&lt;br /&gt;
*** Zigbee http://www.meshnetics.com/zigbee-modules&lt;br /&gt;
** ...&lt;br /&gt;
* Bootloader, damit Leute mitarbeiten können, die keine JTAG haben. Mit einem JTAG könnte man den Bootloader Flashen, ohne den Thermostaten öffnen zu müssen. Von da an kann man über den Programmierstecker mit einem umgebauten Handykabel den Thermostaten neu flashen.&lt;br /&gt;
&lt;br /&gt;
= Lizenz =&lt;br /&gt;
Die Software wird unter GPL v2 gestellt.&lt;br /&gt;
&lt;br /&gt;
= Subversion Repository =&lt;br /&gt;
Ein SVN Repository liegt auf dem freien SVN Server: https://opensvn.csie.org&lt;br /&gt;
== Zugangsdaten ==&lt;br /&gt;
Repository Location: https://OpenSVN.csie.org/hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
Browse Repository: https://OpenSVN.csie.org/viewcvs.cgi/?root=hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
TRAC: https://opensvn.csie.org/traccgi/hr20&lt;br /&gt;
== Policy ==&lt;br /&gt;
Anonymous check out ist erlaubt. &amp;lt;br&amp;gt;&lt;br /&gt;
Wer was committen will muss freigeschaltet werden. &amp;lt;br&amp;gt;&lt;br /&gt;
Dazu brauche ich ein &#039;&#039;Usernamen, Passwort&#039;&#039; und eine &#039;&#039;Mailadresse&#039;&#039;, dann kann ich das einrichten. &amp;lt;br&amp;gt;&lt;br /&gt;
Tragt Euch dazu einfach selber in die Tabelle ein, ich erledige dann den Rest.&amp;lt;br&amp;gt;&lt;br /&gt;
Oder einfch eine Email mit username und password an hr20[at]carluccio[dot]de&amp;lt;br&amp;gt;&lt;br /&gt;
Das mache ich dann von Hand und da ich nicht alle 10 Minuten Mails bearbeite kann das auch schon mal einen oder zwei Tage dauern. &amp;lt;br&amp;gt;&lt;br /&gt;
Wenn sich ein Maintainer findet, gebe ich die Zugangsdaten gerne weiter.&lt;br /&gt;
&lt;br /&gt;
== Entwickler ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! width=&amp;quot;150&amp;quot; | Entwickler&lt;br /&gt;
! width=&amp;quot;150&amp;quot; | svn Status&lt;br /&gt;
|-&lt;br /&gt;
| darioc&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|-&lt;br /&gt;
| louk&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|-&lt;br /&gt;
| jsachs&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Verzeichnisstruktur ==&lt;br /&gt;
Eine Verzeichnisstruktur ist auch schon angelegt und die ersten Daten auch drin. Hier die Verzeichnisse:&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
| &#039;&#039;&#039;/doc&#039;&#039;&#039;&lt;br /&gt;
| Für alles an Dokumenten, die selbst erstellt wurden. &amp;lt;br&amp;gt;&lt;br /&gt;
Specs, die man im Internet bekommen kann gehören hier nicht rein, &amp;lt;br&amp;gt;&lt;br /&gt;
die machen das alles nur unnötig gross und das auschecken dauert länger.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/playground&#039;&#039;&#039; &lt;br /&gt;
| Wie der Name schon sagt, zum rumspielen und testen. &amp;lt;br&amp;gt;&lt;br /&gt;
Hier kommt jegliche art von Codeschnipseln hin, die zu Testen da sind &amp;lt;br&amp;gt;&lt;br /&gt;
und (derzeit) noch nicht Teil des Programmes sind.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/source&#039;&#039;&#039; &lt;br /&gt;
| Hier kommt die Applikation rein mit allen Modulen und makefiles.&amp;lt;br&amp;gt;&lt;br /&gt;
Bitte haltet das Repository sauber und checkt nur Dateien ein, &amp;lt;br&amp;gt;&lt;br /&gt;
die auch Sinn  machen, &amp;quot;thumbs.db&amp;quot; oder andere Temp-Dateien gehören hier nicht rein.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SVN Client und Anleitung ==&lt;br /&gt;
Windows-User nutzen am besten den Tortoise-SVN-Client, den man kostenfrei [http://tortoisesvn.tigris.org hier runterladen] kann. &amp;lt;br&amp;gt;&lt;br /&gt;
Dort gibt es auch eine Anleitung zum Arbeiten mit SVN.&lt;br /&gt;
&lt;br /&gt;
= Analyse der Hardware =&lt;br /&gt;
Die Analyse hat der Dario schon gemacht, zu finden ist die jeweils aktuelle Version &lt;br /&gt;
[http://www.carluccio.de/img/hr20/analyse.pdf als PDF hier] oder [https://opensvn.csie.org/viewcvs.cgi/doc/analyse.pdf hier im SVN].&lt;br /&gt;
&lt;br /&gt;
= Benötigte Module =&lt;br /&gt;
&lt;br /&gt;
Um das Ganze nun etwas zu koordinieren hier eine Liste der benötigten Module und deren Funktionen. &amp;lt;br&amp;gt;&lt;br /&gt;
Diese dient dazu später die Aufgaben zu verteilen:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Module&lt;br /&gt;
! Function&lt;br /&gt;
! Developer&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| LCD&lt;br /&gt;
| Display Driver:&amp;lt;BR&amp;gt;&lt;br /&gt;
* Init Display - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Set Segments - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Print HEX, DEC, TEMP, DayofWeek - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Blink - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* e.t.c&lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; DONE &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| LCD Simulation&lt;br /&gt;
| Simulation for display in AVR Studio:&amp;lt;BR&amp;gt;&lt;br /&gt;
* Defining Display - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Assign Segments to register bits - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Providing samplecode - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
| louk&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; 95% &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| RTC&lt;br /&gt;
| Time and Date Handler&lt;br /&gt;
* init timer - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* use IRQ with 32kHz crystal - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* handle time and date - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** daylight saving - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** consult leapyear  - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* calc day of week out of date - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Only one Byte for Year -&amp;gt; (2000 to 2255)&lt;br /&gt;
* Day of week timer with callback - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* Tick counter (seconds since reboot) - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** used to detect long keypress&lt;br /&gt;
** used to detect motor blocked&lt;br /&gt;
** used for additional timer &lt;br /&gt;
* Additional timer based on tick counter value - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* corretion for external Crystal - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* calibrate internal RC - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE, but not tested &#039;&#039;&#039;&amp;lt;/span&amp;gt; &lt;br /&gt;
| &#039;&#039;&#039; dario &#039;&#039;&#039; &lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; 95% &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| COM&lt;br /&gt;
| COM-Driver&lt;br /&gt;
* menue (Debug und Steuerung)&lt;br /&gt;
** show and set desired temperature &lt;br /&gt;
** show and set Time and Date&lt;br /&gt;
** show actual temperature&lt;br /&gt;
** show (and set) actual valveposition &lt;br /&gt;
** show and set timetable and temperatures&lt;br /&gt;
* optional &lt;br /&gt;
** adressierung of HR20 (for BUS, RF)&lt;br /&gt;
** authentication end encryption&lt;br /&gt;
| style=&amp;quot;background-color:blue;&amp;quot; | &#039;&#039;&#039; jsachs &#039;&#039;&#039; &lt;br /&gt;
&#039;&#039;&#039; active &#039;&#039;&#039; &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039; (50%) &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| CONFIG &lt;br /&gt;
| Save Config in EEPROM&lt;br /&gt;
* driver for EEPROM access&lt;br /&gt;
* save values to EEPROM &lt;br /&gt;
* load values from EEPROM &lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| MENU &lt;br /&gt;
| Control Menu State Machine&lt;br /&gt;
* show values on display&lt;br /&gt;
* functionality:&lt;br /&gt;
** show and set desired temperature&lt;br /&gt;
** show and set time and date &lt;br /&gt;
** show actual temperature&lt;br /&gt;
** show actual valveposition &lt;br /&gt;
** show and set timetable and temperatures&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| MAIN&lt;br /&gt;
| Main Loop&lt;br /&gt;
* init everything&lt;br /&gt;
** global vars - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** rtc - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** lcd - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** motor - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** tempsensor &lt;br /&gt;
* get keystate - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE (ISR in main.c)&#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** debounce - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039;not needed&#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** multi keypress (needed for hidden menue?) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039;can be checked by main loop&#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
* get position of wheel (incremental counter) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE (ISR in main.c)&#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* call menue&lt;br /&gt;
* detect longer keypress / double click - needed?&lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; (70%)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| MOTOR&lt;br /&gt;
| Motor-Driver &lt;br /&gt;
* set desired valveposition  - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** quick, asympthotic, quiet - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE (speed can be chosen) &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* callibrate for Valve - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt; &lt;br /&gt;
** optimised (less motor consumption depending on desired final position) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Stop motor if not turning (blocked) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* stop calibration if valve is removed - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN  &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Genereate ERROR if motor is not turning (blocked or low energy) - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; (95%)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| ADC&lt;br /&gt;
| ADC-Driver (measure Temp and U_Bat)&lt;br /&gt;
* init Sensor &lt;br /&gt;
* IRQ driven (500ms, from RTC)&lt;br /&gt;
* start A/D conversion (Temp and U_Bat)&lt;br /&gt;
* calc temperature in 1/100 degree Celsius&lt;br /&gt;
* calc battery voltage in mV&lt;br /&gt;
* calibration for sensor (needed?)&lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; (95%)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| PID&lt;br /&gt;
| PID Algorithm&lt;br /&gt;
* calculate desired valveposition out of&lt;br /&gt;
** last valveposition(s) &lt;br /&gt;
** last temperature(s)&lt;br /&gt;
** actual temperature&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| LOG&lt;br /&gt;
| Datalogger&lt;br /&gt;
* Operating Hours&lt;br /&gt;
** motor in action&lt;br /&gt;
** ODOmeter&lt;br /&gt;
** since Battery Exchange&lt;br /&gt;
* Errors&lt;br /&gt;
* Logfiles (only with additional hardware)&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UID&lt;br /&gt;
| Unique ID for identification&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| BOOT&lt;br /&gt;
| Bootloader&lt;br /&gt;
we need a bootloader so that the developers can flash the software &lt;br /&gt;
without a JTAG cable and without disassembling the HR20.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039; I have a working XModem bootloader. We should discuss if we want to use it. &#039;&#039;&#039; &amp;lt;br&amp;gt;&lt;br /&gt;
Still need some size optimisation&amp;lt;br&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color:blue;&amp;quot; | &#039;&#039;&#039; jsachs &#039;&#039;&#039; &lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; |&lt;br /&gt;
&#039;&#039;&#039; (95%) &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= API Beschreibung =&lt;br /&gt;
Das Projekt wird mit doxygen dokumentiert, &lt;br /&gt;
die API-Beschreibung kann aus dem Source-Code generiert werden.&lt;br /&gt;
= UART Protokoll =&lt;br /&gt;
Es soll möglich sein den Thermostaten über eine Schnittstelle anzusteuern.&lt;br /&gt;
An dem externen Stecker liegt schon die Serielle Schnittstelle an.&lt;br /&gt;
Wir definieren ein Protokoll, welches dem Datenaustausch zwischen einem HR20 und einem externen Gerät dienst. So kann man einen PC direkt (über einen 3V Pegelwandler) anschließen. &lt;br /&gt;
Wenn man ein anderes Medium nutzen will, muss man dafür sorgen, dass genau diese &lt;br /&gt;
Pakete an den Kommandohandler übergeben werden. So kann man darüber oder darunter, je nach Sichtweise jedes Medium (Kabel, Funk, IR) und jedes Protokoll legen.&lt;br /&gt;
== Nachrichten ==&lt;br /&gt;
Folgede Anforderungen werden an das Nachrichtenformat gestellt.&lt;br /&gt;
* Jeder Befehl soll zu jedem Zeitpunkt möglich sein (nicht state orientiert)&lt;br /&gt;
* Befehle sollen eingetippt werden können (z.B. am Terminalprogramm)&lt;br /&gt;
* Es soll einfach möglich sein, das Protokoll um neue Befehle zu erweitern.&lt;br /&gt;
* Der Parser läuft im Mikrocontroller, er sollte wirklich klein sein. Es wäre nicht schön, wenn dazu jede Menge Strings gespeichert werden müssen.&lt;br /&gt;
&lt;br /&gt;
== Protokoll Umfang ==&lt;br /&gt;
Folgende Befehle sollten verfügbar sein:&amp;lt;br&amp;gt;&lt;br /&gt;
* Soll Temperatur setzen und lesen&lt;br /&gt;
* Programm Manuell / Auto Umschaltung, setzen und lesen&lt;br /&gt;
* Datum / Zeit Einstellung, setzen und lesen&lt;br /&gt;
* Sommer Winterzeit setzen und lesen&lt;br /&gt;
* Programm für die Wochentage 1-7, vermute hier auch 2 Zeiten pro Tag wie beim Original ?&lt;br /&gt;
* Temperatur für Absenk Temperatur und Normal Temperatur setzen und lesen&lt;br /&gt;
* Version lesen&lt;br /&gt;
* Batteriespannung (Zustand) lesen&lt;br /&gt;
* Ventilstellung setzen und lesen&lt;br /&gt;
* Kalibrierung auslösen&lt;br /&gt;
* Bootloader starten für Update über RS232&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Generell sollten alle Veränderungen automatisch gemeldet werden (Notify) um ein Polling zu vermeiden.&amp;lt;br&lt;br /&gt;
&lt;br /&gt;
=== 1. Vorschlag ===&lt;br /&gt;
Byte1: Befehl&lt;br /&gt;
Byte2: Länge Daten&lt;br /&gt;
Byte3: Daten&lt;br /&gt;
Maximal 16 oder 32 Byte, wegen Buffergröße.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
Befehle: &lt;br /&gt;
* 00 OK&lt;br /&gt;
* 01 Gettime&lt;br /&gt;
* 02 Get SollTemp&lt;br /&gt;
* 03 Get IstTemp&lt;br /&gt;
* 04 Get Ventilpos&lt;br /&gt;
* 81 Settime&lt;br /&gt;
* 82 Set SollTemp&lt;br /&gt;
* 83 n/a&lt;br /&gt;
* 84 n/a&lt;br /&gt;
* FF NOK&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
-&amp;gt; 81,03,12,30,17  &lt;br /&gt;
&amp;lt;- 00&lt;br /&gt;
-&amp;gt; 01,00&lt;br /&gt;
&amp;lt;- time: 12:30:17&lt;br /&gt;
-&amp;gt; 02,00&lt;br /&gt;
&amp;lt;- soll: 20.0&lt;br /&gt;
-&amp;gt; 03,00&lt;br /&gt;
&amp;lt;- ist: 19.95&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Richtig zufrieden bin ich damit nicht, hat jemand bessere Vorschlage, dann hier eintragen:&lt;br /&gt;
&lt;br /&gt;
=== 2. Vorschlag ===&lt;br /&gt;
* Einfaches ASCII Protokoll.&amp;lt;br&amp;gt;&lt;br /&gt;
* Die Kommandos müssen kurz aber Aussagekräftig sein.&amp;lt;br&amp;gt;&lt;br /&gt;
* Alle Strings müssen im Flash liegen um Speicher zu sparen.&amp;lt;br&amp;gt;&lt;br /&gt;
* Rückmeldungen und Notifys müssen eindeutig unterscheidbar sein&amp;lt;br&amp;gt;&lt;br /&gt;
Eine kleine Protokollbeschreibung ist im SVN zusammengepackt unter &amp;quot;doc/protokoll/&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Beispiel :&amp;lt;/B&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;quot;!VER\r&amp;quot; -&amp;gt; &amp;quot;$VER-1.2.17&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;quot;?TEMP\r&amp;quot; -&amp;gt; &amp;quot;$TEMP-CUR=20.5,MIN=16.3,MAX=24.5\r&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;quot;!SET-TIME=17:30:55\&amp;quot; -&amp;gt; &amp;quot;$SET-TIME=OK\r&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Notify: &amp;quot;@TEMP-CUR=20.5,MIN=16.3,MAX=24.5\r&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Der Aufbau ist ja im SVN Erklärt.&amp;lt;br&amp;gt;&lt;br /&gt;
Der Aufwand fürs Parsen hält sich mehr als in grenzen.&amp;lt;br&amp;gt;&lt;br /&gt;
Die Strings alle ins Flash.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Bootloader ist hier außen vor. Der wird nur per Kommando angestoßen und fährt dann ein eigenes Protokoll. Hier würde ich XModem vorschlagen. Kompakt und mit Prüfsumme. Zum Upload kann jedes Terminalprogramm genutzt werden.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;quot;BOOTLOAD\r&amp;quot; -&amp;gt; &amp;quot;BOOTLOAD-OK\r&amp;quot; dann sendet der Controller die XModem start Sequenz und es geht los.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Vorschlag ===&lt;br /&gt;
=== 4. Vorschlag ===&lt;br /&gt;
&lt;br /&gt;
= Bootloader =&lt;br /&gt;
Um ein einfaches Update der Software, auch ohne Programmer und Zerlegen des HR20E zu ermöglichen, sollte ein Bootloader implementiert werden.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Anforderungen ==&lt;br /&gt;
* Einfaches Update ohne öffnen des HR20E&amp;lt;br&amp;gt;&lt;br /&gt;
* Nutzen bestehender Programme (Terminalprogramm), das erspart das schreiben von Update Software&amp;lt;br&amp;gt;&lt;br /&gt;
* HR20E sollte nach dem Start prüfen ob Programm gültig und nur dann das Anwenderprogramm starten&lt;br /&gt;
* Protokoll sollte Updatevorgang aus dem laufenden Betrieb unterstützen (Sprung in den Bootloader)&lt;br /&gt;
&lt;br /&gt;
== Vorschlag 1 ==&lt;br /&gt;
X-Modem Protokoll (mit CRC)&amp;lt;br&amp;gt;&lt;br /&gt;
Hier gibt es eine fertige Lösung für das Etherboot projekt, deren übername gestattet ist.&amp;lt;br&amp;gt; &lt;br /&gt;
Größe ist hier kleiner 1kb und wohl verkraftbar.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vorteil:&amp;lt;br&amp;gt;&lt;br /&gt;
* etablierte Technik&lt;br /&gt;
* von anderen Herstellern Verwendet&lt;br /&gt;
* wird von den meisten Terminal Programmen unterstützt&lt;br /&gt;
* Gesichert durch Checksumme&lt;br /&gt;
Nachteil:&amp;lt;br&amp;gt;&lt;br /&gt;
* Aufwendige Checksummen Berechnung oder Lookup Tabelle Notwendig&lt;br /&gt;
&lt;br /&gt;
= Entwicklungsumgebung =&lt;br /&gt;
* Editor, Debugger, Compiler&lt;br /&gt;
** WinAVR version (20071221), sprich GCC 4.2.2 sowie avr-libc 1.6.0&lt;br /&gt;
** AVR Studio 4 &lt;br /&gt;
* JTAG ICE&lt;br /&gt;
** Atmel AVR JTAGICE MK2 &lt;br /&gt;
** AVR Dragon (z.B. http://elmicro.com/de/atavrdragon.html)&lt;br /&gt;
** Olimex-Seriell http://www.olimex.com/dev/avr-jtag.html  &lt;br /&gt;
** Olimex-USB http://www.olimex.com/dev/avr-usb-jtag.html &lt;br /&gt;
&lt;br /&gt;
= Sonstiges =&lt;br /&gt;
== Altes Protokoll ==&lt;br /&gt;
[[HR20_Protocol_V2 | Hier ]] hat mal einer ein Protokoll eingegeben.&lt;br /&gt;
Das scheint aber nicht zu der Version 2.04 zu passen. &lt;br /&gt;
Ich habe es nicht gelöscht, falls es jemanden interessiert.&lt;br /&gt;
&lt;br /&gt;
[[Category:Projekte|!]]&lt;/div&gt;</summary>
		<author><name>Dario</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=27268</id>
		<title>Heizungssteuerung mit Honeywell HR20</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=27268"/>
		<updated>2008-04-06T22:19:03Z</updated>

		<summary type="html">&lt;p&gt;Dario: /* Benötigte Module */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von DarioC&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Wie alles begann =&lt;br /&gt;
&lt;br /&gt;
Nachdem von Uwe Felgentreu vor nunmehr vor über drei Jahren (genau am 17.11.2004 um 11:26) hier in diesem Forum den Thread mit dem Titel &#039;&#039;Honeywell Rondostat HR20E per AVR steuern und konfigurieren&#039;&#039; gestartet hat ist es nun langsam soweit, dass das Ganze auch ein Projekt wird. &lt;br /&gt;
&lt;br /&gt;
Den Thread dazu kann der interessierte Leser [http://www.mikrocontroller.net/topic/17603 hier nachlesen] &lt;br /&gt;
&lt;br /&gt;
= Projektziel =&lt;br /&gt;
&lt;br /&gt;
Wir konzentrieren uns in erster Linie auf den Honeywell Rondostat HR20E mit ausgelieferten Softwareversion 2.04. Dass es ähnliche andere Geräte gibt behalten wir bei der Entwicklung im Hinterkopf.&lt;br /&gt;
&lt;br /&gt;
Basierend auf dieser Hardware wollen wir eine neue Software entwickeln. &lt;br /&gt;
Dabei können wir ausser der Hardware nichts weiter verwenden, da die Originalsoftware geschützt ist und nicht ausgelesen werden kann.&lt;br /&gt;
&lt;br /&gt;
== Phase 1 ==&lt;br /&gt;
Die Software soll die Funktionen bieten, die die Originalsoftware auch bietet, später können dies dann um zusätzliche Funktionen erweitert werden. Die wichtigsten Funktionen sind:&lt;br /&gt;
&lt;br /&gt;
* Temperaturregelung&lt;br /&gt;
* Echtzeituhr&lt;br /&gt;
* Ausnutzen der Sleep Funktion&lt;br /&gt;
* Anzeige Soll-Temperatur und der Uhrzeit&lt;br /&gt;
* Einstellung der Soll-Temperatur&lt;br /&gt;
* Uhrzeitgesteuerte Einstellung der Soll-Temperatur &lt;br /&gt;
* Fenster-Offen-Erkennung&lt;br /&gt;
* Ventilfreispülungsfunktion&lt;br /&gt;
&lt;br /&gt;
== Phase 2 ==&lt;br /&gt;
&lt;br /&gt;
Hier liegt der Sinn des ganzen Projektes: Durch diese zusätzlichen Funktionen wollen wir den Nutzwert des Thermostaten erheblich steigern:&lt;br /&gt;
&lt;br /&gt;
* Programmierung der Schaltzeiten und Temperaturen über externe Schnittstelle&lt;br /&gt;
* Abfrage der Messwerte und Parameter über externe Schnittstelle&lt;br /&gt;
* Vernetzung der Thermostaten untereinander&lt;br /&gt;
* Zusätzliche externe Schnittstellen (neben UART auch CAN und Funk)&lt;br /&gt;
* Erweiterung der Anzeige um&lt;br /&gt;
** Ist-Temperatur &lt;br /&gt;
** Ventilstellung&lt;br /&gt;
** Funkschnittstelle&lt;br /&gt;
*** RFM12 http://www.hoperf.com/rf_fsk.asp&lt;br /&gt;
*** Zigbee http://www.meshnetics.com/zigbee-modules&lt;br /&gt;
** ...&lt;br /&gt;
* Bootloader, damit Leute mitarbeiten können, die keine JTAG haben. Mit einem JTAG könnte man den Bootloader Flashen, ohne den Thermostaten öffnen zu müssen. Von da an kann man über den Programmierstecker mit einem umgebauten Handykabel den Thermostaten neu flashen.&lt;br /&gt;
&lt;br /&gt;
= Lizenz =&lt;br /&gt;
Die Software wird unter GPL v2 gestellt.&lt;br /&gt;
&lt;br /&gt;
= Subversion Repository =&lt;br /&gt;
Ein SVN Repository liegt auf dem freien SVN Server: https://opensvn.csie.org&lt;br /&gt;
== Zugangsdaten ==&lt;br /&gt;
Repository Location: https://OpenSVN.csie.org/hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
Browse Repository: https://OpenSVN.csie.org/viewcvs.cgi/?root=hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
TRAC: https://opensvn.csie.org/traccgi/hr20&lt;br /&gt;
== Policy ==&lt;br /&gt;
Anonymous check out ist erlaubt. &amp;lt;br&amp;gt;&lt;br /&gt;
Wer was committen will muss freigeschaltet werden. &amp;lt;br&amp;gt;&lt;br /&gt;
Dazu brauche ich ein &#039;&#039;Usernamen, Passwort&#039;&#039; und eine &#039;&#039;Mailadresse&#039;&#039;, dann kann ich das einrichten. &amp;lt;br&amp;gt;&lt;br /&gt;
Tragt Euch dazu einfach selber in die Tabelle ein, ich erledige dann den Rest.&amp;lt;br&amp;gt;&lt;br /&gt;
Oder einfch eine Email mit username und password an hr20[at]carluccio[dot]de&amp;lt;br&amp;gt;&lt;br /&gt;
Das mache ich dann von Hand und da ich nicht alle 10 Minuten Mails bearbeite kann das auch schon mal einen oder zwei Tage dauern. &amp;lt;br&amp;gt;&lt;br /&gt;
Wenn sich ein Maintainer findet, gebe ich die Zugangsdaten gerne weiter.&lt;br /&gt;
&lt;br /&gt;
== Entwickler ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! width=&amp;quot;150&amp;quot; | Entwickler&lt;br /&gt;
! width=&amp;quot;150&amp;quot; | svn Status&lt;br /&gt;
|-&lt;br /&gt;
| darioc&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|-&lt;br /&gt;
| louk&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|-&lt;br /&gt;
| jsachs&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Verzeichnisstruktur ==&lt;br /&gt;
Eine Verzeichnisstruktur ist auch schon angelegt und die ersten Daten auch drin. Hier die Verzeichnisse:&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
| &#039;&#039;&#039;/doc&#039;&#039;&#039;&lt;br /&gt;
| Für alles an Dokumenten, die selbst erstellt wurden. &amp;lt;br&amp;gt;&lt;br /&gt;
Specs, die man im Internet bekommen kann gehören hier nicht rein, &amp;lt;br&amp;gt;&lt;br /&gt;
die machen das alles nur unnötig gross und das auschecken dauert länger.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/playground&#039;&#039;&#039; &lt;br /&gt;
| Wie der Name schon sagt, zum rumspielen und testen. &amp;lt;br&amp;gt;&lt;br /&gt;
Hier kommt jegliche art von Codeschnipseln hin, die zu Testen da sind &amp;lt;br&amp;gt;&lt;br /&gt;
und (derzeit) noch nicht Teil des Programmes sind.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/source&#039;&#039;&#039; &lt;br /&gt;
| Hier kommt die Applikation rein mit allen Modulen und makefiles.&amp;lt;br&amp;gt;&lt;br /&gt;
Bitte haltet das Repository sauber und checkt nur Dateien ein, &amp;lt;br&amp;gt;&lt;br /&gt;
die auch Sinn  machen, &amp;quot;thumbs.db&amp;quot; oder andere Temp-Dateien gehören hier nicht rein.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SVN Client und Anleitung ==&lt;br /&gt;
Windows-User nutzen am besten den Tortoise-SVN-Client, den man kostenfrei [http://tortoisesvn.tigris.org hier runterladen] kann. &amp;lt;br&amp;gt;&lt;br /&gt;
Dort gibt es auch eine Anleitung zum Arbeiten mit SVN.&lt;br /&gt;
&lt;br /&gt;
= Analyse der Hardware =&lt;br /&gt;
Die Analyse hat der Dario schon gemacht, zu finden ist die jeweils aktuelle Version &lt;br /&gt;
[http://www.carluccio.de/img/hr20/analyse.pdf als PDF hier] oder [https://opensvn.csie.org/viewcvs.cgi/doc/analyse.pdf hier im SVN].&lt;br /&gt;
&lt;br /&gt;
= Benötigte Module =&lt;br /&gt;
&lt;br /&gt;
Um das Ganze nun etwas zu koordinieren hier eine Liste der benötigten Module und deren Funktionen. &amp;lt;br&amp;gt;&lt;br /&gt;
Diese dient dazu später die Aufgaben zu verteilen:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Module&lt;br /&gt;
! Function&lt;br /&gt;
! Developer&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| LCD&lt;br /&gt;
| Display Driver:&amp;lt;BR&amp;gt;&lt;br /&gt;
* Init Display - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Set Segments - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Print HEX, DEC, TEMP, DayofWeek - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Blink - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* e.t.c&lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; DONE &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| LCD Simulation&lt;br /&gt;
| Simulation for display in AVR Studio:&amp;lt;BR&amp;gt;&lt;br /&gt;
* Defining Display - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Assign Segments to register bits - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Providing samplecode - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
| louk&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; 95% &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| RTC&lt;br /&gt;
| Time and Date Handler&lt;br /&gt;
* init timer - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* use IRQ with 32kHz crystal - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* handle time and date - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** daylight saving - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** consult leapyear  - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* calc day of week out of date - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Only one Byte for Year -&amp;gt; (2000 to 2255)&lt;br /&gt;
* Day of week timer with callback - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* Tick counter (seconds since reboot) - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** used to detect long keypress&lt;br /&gt;
** used to detect motor blocked&lt;br /&gt;
** used for additional timer &lt;br /&gt;
* Additional timer based on tick counter value - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* corretion for external Crystal - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* calibrate internal RC - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE, but not tested &#039;&#039;&#039;&amp;lt;/span&amp;gt; &lt;br /&gt;
| &#039;&#039;&#039; dario &#039;&#039;&#039; &lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; 95% &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UART &lt;br /&gt;
| UART-Driver&lt;br /&gt;
* menue (Debug und Steuerung)&lt;br /&gt;
** show and set desired temperature &lt;br /&gt;
** show and set Time and Date&lt;br /&gt;
** show actual temperature&lt;br /&gt;
** show (and set) actual valveposition &lt;br /&gt;
** show and set timetable and temperatures&lt;br /&gt;
* optional &lt;br /&gt;
** adressierung of HR20 (for BUS, RF)&lt;br /&gt;
** authentication end encryption&lt;br /&gt;
| style=&amp;quot;background-color:blue;&amp;quot; | &#039;&#039;&#039; jsachs &#039;&#039;&#039; &lt;br /&gt;
&#039;&#039;&#039; active &#039;&#039;&#039; &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039; (50%) &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| CONFIG &lt;br /&gt;
| Save Config in EEPROM&lt;br /&gt;
* driver for EEPROM access&lt;br /&gt;
* save values to EEPROM &lt;br /&gt;
* load values from EEPROM &lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| MENU &lt;br /&gt;
| Control Menu State Machine&lt;br /&gt;
* show values on display&lt;br /&gt;
* functionality:&lt;br /&gt;
** show and set desired temperature&lt;br /&gt;
** show and set time and date &lt;br /&gt;
** show actual temperature&lt;br /&gt;
** show actual valveposition &lt;br /&gt;
** show and set timetable and temperatures&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| MAIN&lt;br /&gt;
| Main Loop&lt;br /&gt;
* init everything&lt;br /&gt;
** global vars - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** rtc - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** lcd - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** motor - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** tempsensor &lt;br /&gt;
* get keystate - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE (ISR in main.c)&#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** debounce - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039;not needed&#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** multi keypress (needed for hidden menue?) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039;can be checked by main loop&#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
* get position of wheel (incremental counter) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE (ISR in main.c)&#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* call menue&lt;br /&gt;
* detect longer keypress / double click - needed?&lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; (70%)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| MOTOR&lt;br /&gt;
| Motor-Driver &lt;br /&gt;
* set desired valveposition  - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** quick, asympthotic, quiet - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE (speed can be chosen) &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* callibrate for Valve - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt; &lt;br /&gt;
** optimised (less motor consumption depending on desired final position) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Stop motor if not turning (blocked) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* stop calibration if valve is removed - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN  &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Genereate ERROR if motor is not turning (blocked or low energy) - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; (95%)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| ADC&lt;br /&gt;
| ADC-Driver (measure Temp and U_Bat)&lt;br /&gt;
* init Sensor &lt;br /&gt;
* IRQ driven (500ms, from RTC)&lt;br /&gt;
* start A/D conversion (Temp and U_Bat)&lt;br /&gt;
* calc temperature in 1/100 degree Celsius&lt;br /&gt;
* calc battery voltage in mV&lt;br /&gt;
* calibration for sensor (needed?)&lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; (95%)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| PID&lt;br /&gt;
| PID Algorithm&lt;br /&gt;
* calculate desired valveposition out of&lt;br /&gt;
** last valveposition(s) &lt;br /&gt;
** last temperature(s)&lt;br /&gt;
** actual temperature&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| BOOT&lt;br /&gt;
| Bootloader&lt;br /&gt;
we need a bootloader so that the developers can flash the software &lt;br /&gt;
without a JTAG cable and without disassembling the HR20.&amp;lt;br&amp;gt;&lt;br /&gt;
&#039;&#039;&#039; I have a working XModem bootloader. We should discuss if we want to use it. &#039;&#039;&#039; &amp;lt;br&amp;gt;&lt;br /&gt;
Still need some size optimisation&amp;lt;br&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color:blue;&amp;quot; | &#039;&#039;&#039; jsachs &#039;&#039;&#039; &lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; |&lt;br /&gt;
&#039;&#039;&#039; (95%) &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| LOG&lt;br /&gt;
| Datalogger&lt;br /&gt;
* Operating Hours&lt;br /&gt;
** motor in action&lt;br /&gt;
** ODOmeter&lt;br /&gt;
** since Battery Exchange&lt;br /&gt;
* Errors&lt;br /&gt;
* Logfiles (only with additional hardware)&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UID&lt;br /&gt;
| Unique ID for identification&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= API Beschreibung =&lt;br /&gt;
Das Projekt wird mit doxygen dokumentiert, &lt;br /&gt;
die API-Beschreibung kann aus dem Source-Code generiert werden.&lt;br /&gt;
= UART Protokoll =&lt;br /&gt;
Es soll möglich sein den Thermostaten über eine Schnittstelle anzusteuern.&lt;br /&gt;
An dem externen Stecker liegt schon die Serielle Schnittstelle an.&lt;br /&gt;
Wir definieren ein Protokoll, welches dem Datenaustausch zwischen einem HR20 und einem externen Gerät dienst. So kann man einen PC direkt (über einen 3V Pegelwandler) anschließen. &lt;br /&gt;
Wenn man ein anderes Medium nutzen will, muss man dafür sorgen, dass genau diese &lt;br /&gt;
Pakete an den Kommandohandler übergeben werden. So kann man darüber oder darunter, je nach Sichtweise jedes Medium (Kabel, Funk, IR) und jedes Protokoll legen.&lt;br /&gt;
== Nachrichten ==&lt;br /&gt;
Folgede Anforderungen werden an das Nachrichtenformat gestellt.&lt;br /&gt;
* Jeder Befehl soll zu jedem Zeitpunkt möglich sein (nicht state orientiert)&lt;br /&gt;
* Befehle sollen eingetippt werden können (z.B. am Terminalprogramm)&lt;br /&gt;
* Es soll einfach möglich sein, das Protokoll um neue Befehle zu erweitern.&lt;br /&gt;
* Der Parser läuft im Mikrocontroller, er sollte wirklich klein sein. Es wäre nicht schön, wenn dazu jede Menge Strings gespeichert werden müssen.&lt;br /&gt;
&lt;br /&gt;
== Protokoll Umfang ==&lt;br /&gt;
Folgende Befehle sollten verfügbar sein:&amp;lt;br&amp;gt;&lt;br /&gt;
* Soll Temperatur setzen und lesen&lt;br /&gt;
* Programm Manuell / Auto Umschaltung, setzen und lesen&lt;br /&gt;
* Datum / Zeit Einstellung, setzen und lesen&lt;br /&gt;
* Sommer Winterzeit setzen und lesen&lt;br /&gt;
* Programm für die Wochentage 1-7, vermute hier auch 2 Zeiten pro Tag wie beim Original ?&lt;br /&gt;
* Temperatur für Absenk Temperatur und Normal Temperatur setzen und lesen&lt;br /&gt;
* Version lesen&lt;br /&gt;
* Batteriespannung (Zustand) lesen&lt;br /&gt;
* Ventilstellung setzen und lesen&lt;br /&gt;
* Kalibrierung auslösen&lt;br /&gt;
* Bootloader starten für Update über RS232&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Generell sollten alle Veränderungen automatisch gemeldet werden (Notify) um ein Polling zu vermeiden.&amp;lt;br&lt;br /&gt;
&lt;br /&gt;
=== 1. Vorschlag ===&lt;br /&gt;
Byte1: Befehl&lt;br /&gt;
Byte2: Länge Daten&lt;br /&gt;
Byte3: Daten&lt;br /&gt;
Maximal 16 oder 32 Byte, wegen Buffergröße.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
Befehle: &lt;br /&gt;
* 00 OK&lt;br /&gt;
* 01 Gettime&lt;br /&gt;
* 02 Get SollTemp&lt;br /&gt;
* 03 Get IstTemp&lt;br /&gt;
* 04 Get Ventilpos&lt;br /&gt;
* 81 Settime&lt;br /&gt;
* 82 Set SollTemp&lt;br /&gt;
* 83 n/a&lt;br /&gt;
* 84 n/a&lt;br /&gt;
* FF NOK&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
-&amp;gt; 81,03,12,30,17  &lt;br /&gt;
&amp;lt;- 00&lt;br /&gt;
-&amp;gt; 01,00&lt;br /&gt;
&amp;lt;- time: 12:30:17&lt;br /&gt;
-&amp;gt; 02,00&lt;br /&gt;
&amp;lt;- soll: 20.0&lt;br /&gt;
-&amp;gt; 03,00&lt;br /&gt;
&amp;lt;- ist: 19.95&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Richtig zufrieden bin ich damit nicht, hat jemand bessere Vorschlage, dann hier eintragen:&lt;br /&gt;
&lt;br /&gt;
=== 2. Vorschlag ===&lt;br /&gt;
* Einfaches ASCII Protokoll.&amp;lt;br&amp;gt;&lt;br /&gt;
* Die Kommandos müssen kurz aber Aussagekräftig sein.&amp;lt;br&amp;gt;&lt;br /&gt;
* Alle Strings müssen im Flash liegen um Speicher zu sparen.&amp;lt;br&amp;gt;&lt;br /&gt;
* Rückmeldungen und Notifys müssen eindeutig unterscheidbar sein&amp;lt;br&amp;gt;&lt;br /&gt;
Eine kleine Protokollbeschreibung ist im SVN zusammengepackt unter &amp;quot;doc/protokoll/&amp;quot;.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Beispiel :&amp;lt;/B&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;quot;!VER\r&amp;quot; -&amp;gt; &amp;quot;$VER-1.2.17&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;quot;?TEMP\r&amp;quot; -&amp;gt; &amp;quot;$TEMP-CUR=20.5,MIN=16.3,MAX=24.5\r&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;quot;!SET-TIME=17:30:55\&amp;quot; -&amp;gt; &amp;quot;$SET-TIME=OK\r&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Notify: &amp;quot;@TEMP-CUR=20.5,MIN=16.3,MAX=24.5\r&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Der Aufbau ist ja im SVN Erklärt.&amp;lt;br&amp;gt;&lt;br /&gt;
Der Aufwand fürs Parsen hält sich mehr als in grenzen.&amp;lt;br&amp;gt;&lt;br /&gt;
Die Strings alle ins Flash.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Bootloader ist hier außen vor. Der wird nur per Kommando angestoßen und fährt dann ein eigenes Protokoll. Hier würde ich XModem vorschlagen. Kompakt und mit Prüfsumme. Zum Upload kann jedes Terminalprogramm genutzt werden.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;quot;BOOTLOAD\r&amp;quot; -&amp;gt; &amp;quot;BOOTLOAD-OK\r&amp;quot; dann sendet der Controller die XModem start Sequenz und es geht los.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Vorschlag ===&lt;br /&gt;
=== 4. Vorschlag ===&lt;br /&gt;
&lt;br /&gt;
= Bootloader =&lt;br /&gt;
Um ein einfaches Update der Software, auch ohne Programmer und Zerlegen des HR20E zu ermöglichen, sollte ein Bootloader implementiert werden.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Anforderungen ==&lt;br /&gt;
* Einfaches Update ohne öffnen des HR20E&amp;lt;br&amp;gt;&lt;br /&gt;
* Nutzen bestehender Programme (Terminalprogramm), das erspart das schreiben von Update Software&amp;lt;br&amp;gt;&lt;br /&gt;
* HR20E sollte nach dem Start prüfen ob Programm gültig und nur dann das Anwenderprogramm starten&lt;br /&gt;
* Protokoll sollte Updatevorgang aus dem laufenden Betrieb unterstützen (Sprung in den Bootloader)&lt;br /&gt;
&lt;br /&gt;
== Vorschlag 1 ==&lt;br /&gt;
X-Modem Protokoll (mit CRC)&amp;lt;br&amp;gt;&lt;br /&gt;
Hier gibt es eine fertige Lösung für das Etherboot projekt, deren übername gestattet ist.&amp;lt;br&amp;gt; &lt;br /&gt;
Größe ist hier kleiner 1kb und wohl verkraftbar.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vorteil:&amp;lt;br&amp;gt;&lt;br /&gt;
* etablierte Technik&lt;br /&gt;
* von anderen Herstellern Verwendet&lt;br /&gt;
* wird von den meisten Terminal Programmen unterstützt&lt;br /&gt;
* Gesichert durch Checksumme&lt;br /&gt;
Nachteil:&amp;lt;br&amp;gt;&lt;br /&gt;
* Aufwendige Checksummen Berechnung oder Lookup Tabelle Notwendig&lt;br /&gt;
&lt;br /&gt;
= Entwicklungsumgebung =&lt;br /&gt;
* Editor, Debugger, Compiler&lt;br /&gt;
** WinAVR version (20071221), sprich GCC 4.2.2 sowie avr-libc 1.6.0&lt;br /&gt;
** AVR Studio 4 &lt;br /&gt;
* JTAG ICE&lt;br /&gt;
** Atmel AVR JTAGICE MK2 &lt;br /&gt;
** AVR Dragon (z.B. http://elmicro.com/de/atavrdragon.html)&lt;br /&gt;
** Olimex-Seriell http://www.olimex.com/dev/avr-jtag.html  &lt;br /&gt;
** Olimex-USB http://www.olimex.com/dev/avr-usb-jtag.html &lt;br /&gt;
&lt;br /&gt;
= Sonstiges =&lt;br /&gt;
== Altes Protokoll ==&lt;br /&gt;
[[HR20_Protocol_V2 | Hier ]] hat mal einer ein Protokoll eingegeben.&lt;br /&gt;
Das scheint aber nicht zu der Version 2.04 zu passen. &lt;br /&gt;
Ich habe es nicht gelöscht, falls es jemanden interessiert.&lt;br /&gt;
&lt;br /&gt;
[[Category:Projekte|!]]&lt;/div&gt;</summary>
		<author><name>Dario</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=26872</id>
		<title>Heizungssteuerung mit Honeywell HR20</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=26872"/>
		<updated>2008-03-16T11:15:15Z</updated>

		<summary type="html">&lt;p&gt;Dario: /* API Beschreibung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von DarioC&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Wie alles begann =&lt;br /&gt;
&lt;br /&gt;
Nachdem von Uwe Felgentreu vor nunmehr vor über drei Jahren (genau am 17.11.2004 um 11:26) hier in diesem Forum den Thread mit dem Titel &#039;&#039;Honeywell Rondostat HR20E per AVR steuern und konfigurieren&#039;&#039; gestartet hat ist es nun langsam soweit, dass das Ganze auch ein Projekt wird. &lt;br /&gt;
&lt;br /&gt;
Den Thread dazu kann der interessierte Leser [http://www.mikrocontroller.net/topic/17603 hier nachlesen] &lt;br /&gt;
&lt;br /&gt;
= Projektziel =&lt;br /&gt;
&lt;br /&gt;
Wir konzentrieren uns in erster Linie auf den Honeywell Rondostat HR20E mit ausgelieferten Softwareversion 2.04. Dass es ähnliche andere Geräte gibt behalten wir bei der Entwicklung im Hinterkopf.&lt;br /&gt;
&lt;br /&gt;
Basierend auf dieser Hardware wollen wir eine neue Software entwickeln. &lt;br /&gt;
Dabei können wir ausser der Hardware nichts weiter verwenden, da die Originalsoftware geschützt ist und nicht ausgelesen werden kann.&lt;br /&gt;
&lt;br /&gt;
== Phase 1 ==&lt;br /&gt;
Die Software soll die Funktionen bieten, die die Originalsoftware auch bietet, später können dies dann um zusätzliche Funktionen erweitert werden. Die wichtigsten Funktionen sind:&lt;br /&gt;
&lt;br /&gt;
* Temperaturregelung&lt;br /&gt;
* Echtzeituhr&lt;br /&gt;
* Ausnutzen der Sleep Funktion&lt;br /&gt;
* Anzeige Soll-Temperatur und der Uhrzeit&lt;br /&gt;
* Einstellung der Soll-Temperatur&lt;br /&gt;
* Uhrzeitgesteuerte Einstellung der Soll-Temperatur &lt;br /&gt;
* Fenster-Offen-Erkennung&lt;br /&gt;
* Ventilfreispülungsfunktion&lt;br /&gt;
&lt;br /&gt;
== Phase 2 ==&lt;br /&gt;
&lt;br /&gt;
Hier liegt der Sinn des ganzen Projektes: Durch diese zusätzlichen Funktionen wollen wir den Nutzwert des Thermostaten erheblich steigern:&lt;br /&gt;
&lt;br /&gt;
* Programmierung der Schaltzeiten und Temperaturen über externe Schnittstelle&lt;br /&gt;
* Abfrage der Messwerte und Parameter über externe Schnittstelle&lt;br /&gt;
* Vernetzung der Thermostaten untereinander&lt;br /&gt;
* Zusätzliche externe Schnittstellen (neben UART auch CAN und Funk)&lt;br /&gt;
* Erweiterung der Anzeige um&lt;br /&gt;
** Ist-Temperatur &lt;br /&gt;
** Ventilstellung&lt;br /&gt;
** Funkschnittstelle&lt;br /&gt;
*** RFM12 http://www.hoperf.com/rf_fsk.asp&lt;br /&gt;
*** Zigbee http://www.meshnetics.com/zigbee-modules&lt;br /&gt;
** ...&lt;br /&gt;
* Bootloader, damit Leute mitarbeiten können, die keine JTAG haben. Mit einem JTAG könnte man den Bootloader Flashen, ohne den Thermostaten öffnen zu müssen. Von da an kann man über den Programmierstecker mit einem umgebauten Handykabel den Thermostaten neu flashen.&lt;br /&gt;
&lt;br /&gt;
= Lizenz =&lt;br /&gt;
Die Software wird unter GPL v2 gestellt.&lt;br /&gt;
&lt;br /&gt;
= Subversion Repository =&lt;br /&gt;
Ein SVN Repository liegt auf dem freien SVN Server: https://opensvn.csie.org&lt;br /&gt;
== Zugangsdaten ==&lt;br /&gt;
Repository Location: https://OpenSVN.csie.org/hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
Browse Repository: https://OpenSVN.csie.org/viewcvs.cgi/?root=hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
TRAC: https://opensvn.csie.org/traccgi/hr20&lt;br /&gt;
== Policy ==&lt;br /&gt;
Anonymous check out ist erlaubt. &amp;lt;br&amp;gt;&lt;br /&gt;
Wer was committen will muss freigeschaltet werden. &amp;lt;br&amp;gt;&lt;br /&gt;
Dazu brauche ich ein &#039;&#039;Usernamen, Passwort&#039;&#039; und eine &#039;&#039;Mailadresse&#039;&#039;, dann kann ich das einrichten. &amp;lt;br&amp;gt;&lt;br /&gt;
Tragt Euch dazu einfach selber in die Tabelle ein, ich erledige dann den Rest.&amp;lt;br&amp;gt;&lt;br /&gt;
Oder einfch eine Email mit username und password an hr20[at]carluccio[dot]de&amp;lt;br&amp;gt;&lt;br /&gt;
Das mache ich dann von Hand und da ich nicht alle 10 Minuten Mails bearbeite kann das auch schon mal einen oder zwei Tage dauern. &amp;lt;br&amp;gt;&lt;br /&gt;
Wenn sich ein Maintainer findet, gebe ich die Zugangsdaten gerne weiter.&lt;br /&gt;
&lt;br /&gt;
== Entwickler ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! width=&amp;quot;150&amp;quot; | Entwickler&lt;br /&gt;
! width=&amp;quot;150&amp;quot; | svn Status&lt;br /&gt;
|-&lt;br /&gt;
| darioc&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|-&lt;br /&gt;
| louk&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|-&lt;br /&gt;
| jsachs&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Verzeichnisstruktur ==&lt;br /&gt;
Eine Verzeichnisstruktur ist auch schon angelegt und die ersten Daten auch drin. Hier die Verzeichnisse:&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
| &#039;&#039;&#039;/doc&#039;&#039;&#039;&lt;br /&gt;
| Für alles an Dokumenten, die selbst erstellt wurden. &amp;lt;br&amp;gt;&lt;br /&gt;
Specs, die man im Internet bekommen kann gehören hier nicht rein, &amp;lt;br&amp;gt;&lt;br /&gt;
die machen das alles nur unnötig gross und das auschecken dauert länger.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/playground&#039;&#039;&#039; &lt;br /&gt;
| Wie der Name schon sagt, zum rumspielen und testen. &amp;lt;br&amp;gt;&lt;br /&gt;
Hier kommt jegliche art von Codeschnipseln hin, die zu Testen da sind &amp;lt;br&amp;gt;&lt;br /&gt;
und (derzeit) noch nicht Teil des Programmes sind.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/source&#039;&#039;&#039; &lt;br /&gt;
| Hier kommt die Applikation rein mit allen Modulen und makefiles.&amp;lt;br&amp;gt;&lt;br /&gt;
Bitte haltet das Repository sauber und checkt nur Dateien ein, &amp;lt;br&amp;gt;&lt;br /&gt;
die auch Sinn  machen, &amp;quot;thumbs.db&amp;quot; oder andere Temp-Dateien gehören hier nicht rein.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SVN Client und Anleitung ==&lt;br /&gt;
Windows-User nutzen am besten den Tortoise-SVN-Client, den man kostenfrei [http://tortoisesvn.tigris.org hier runterladen] kann. &amp;lt;br&amp;gt;&lt;br /&gt;
Dort gibt es auch eine Anleitung zum Arbeiten mit SVN.&lt;br /&gt;
&lt;br /&gt;
= Analyse der Hardware =&lt;br /&gt;
Die Analyse hat der Dario schon gemacht, zu finden ist die jeweils aktuelle Version &lt;br /&gt;
[http://www.carluccio.de/img/hr20/analyse.pdf als PDF hier] oder [https://opensvn.csie.org/viewcvs.cgi/doc/analyse.pdf hier im SVN].&lt;br /&gt;
&lt;br /&gt;
= Benötigte Module =&lt;br /&gt;
&lt;br /&gt;
Um das Ganze nun etwas zu koordinieren hier eine Liste der benötigten Module und deren Funktionen. &amp;lt;br&amp;gt;&lt;br /&gt;
Diese dient dazu später die Aufgaben zu verteilen:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Module&lt;br /&gt;
! Function&lt;br /&gt;
! Developer&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| LCD&lt;br /&gt;
| Display Driver:&amp;lt;BR&amp;gt;&lt;br /&gt;
* Init Display - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Set Segments - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Print HEX, DEC, TEMP, DayofWeek - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Blink - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* e.t.c&lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; DONE &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| LCD Simulation&lt;br /&gt;
| Simulation for display in AVR Studio:&amp;lt;BR&amp;gt;&lt;br /&gt;
* Defining Display - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Assign Segments to register bits - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Providing samplecode - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
| louk&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; 95% &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| RTC&lt;br /&gt;
| Time and Date Handler&lt;br /&gt;
* init timer - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* use IRQ with 32kHz crystal - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* handle time and date - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** daylight saving - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** consult leapyear  - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* calc day of week out of date - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Only one Byte for Year -&amp;gt; (2000 to 2255)&lt;br /&gt;
* Day of week timer with callback - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* Tick counter (seconds since reboot) - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; WIP &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** used to detect long keypress&lt;br /&gt;
** used to detect motor blocked&lt;br /&gt;
** used for additional timer &lt;br /&gt;
* Additional timer based on tick counter value - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* corretion for external Crystal - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* calibrate internal RC - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE, but not tested &#039;&#039;&#039;&amp;lt;/span&amp;gt; &lt;br /&gt;
| style=&amp;quot;background-color:yellow;&amp;quot; | &#039;&#039;&#039; dario &#039;&#039;&#039; &lt;br /&gt;
&#039;&#039;&#039; active &#039;&#039;&#039; &lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; (95%)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UART &lt;br /&gt;
| UART-Driver&lt;br /&gt;
* menue (Debug und Steuerung)&lt;br /&gt;
** show and set desired temperature &lt;br /&gt;
** show and set Time and Date&lt;br /&gt;
** show actual temperature&lt;br /&gt;
** show (and set) actual valveposition &lt;br /&gt;
** show and set timetable and temperatures&lt;br /&gt;
* optional &lt;br /&gt;
** adressierung of HR20 (for BUS, RF)&lt;br /&gt;
** authentication end encryption&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| CONFIG &lt;br /&gt;
| Save Config in EEPROM&lt;br /&gt;
* driver for EEPROM access&lt;br /&gt;
* save values to EEPROM &lt;br /&gt;
* load values from EEPROM &lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| MENU &lt;br /&gt;
| Control Menu State Machine&lt;br /&gt;
* show values on display&lt;br /&gt;
* functionality:&lt;br /&gt;
** show and set desired temperature&lt;br /&gt;
** show and set time and date &lt;br /&gt;
** show actual temperature&lt;br /&gt;
** show actual valveposition &lt;br /&gt;
** show and set timetable and temperatures&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| MAIN&lt;br /&gt;
| Main Loop&lt;br /&gt;
* init everything&lt;br /&gt;
** global vars - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** rtc - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** lcd - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** motor - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** tempsensor &lt;br /&gt;
* get keystate - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE (ISR in main.c)&#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** debounce - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039;not needed&#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** multi keypress (needed for hidden menue?) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039;can be checked by main loop&#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
* get position of wheel (incremental counter) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE (ISR in main.c)&#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* call menue&lt;br /&gt;
* detect longer keypress / double click - needed?&lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; (70%)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| MOTOR&lt;br /&gt;
| Motor-Driver &lt;br /&gt;
* set desired valveposition  - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** quick, asympthotic, quiet - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE (speed can be chosen) &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* callibrate for Valve - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt; &lt;br /&gt;
** optimised (less motor consumption depending on desired final position) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Stop motor if not turning (blocked) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* stop calibration if valve is removed - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; WIP  &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Genereate ERROR if motor is not turning (blocked or low energy) - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color:yellow;&amp;quot; | &#039;&#039;&#039; dario &#039;&#039;&#039; &lt;br /&gt;
&#039;&#039;&#039; active &#039;&#039;&#039; &lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; (95%)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| ADC&lt;br /&gt;
| ADC-Driver (measure Temp and U_Bat)&lt;br /&gt;
* init Sensor &lt;br /&gt;
* IRQ driven (500ms)&lt;br /&gt;
* start A/D conversion (Temp and U_Bat)&lt;br /&gt;
* calc temperature in 1/100 degree Celsius&lt;br /&gt;
* calc battery voltage in mV&lt;br /&gt;
* calibration for sensor (needed?)&lt;br /&gt;
| style=&amp;quot;background-color:yellow;&amp;quot; | &#039;&#039;&#039; dario &#039;&#039;&#039; &lt;br /&gt;
&#039;&#039;&#039; active &#039;&#039;&#039; &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| PID&lt;br /&gt;
| PID Algorithm&lt;br /&gt;
* calculate desired valveposition out of&lt;br /&gt;
** last valveposition(s) &lt;br /&gt;
** last temperature(s)&lt;br /&gt;
** actual temperature&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| BOOT&lt;br /&gt;
| Bootloader&lt;br /&gt;
we need a bootloader so that the developers can flash the software &lt;br /&gt;
without a JTAG cable and without disassembling the HR20.&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| LOG&lt;br /&gt;
| Datalogger&lt;br /&gt;
* Operating Hours&lt;br /&gt;
** motor in action&lt;br /&gt;
** ODOmeter&lt;br /&gt;
** since Battery Exchange&lt;br /&gt;
* Errors&lt;br /&gt;
* Logfiles (only with additional hardware)&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UID&lt;br /&gt;
| Unique ID for identification&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= API Beschreibung =&lt;br /&gt;
Das Projekt wird mit doxygen dokumentiert, &lt;br /&gt;
die API-Beschreibung kann aus dem Source-Code generiert werden.&lt;br /&gt;
= UART Protokoll =&lt;br /&gt;
Es soll möglich sein den Thermostaten über eine Schnittstelle anzusteuern.&lt;br /&gt;
An dem externen Stecker liegt schon die Serielle Schnittstelle an.&lt;br /&gt;
Wir definieren ein Protokoll, welches dem Datenaustausch zwischen einem HR20 und einem externen Gerät dienst. So kann man einen PC direkt (über einen 3V Pegelwandler) anschließen. &lt;br /&gt;
Wenn man ein anderes Medium nutzen will, muss man dafür sorgen, dass genau diese &lt;br /&gt;
Pakete an den Kommandohandler übergeben werden. So kann man darüber oder darunter, je nach Sichtweise jedes Medium (Kabel, Funk, IR) und jedes Protokoll legen.&lt;br /&gt;
== Nachrichten ==&lt;br /&gt;
Folgede Anforderungen werden an das Nachrichtenformat gestellt.&lt;br /&gt;
* Jeder Befehl soll zu jedem Zeitpunkt möglich sein (nicht state orientiert)&lt;br /&gt;
* Befehle sollen eingetippt werden können (z.B. am Terminalprogramm)&lt;br /&gt;
* Es soll einfach möglich sein, das Protokoll um neue Befehle zu erweitern.&lt;br /&gt;
* Der Parser läuft im Mikrocontroller, er sollte wirklich klein sein. Es wäre nicht schön, wenn dazu jede Menge Strings gespeichert werden müssen.&lt;br /&gt;
=== 1. Vorschlag ===&lt;br /&gt;
Byte1: Befehl&lt;br /&gt;
Byte2: Länge Daten&lt;br /&gt;
Byte3: Daten&lt;br /&gt;
Maximal 16 oder 32 Byte, wegen Buffergröße.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
Befehle: &lt;br /&gt;
* 00 OK&lt;br /&gt;
* 01 Gettime&lt;br /&gt;
* 02 Get SollTemp&lt;br /&gt;
* 03 Get IstTemp&lt;br /&gt;
* 04 Get Ventilpos&lt;br /&gt;
* 81 Settime&lt;br /&gt;
* 82 Set SollTemp&lt;br /&gt;
* 83 n/a&lt;br /&gt;
* 84 n/a&lt;br /&gt;
* FF NOK&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
-&amp;gt; 71,03,12,30,17  &lt;br /&gt;
&amp;lt;- 00&lt;br /&gt;
-&amp;gt; 01,00&lt;br /&gt;
&amp;lt;- time: 12:30:17&lt;br /&gt;
-&amp;gt; 02,00&lt;br /&gt;
&amp;lt;- soll: 20.0&lt;br /&gt;
-&amp;gt; 03,00&lt;br /&gt;
&amp;lt;- ist: 19.95&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
Richtig zufrieden bin ich damit nicht, hat jemand bessere Vorschlage, dann hier eintragen:&lt;br /&gt;
=== 2. Vorschlag ===&lt;br /&gt;
=== 3. Vorschlag ===&lt;br /&gt;
=== 4. Vorschlag ===&lt;br /&gt;
&lt;br /&gt;
= Entwicklungsumgebung =&lt;br /&gt;
* Editor, Debugger, Compiler&lt;br /&gt;
** WinAVR version (20071221), sprich GCC 4.2.2 sowie avr-libc 1.6.0&lt;br /&gt;
** AVR Studio 4 &lt;br /&gt;
* JTAG ICE&lt;br /&gt;
** Atmel AVR JTAGICE MK2 &lt;br /&gt;
** AVR Dragon (z.B. http://elmicro.com/de/atavrdragon.html)&lt;br /&gt;
** Olimex-Seriell http://www.olimex.com/dev/avr-jtag.html  &lt;br /&gt;
** Olimex-USB http://www.olimex.com/dev/avr-usb-jtag.html &lt;br /&gt;
&lt;br /&gt;
= Sonstiges =&lt;br /&gt;
== Altes Protokoll ==&lt;br /&gt;
[[HR20_Protocol_V2 | Hier ]] hat mal einer ein Protokoll eingegeben.&lt;br /&gt;
Das scheint aber nicht zu der Version 2.04 zu passen. &lt;br /&gt;
Ich habe es nicht gelöscht, falls es jemanden interessiert.&lt;br /&gt;
&lt;br /&gt;
[[Category:Projekte|!]]&lt;/div&gt;</summary>
		<author><name>Dario</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=26871</id>
		<title>Heizungssteuerung mit Honeywell HR20</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=26871"/>
		<updated>2008-03-16T10:55:50Z</updated>

		<summary type="html">&lt;p&gt;Dario: /* Policy */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von DarioC&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Wie alles begann =&lt;br /&gt;
&lt;br /&gt;
Nachdem von Uwe Felgentreu vor nunmehr vor über drei Jahren (genau am 17.11.2004 um 11:26) hier in diesem Forum den Thread mit dem Titel &#039;&#039;Honeywell Rondostat HR20E per AVR steuern und konfigurieren&#039;&#039; gestartet hat ist es nun langsam soweit, dass das Ganze auch ein Projekt wird. &lt;br /&gt;
&lt;br /&gt;
Den Thread dazu kann der interessierte Leser [http://www.mikrocontroller.net/topic/17603 hier nachlesen] &lt;br /&gt;
&lt;br /&gt;
= Projektziel =&lt;br /&gt;
&lt;br /&gt;
Wir konzentrieren uns in erster Linie auf den Honeywell Rondostat HR20E mit ausgelieferten Softwareversion 2.04. Dass es ähnliche andere Geräte gibt behalten wir bei der Entwicklung im Hinterkopf.&lt;br /&gt;
&lt;br /&gt;
Basierend auf dieser Hardware wollen wir eine neue Software entwickeln. &lt;br /&gt;
Dabei können wir ausser der Hardware nichts weiter verwenden, da die Originalsoftware geschützt ist und nicht ausgelesen werden kann.&lt;br /&gt;
&lt;br /&gt;
== Phase 1 ==&lt;br /&gt;
Die Software soll die Funktionen bieten, die die Originalsoftware auch bietet, später können dies dann um zusätzliche Funktionen erweitert werden. Die wichtigsten Funktionen sind:&lt;br /&gt;
&lt;br /&gt;
* Temperaturregelung&lt;br /&gt;
* Echtzeituhr&lt;br /&gt;
* Ausnutzen der Sleep Funktion&lt;br /&gt;
* Anzeige Soll-Temperatur und der Uhrzeit&lt;br /&gt;
* Einstellung der Soll-Temperatur&lt;br /&gt;
* Uhrzeitgesteuerte Einstellung der Soll-Temperatur &lt;br /&gt;
* Fenster-Offen-Erkennung&lt;br /&gt;
* Ventilfreispülungsfunktion&lt;br /&gt;
&lt;br /&gt;
== Phase 2 ==&lt;br /&gt;
&lt;br /&gt;
Hier liegt der Sinn des ganzen Projektes: Durch diese zusätzlichen Funktionen wollen wir den Nutzwert des Thermostaten erheblich steigern:&lt;br /&gt;
&lt;br /&gt;
* Programmierung der Schaltzeiten und Temperaturen über externe Schnittstelle&lt;br /&gt;
* Abfrage der Messwerte und Parameter über externe Schnittstelle&lt;br /&gt;
* Vernetzung der Thermostaten untereinander&lt;br /&gt;
* Zusätzliche externe Schnittstellen (neben UART auch CAN und Funk)&lt;br /&gt;
* Erweiterung der Anzeige um&lt;br /&gt;
** Ist-Temperatur &lt;br /&gt;
** Ventilstellung&lt;br /&gt;
** Funkschnittstelle&lt;br /&gt;
*** RFM12 http://www.hoperf.com/rf_fsk.asp&lt;br /&gt;
*** Zigbee http://www.meshnetics.com/zigbee-modules&lt;br /&gt;
** ...&lt;br /&gt;
* Bootloader, damit Leute mitarbeiten können, die keine JTAG haben. Mit einem JTAG könnte man den Bootloader Flashen, ohne den Thermostaten öffnen zu müssen. Von da an kann man über den Programmierstecker mit einem umgebauten Handykabel den Thermostaten neu flashen.&lt;br /&gt;
&lt;br /&gt;
= Lizenz =&lt;br /&gt;
Die Software wird unter GPL v2 gestellt.&lt;br /&gt;
&lt;br /&gt;
= Subversion Repository =&lt;br /&gt;
Ein SVN Repository liegt auf dem freien SVN Server: https://opensvn.csie.org&lt;br /&gt;
== Zugangsdaten ==&lt;br /&gt;
Repository Location: https://OpenSVN.csie.org/hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
Browse Repository: https://OpenSVN.csie.org/viewcvs.cgi/?root=hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
TRAC: https://opensvn.csie.org/traccgi/hr20&lt;br /&gt;
== Policy ==&lt;br /&gt;
Anonymous check out ist erlaubt. &amp;lt;br&amp;gt;&lt;br /&gt;
Wer was committen will muss freigeschaltet werden. &amp;lt;br&amp;gt;&lt;br /&gt;
Dazu brauche ich ein &#039;&#039;Usernamen, Passwort&#039;&#039; und eine &#039;&#039;Mailadresse&#039;&#039;, dann kann ich das einrichten. &amp;lt;br&amp;gt;&lt;br /&gt;
Tragt Euch dazu einfach selber in die Tabelle ein, ich erledige dann den Rest.&amp;lt;br&amp;gt;&lt;br /&gt;
Oder einfch eine Email mit username und password an hr20[at]carluccio[dot]de&amp;lt;br&amp;gt;&lt;br /&gt;
Das mache ich dann von Hand und da ich nicht alle 10 Minuten Mails bearbeite kann das auch schon mal einen oder zwei Tage dauern. &amp;lt;br&amp;gt;&lt;br /&gt;
Wenn sich ein Maintainer findet, gebe ich die Zugangsdaten gerne weiter.&lt;br /&gt;
&lt;br /&gt;
== Entwickler ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! width=&amp;quot;150&amp;quot; | Entwickler&lt;br /&gt;
! width=&amp;quot;150&amp;quot; | svn Status&lt;br /&gt;
|-&lt;br /&gt;
| darioc&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|-&lt;br /&gt;
| louk&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|-&lt;br /&gt;
| jsachs&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Verzeichnisstruktur ==&lt;br /&gt;
Eine Verzeichnisstruktur ist auch schon angelegt und die ersten Daten auch drin. Hier die Verzeichnisse:&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
| &#039;&#039;&#039;/doc&#039;&#039;&#039;&lt;br /&gt;
| Für alles an Dokumenten, die selbst erstellt wurden. &amp;lt;br&amp;gt;&lt;br /&gt;
Specs, die man im Internet bekommen kann gehören hier nicht rein, &amp;lt;br&amp;gt;&lt;br /&gt;
die machen das alles nur unnötig gross und das auschecken dauert länger.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/playground&#039;&#039;&#039; &lt;br /&gt;
| Wie der Name schon sagt, zum rumspielen und testen. &amp;lt;br&amp;gt;&lt;br /&gt;
Hier kommt jegliche art von Codeschnipseln hin, die zu Testen da sind &amp;lt;br&amp;gt;&lt;br /&gt;
und (derzeit) noch nicht Teil des Programmes sind.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/source&#039;&#039;&#039; &lt;br /&gt;
| Hier kommt die Applikation rein mit allen Modulen und makefiles.&amp;lt;br&amp;gt;&lt;br /&gt;
Bitte haltet das Repository sauber und checkt nur Dateien ein, &amp;lt;br&amp;gt;&lt;br /&gt;
die auch Sinn  machen, &amp;quot;thumbs.db&amp;quot; oder andere Temp-Dateien gehören hier nicht rein.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SVN Client und Anleitung ==&lt;br /&gt;
Windows-User nutzen am besten den Tortoise-SVN-Client, den man kostenfrei [http://tortoisesvn.tigris.org hier runterladen] kann. &amp;lt;br&amp;gt;&lt;br /&gt;
Dort gibt es auch eine Anleitung zum Arbeiten mit SVN.&lt;br /&gt;
&lt;br /&gt;
= Analyse der Hardware =&lt;br /&gt;
Die Analyse hat der Dario schon gemacht, zu finden ist die jeweils aktuelle Version &lt;br /&gt;
[http://www.carluccio.de/img/hr20/analyse.pdf als PDF hier] oder [https://opensvn.csie.org/viewcvs.cgi/doc/analyse.pdf hier im SVN].&lt;br /&gt;
&lt;br /&gt;
= Benötigte Module =&lt;br /&gt;
&lt;br /&gt;
Um das Ganze nun etwas zu koordinieren hier eine Liste der benötigten Module und deren Funktionen. &amp;lt;br&amp;gt;&lt;br /&gt;
Diese dient dazu später die Aufgaben zu verteilen:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Module&lt;br /&gt;
! Function&lt;br /&gt;
! Developer&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| LCD&lt;br /&gt;
| Display Driver:&amp;lt;BR&amp;gt;&lt;br /&gt;
* Init Display - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Set Segments - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Print HEX, DEC, TEMP, DayofWeek - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Blink - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* e.t.c&lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; DONE &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| LCD Simulation&lt;br /&gt;
| Simulation for display in AVR Studio:&amp;lt;BR&amp;gt;&lt;br /&gt;
* Defining Display - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Assign Segments to register bits - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Providing samplecode - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
| louk&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; 95% &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| RTC&lt;br /&gt;
| Time and Date Handler&lt;br /&gt;
* init timer - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* use IRQ with 32kHz crystal - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* handle time and date - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** daylight saving - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** consult leapyear  - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* calc day of week out of date - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Only one Byte for Year -&amp;gt; (2000 to 2255)&lt;br /&gt;
* Day of week timer with callback - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* Tick counter (seconds since reboot) - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; WIP &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** used to detect long keypress&lt;br /&gt;
** used to detect motor blocked&lt;br /&gt;
** used for additional timer &lt;br /&gt;
* Additional timer based on tick counter value - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* corretion for external Crystal - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* calibrate internal RC - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE, but not tested &#039;&#039;&#039;&amp;lt;/span&amp;gt; &lt;br /&gt;
| style=&amp;quot;background-color:yellow;&amp;quot; | &#039;&#039;&#039; dario &#039;&#039;&#039; &lt;br /&gt;
&#039;&#039;&#039; active &#039;&#039;&#039; &lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; (95%)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UART &lt;br /&gt;
| UART-Driver&lt;br /&gt;
* menue (Debug und Steuerung)&lt;br /&gt;
** show and set desired temperature &lt;br /&gt;
** show and set Time and Date&lt;br /&gt;
** show actual temperature&lt;br /&gt;
** show (and set) actual valveposition &lt;br /&gt;
** show and set timetable and temperatures&lt;br /&gt;
* optional &lt;br /&gt;
** adressierung of HR20 (for BUS, RF)&lt;br /&gt;
** authentication end encryption&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| CONFIG &lt;br /&gt;
| Save Config in EEPROM&lt;br /&gt;
* driver for EEPROM access&lt;br /&gt;
* save values to EEPROM &lt;br /&gt;
* load values from EEPROM &lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| MENU &lt;br /&gt;
| Control Menu State Machine&lt;br /&gt;
* show values on display&lt;br /&gt;
* functionality:&lt;br /&gt;
** show and set desired temperature&lt;br /&gt;
** show and set time and date &lt;br /&gt;
** show actual temperature&lt;br /&gt;
** show actual valveposition &lt;br /&gt;
** show and set timetable and temperatures&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| MAIN&lt;br /&gt;
| Main Loop&lt;br /&gt;
* init everything&lt;br /&gt;
** global vars - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** rtc - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** lcd - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** motor - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** tempsensor &lt;br /&gt;
* get keystate - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE (ISR in main.c)&#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** debounce - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039;not needed&#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** multi keypress (needed for hidden menue?) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039;can be checked by main loop&#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
* get position of wheel (incremental counter) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE (ISR in main.c)&#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* call menue&lt;br /&gt;
* detect longer keypress / double click - needed?&lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; (70%)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| MOTOR&lt;br /&gt;
| Motor-Driver &lt;br /&gt;
* set desired valveposition  - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** quick, asympthotic, quiet - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE (speed can be chosen) &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* callibrate for Valve - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt; &lt;br /&gt;
** optimised (less motor consumption depending on desired final position) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Stop motor if not turning (blocked) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* stop calibration if valve is removed - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; WIP  &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Genereate ERROR if motor is not turning (blocked or low energy) - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color:yellow;&amp;quot; | &#039;&#039;&#039; dario &#039;&#039;&#039; &lt;br /&gt;
&#039;&#039;&#039; active &#039;&#039;&#039; &lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; (95%)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| ADC&lt;br /&gt;
| ADC-Driver (measure Temp and U_Bat)&lt;br /&gt;
* init Sensor &lt;br /&gt;
* IRQ driven (500ms)&lt;br /&gt;
* start A/D conversion (Temp and U_Bat)&lt;br /&gt;
* calc temperature in 1/100 degree Celsius&lt;br /&gt;
* calc battery voltage in mV&lt;br /&gt;
* calibration for sensor (needed?)&lt;br /&gt;
| style=&amp;quot;background-color:yellow;&amp;quot; | &#039;&#039;&#039; dario &#039;&#039;&#039; &lt;br /&gt;
&#039;&#039;&#039; active &#039;&#039;&#039; &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| PID&lt;br /&gt;
| PID Algorithm&lt;br /&gt;
* calculate desired valveposition out of&lt;br /&gt;
** last valveposition(s) &lt;br /&gt;
** last temperature(s)&lt;br /&gt;
** actual temperature&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| BOOT&lt;br /&gt;
| Bootloader&lt;br /&gt;
we need a bootloader so that the developers can flash the software &lt;br /&gt;
without a JTAG cable and without disassembling the HR20.&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| LOG&lt;br /&gt;
| Datalogger&lt;br /&gt;
* Operating Hours&lt;br /&gt;
** motor in action&lt;br /&gt;
** ODOmeter&lt;br /&gt;
** since Battery Exchange&lt;br /&gt;
* Errors&lt;br /&gt;
* Logfiles (only with additional hardware)&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UID&lt;br /&gt;
| Unique ID for identification&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= API Beschreibung =&lt;br /&gt;
Das Projekt wird mit doxygen dokumentiert, &lt;br /&gt;
die API-Beschreibung kann aus dem Source-Code generiert werden.&lt;br /&gt;
&lt;br /&gt;
= Entwicklungsumgebung =&lt;br /&gt;
* Editor, Debugger, Compiler&lt;br /&gt;
** WinAVR version (20071221), sprich GCC 4.2.2 sowie avr-libc 1.6.0&lt;br /&gt;
** AVR Studio 4 &lt;br /&gt;
* JTAG ICE&lt;br /&gt;
** Atmel AVR JTAGICE MK2 &lt;br /&gt;
** AVR Dragon (z.B. http://elmicro.com/de/atavrdragon.html)&lt;br /&gt;
** Olimex-Seriell http://www.olimex.com/dev/avr-jtag.html  &lt;br /&gt;
** Olimex-USB http://www.olimex.com/dev/avr-usb-jtag.html &lt;br /&gt;
&lt;br /&gt;
= Sonstiges =&lt;br /&gt;
== Altes Protokoll ==&lt;br /&gt;
[[HR20_Protocol_V2 | Hier ]] hat mal einer ein Protokoll eingegeben.&lt;br /&gt;
Das scheint aber nicht zu der Version 2.04 zu passen. &lt;br /&gt;
Ich habe es nicht gelöscht, falls es jemanden interessiert.&lt;br /&gt;
&lt;br /&gt;
[[Category:Projekte|!]]&lt;/div&gt;</summary>
		<author><name>Dario</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=26870</id>
		<title>Heizungssteuerung mit Honeywell HR20</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=26870"/>
		<updated>2008-03-16T10:36:25Z</updated>

		<summary type="html">&lt;p&gt;Dario: /* Entwickler */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von DarioC&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Wie alles begann =&lt;br /&gt;
&lt;br /&gt;
Nachdem von Uwe Felgentreu vor nunmehr vor über drei Jahren (genau am 17.11.2004 um 11:26) hier in diesem Forum den Thread mit dem Titel &#039;&#039;Honeywell Rondostat HR20E per AVR steuern und konfigurieren&#039;&#039; gestartet hat ist es nun langsam soweit, dass das Ganze auch ein Projekt wird. &lt;br /&gt;
&lt;br /&gt;
Den Thread dazu kann der interessierte Leser [http://www.mikrocontroller.net/topic/17603 hier nachlesen] &lt;br /&gt;
&lt;br /&gt;
= Projektziel =&lt;br /&gt;
&lt;br /&gt;
Wir konzentrieren uns in erster Linie auf den Honeywell Rondostat HR20E mit ausgelieferten Softwareversion 2.04. Dass es ähnliche andere Geräte gibt behalten wir bei der Entwicklung im Hinterkopf.&lt;br /&gt;
&lt;br /&gt;
Basierend auf dieser Hardware wollen wir eine neue Software entwickeln. &lt;br /&gt;
Dabei können wir ausser der Hardware nichts weiter verwenden, da die Originalsoftware geschützt ist und nicht ausgelesen werden kann.&lt;br /&gt;
&lt;br /&gt;
== Phase 1 ==&lt;br /&gt;
Die Software soll die Funktionen bieten, die die Originalsoftware auch bietet, später können dies dann um zusätzliche Funktionen erweitert werden. Die wichtigsten Funktionen sind:&lt;br /&gt;
&lt;br /&gt;
* Temperaturregelung&lt;br /&gt;
* Echtzeituhr&lt;br /&gt;
* Ausnutzen der Sleep Funktion&lt;br /&gt;
* Anzeige Soll-Temperatur und der Uhrzeit&lt;br /&gt;
* Einstellung der Soll-Temperatur&lt;br /&gt;
* Uhrzeitgesteuerte Einstellung der Soll-Temperatur &lt;br /&gt;
* Fenster-Offen-Erkennung&lt;br /&gt;
* Ventilfreispülungsfunktion&lt;br /&gt;
&lt;br /&gt;
== Phase 2 ==&lt;br /&gt;
&lt;br /&gt;
Hier liegt der Sinn des ganzen Projektes: Durch diese zusätzlichen Funktionen wollen wir den Nutzwert des Thermostaten erheblich steigern:&lt;br /&gt;
&lt;br /&gt;
* Programmierung der Schaltzeiten und Temperaturen über externe Schnittstelle&lt;br /&gt;
* Abfrage der Messwerte und Parameter über externe Schnittstelle&lt;br /&gt;
* Vernetzung der Thermostaten untereinander&lt;br /&gt;
* Zusätzliche externe Schnittstellen (neben UART auch CAN und Funk)&lt;br /&gt;
* Erweiterung der Anzeige um&lt;br /&gt;
** Ist-Temperatur &lt;br /&gt;
** Ventilstellung&lt;br /&gt;
** Funkschnittstelle&lt;br /&gt;
*** RFM12 http://www.hoperf.com/rf_fsk.asp&lt;br /&gt;
*** Zigbee http://www.meshnetics.com/zigbee-modules&lt;br /&gt;
** ...&lt;br /&gt;
* Bootloader, damit Leute mitarbeiten können, die keine JTAG haben. Mit einem JTAG könnte man den Bootloader Flashen, ohne den Thermostaten öffnen zu müssen. Von da an kann man über den Programmierstecker mit einem umgebauten Handykabel den Thermostaten neu flashen.&lt;br /&gt;
&lt;br /&gt;
= Lizenz =&lt;br /&gt;
Die Software wird unter GPL v2 gestellt.&lt;br /&gt;
&lt;br /&gt;
= Subversion Repository =&lt;br /&gt;
Ein SVN Repository liegt auf dem freien SVN Server: https://opensvn.csie.org&lt;br /&gt;
== Zugangsdaten ==&lt;br /&gt;
Repository Location: https://OpenSVN.csie.org/hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
Browse Repository: https://OpenSVN.csie.org/viewcvs.cgi/?root=hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
TRAC: https://opensvn.csie.org/traccgi/hr20&lt;br /&gt;
== Policy ==&lt;br /&gt;
Anonymous check out ist erlaubt. &amp;lt;br&amp;gt;&lt;br /&gt;
Wer was committen will muss freigeschaltet werden. &amp;lt;br&amp;gt;&lt;br /&gt;
Dazu brauche ich ein &#039;&#039;Usernamen, Passwort&#039;&#039; und eine &#039;&#039;Mailadresse&#039;&#039;, dann kann ich das einrichten. &amp;lt;br&amp;gt;&lt;br /&gt;
Tragt Euch dazu einfach selber in die Tabelle ein, ich erledige dann den Rest.&amp;lt;br&amp;gt;&lt;br /&gt;
Das mache ich dann von Hand und da ich nicht alle 10 Minuten Mails bearbeite kann das auch schon mal einen oder zwei Tage dauern. &amp;lt;br&amp;gt;&lt;br /&gt;
Wenn sich ein Maintainer findet, gebe ich die Zugangsdaten gerne weiter.&lt;br /&gt;
== Entwickler ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! width=&amp;quot;150&amp;quot; | Entwickler&lt;br /&gt;
! width=&amp;quot;150&amp;quot; | svn Status&lt;br /&gt;
|-&lt;br /&gt;
| darioc&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|-&lt;br /&gt;
| louk&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|-&lt;br /&gt;
| jsachs&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Verzeichnisstruktur ==&lt;br /&gt;
Eine Verzeichnisstruktur ist auch schon angelegt und die ersten Daten auch drin. Hier die Verzeichnisse:&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
| &#039;&#039;&#039;/doc&#039;&#039;&#039;&lt;br /&gt;
| Für alles an Dokumenten, die selbst erstellt wurden. &amp;lt;br&amp;gt;&lt;br /&gt;
Specs, die man im Internet bekommen kann gehören hier nicht rein, &amp;lt;br&amp;gt;&lt;br /&gt;
die machen das alles nur unnötig gross und das auschecken dauert länger.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/playground&#039;&#039;&#039; &lt;br /&gt;
| Wie der Name schon sagt, zum rumspielen und testen. &amp;lt;br&amp;gt;&lt;br /&gt;
Hier kommt jegliche art von Codeschnipseln hin, die zu Testen da sind &amp;lt;br&amp;gt;&lt;br /&gt;
und (derzeit) noch nicht Teil des Programmes sind.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/source&#039;&#039;&#039; &lt;br /&gt;
| Hier kommt die Applikation rein mit allen Modulen und makefiles.&amp;lt;br&amp;gt;&lt;br /&gt;
Bitte haltet das Repository sauber und checkt nur Dateien ein, &amp;lt;br&amp;gt;&lt;br /&gt;
die auch Sinn  machen, &amp;quot;thumbs.db&amp;quot; oder andere Temp-Dateien gehören hier nicht rein.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SVN Client und Anleitung ==&lt;br /&gt;
Windows-User nutzen am besten den Tortoise-SVN-Client, den man kostenfrei [http://tortoisesvn.tigris.org hier runterladen] kann. &amp;lt;br&amp;gt;&lt;br /&gt;
Dort gibt es auch eine Anleitung zum Arbeiten mit SVN.&lt;br /&gt;
&lt;br /&gt;
= Analyse der Hardware =&lt;br /&gt;
Die Analyse hat der Dario schon gemacht, zu finden ist die jeweils aktuelle Version &lt;br /&gt;
[http://www.carluccio.de/img/hr20/analyse.pdf als PDF hier] oder [https://opensvn.csie.org/viewcvs.cgi/doc/analyse.pdf hier im SVN].&lt;br /&gt;
&lt;br /&gt;
= Benötigte Module =&lt;br /&gt;
&lt;br /&gt;
Um das Ganze nun etwas zu koordinieren hier eine Liste der benötigten Module und deren Funktionen. &amp;lt;br&amp;gt;&lt;br /&gt;
Diese dient dazu später die Aufgaben zu verteilen:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Module&lt;br /&gt;
! Function&lt;br /&gt;
! Developer&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| LCD&lt;br /&gt;
| Display Driver:&amp;lt;BR&amp;gt;&lt;br /&gt;
* Init Display - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Set Segments - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Print HEX, DEC, TEMP, DayofWeek - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Blink - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* e.t.c&lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; DONE &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| LCD Simulation&lt;br /&gt;
| Simulation for display in AVR Studio:&amp;lt;BR&amp;gt;&lt;br /&gt;
* Defining Display - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Assign Segments to register bits - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Providing samplecode - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
| louk&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; 95% &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| RTC&lt;br /&gt;
| Time and Date Handler&lt;br /&gt;
* init timer - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* use IRQ with 32kHz crystal - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* handle time and date - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** daylight saving - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** consult leapyear  - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* calc day of week out of date - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Only one Byte for Year -&amp;gt; (2000 to 2255)&lt;br /&gt;
* Day of week timer with callback - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* Tick counter (seconds since reboot) - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; WIP &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** used to detect long keypress&lt;br /&gt;
** used to detect motor blocked&lt;br /&gt;
** used for additional timer &lt;br /&gt;
* Additional timer based on tick counter value - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* corretion for external Crystal - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* calibrate internal RC - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE, but not tested &#039;&#039;&#039;&amp;lt;/span&amp;gt; &lt;br /&gt;
| style=&amp;quot;background-color:yellow;&amp;quot; | &#039;&#039;&#039; dario &#039;&#039;&#039; &lt;br /&gt;
&#039;&#039;&#039; active &#039;&#039;&#039; &lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; (95%)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UART &lt;br /&gt;
| UART-Driver&lt;br /&gt;
* menue (Debug und Steuerung)&lt;br /&gt;
** show and set desired temperature &lt;br /&gt;
** show and set Time and Date&lt;br /&gt;
** show actual temperature&lt;br /&gt;
** show (and set) actual valveposition &lt;br /&gt;
** show and set timetable and temperatures&lt;br /&gt;
* optional &lt;br /&gt;
** adressierung of HR20 (for BUS, RF)&lt;br /&gt;
** authentication end encryption&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| CONFIG &lt;br /&gt;
| Save Config in EEPROM&lt;br /&gt;
* driver for EEPROM access&lt;br /&gt;
* save values to EEPROM &lt;br /&gt;
* load values from EEPROM &lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| MENU &lt;br /&gt;
| Control Menu State Machine&lt;br /&gt;
* show values on display&lt;br /&gt;
* functionality:&lt;br /&gt;
** show and set desired temperature&lt;br /&gt;
** show and set time and date &lt;br /&gt;
** show actual temperature&lt;br /&gt;
** show actual valveposition &lt;br /&gt;
** show and set timetable and temperatures&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| MAIN&lt;br /&gt;
| Main Loop&lt;br /&gt;
* init everything&lt;br /&gt;
** global vars - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** rtc - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** lcd - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** motor - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** tempsensor &lt;br /&gt;
* get keystate - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE (ISR in main.c)&#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** debounce - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039;not needed&#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** multi keypress (needed for hidden menue?) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039;can be checked by main loop&#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
* get position of wheel (incremental counter) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE (ISR in main.c)&#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* call menue&lt;br /&gt;
* detect longer keypress / double click - needed?&lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; (70%)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| MOTOR&lt;br /&gt;
| Motor-Driver &lt;br /&gt;
* set desired valveposition  - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** quick, asympthotic, quiet - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE (speed can be chosen) &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* callibrate for Valve - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt; &lt;br /&gt;
** optimised (less motor consumption depending on desired final position) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Stop motor if not turning (blocked) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* stop calibration if valve is removed - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; WIP  &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Genereate ERROR if motor is not turning (blocked or low energy) - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color:yellow;&amp;quot; | &#039;&#039;&#039; dario &#039;&#039;&#039; &lt;br /&gt;
&#039;&#039;&#039; active &#039;&#039;&#039; &lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; (95%)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| ADC&lt;br /&gt;
| ADC-Driver (measure Temp and U_Bat)&lt;br /&gt;
* init Sensor &lt;br /&gt;
* IRQ driven (500ms)&lt;br /&gt;
* start A/D conversion (Temp and U_Bat)&lt;br /&gt;
* calc temperature in 1/100 degree Celsius&lt;br /&gt;
* calc battery voltage in mV&lt;br /&gt;
* calibration for sensor (needed?)&lt;br /&gt;
| style=&amp;quot;background-color:yellow;&amp;quot; | &#039;&#039;&#039; dario &#039;&#039;&#039; &lt;br /&gt;
&#039;&#039;&#039; active &#039;&#039;&#039; &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| PID&lt;br /&gt;
| PID Algorithm&lt;br /&gt;
* calculate desired valveposition out of&lt;br /&gt;
** last valveposition(s) &lt;br /&gt;
** last temperature(s)&lt;br /&gt;
** actual temperature&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| BOOT&lt;br /&gt;
| Bootloader&lt;br /&gt;
we need a bootloader so that the developers can flash the software &lt;br /&gt;
without a JTAG cable and without disassembling the HR20.&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| LOG&lt;br /&gt;
| Datalogger&lt;br /&gt;
* Operating Hours&lt;br /&gt;
** motor in action&lt;br /&gt;
** ODOmeter&lt;br /&gt;
** since Battery Exchange&lt;br /&gt;
* Errors&lt;br /&gt;
* Logfiles (only with additional hardware)&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UID&lt;br /&gt;
| Unique ID for identification&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= API Beschreibung =&lt;br /&gt;
Das Projekt wird mit doxygen dokumentiert, &lt;br /&gt;
die API-Beschreibung kann aus dem Source-Code generiert werden.&lt;br /&gt;
&lt;br /&gt;
= Entwicklungsumgebung =&lt;br /&gt;
* Editor, Debugger, Compiler&lt;br /&gt;
** WinAVR version (20071221), sprich GCC 4.2.2 sowie avr-libc 1.6.0&lt;br /&gt;
** AVR Studio 4 &lt;br /&gt;
* JTAG ICE&lt;br /&gt;
** Atmel AVR JTAGICE MK2 &lt;br /&gt;
** AVR Dragon (z.B. http://elmicro.com/de/atavrdragon.html)&lt;br /&gt;
** Olimex-Seriell http://www.olimex.com/dev/avr-jtag.html  &lt;br /&gt;
** Olimex-USB http://www.olimex.com/dev/avr-usb-jtag.html &lt;br /&gt;
&lt;br /&gt;
= Sonstiges =&lt;br /&gt;
== Altes Protokoll ==&lt;br /&gt;
[[HR20_Protocol_V2 | Hier ]] hat mal einer ein Protokoll eingegeben.&lt;br /&gt;
Das scheint aber nicht zu der Version 2.04 zu passen. &lt;br /&gt;
Ich habe es nicht gelöscht, falls es jemanden interessiert.&lt;br /&gt;
&lt;br /&gt;
[[Category:Projekte|!]]&lt;/div&gt;</summary>
		<author><name>Dario</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=26867</id>
		<title>Heizungssteuerung mit Honeywell HR20</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=26867"/>
		<updated>2008-03-15T19:31:09Z</updated>

		<summary type="html">&lt;p&gt;Dario: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von DarioC&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Wie alles begann =&lt;br /&gt;
&lt;br /&gt;
Nachdem von Uwe Felgentreu vor nunmehr vor über drei Jahren (genau am 17.11.2004 um 11:26) hier in diesem Forum den Thread mit dem Titel &#039;&#039;Honeywell Rondostat HR20E per AVR steuern und konfigurieren&#039;&#039; gestartet hat ist es nun langsam soweit, dass das Ganze auch ein Projekt wird. &lt;br /&gt;
&lt;br /&gt;
Den Thread dazu kann der interessierte Leser [http://www.mikrocontroller.net/topic/17603 hier nachlesen] &lt;br /&gt;
&lt;br /&gt;
= Projektziel =&lt;br /&gt;
&lt;br /&gt;
Wir konzentrieren uns in erster Linie auf den Honeywell Rondostat HR20E mit ausgelieferten Softwareversion 2.04. Dass es ähnliche andere Geräte gibt behalten wir bei der Entwicklung im Hinterkopf.&lt;br /&gt;
&lt;br /&gt;
Basierend auf dieser Hardware wollen wir eine neue Software entwickeln. &lt;br /&gt;
Dabei können wir ausser der Hardware nichts weiter verwenden, da die Originalsoftware geschützt ist und nicht ausgelesen werden kann.&lt;br /&gt;
&lt;br /&gt;
== Phase 1 ==&lt;br /&gt;
Die Software soll die Funktionen bieten, die die Originalsoftware auch bietet, später können dies dann um zusätzliche Funktionen erweitert werden. Die wichtigsten Funktionen sind:&lt;br /&gt;
&lt;br /&gt;
* Temperaturregelung&lt;br /&gt;
* Echtzeituhr&lt;br /&gt;
* Ausnutzen der Sleep Funktion&lt;br /&gt;
* Anzeige Soll-Temperatur und der Uhrzeit&lt;br /&gt;
* Einstellung der Soll-Temperatur&lt;br /&gt;
* Uhrzeitgesteuerte Einstellung der Soll-Temperatur &lt;br /&gt;
* Fenster-Offen-Erkennung&lt;br /&gt;
* Ventilfreispülungsfunktion&lt;br /&gt;
&lt;br /&gt;
== Phase 2 ==&lt;br /&gt;
&lt;br /&gt;
Hier liegt der Sinn des ganzen Projektes: Durch diese zusätzlichen Funktionen wollen wir den Nutzwert des Thermostaten erheblich steigern:&lt;br /&gt;
&lt;br /&gt;
* Programmierung der Schaltzeiten und Temperaturen über externe Schnittstelle&lt;br /&gt;
* Abfrage der Messwerte und Parameter über externe Schnittstelle&lt;br /&gt;
* Vernetzung der Thermostaten untereinander&lt;br /&gt;
* Zusätzliche externe Schnittstellen (neben UART auch CAN und Funk)&lt;br /&gt;
* Erweiterung der Anzeige um&lt;br /&gt;
** Ist-Temperatur &lt;br /&gt;
** Ventilstellung&lt;br /&gt;
** Funkschnittstelle&lt;br /&gt;
*** RFM12 http://www.hoperf.com/rf_fsk.asp&lt;br /&gt;
*** Zigbee http://www.meshnetics.com/zigbee-modules&lt;br /&gt;
** ...&lt;br /&gt;
* Bootloader, damit Leute mitarbeiten können, die keine JTAG haben. Mit einem JTAG könnte man den Bootloader Flashen, ohne den Thermostaten öffnen zu müssen. Von da an kann man über den Programmierstecker mit einem umgebauten Handykabel den Thermostaten neu flashen.&lt;br /&gt;
&lt;br /&gt;
= Lizenz =&lt;br /&gt;
Die Software wird unter GPL v2 gestellt.&lt;br /&gt;
&lt;br /&gt;
= Subversion Repository =&lt;br /&gt;
Ein SVN Repository liegt auf dem freien SVN Server: https://opensvn.csie.org&lt;br /&gt;
== Zugangsdaten ==&lt;br /&gt;
Repository Location: https://OpenSVN.csie.org/hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
Browse Repository: https://OpenSVN.csie.org/viewcvs.cgi/?root=hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
TRAC: https://opensvn.csie.org/traccgi/hr20&lt;br /&gt;
== Policy ==&lt;br /&gt;
Anonymous check out ist erlaubt. &amp;lt;br&amp;gt;&lt;br /&gt;
Wer was committen will muss freigeschaltet werden. &amp;lt;br&amp;gt;&lt;br /&gt;
Dazu brauche ich ein &#039;&#039;Usernamen, Passwort&#039;&#039; und eine &#039;&#039;Mailadresse&#039;&#039;, dann kann ich das einrichten. &amp;lt;br&amp;gt;&lt;br /&gt;
Tragt Euch dazu einfach selber in die Tabelle ein, ich erledige dann den Rest.&amp;lt;br&amp;gt;&lt;br /&gt;
Das mache ich dann von Hand und da ich nicht alle 10 Minuten Mails bearbeite kann das auch schon mal einen oder zwei Tage dauern. &amp;lt;br&amp;gt;&lt;br /&gt;
Wenn sich ein Maintainer findet, gebe ich die Zugangsdaten gerne weiter.&lt;br /&gt;
== Entwickler ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! width=&amp;quot;150&amp;quot; | Entwickler&lt;br /&gt;
! width=&amp;quot;150&amp;quot; | svn Status&lt;br /&gt;
|-&lt;br /&gt;
| darioc&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|-&lt;br /&gt;
| louk&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|}&lt;br /&gt;
== Verzeichnisstruktur ==&lt;br /&gt;
Eine Verzeichnisstruktur ist auch schon angelegt und die ersten Daten auch drin. Hier die Verzeichnisse:&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
| &#039;&#039;&#039;/doc&#039;&#039;&#039;&lt;br /&gt;
| Für alles an Dokumenten, die selbst erstellt wurden. &amp;lt;br&amp;gt;&lt;br /&gt;
Specs, die man im Internet bekommen kann gehören hier nicht rein, &amp;lt;br&amp;gt;&lt;br /&gt;
die machen das alles nur unnötig gross und das auschecken dauert länger.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/playground&#039;&#039;&#039; &lt;br /&gt;
| Wie der Name schon sagt, zum rumspielen und testen. &amp;lt;br&amp;gt;&lt;br /&gt;
Hier kommt jegliche art von Codeschnipseln hin, die zu Testen da sind &amp;lt;br&amp;gt;&lt;br /&gt;
und (derzeit) noch nicht Teil des Programmes sind.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/source&#039;&#039;&#039; &lt;br /&gt;
| Hier kommt die Applikation rein mit allen Modulen und makefiles.&amp;lt;br&amp;gt;&lt;br /&gt;
Bitte haltet das Repository sauber und checkt nur Dateien ein, &amp;lt;br&amp;gt;&lt;br /&gt;
die auch Sinn  machen, &amp;quot;thumbs.db&amp;quot; oder andere Temp-Dateien gehören hier nicht rein.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SVN Client und Anleitung ==&lt;br /&gt;
Windows-User nutzen am besten den Tortoise-SVN-Client, den man kostenfrei [http://tortoisesvn.tigris.org hier runterladen] kann. &amp;lt;br&amp;gt;&lt;br /&gt;
Dort gibt es auch eine Anleitung zum Arbeiten mit SVN.&lt;br /&gt;
&lt;br /&gt;
= Analyse der Hardware =&lt;br /&gt;
Die Analyse hat der Dario schon gemacht, zu finden ist die jeweils aktuelle Version &lt;br /&gt;
[http://www.carluccio.de/img/hr20/analyse.pdf als PDF hier] oder [https://opensvn.csie.org/viewcvs.cgi/doc/analyse.pdf hier im SVN].&lt;br /&gt;
&lt;br /&gt;
= Benötigte Module =&lt;br /&gt;
&lt;br /&gt;
Um das Ganze nun etwas zu koordinieren hier eine Liste der benötigten Module und deren Funktionen. &amp;lt;br&amp;gt;&lt;br /&gt;
Diese dient dazu später die Aufgaben zu verteilen:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Module&lt;br /&gt;
! Function&lt;br /&gt;
! Developer&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| LCD&lt;br /&gt;
| Display Driver:&amp;lt;BR&amp;gt;&lt;br /&gt;
* Init Display - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Set Segments - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Print HEX, DEC, TEMP, DayofWeek - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Blink - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* e.t.c&lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; DONE &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| LCD Simulation&lt;br /&gt;
| Simulation for display in AVR Studio:&amp;lt;BR&amp;gt;&lt;br /&gt;
* Defining Display - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Assign Segments to register bits - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Providing samplecode - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
| louk&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; 95% &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| RTC&lt;br /&gt;
| Time and Date Handler&lt;br /&gt;
* init timer - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* use IRQ with 32kHz crystal - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* handle time and date - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** daylight saving - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** consult leapyear  - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* calc day of week out of date - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Only one Byte for Year -&amp;gt; (2000 to 2255)&lt;br /&gt;
* Day of week timer with callback - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* Tick counter (seconds since reboot) - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; WIP &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** used to detect long keypress&lt;br /&gt;
** used to detect motor blocked&lt;br /&gt;
** used for additional timer &lt;br /&gt;
* Additional timer based on tick counter value - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* corretion for external Crystal - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* calibrate internal RC - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE, but not tested &#039;&#039;&#039;&amp;lt;/span&amp;gt; &lt;br /&gt;
| style=&amp;quot;background-color:yellow;&amp;quot; | &#039;&#039;&#039; dario &#039;&#039;&#039; &lt;br /&gt;
&#039;&#039;&#039; active &#039;&#039;&#039; &lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; (95%)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UART &lt;br /&gt;
| UART-Driver&lt;br /&gt;
* menue (Debug und Steuerung)&lt;br /&gt;
** show and set desired temperature &lt;br /&gt;
** show and set Time and Date&lt;br /&gt;
** show actual temperature&lt;br /&gt;
** show (and set) actual valveposition &lt;br /&gt;
** show and set timetable and temperatures&lt;br /&gt;
* optional &lt;br /&gt;
** adressierung of HR20 (for BUS, RF)&lt;br /&gt;
** authentication end encryption&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| CONFIG &lt;br /&gt;
| Save Config in EEPROM&lt;br /&gt;
* driver for EEPROM access&lt;br /&gt;
* save values to EEPROM &lt;br /&gt;
* load values from EEPROM &lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| MENU &lt;br /&gt;
| Control Menu State Machine&lt;br /&gt;
* show values on display&lt;br /&gt;
* functionality:&lt;br /&gt;
** show and set desired temperature&lt;br /&gt;
** show and set time and date &lt;br /&gt;
** show actual temperature&lt;br /&gt;
** show actual valveposition &lt;br /&gt;
** show and set timetable and temperatures&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| MAIN&lt;br /&gt;
| Main Loop&lt;br /&gt;
* init everything&lt;br /&gt;
** global vars - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** rtc - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** lcd - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** motor - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** tempsensor &lt;br /&gt;
* get keystate - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE (ISR in main.c)&#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** debounce - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039;not needed&#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** multi keypress (needed for hidden menue?) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039;can be checked by main loop&#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
* get position of wheel (incremental counter) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE (ISR in main.c)&#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* call menue&lt;br /&gt;
* detect longer keypress / double click - needed?&lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; (70%)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| MOTOR&lt;br /&gt;
| Motor-Driver &lt;br /&gt;
* set desired valveposition  - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** quick, asympthotic, quiet - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE (speed can be chosen) &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* callibrate for Valve - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt; &lt;br /&gt;
** optimised (less motor consumption depending on desired final position) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Stop motor if not turning (blocked) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* stop calibration if valve is removed - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; WIP  &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Genereate ERROR if motor is not turning (blocked or low energy) - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color:yellow;&amp;quot; | &#039;&#039;&#039; dario &#039;&#039;&#039; &lt;br /&gt;
&#039;&#039;&#039; active &#039;&#039;&#039; &lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; (95%)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| ADC&lt;br /&gt;
| ADC-Driver (measure Temp and U_Bat)&lt;br /&gt;
* init Sensor &lt;br /&gt;
* IRQ driven (500ms)&lt;br /&gt;
* start A/D conversion (Temp and U_Bat)&lt;br /&gt;
* calc temperature in 1/100 degree Celsius&lt;br /&gt;
* calc battery voltage in mV&lt;br /&gt;
* calibration for sensor (needed?)&lt;br /&gt;
| style=&amp;quot;background-color:yellow;&amp;quot; | &#039;&#039;&#039; dario &#039;&#039;&#039; &lt;br /&gt;
&#039;&#039;&#039; active &#039;&#039;&#039; &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| PID&lt;br /&gt;
| PID Algorithm&lt;br /&gt;
* calculate desired valveposition out of&lt;br /&gt;
** last valveposition(s) &lt;br /&gt;
** last temperature(s)&lt;br /&gt;
** actual temperature&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| BOOT&lt;br /&gt;
| Bootloader&lt;br /&gt;
we need a bootloader so that the developers can flash the software &lt;br /&gt;
without a JTAG cable and without disassembling the HR20.&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| LOG&lt;br /&gt;
| Datalogger&lt;br /&gt;
* Operating Hours&lt;br /&gt;
** motor in action&lt;br /&gt;
** ODOmeter&lt;br /&gt;
** since Battery Exchange&lt;br /&gt;
* Errors&lt;br /&gt;
* Logfiles (only with additional hardware)&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UID&lt;br /&gt;
| Unique ID for identification&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= API Beschreibung =&lt;br /&gt;
Das Projekt wird mit doxygen dokumentiert, &lt;br /&gt;
die API-Beschreibung kann aus dem Source-Code generiert werden.&lt;br /&gt;
&lt;br /&gt;
= Entwicklungsumgebung =&lt;br /&gt;
* Editor, Debugger, Compiler&lt;br /&gt;
** WinAVR version (20071221), sprich GCC 4.2.2 sowie avr-libc 1.6.0&lt;br /&gt;
** AVR Studio 4 &lt;br /&gt;
* JTAG ICE&lt;br /&gt;
** Atmel AVR JTAGICE MK2 &lt;br /&gt;
** AVR Dragon (z.B. http://elmicro.com/de/atavrdragon.html)&lt;br /&gt;
** Olimex-Seriell http://www.olimex.com/dev/avr-jtag.html  &lt;br /&gt;
** Olimex-USB http://www.olimex.com/dev/avr-usb-jtag.html &lt;br /&gt;
&lt;br /&gt;
= Sonstiges =&lt;br /&gt;
== Altes Protokoll ==&lt;br /&gt;
[[HR20_Protocol_V2 | Hier ]] hat mal einer ein Protokoll eingegeben.&lt;br /&gt;
Das scheint aber nicht zu der Version 2.04 zu passen. &lt;br /&gt;
Ich habe es nicht gelöscht, falls es jemanden interessiert.&lt;br /&gt;
&lt;br /&gt;
[[Category:Projekte|!]]&lt;/div&gt;</summary>
		<author><name>Dario</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=26576</id>
		<title>Heizungssteuerung mit Honeywell HR20</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=26576"/>
		<updated>2008-03-01T00:04:20Z</updated>

		<summary type="html">&lt;p&gt;Dario: /* API Beschreibung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von DarioC&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Wie alles begann =&lt;br /&gt;
&lt;br /&gt;
Nachdem von Uwe Felgentreu vor nunmehr vor über drei Jahren (genau am 17.11.2004 um 11:26) hier in diesem Forum den Thread mit dem Titel &#039;&#039;Honeywell Rondostat HR20E per AVR steuern und konfigurieren&#039;&#039; gestartet hat ist es nun langsam soweit, dass das Ganze auch ein Projekt wird. &lt;br /&gt;
&lt;br /&gt;
Den Thread dazu kann der interessierte Leser [http://www.mikrocontroller.net/topic/17603 hier nachlesen] &lt;br /&gt;
&lt;br /&gt;
= Projektziel =&lt;br /&gt;
&lt;br /&gt;
Wir konzentrieren uns in erster Linie auf den Honeywell Rondostat HR20E mit ausgelieferten Softwareversion 2.04. Dass es ähnliche andere Geräte gibt behalten wir bei der Entwicklung im Hinterkopf.&lt;br /&gt;
&lt;br /&gt;
Basierend auf dieser Hardware wollen wir eine neue Software entwickeln. &lt;br /&gt;
Dabei können wir ausser der Hardware nichts weiter verwenden, da die Originalsoftware geschützt ist und nicht ausgelesen werden kann.&lt;br /&gt;
&lt;br /&gt;
== Phase 1 ==&lt;br /&gt;
Die Software soll die Funktionen bieten, die die Originalsoftware auch bietet, später können dies dann um zusätzliche Funktionen erweitert werden. Die wichtigsten Funktionen sind:&lt;br /&gt;
&lt;br /&gt;
* Temperaturregelung&lt;br /&gt;
* Echtzeituhr&lt;br /&gt;
* Ausnutzen der Sleep Funktion&lt;br /&gt;
* Anzeige Soll-Temperatur und der Uhrzeit&lt;br /&gt;
* Einstellung der Soll-Temperatur&lt;br /&gt;
* Uhrzeitgesteuerte Einstellung der Soll-Temperatur &lt;br /&gt;
* Fenster-Offen-Erkennung&lt;br /&gt;
* Ventilfreispülungsfunktion&lt;br /&gt;
&lt;br /&gt;
== Phase 2 ==&lt;br /&gt;
&lt;br /&gt;
Hier liegt der Sinn des ganzen Projektes: Durch diese zusätzlichen Funktionen wollen wir den Nutzwert des Thermostaten erheblich steigern:&lt;br /&gt;
&lt;br /&gt;
* Programmierung der Schaltzeiten und Temperaturen über externe Schnittstelle&lt;br /&gt;
* Abfrage der Messwerte und Parameter über externe Schnittstelle&lt;br /&gt;
* Vernetzung der Thermostaten untereinander&lt;br /&gt;
* Zusätzliche externe Schnittstellen (neben UART auch CAN und Funk)&lt;br /&gt;
* Erweiterung der Anzeige um&lt;br /&gt;
** Ist-Temperatur &lt;br /&gt;
** Ventilstellung&lt;br /&gt;
** Funkschnittstelle&lt;br /&gt;
*** RFM12 http://www.hoperf.com/rf_fsk.asp&lt;br /&gt;
*** Zigbee http://www.meshnetics.com/zigbee-modules&lt;br /&gt;
** ...&lt;br /&gt;
* Bootloader, damit Leute mitarbeiten können, die keine JTAG haben. Mit einem JTAG könnte man den Bootloader Flashen, ohne den Thermostaten öffnen zu müssen. Von da an kann man über den Programmierstecker mit einem umgebauten Handykabel den Thermostaten neu flashen.&lt;br /&gt;
&lt;br /&gt;
= Lizenz =&lt;br /&gt;
Die Software wird unter GPL v2 gestellt.&lt;br /&gt;
&lt;br /&gt;
= Subversion Repository =&lt;br /&gt;
Ein SVN Repository liegt auf dem freien SVN Server: https://opensvn.csie.org&lt;br /&gt;
== Zugangsdaten ==&lt;br /&gt;
Repository Location: https://OpenSVN.csie.org/hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
Browse Repository: https://OpenSVN.csie.org/viewcvs.cgi/?root=hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
TRAC: https://opensvn.csie.org/traccgi/hr20&lt;br /&gt;
== Policy ==&lt;br /&gt;
Anonymous check out ist erlaubt. &amp;lt;br&amp;gt;&lt;br /&gt;
Wer was committen will muss freigeschaltet werden. &amp;lt;br&amp;gt;&lt;br /&gt;
Dazu brauche ich ein &#039;&#039;Usernamen, Passwort&#039;&#039; und eine &#039;&#039;Mailadresse&#039;&#039;, dann kann ich das einrichten. &amp;lt;br&amp;gt;&lt;br /&gt;
Tragt Euch dazu einfach selber in die Tabelle ein, ich erledige dann den Rest.&amp;lt;br&amp;gt;&lt;br /&gt;
Das mache ich dann von Hand und da ich nicht alle 10 Minuten Mails bearbeite kann das auch schon mal einen oder zwei Tage dauern. &amp;lt;br&amp;gt;&lt;br /&gt;
Wenn sich ein Maintainer findet, gebe ich die Zugangsdaten gerne weiter.&lt;br /&gt;
== Entwickler ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! width=&amp;quot;150&amp;quot; | Entwickler&lt;br /&gt;
! width=&amp;quot;150&amp;quot; | svn Status&lt;br /&gt;
|-&lt;br /&gt;
| darioc&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|-&lt;br /&gt;
| louk&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|}&lt;br /&gt;
== Verzeichnisstruktur ==&lt;br /&gt;
Eine Verzeichnisstruktur ist auch schon angelegt und die ersten Daten auch drin. Hier die Verzeichnisse:&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
| &#039;&#039;&#039;/doc&#039;&#039;&#039;&lt;br /&gt;
| Für alles an Dokumenten, die selbst erstellt wurden. &amp;lt;br&amp;gt;&lt;br /&gt;
Specs, die man im Internet bekommen kann gehören hier nicht rein, &amp;lt;br&amp;gt;&lt;br /&gt;
die machen das alles nur unnötig gross und das auschecken dauert länger.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/playground&#039;&#039;&#039; &lt;br /&gt;
| Wie der Name schon sagt, zum rumspielen und testen. &amp;lt;br&amp;gt;&lt;br /&gt;
Hier kommt jegliche art von Codeschnipseln hin, die zu Testen da sind &amp;lt;br&amp;gt;&lt;br /&gt;
und (derzeit) noch nicht Teil des Programmes sind.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/source&#039;&#039;&#039; &lt;br /&gt;
| Hier kommt die Applikation rein mit allen Modulen und makefiles.&amp;lt;br&amp;gt;&lt;br /&gt;
Bitte haltet das Repository sauber und checkt nur Dateien ein, &amp;lt;br&amp;gt;&lt;br /&gt;
die auch Sinn  machen, &amp;quot;thumbs.db&amp;quot; oder andere Temp-Dateien gehören hier nicht rein.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SVN Client und Anleitung ==&lt;br /&gt;
Windows-User nutzen am besten den Tortoise-SVN-Client, den man kostenfrei [http://tortoisesvn.tigris.org hier runterladen] kann. &amp;lt;br&amp;gt;&lt;br /&gt;
Dort gibt es auch eine Anleitung zum Arbeiten mit SVN.&lt;br /&gt;
&lt;br /&gt;
= Analyse der Hardware =&lt;br /&gt;
Die Analyse hat der Dario schon gemacht, zu finden ist die jeweils aktuelle Version &lt;br /&gt;
[http://www.carluccio.de/img/hr20/analyse.pdf als PDF hier] oder [https://opensvn.csie.org/viewcvs.cgi/doc/analyse.pdf hier im SVN].&lt;br /&gt;
&lt;br /&gt;
= Benötigte Module =&lt;br /&gt;
&lt;br /&gt;
Um das Ganze nun etwas zu koordinieren hier eine Liste der benötigten Module und deren Funktionen. &amp;lt;br&amp;gt;&lt;br /&gt;
Diese dient dazu später die Aufgaben zu verteilen:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Module&lt;br /&gt;
! Function&lt;br /&gt;
! Developer&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| LCD&lt;br /&gt;
| Display Driver:&amp;lt;BR&amp;gt;&lt;br /&gt;
* Init Display - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Set Segments - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Print HEX, DEC, TEMP, DayofWeek - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Blink - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* e.t.c&lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; DONE &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| LCD Simulation&lt;br /&gt;
| Simulation for display in AVR Studio:&amp;lt;BR&amp;gt;&lt;br /&gt;
* Defining Display - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Assign Segments to register bits - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Providing samplecode - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
| louk&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; 95% &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| RTC&lt;br /&gt;
| Time and Date Handler&lt;br /&gt;
* init timer - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* use IRQ with 32kHz crystal - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* handle time and date - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** daylight saving - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** consult leapyear  - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* calc day of week out of date - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Only one Byte for Year -&amp;gt; (2000 to 2255)&lt;br /&gt;
* Day of week timer with callback - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* Tick counter (seconds since reboot) - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; WIP &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** used to detect long keypress&lt;br /&gt;
** used to detect motor blocked&lt;br /&gt;
** used for additional timer &lt;br /&gt;
* Additional timer based on tick counter value - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* corretion for external Crystal - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* calibrate internal RC - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE, but not tested &#039;&#039;&#039;&amp;lt;/span&amp;gt; &lt;br /&gt;
| style=&amp;quot;background-color:yellow;&amp;quot; | &#039;&#039;&#039; dario &#039;&#039;&#039; &lt;br /&gt;
&#039;&#039;&#039; active &#039;&#039;&#039; &lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; (95%)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UART &lt;br /&gt;
| UART-Driver&lt;br /&gt;
* menue (Debug und Steuerung)&lt;br /&gt;
** show and set desired temperature &lt;br /&gt;
** show and set Time and Date&lt;br /&gt;
** show actual temperature&lt;br /&gt;
** show (and set) actual valveposition &lt;br /&gt;
** show and set timetable and temperatures&lt;br /&gt;
* optional &lt;br /&gt;
** adressierung of HR20 (for BUS, RF)&lt;br /&gt;
** authentication end encryption&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| CONFIG &lt;br /&gt;
| Save Config in EEPROM&lt;br /&gt;
* driver for EEPROM access&lt;br /&gt;
* save values to EEPROM &lt;br /&gt;
* load values from EEPROM &lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| MENU &lt;br /&gt;
| Control Menu State Machine&lt;br /&gt;
* show values on display&lt;br /&gt;
* functionality:&lt;br /&gt;
** show and set desired temperature&lt;br /&gt;
** show and set time and date &lt;br /&gt;
** show actual temperature&lt;br /&gt;
** show actual valveposition &lt;br /&gt;
** show and set timetable and temperatures&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| MAIN&lt;br /&gt;
| Main Loop&lt;br /&gt;
* init everything&lt;br /&gt;
** global vars - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** rtc - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** lcd - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** motor - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** tempsensor &lt;br /&gt;
* get keystate - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE (ISR in main.c)&#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** debounce - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039;not needed&#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** multi keypress (needed for hidden menue?) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039;can be checked by main loop&#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
* get position of wheel (incremental counter) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE (ISR in main.c)&#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* call menue&lt;br /&gt;
* detect longer keypress / double click - needed?&lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; (70%)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| MOTOR&lt;br /&gt;
| Motor-Driver &lt;br /&gt;
* set desired valveposition  - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** quick, asympthotic, quiet - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE (speed can be chosen) &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* callibrate for Valve - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt; &lt;br /&gt;
** optimised (less motor consumption depending on desired final position) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Stop motor if not turning (blocked) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* stop calibration if valve is removed - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; WIP  &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Genereate ERROR if motor is not turning (blocked or low energy) - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color:yellow;&amp;quot; | &#039;&#039;&#039; dario &#039;&#039;&#039; &lt;br /&gt;
&#039;&#039;&#039; active &#039;&#039;&#039; &lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; (95%)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| TEMP&lt;br /&gt;
| Temperaturesensor-Driver &lt;br /&gt;
* init Sensor &lt;br /&gt;
* IRQ driven (500ms)&lt;br /&gt;
* start A/D conversion (IQR driven)&lt;br /&gt;
* get A/D Value and calc temperature&lt;br /&gt;
* calibration for sensor (needed?)&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| PID&lt;br /&gt;
| PID Algorithm&lt;br /&gt;
* calculate desired valveposition out of&lt;br /&gt;
** last valveposition(s) &lt;br /&gt;
** last temperature(s)&lt;br /&gt;
** actual temperature&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| BOOT&lt;br /&gt;
| Bootloader&lt;br /&gt;
we need a bootloader so that the developers can flash the software &lt;br /&gt;
without a JTAG cable and without disassembling the HR20.&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| LOG&lt;br /&gt;
| Datalogger&lt;br /&gt;
* Operating Hours&lt;br /&gt;
** motor in action&lt;br /&gt;
** ODOmeter&lt;br /&gt;
** since Battery Exchange&lt;br /&gt;
* Errors&lt;br /&gt;
* Logfiles (only with additional hardware)&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UID&lt;br /&gt;
| Unique ID for identification&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= API Beschreibung =&lt;br /&gt;
Das Projekt wird mit doxygen dokumentiert, &lt;br /&gt;
die API-Beschreibung kann aus dem Source-Code generiert werden.&lt;br /&gt;
&lt;br /&gt;
= Entwicklungsumgebung =&lt;br /&gt;
* Editor, Debugger, Compiler&lt;br /&gt;
** WinAVR version (20071221), sprich GCC 4.2.2 sowie avr-libc 1.6.0&lt;br /&gt;
** AVR Studio 4 &lt;br /&gt;
* JTAG ICE&lt;br /&gt;
** Atmel AVR JTAGICE MK2 &lt;br /&gt;
** AVR Dragon (z.B. http://elmicro.com/de/atavrdragon.html)&lt;br /&gt;
** Olimex-Seriell http://www.olimex.com/dev/avr-jtag.html  &lt;br /&gt;
** Olimex-USB http://www.olimex.com/dev/avr-usb-jtag.html &lt;br /&gt;
&lt;br /&gt;
= Sonstiges =&lt;br /&gt;
== Altes Protokoll ==&lt;br /&gt;
[[HR20_Protocol_V2 | Hier ]] hat mal einer ein Protokoll eingegeben.&lt;br /&gt;
Das scheint aber nicht zu der Version 2.04 zu passen. &lt;br /&gt;
Ich habe es nicht gelöscht, falls es jemanden interessiert.&lt;br /&gt;
&lt;br /&gt;
[[Category:Projekte|!]]&lt;/div&gt;</summary>
		<author><name>Dario</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=26543</id>
		<title>Heizungssteuerung mit Honeywell HR20</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=26543"/>
		<updated>2008-02-27T10:06:11Z</updated>

		<summary type="html">&lt;p&gt;Dario: /* Benötigte Module */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von DarioC&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Wie alles begann =&lt;br /&gt;
&lt;br /&gt;
Nachdem von Uwe Felgentreu vor nunmehr vor über drei Jahren (genau am 17.11.2004 um 11:26) hier in diesem Forum den Thread mit dem Titel &#039;&#039;Honeywell Rondostat HR20E per AVR steuern und konfigurieren&#039;&#039; gestartet hat ist es nun langsam soweit, dass das Ganze auch ein Projekt wird. &lt;br /&gt;
&lt;br /&gt;
Den Thread dazu kann der interessierte Leser [http://www.mikrocontroller.net/topic/17603 hier nachlesen] &lt;br /&gt;
&lt;br /&gt;
= Projektziel =&lt;br /&gt;
&lt;br /&gt;
Wir konzentrieren uns in erster Linie auf den Honeywell Rondostat HR20E mit ausgelieferten Softwareversion 2.04. Dass es ähnliche andere Geräte gibt behalten wir bei der Entwicklung im Hinterkopf.&lt;br /&gt;
&lt;br /&gt;
Basierend auf dieser Hardware wollen wir eine neue Software entwickeln. &lt;br /&gt;
Dabei können wir ausser der Hardware nichts weiter verwenden, da die Originalsoftware geschützt ist und nicht ausgelesen werden kann.&lt;br /&gt;
&lt;br /&gt;
== Phase 1 ==&lt;br /&gt;
Die Software soll die Funktionen bieten, die die Originalsoftware auch bietet, später können dies dann um zusätzliche Funktionen erweitert werden. Die wichtigsten Funktionen sind:&lt;br /&gt;
&lt;br /&gt;
* Temperaturregelung&lt;br /&gt;
* Echtzeituhr&lt;br /&gt;
* Ausnutzen der Sleep Funktion&lt;br /&gt;
* Anzeige Soll-Temperatur und der Uhrzeit&lt;br /&gt;
* Einstellung der Soll-Temperatur&lt;br /&gt;
* Uhrzeitgesteuerte Einstellung der Soll-Temperatur &lt;br /&gt;
* Fenster-Offen-Erkennung&lt;br /&gt;
* Ventilfreispülungsfunktion&lt;br /&gt;
&lt;br /&gt;
== Phase 2 ==&lt;br /&gt;
&lt;br /&gt;
Hier liegt der Sinn des ganzen Projektes: Durch diese zusätzlichen Funktionen wollen wir den Nutzwert des Thermostaten erheblich steigern:&lt;br /&gt;
&lt;br /&gt;
* Programmierung der Schaltzeiten und Temperaturen über externe Schnittstelle&lt;br /&gt;
* Abfrage der Messwerte und Parameter über externe Schnittstelle&lt;br /&gt;
* Vernetzung der Thermostaten untereinander&lt;br /&gt;
* Zusätzliche externe Schnittstellen (neben UART auch CAN und Funk)&lt;br /&gt;
* Erweiterung der Anzeige um&lt;br /&gt;
** Ist-Temperatur &lt;br /&gt;
** Ventilstellung&lt;br /&gt;
** Funkschnittstelle&lt;br /&gt;
*** RFM12 http://www.hoperf.com/rf_fsk.asp&lt;br /&gt;
*** Zigbee http://www.meshnetics.com/zigbee-modules&lt;br /&gt;
** ...&lt;br /&gt;
* Bootloader, damit Leute mitarbeiten können, die keine JTAG haben. Mit einem JTAG könnte man den Bootloader Flashen, ohne den Thermostaten öffnen zu müssen. Von da an kann man über den Programmierstecker mit einem umgebauten Handykabel den Thermostaten neu flashen.&lt;br /&gt;
&lt;br /&gt;
= Lizenz =&lt;br /&gt;
Die Software wird unter GPL v2 gestellt.&lt;br /&gt;
&lt;br /&gt;
= Subversion Repository =&lt;br /&gt;
Ein SVN Repository liegt auf dem freien SVN Server: https://opensvn.csie.org&lt;br /&gt;
== Zugangsdaten ==&lt;br /&gt;
Repository Location: https://OpenSVN.csie.org/hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
Browse Repository: https://OpenSVN.csie.org/viewcvs.cgi/?root=hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
TRAC: https://opensvn.csie.org/traccgi/hr20&lt;br /&gt;
== Policy ==&lt;br /&gt;
Anonymous check out ist erlaubt. &amp;lt;br&amp;gt;&lt;br /&gt;
Wer was committen will muss freigeschaltet werden. &amp;lt;br&amp;gt;&lt;br /&gt;
Dazu brauche ich ein &#039;&#039;Usernamen, Passwort&#039;&#039; und eine &#039;&#039;Mailadresse&#039;&#039;, dann kann ich das einrichten. &amp;lt;br&amp;gt;&lt;br /&gt;
Tragt Euch dazu einfach selber in die Tabelle ein, ich erledige dann den Rest.&amp;lt;br&amp;gt;&lt;br /&gt;
Das mache ich dann von Hand und da ich nicht alle 10 Minuten Mails bearbeite kann das auch schon mal einen oder zwei Tage dauern. &amp;lt;br&amp;gt;&lt;br /&gt;
Wenn sich ein Maintainer findet, gebe ich die Zugangsdaten gerne weiter.&lt;br /&gt;
== Entwickler ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! width=&amp;quot;150&amp;quot; | Entwickler&lt;br /&gt;
! width=&amp;quot;150&amp;quot; | svn Status&lt;br /&gt;
|-&lt;br /&gt;
| darioc&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|-&lt;br /&gt;
| louk&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|}&lt;br /&gt;
== Verzeichnisstruktur ==&lt;br /&gt;
Eine Verzeichnisstruktur ist auch schon angelegt und die ersten Daten auch drin. Hier die Verzeichnisse:&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
| &#039;&#039;&#039;/doc&#039;&#039;&#039;&lt;br /&gt;
| Für alles an Dokumenten, die selbst erstellt wurden. &amp;lt;br&amp;gt;&lt;br /&gt;
Specs, die man im Internet bekommen kann gehören hier nicht rein, &amp;lt;br&amp;gt;&lt;br /&gt;
die machen das alles nur unnötig gross und das auschecken dauert länger.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/playground&#039;&#039;&#039; &lt;br /&gt;
| Wie der Name schon sagt, zum rumspielen und testen. &amp;lt;br&amp;gt;&lt;br /&gt;
Hier kommt jegliche art von Codeschnipseln hin, die zu Testen da sind &amp;lt;br&amp;gt;&lt;br /&gt;
und (derzeit) noch icht Teil des Programmes sind.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/source&#039;&#039;&#039; &lt;br /&gt;
| Hier kommt die Applikation rein mit allen Modulen und makefiles.&amp;lt;br&amp;gt;&lt;br /&gt;
Bitte haltet das Repository sauber und checkt nur Dateien ein, &amp;lt;br&amp;gt;&lt;br /&gt;
die auch Sinn  machen, &amp;quot;thumbs.db&amp;quot; oder andere Temp-Dateien gehören hier nicht rein.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SVN Client und Anleitung ==&lt;br /&gt;
Windows-User nutzen am besten den Tortoise-SVN-Client, den man kostenfrei [http://tortoisesvn.tigris.org hier runterladen] kann. &amp;lt;br&amp;gt;&lt;br /&gt;
Dort gibt es auch eine Anleitung zum Arbeiten mit SVN.&lt;br /&gt;
&lt;br /&gt;
= Analyse der Hardware =&lt;br /&gt;
Die Analyse hat der Dario schon gemacht, zu finden ist die jeweils aktuelle Version &lt;br /&gt;
[http://www.carluccio.de/img/hr20/analyse.pdf als PDF hier] oder [https://opensvn.csie.org/viewcvs.cgi/doc/analyse.pdf hier im SVN].&lt;br /&gt;
&lt;br /&gt;
= Benötigte Module =&lt;br /&gt;
&lt;br /&gt;
Um das Ganze nun etwas zu koordinieren hier eine Liste der benötigten Module und deren Funktionen. &amp;lt;br&amp;gt;&lt;br /&gt;
Diese dient dazu später die Aufgaben zu verteilen:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Module&lt;br /&gt;
! Function&lt;br /&gt;
! Developer&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| LCD&lt;br /&gt;
| Display Driver:&amp;lt;BR&amp;gt;&lt;br /&gt;
* Init Display - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Set Segments - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Print HEX, DEC, TEMP, DayofWeek - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Blink - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* e.t.c&lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; DONE &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| LCD Simulation&lt;br /&gt;
| Simulation for display in AVR Studio:&amp;lt;BR&amp;gt;&lt;br /&gt;
* Defining Display - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Assign Segments to register bits - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Providing samplecode - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
| louk&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; 95% &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| RTC&lt;br /&gt;
| Time and Date Handler&lt;br /&gt;
* init timer - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* use IRQ with 32kHz crystal - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* handle time and date - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** daylight saving - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** consult leapyear  - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* calc day of week out of date - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Only one Byte for Year -&amp;gt; (2000 to 2255)&lt;br /&gt;
* Day of week timer with callback - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* Tick counter (seconds since reboot) - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; WIP &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** used to detect long keypress&lt;br /&gt;
** used to detect motor blocked&lt;br /&gt;
** used for additional timer &lt;br /&gt;
* Additional timer based on tick counter value - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* corretion for external Crystal - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* calibrate internal RC - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE, but not tested &#039;&#039;&#039;&amp;lt;/span&amp;gt; &lt;br /&gt;
| style=&amp;quot;background-color:yellow;&amp;quot; | &#039;&#039;&#039; dario &#039;&#039;&#039; &lt;br /&gt;
&#039;&#039;&#039; active &#039;&#039;&#039; &lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; (95%)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UART &lt;br /&gt;
| UART-Driver&lt;br /&gt;
* menue (Debug und Steuerung)&lt;br /&gt;
** show and set desired temperature &lt;br /&gt;
** show and set Time and Date&lt;br /&gt;
** show actual temperature&lt;br /&gt;
** show (and set) actual valveposition &lt;br /&gt;
** show and set timetable and temperatures&lt;br /&gt;
* optional &lt;br /&gt;
** adressierung of HR20 (for BUS, RF)&lt;br /&gt;
** authentication end encryption&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| CONFIG &lt;br /&gt;
| Save Config in EEPROM&lt;br /&gt;
* driver for EEPROM access&lt;br /&gt;
* save values to EEPROM &lt;br /&gt;
* load values from EEPROM &lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| MENU &lt;br /&gt;
| Control Menu State Machine&lt;br /&gt;
* show values on display&lt;br /&gt;
* functionality:&lt;br /&gt;
** show and set desired temperature&lt;br /&gt;
** show and set time and date &lt;br /&gt;
** show actual temperature&lt;br /&gt;
** show actual valveposition &lt;br /&gt;
** show and set timetable and temperatures&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| MAIN&lt;br /&gt;
| Main Loop&lt;br /&gt;
* init everything&lt;br /&gt;
** global vars - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** rtc - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** lcd - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** motor - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** tempsensor &lt;br /&gt;
* get keystate - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE (ISR in main.c)&#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** debounce - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039;not needed&#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** multi keypress (needed for hidden menue?) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039;can be checked by main loop&#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
* get position of wheel (incremental counter) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE (ISR in main.c)&#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* call menue&lt;br /&gt;
* detect longer keypress / double click - needed?&lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; (70%)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| MOTOR&lt;br /&gt;
| Motor-Driver &lt;br /&gt;
* set desired valveposition  - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** quick, asympthotic, quiet - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE (speed can be chosen) &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* callibrate for Valve - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt; &lt;br /&gt;
** optimised (less motor consumption depending on desired final position) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Stop motor if not turning (blocked) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* stop calibration if valve is removed - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; WIP  &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Genereate ERROR if motor is not turning (blocked or low energy) - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color:yellow;&amp;quot; | &#039;&#039;&#039; dario &#039;&#039;&#039; &lt;br /&gt;
&#039;&#039;&#039; active &#039;&#039;&#039; &lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; (95%)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| TEMP&lt;br /&gt;
| Temperaturesensor-Driver &lt;br /&gt;
* init Sensor &lt;br /&gt;
* IRQ driven (500ms)&lt;br /&gt;
* start A/D conversion (IQR driven)&lt;br /&gt;
* get A/D Value and calc temperature&lt;br /&gt;
* calibration for sensor (needed?)&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| PID&lt;br /&gt;
| PID Algorithm&lt;br /&gt;
* calculate desired valveposition out of&lt;br /&gt;
** last valveposition(s) &lt;br /&gt;
** last temperature(s)&lt;br /&gt;
** actual temperature&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| BOOT&lt;br /&gt;
| Bootloader&lt;br /&gt;
we need a bootloader so that the developers can flash the software &lt;br /&gt;
without a JTAG cable and without disassembling the HR20.&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| LOG&lt;br /&gt;
| Datalogger&lt;br /&gt;
* Operating Hours&lt;br /&gt;
** motor in action&lt;br /&gt;
** ODOmeter&lt;br /&gt;
** since Battery Exchange&lt;br /&gt;
* Errors&lt;br /&gt;
* Logfiles (only with additional hardware)&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UID&lt;br /&gt;
| Unique ID for identification&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= API Beschreibung =&lt;br /&gt;
== LCD ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Funtion&lt;br /&gt;
! Propose&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Init(void);            &lt;br /&gt;
|Init the LCD Controller&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_AllSegments(uint8_t);&lt;br /&gt;
|Set all segments to LCD_MODE&lt;br /&gt;
| done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearAll(void);                       &lt;br /&gt;
|Clear all segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearHour_Bar(void);&lt;br /&gt;
|Clear 24 bar segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearSymbols(void);&lt;br /&gt;
|Clear AUTO MANU PROG SUN MOON SNOW&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearNumbers(void);&lt;br /&gt;
|Clear 7 Segments ans Collumns&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintDec(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print DEC-val in two 7 Segments 0-99&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintHex(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print HEX-val in two 7 Segments 0-ff&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintNo(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print one ditig in one 7 Segment&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintTemp(uint8_t, uint8_t);&lt;br /&gt;
|Print desired temperature (val+4,9)°C&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetSeg(uint8_t, uint8_t);          &lt;br /&gt;
|Set one segment to LCD_MODE (0-69)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetHourBarSeg(uint8_t, uint8_t);    &lt;br /&gt;
|Set one hour bar segment to LCD_MODE (0-23)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetHourBarVal(uint8_t, uint8_t);&lt;br /&gt;
|Set one (val) hour bar segment to LCD_MODE (0-23) reset all other segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetHourBarBar(uint8_t, uint8_t);&lt;br /&gt;
|Set all hour bar segments from 0 to val to LCD_MODE (0-23)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Update(void);                        &lt;br /&gt;
|Request immidiate LCD-Update (normal only when bitplane changes)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t LCD_ContrastAdjust (int8_t);           &lt;br /&gt;
|Adjust the contrast&lt;br /&gt;
|&#039;&#039;&#039;not tested yet&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== RTC ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Funtion&lt;br /&gt;
! Propose&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_Init(RTC_CALLBACK_FUNC);            &lt;br /&gt;
|Sart Timer, activate 500ms IRQ, set callback Function for Dow_Timer&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetHour(void);                    &lt;br /&gt;
|Get Hour&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetMinute(void);                   &lt;br /&gt;
|Get Minute&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetSecond(void);                   &lt;br /&gt;
|Get Second&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetDay(void);                      &lt;br /&gt;
|Get Day&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetMonth(void);                    &lt;br /&gt;
|Get Month&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetYearYY(void);                     &lt;br /&gt;
|Get Year (00-255)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetDayOfWeek(void);                &lt;br /&gt;
|Get Day of Week (0:Monday)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint16_t RTC_GetYearYYYY(void);               &lt;br /&gt;
|Get Year (2000-2255)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetHour(uint8_t);                     &lt;br /&gt;
|Set Hour&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetMinute(uint8_t);                   &lt;br /&gt;
|Set Minute&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetSecond(uint8_t);                   &lt;br /&gt;
|Set Second&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetDay(uint8_t);                      &lt;br /&gt;
|Set Day&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetMonth(uint8_t);                    &lt;br /&gt;
|Set Month&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetYear(uint8_t);                     &lt;br /&gt;
|Set Year&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void    RTC_DowTimerSet(rtc_dow_t, uint8_t, uint8_t); &lt;br /&gt;
|set day of week timer&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_DowTimerGet(rtc_dow_t, uint8_t);         &lt;br /&gt;
|get day of week timer&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_DowTimerGetStartOfDay(void);              &lt;br /&gt;
|timer status start of day&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_DowTimerGetActualIndex(void);         &lt;br /&gt;
|timer status now&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_CalibrateRCO(void);&lt;br /&gt;
|calibrate internal rco&lt;br /&gt;
|&#039;&#039;&#039;not tested yet&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
Dow_Timer &lt;br /&gt;
* there are 28 DOW timers (for each DOW 4 Timers)&lt;br /&gt;
* Each timer can be set to a time (multiple of 10 minutes) &lt;br /&gt;
**  time is stored in a byte with the format hh*10+mm/10 e.g.: &lt;br /&gt;
**  10:10=110, 23:50=235, 255=disable&lt;br /&gt;
* when actual time and DOW is eaqual to a timer time and DOW, then &lt;br /&gt;
** callback function is called (during Timer IRQ) with timerindex as argument &lt;br /&gt;
&lt;br /&gt;
= Entwicklungsumgebung =&lt;br /&gt;
* Editor, Debugger, Compiler&lt;br /&gt;
** WinAVR version (20071221), sprich GCC 4.2.2 sowie avr-libc 1.6.0&lt;br /&gt;
** AVR Studio 4 &lt;br /&gt;
* JTAG ICE&lt;br /&gt;
** Atmel AVR JTAGICE MK2 &lt;br /&gt;
** AVR Dragon (z.B. http://elmicro.com/de/atavrdragon.html)&lt;br /&gt;
** Olimex-Seriell http://www.olimex.com/dev/avr-jtag.html  &lt;br /&gt;
** Olimex-USB http://www.olimex.com/dev/avr-usb-jtag.html &lt;br /&gt;
&lt;br /&gt;
= Sonstiges =&lt;br /&gt;
== Altes Protokoll ==&lt;br /&gt;
[[HR20_Protocol_V2 | Hier ]] hat mal einer ein Protokoll eingegeben.&lt;br /&gt;
Das scheint aber nicht zu der Version 2.04 zu passen. &lt;br /&gt;
Ich habe es nicht gelöscht, falls es jemanden interessiert.&lt;br /&gt;
&lt;br /&gt;
[[Category:Projekte|!]]&lt;/div&gt;</summary>
		<author><name>Dario</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=26542</id>
		<title>Heizungssteuerung mit Honeywell HR20</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=26542"/>
		<updated>2008-02-27T10:05:10Z</updated>

		<summary type="html">&lt;p&gt;Dario: /* Benötigte Module */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von DarioC&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Wie alles begann =&lt;br /&gt;
&lt;br /&gt;
Nachdem von Uwe Felgentreu vor nunmehr vor über drei Jahren (genau am 17.11.2004 um 11:26) hier in diesem Forum den Thread mit dem Titel &#039;&#039;Honeywell Rondostat HR20E per AVR steuern und konfigurieren&#039;&#039; gestartet hat ist es nun langsam soweit, dass das Ganze auch ein Projekt wird. &lt;br /&gt;
&lt;br /&gt;
Den Thread dazu kann der interessierte Leser [http://www.mikrocontroller.net/topic/17603 hier nachlesen] &lt;br /&gt;
&lt;br /&gt;
= Projektziel =&lt;br /&gt;
&lt;br /&gt;
Wir konzentrieren uns in erster Linie auf den Honeywell Rondostat HR20E mit ausgelieferten Softwareversion 2.04. Dass es ähnliche andere Geräte gibt behalten wir bei der Entwicklung im Hinterkopf.&lt;br /&gt;
&lt;br /&gt;
Basierend auf dieser Hardware wollen wir eine neue Software entwickeln. &lt;br /&gt;
Dabei können wir ausser der Hardware nichts weiter verwenden, da die Originalsoftware geschützt ist und nicht ausgelesen werden kann.&lt;br /&gt;
&lt;br /&gt;
== Phase 1 ==&lt;br /&gt;
Die Software soll die Funktionen bieten, die die Originalsoftware auch bietet, später können dies dann um zusätzliche Funktionen erweitert werden. Die wichtigsten Funktionen sind:&lt;br /&gt;
&lt;br /&gt;
* Temperaturregelung&lt;br /&gt;
* Echtzeituhr&lt;br /&gt;
* Ausnutzen der Sleep Funktion&lt;br /&gt;
* Anzeige Soll-Temperatur und der Uhrzeit&lt;br /&gt;
* Einstellung der Soll-Temperatur&lt;br /&gt;
* Uhrzeitgesteuerte Einstellung der Soll-Temperatur &lt;br /&gt;
* Fenster-Offen-Erkennung&lt;br /&gt;
* Ventilfreispülungsfunktion&lt;br /&gt;
&lt;br /&gt;
== Phase 2 ==&lt;br /&gt;
&lt;br /&gt;
Hier liegt der Sinn des ganzen Projektes: Durch diese zusätzlichen Funktionen wollen wir den Nutzwert des Thermostaten erheblich steigern:&lt;br /&gt;
&lt;br /&gt;
* Programmierung der Schaltzeiten und Temperaturen über externe Schnittstelle&lt;br /&gt;
* Abfrage der Messwerte und Parameter über externe Schnittstelle&lt;br /&gt;
* Vernetzung der Thermostaten untereinander&lt;br /&gt;
* Zusätzliche externe Schnittstellen (neben UART auch CAN und Funk)&lt;br /&gt;
* Erweiterung der Anzeige um&lt;br /&gt;
** Ist-Temperatur &lt;br /&gt;
** Ventilstellung&lt;br /&gt;
** Funkschnittstelle&lt;br /&gt;
*** RFM12 http://www.hoperf.com/rf_fsk.asp&lt;br /&gt;
*** Zigbee http://www.meshnetics.com/zigbee-modules&lt;br /&gt;
** ...&lt;br /&gt;
* Bootloader, damit Leute mitarbeiten können, die keine JTAG haben. Mit einem JTAG könnte man den Bootloader Flashen, ohne den Thermostaten öffnen zu müssen. Von da an kann man über den Programmierstecker mit einem umgebauten Handykabel den Thermostaten neu flashen.&lt;br /&gt;
&lt;br /&gt;
= Lizenz =&lt;br /&gt;
Die Software wird unter GPL v2 gestellt.&lt;br /&gt;
&lt;br /&gt;
= Subversion Repository =&lt;br /&gt;
Ein SVN Repository liegt auf dem freien SVN Server: https://opensvn.csie.org&lt;br /&gt;
== Zugangsdaten ==&lt;br /&gt;
Repository Location: https://OpenSVN.csie.org/hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
Browse Repository: https://OpenSVN.csie.org/viewcvs.cgi/?root=hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
TRAC: https://opensvn.csie.org/traccgi/hr20&lt;br /&gt;
== Policy ==&lt;br /&gt;
Anonymous check out ist erlaubt. &amp;lt;br&amp;gt;&lt;br /&gt;
Wer was committen will muss freigeschaltet werden. &amp;lt;br&amp;gt;&lt;br /&gt;
Dazu brauche ich ein &#039;&#039;Usernamen, Passwort&#039;&#039; und eine &#039;&#039;Mailadresse&#039;&#039;, dann kann ich das einrichten. &amp;lt;br&amp;gt;&lt;br /&gt;
Tragt Euch dazu einfach selber in die Tabelle ein, ich erledige dann den Rest.&amp;lt;br&amp;gt;&lt;br /&gt;
Das mache ich dann von Hand und da ich nicht alle 10 Minuten Mails bearbeite kann das auch schon mal einen oder zwei Tage dauern. &amp;lt;br&amp;gt;&lt;br /&gt;
Wenn sich ein Maintainer findet, gebe ich die Zugangsdaten gerne weiter.&lt;br /&gt;
== Entwickler ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! width=&amp;quot;150&amp;quot; | Entwickler&lt;br /&gt;
! width=&amp;quot;150&amp;quot; | svn Status&lt;br /&gt;
|-&lt;br /&gt;
| darioc&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|-&lt;br /&gt;
| louk&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|}&lt;br /&gt;
== Verzeichnisstruktur ==&lt;br /&gt;
Eine Verzeichnisstruktur ist auch schon angelegt und die ersten Daten auch drin. Hier die Verzeichnisse:&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
| &#039;&#039;&#039;/doc&#039;&#039;&#039;&lt;br /&gt;
| Für alles an Dokumenten, die selbst erstellt wurden. &amp;lt;br&amp;gt;&lt;br /&gt;
Specs, die man im Internet bekommen kann gehören hier nicht rein, &amp;lt;br&amp;gt;&lt;br /&gt;
die machen das alles nur unnötig gross und das auschecken dauert länger.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/playground&#039;&#039;&#039; &lt;br /&gt;
| Wie der Name schon sagt, zum rumspielen und testen. &amp;lt;br&amp;gt;&lt;br /&gt;
Hier kommt jegliche art von Codeschnipseln hin, die zu Testen da sind &amp;lt;br&amp;gt;&lt;br /&gt;
und (derzeit) noch icht Teil des Programmes sind.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/source&#039;&#039;&#039; &lt;br /&gt;
| Hier kommt die Applikation rein mit allen Modulen und makefiles.&amp;lt;br&amp;gt;&lt;br /&gt;
Bitte haltet das Repository sauber und checkt nur Dateien ein, &amp;lt;br&amp;gt;&lt;br /&gt;
die auch Sinn  machen, &amp;quot;thumbs.db&amp;quot; oder andere Temp-Dateien gehören hier nicht rein.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SVN Client und Anleitung ==&lt;br /&gt;
Windows-User nutzen am besten den Tortoise-SVN-Client, den man kostenfrei [http://tortoisesvn.tigris.org hier runterladen] kann. &amp;lt;br&amp;gt;&lt;br /&gt;
Dort gibt es auch eine Anleitung zum Arbeiten mit SVN.&lt;br /&gt;
&lt;br /&gt;
= Analyse der Hardware =&lt;br /&gt;
Die Analyse hat der Dario schon gemacht, zu finden ist die jeweils aktuelle Version &lt;br /&gt;
[http://www.carluccio.de/img/hr20/analyse.pdf als PDF hier] oder [https://opensvn.csie.org/viewcvs.cgi/doc/analyse.pdf hier im SVN].&lt;br /&gt;
&lt;br /&gt;
= Benötigte Module =&lt;br /&gt;
&lt;br /&gt;
Um das Ganze nun etwas zu koordinieren hier eine Liste der benötigten Module und deren Funktionen. &amp;lt;br&amp;gt;&lt;br /&gt;
Diese dient dazu später die Aufgaben zu verteilen:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Module&lt;br /&gt;
! Function&lt;br /&gt;
! Developer&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| LCD&lt;br /&gt;
| Display Driver:&amp;lt;BR&amp;gt;&lt;br /&gt;
* Init Display - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Set Segments - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Print HEX, DEC, TEMP, DayofWeek - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Blink - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* e.t.c&lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; DONE &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| LCD Simulation&lt;br /&gt;
| Simulation for display in AVR Studio:&amp;lt;BR&amp;gt;&lt;br /&gt;
* Defining Display - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Assign Segments to register bits - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Providing samplecode - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
| louk&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; 95% &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| RTC&lt;br /&gt;
| Time and Date Handler&lt;br /&gt;
* init timer - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* use IRQ with 32kHz crystal - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* handle time and date - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** daylight saving - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** consult leapyear  - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* calc day of week out of date - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Only one Byte for Year -&amp;gt; (2000 to 2255)&lt;br /&gt;
* Day of week timer with callback - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* Tick counter (seconds since reboot) - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** used to detect long keypress&lt;br /&gt;
** used to detect motor blocked&lt;br /&gt;
** used for additional timer &lt;br /&gt;
* Additional timer based on tick counter value - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* corretion for external Crystal - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* calibrate internal RC - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE, but not tested &#039;&#039;&#039;&amp;lt;/span&amp;gt; &lt;br /&gt;
| style=&amp;quot;background-color:yellow;&amp;quot; | &#039;&#039;&#039; dario &#039;&#039;&#039; &lt;br /&gt;
&#039;&#039;&#039; active &#039;&#039;&#039; &lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; (95%)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UART &lt;br /&gt;
| UART-Driver&lt;br /&gt;
* menue (Debug und Steuerung)&lt;br /&gt;
** show and set desired temperature &lt;br /&gt;
** show and set Time and Date&lt;br /&gt;
** show actual temperature&lt;br /&gt;
** show (and set) actual valveposition &lt;br /&gt;
** show and set timetable and temperatures&lt;br /&gt;
* optional &lt;br /&gt;
** adressierung of HR20 (for BUS, RF)&lt;br /&gt;
** authentication end encryption&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| CONFIG &lt;br /&gt;
| Save Config in EEPROM&lt;br /&gt;
* driver for EEPROM access&lt;br /&gt;
* save values to EEPROM &lt;br /&gt;
* load values from EEPROM &lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| MENU &lt;br /&gt;
| Control Menu State Machine&lt;br /&gt;
* show values on display&lt;br /&gt;
* functionality:&lt;br /&gt;
** show and set desired temperature&lt;br /&gt;
** show and set time and date &lt;br /&gt;
** show actual temperature&lt;br /&gt;
** show actual valveposition &lt;br /&gt;
** show and set timetable and temperatures&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| MAIN&lt;br /&gt;
| Main Loop&lt;br /&gt;
* init everything&lt;br /&gt;
** global vars - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** rtc - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** lcd - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** motor - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** tempsensor &lt;br /&gt;
* get keystate - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE (ISR in main.c)&#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** debounce - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039;not needed&#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** multi keypress (needed for hidden menue?) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039;can be checked by main loop&#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
* get position of wheel (incremental counter) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE (ISR in main.c)&#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* call menue&lt;br /&gt;
* detect longer keypress / double click - needed?&lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; (70%)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| MOTOR&lt;br /&gt;
| Motor-Driver &lt;br /&gt;
* set desired valveposition  - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** quick, asympthotic, quiet - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE (speed can be chosen) &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* callibrate for Valve - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt; &lt;br /&gt;
** optimised (less motor consumption depending on desired final position) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Stop motor if not turning (blocked) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* stop calibration if valve is removed - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Genereate ERROR if motor is not turning (blocked or low energy) - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color:yellow;&amp;quot; | &#039;&#039;&#039; dario &#039;&#039;&#039; &lt;br /&gt;
&#039;&#039;&#039; active &#039;&#039;&#039; &lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; (95%)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| TEMP&lt;br /&gt;
| Temperaturesensor-Driver &lt;br /&gt;
* init Sensor &lt;br /&gt;
* IRQ driven (500ms)&lt;br /&gt;
* start A/D conversion (IQR driven)&lt;br /&gt;
* get A/D Value and calc temperature&lt;br /&gt;
* calibration for sensor (needed?)&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| PID&lt;br /&gt;
| PID Algorithm&lt;br /&gt;
* calculate desired valveposition out of&lt;br /&gt;
** last valveposition(s) &lt;br /&gt;
** last temperature(s)&lt;br /&gt;
** actual temperature&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| BOOT&lt;br /&gt;
| Bootloader&lt;br /&gt;
we need a bootloader so that the developers can flash the software &lt;br /&gt;
without a JTAG cable and without disassembling the HR20.&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| LOG&lt;br /&gt;
| Datalogger&lt;br /&gt;
* Operating Hours&lt;br /&gt;
** motor in action&lt;br /&gt;
** ODOmeter&lt;br /&gt;
** since Battery Exchange&lt;br /&gt;
* Errors&lt;br /&gt;
* Logfiles (only with additional hardware)&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UID&lt;br /&gt;
| Unique ID for identification&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= API Beschreibung =&lt;br /&gt;
== LCD ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Funtion&lt;br /&gt;
! Propose&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Init(void);            &lt;br /&gt;
|Init the LCD Controller&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_AllSegments(uint8_t);&lt;br /&gt;
|Set all segments to LCD_MODE&lt;br /&gt;
| done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearAll(void);                       &lt;br /&gt;
|Clear all segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearHour_Bar(void);&lt;br /&gt;
|Clear 24 bar segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearSymbols(void);&lt;br /&gt;
|Clear AUTO MANU PROG SUN MOON SNOW&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearNumbers(void);&lt;br /&gt;
|Clear 7 Segments ans Collumns&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintDec(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print DEC-val in two 7 Segments 0-99&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintHex(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print HEX-val in two 7 Segments 0-ff&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintNo(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print one ditig in one 7 Segment&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintTemp(uint8_t, uint8_t);&lt;br /&gt;
|Print desired temperature (val+4,9)°C&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetSeg(uint8_t, uint8_t);          &lt;br /&gt;
|Set one segment to LCD_MODE (0-69)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetHourBarSeg(uint8_t, uint8_t);    &lt;br /&gt;
|Set one hour bar segment to LCD_MODE (0-23)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetHourBarVal(uint8_t, uint8_t);&lt;br /&gt;
|Set one (val) hour bar segment to LCD_MODE (0-23) reset all other segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetHourBarBar(uint8_t, uint8_t);&lt;br /&gt;
|Set all hour bar segments from 0 to val to LCD_MODE (0-23)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Update(void);                        &lt;br /&gt;
|Request immidiate LCD-Update (normal only when bitplane changes)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t LCD_ContrastAdjust (int8_t);           &lt;br /&gt;
|Adjust the contrast&lt;br /&gt;
|&#039;&#039;&#039;not tested yet&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== RTC ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Funtion&lt;br /&gt;
! Propose&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_Init(RTC_CALLBACK_FUNC);            &lt;br /&gt;
|Sart Timer, activate 500ms IRQ, set callback Function for Dow_Timer&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetHour(void);                    &lt;br /&gt;
|Get Hour&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetMinute(void);                   &lt;br /&gt;
|Get Minute&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetSecond(void);                   &lt;br /&gt;
|Get Second&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetDay(void);                      &lt;br /&gt;
|Get Day&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetMonth(void);                    &lt;br /&gt;
|Get Month&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetYearYY(void);                     &lt;br /&gt;
|Get Year (00-255)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetDayOfWeek(void);                &lt;br /&gt;
|Get Day of Week (0:Monday)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint16_t RTC_GetYearYYYY(void);               &lt;br /&gt;
|Get Year (2000-2255)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetHour(uint8_t);                     &lt;br /&gt;
|Set Hour&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetMinute(uint8_t);                   &lt;br /&gt;
|Set Minute&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetSecond(uint8_t);                   &lt;br /&gt;
|Set Second&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetDay(uint8_t);                      &lt;br /&gt;
|Set Day&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetMonth(uint8_t);                    &lt;br /&gt;
|Set Month&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetYear(uint8_t);                     &lt;br /&gt;
|Set Year&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void    RTC_DowTimerSet(rtc_dow_t, uint8_t, uint8_t); &lt;br /&gt;
|set day of week timer&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_DowTimerGet(rtc_dow_t, uint8_t);         &lt;br /&gt;
|get day of week timer&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_DowTimerGetStartOfDay(void);              &lt;br /&gt;
|timer status start of day&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_DowTimerGetActualIndex(void);         &lt;br /&gt;
|timer status now&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_CalibrateRCO(void);&lt;br /&gt;
|calibrate internal rco&lt;br /&gt;
|&#039;&#039;&#039;not tested yet&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
Dow_Timer &lt;br /&gt;
* there are 28 DOW timers (for each DOW 4 Timers)&lt;br /&gt;
* Each timer can be set to a time (multiple of 10 minutes) &lt;br /&gt;
**  time is stored in a byte with the format hh*10+mm/10 e.g.: &lt;br /&gt;
**  10:10=110, 23:50=235, 255=disable&lt;br /&gt;
* when actual time and DOW is eaqual to a timer time and DOW, then &lt;br /&gt;
** callback function is called (during Timer IRQ) with timerindex as argument &lt;br /&gt;
&lt;br /&gt;
= Entwicklungsumgebung =&lt;br /&gt;
* Editor, Debugger, Compiler&lt;br /&gt;
** WinAVR version (20071221), sprich GCC 4.2.2 sowie avr-libc 1.6.0&lt;br /&gt;
** AVR Studio 4 &lt;br /&gt;
* JTAG ICE&lt;br /&gt;
** Atmel AVR JTAGICE MK2 &lt;br /&gt;
** AVR Dragon (z.B. http://elmicro.com/de/atavrdragon.html)&lt;br /&gt;
** Olimex-Seriell http://www.olimex.com/dev/avr-jtag.html  &lt;br /&gt;
** Olimex-USB http://www.olimex.com/dev/avr-usb-jtag.html &lt;br /&gt;
&lt;br /&gt;
= Sonstiges =&lt;br /&gt;
== Altes Protokoll ==&lt;br /&gt;
[[HR20_Protocol_V2 | Hier ]] hat mal einer ein Protokoll eingegeben.&lt;br /&gt;
Das scheint aber nicht zu der Version 2.04 zu passen. &lt;br /&gt;
Ich habe es nicht gelöscht, falls es jemanden interessiert.&lt;br /&gt;
&lt;br /&gt;
[[Category:Projekte|!]]&lt;/div&gt;</summary>
		<author><name>Dario</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=26465</id>
		<title>Heizungssteuerung mit Honeywell HR20</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=26465"/>
		<updated>2008-02-21T08:32:10Z</updated>

		<summary type="html">&lt;p&gt;Dario: /* Benötigte Module */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von DarioC&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Wie alles begann =&lt;br /&gt;
&lt;br /&gt;
Nachdem von Uwe Felgentreu vor nunmehr vor über drei Jahren (genau am 17.11.2004 um 11:26) hier in diesem Forum den Thread mit dem Titel &#039;&#039;Honeywell Rondostat HR20E per AVR steuern und konfigurieren&#039;&#039; gestartet hat ist es nun langsam soweit, dass das Ganze auch ein Projekt wird. &lt;br /&gt;
&lt;br /&gt;
Den Thread dazu kann der interessierte Leser [http://www.mikrocontroller.net/topic/17603 hier nachlesen] &lt;br /&gt;
&lt;br /&gt;
= Projektziel =&lt;br /&gt;
&lt;br /&gt;
Wir konzentrieren uns in erster Linie auf den Honeywell Rondostat HR20E mit ausgelieferten Softwareversion 2.04. Dass es ähnliche andere Geräte gibt behalten wir bei der Entwicklung im Hinterkopf.&lt;br /&gt;
&lt;br /&gt;
Basierend auf dieser Hardware wollen wir eine neue Software entwickeln. &lt;br /&gt;
Dabe können wir ausser der Hardware nichts weiter verwenden, da die Originalsoftware geschützt ist und nicht ausgelesen werden kann.&lt;br /&gt;
&lt;br /&gt;
== Phase 1 ==&lt;br /&gt;
Die Software soll die Funktionen bieten, die die Originalsoftware auch bietet, später können dies dann um zusätzliche Funktionen erweitert werden. Die wichtigsten Funktionen sind:&lt;br /&gt;
&lt;br /&gt;
* Temperaturregelung&lt;br /&gt;
* Echtzeituhr&lt;br /&gt;
* Ausnutzen der Sleep Funktion&lt;br /&gt;
* Anzeige Soll-Temperatur und der Uhrzeit&lt;br /&gt;
* Einstellung der Soll-Temperatur&lt;br /&gt;
* Uhrzeitgesteuerte Einstellung der Soll-Temperatur &lt;br /&gt;
* Fenster-Offen-Erkennung&lt;br /&gt;
* Ventilfreispülungsfunktion&lt;br /&gt;
&lt;br /&gt;
== Phase 2 ==&lt;br /&gt;
&lt;br /&gt;
Hier liegt der Sinn des ganzen Projektes: Durch diese zusätzlichen Funktionen wollen wir den Nutzwert des Thermostaten erheblich steigern:&lt;br /&gt;
&lt;br /&gt;
* Programmierung der Schaltzeiten und Temperaturen über externe Schnittstelle&lt;br /&gt;
* Abfrage der Messwerte und Parameter über externe Schnittstelle&lt;br /&gt;
* Vernetzung der Thermostaten untereinander&lt;br /&gt;
* Zusätzliche externe Schnittstellen (neben UART auch CAN und Funk)&lt;br /&gt;
* Erweiterung der Anzeige um&lt;br /&gt;
** Ist-Temperatur &lt;br /&gt;
** Ventilstellung&lt;br /&gt;
** Funkschnittstelle&lt;br /&gt;
*** RFM12 http://www.hoperf.com/rf_fsk.asp&lt;br /&gt;
*** Zigbee http://www.meshnetics.com/zigbee-modules&lt;br /&gt;
** ...&lt;br /&gt;
* Bootloader, damit Leute mitarbeiten können, die keine JTAG haben. Mit einem JTAG könnte man den Bootloader Flashen, ohne den Thermostaten öffnen zu müssen. Von da an kann man über den Programmierstecker mit einem umgebauten Handykabel den Thermostaten neu flashen.&lt;br /&gt;
&lt;br /&gt;
= Lizenz =&lt;br /&gt;
Die Software wird unter GPL v2 gestellt.&lt;br /&gt;
&lt;br /&gt;
= Subversion Repository =&lt;br /&gt;
Ein SVN Repository liegt auf dem freien SVN Server: https://opensvn.csie.org&lt;br /&gt;
== Zugangsdaten ==&lt;br /&gt;
Repository Location: https://OpenSVN.csie.org/hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
Browse Repository: https://OpenSVN.csie.org/viewcvs.cgi/?root=hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
TRAC: https://opensvn.csie.org/traccgi/hr20&lt;br /&gt;
== Policy ==&lt;br /&gt;
Anonymous check out ist erlaubt. &amp;lt;br&amp;gt;&lt;br /&gt;
Wer was committen will muss freigeschaltet werden. &amp;lt;br&amp;gt;&lt;br /&gt;
Dazu brauche ich ein &#039;&#039;Usernamen, Passwort&#039;&#039; und eine &#039;&#039;Mailadresse&#039;&#039;, dann kann ich das einrichten. &amp;lt;br&amp;gt;&lt;br /&gt;
Tragt Euch dazu einfach selber in die Tabelle ein, ich erledige dann den Rest.&amp;lt;br&amp;gt;&lt;br /&gt;
Das mache ich dann von Hand und da ich nicht alle 10 Minuten Mails bearbeite kann das auch schon mal einen oder zwei Tage dauern. &amp;lt;br&amp;gt;&lt;br /&gt;
Wenn sich ein Maintainer findet, gebe ich die Zugangsdaten gerne weiter.&lt;br /&gt;
== Entwickler ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! width=&amp;quot;150&amp;quot; | Entwickler&lt;br /&gt;
! width=&amp;quot;150&amp;quot; | svn Status&lt;br /&gt;
|-&lt;br /&gt;
| darioc&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|-&lt;br /&gt;
| louk&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|}&lt;br /&gt;
== Verzeichnisstruktur ==&lt;br /&gt;
Eine Verzeichnisstruktur ist auch schon angelegt und die ersten Daten auch drin. Hier die Verzeichnisse:&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
| &#039;&#039;&#039;/doc&#039;&#039;&#039;&lt;br /&gt;
| Für alles an Dokumenten, die selbst erstellt wurden. &amp;lt;br&amp;gt;&lt;br /&gt;
Specs, die man im Internet bekommen kann gehören hier nicht rein, &amp;lt;br&amp;gt;&lt;br /&gt;
die machen das alles nur unnötig gross und das auschecken dauert länger.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/playground&#039;&#039;&#039; &lt;br /&gt;
| Wie der Name schon sagt, zum rumspielen und testen. &amp;lt;br&amp;gt;&lt;br /&gt;
Hier kommt jegliche art von Codeschnipseln hin, die zu Testen da sind &amp;lt;br&amp;gt;&lt;br /&gt;
und (derzeit) noch icht Teil des Programmes sind.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/source&#039;&#039;&#039; &lt;br /&gt;
| Hier kommt die Applikation rein mit allen Modulen und makefiles.&amp;lt;br&amp;gt;&lt;br /&gt;
Bitte haltet das Repository sauber und checkt nur Dateien ein, &amp;lt;br&amp;gt;&lt;br /&gt;
die auch Sinn  machen, &amp;quot;thumbs.db&amp;quot; oder andere Temp-Dateien gehören hier nicht rein.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SVN Client und Anleitung ==&lt;br /&gt;
Windows-User nutzen am besten den Tortoise-SVN-Client, den man kostenfrei [http://tortoisesvn.tigris.org hier runterladen] kann. &amp;lt;br&amp;gt;&lt;br /&gt;
Dort gibt es auch eine Anleitung zum Arbeiten mit SVN.&lt;br /&gt;
&lt;br /&gt;
= Analyse der Hardware =&lt;br /&gt;
Die Analyse hat der Dario schon gemacht, zu finden ist die jeweils aktuelle Version &lt;br /&gt;
[http://www.carluccio.de/img/hr20/analyse.pdf als PDF hier] oder [https://opensvn.csie.org/viewcvs.cgi/doc/analyse.pdf hier im SVN].&lt;br /&gt;
&lt;br /&gt;
= Benötigte Module =&lt;br /&gt;
&lt;br /&gt;
Um das Ganze nun etwas zu koordinieren hier eine Liste der benötigten Module und deren Funktionen. &amp;lt;br&amp;gt;&lt;br /&gt;
Diese dient dazu später die Aufgaben zu verteilen:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Module&lt;br /&gt;
! Function&lt;br /&gt;
! Developer&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| LCD&lt;br /&gt;
| Display Driver:&amp;lt;BR&amp;gt;&lt;br /&gt;
* Init Display - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Set Segments - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Print HEX, DEC, TEMP, DayofWeek - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Blink - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* e.t.c&lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; DONE &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| LCD Simulation&lt;br /&gt;
| Simulation for display in AVR Studio:&amp;lt;BR&amp;gt;&lt;br /&gt;
* Defining Display - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039;  Done by D/L &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Assign Segments to register bits - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; Done by D/L &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Providing samplecode - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039;  Done by Dario &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; 95% &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| RTC&lt;br /&gt;
| Time and Date Handler&lt;br /&gt;
* init timer - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* use IRQ with 32kHz crystal - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* handle time and date - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** daylight saving - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** consult leapyear  - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* calc day of week out of date - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Only one Byte for Year -&amp;gt; (2000 to 2255)&lt;br /&gt;
* Day of week timer with callback - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* Tick counter (seconds since reboot) - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** used to detect long keypress&lt;br /&gt;
** used to detect motor blocked&lt;br /&gt;
** used for additional timer &lt;br /&gt;
* Additional timer based on tick counter value - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* corretion for external Crystal - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* calibrate internal RC - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE, but not tested &#039;&#039;&#039;&amp;lt;/span&amp;gt; &lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; (95%)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UART &lt;br /&gt;
| UART-Driver&lt;br /&gt;
* menue (Debug und Steuerung)&lt;br /&gt;
** show and set desired temperature &lt;br /&gt;
** show and set Time and Date&lt;br /&gt;
** show actual temperature&lt;br /&gt;
** show (and set) actual valveposition &lt;br /&gt;
** show and set timetable and temperatures&lt;br /&gt;
* optional &lt;br /&gt;
** adressierung of HR20 (for BUS, RF)&lt;br /&gt;
** authentication end encryption&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| CONFIG &lt;br /&gt;
| Save Config in EEPROM&lt;br /&gt;
* driver for EEPROM access&lt;br /&gt;
* save values to EEPROM &lt;br /&gt;
* load values from EEPROM &lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| MENU &lt;br /&gt;
| Control Menu State Machine&lt;br /&gt;
* show values on display&lt;br /&gt;
* functionality:&lt;br /&gt;
** show and set desired temperature&lt;br /&gt;
** show and set time and date &lt;br /&gt;
** show actual temperature&lt;br /&gt;
** show actual valveposition &lt;br /&gt;
** show and set timetable and temperatures&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| MAIN&lt;br /&gt;
| Main Loop&lt;br /&gt;
* init everything&lt;br /&gt;
** global vars - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** rtc - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** lcd - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** motor - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** tempsensor &lt;br /&gt;
* get keystate - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE (ISR in main.c)&#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** debounce - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039;not needed&#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** multi keypress (nedded for hidden menue?) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039;can be checked by main loop&#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
* get position of wheel (incremental counter) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE (ISR in main.c)&#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* call menue&lt;br /&gt;
* detect longer keypress / double click - nedded?&lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; (70%)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| MOTOR&lt;br /&gt;
| Motor-Driver &lt;br /&gt;
* set desired valveposition  - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** quick, asympthotic, quiet - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE (speed can be chosen) &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* callibrate for Valve - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt; &lt;br /&gt;
** optimised (less motor consumption depending on desired final position) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Stop motor if not turning (blocked) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* stop calibration if valve is removed - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Genereate ERROR if motor is not turning (blocked or low energy) - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color:yellow;&amp;quot; | &#039;&#039;&#039; dario &#039;&#039;&#039; &lt;br /&gt;
&#039;&#039;&#039; active &#039;&#039;&#039; &lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; (95%)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| TEMP&lt;br /&gt;
| Temperaturesensor-Driver &lt;br /&gt;
* init Sensor &lt;br /&gt;
* IRQ driven (500ms)&lt;br /&gt;
* start A/D conversion (IQR driven)&lt;br /&gt;
* get A/D Value and calc temperature&lt;br /&gt;
* calibration for sensor (needed?)&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| PID&lt;br /&gt;
| PID Algorithm&lt;br /&gt;
* calculate desired valveposition out of&lt;br /&gt;
** last valveposition(s) &lt;br /&gt;
** last temperature(s)&lt;br /&gt;
** actual temperature&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| BOOT&lt;br /&gt;
| Bootloader&lt;br /&gt;
we need a bootloader so that the developers can flash the software &lt;br /&gt;
without a JTAG cable and without disassembling the HR20.&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| LOG&lt;br /&gt;
| Datalogger&lt;br /&gt;
* Operating Hours&lt;br /&gt;
** motor in action&lt;br /&gt;
** ODOmeter&lt;br /&gt;
** since Battery Exchange&lt;br /&gt;
* Errors&lt;br /&gt;
* Logfiles (only with additional hardware)&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UID&lt;br /&gt;
| Unique ID for identification&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= API Beschreibung =&lt;br /&gt;
== LCD ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Funtion&lt;br /&gt;
! Propose&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Init(void);            &lt;br /&gt;
|Init the LCD Controller&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_AllSegments(uint8_t);&lt;br /&gt;
|Set all segments to LCD_MODE&lt;br /&gt;
| done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearAll(void);                       &lt;br /&gt;
|Clear all segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearHour_Bar(void);&lt;br /&gt;
|Clear 24 bar segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearSymbols(void);&lt;br /&gt;
|Clear AUTO MANU PROG SUN MOON SNOW&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearNumbers(void);&lt;br /&gt;
|Clear 7 Segments ans Collumns&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintDec(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print DEC-val in two 7 Segments 0-99&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintHex(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print HEX-val in two 7 Segments 0-ff&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintNo(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print one ditig in one 7 Segment&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintTemp(uint8_t, uint8_t);&lt;br /&gt;
|Print desired temperature (val+4,9)°C&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetSeg(uint8_t, uint8_t);          &lt;br /&gt;
|Set one segment to LCD_MODE (0-69)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetHourBarSeg(uint8_t, uint8_t);    &lt;br /&gt;
|Set one hour bar segment to LCD_MODE (0-23)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetHourBarVal(uint8_t, uint8_t);&lt;br /&gt;
|Set one (val) hour bar segment to LCD_MODE (0-23) reset all other segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetHourBarBar(uint8_t, uint8_t);&lt;br /&gt;
|Set all hour bar segments from 0 to val to LCD_MODE (0-23)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Update(void);                        &lt;br /&gt;
|Request immidiate LCD-Update (normal only when bitplane changes)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t LCD_ContrastAdjust (int8_t);           &lt;br /&gt;
|Adjust the contrast&lt;br /&gt;
|&#039;&#039;&#039;not tested yet&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== RTC ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Funtion&lt;br /&gt;
! Propose&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_Init(RTC_CALLBACK_FUNC);            &lt;br /&gt;
|Sart Timer, activate 500ms IRQ, set callback Function for Dow_Timer&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetHour(void);                    &lt;br /&gt;
|Get Hour&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetMinute(void);                   &lt;br /&gt;
|Get Minute&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetSecond(void);                   &lt;br /&gt;
|Get Second&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetDay(void);                      &lt;br /&gt;
|Get Day&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetMonth(void);                    &lt;br /&gt;
|Get Month&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetYearYY(void);                     &lt;br /&gt;
|Get Year (00-255)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetDayOfWeek(void);                &lt;br /&gt;
|Get Day of Week (0:Monday)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint16_t RTC_GetYearYYYY(void);               &lt;br /&gt;
|Get Year (2000-2255)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetHour(uint8_t);                     &lt;br /&gt;
|Set Hour&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetMinute(uint8_t);                   &lt;br /&gt;
|Set Minute&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetSecond(uint8_t);                   &lt;br /&gt;
|Set Second&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetDay(uint8_t);                      &lt;br /&gt;
|Set Day&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetMonth(uint8_t);                    &lt;br /&gt;
|Set Month&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetYear(uint8_t);                     &lt;br /&gt;
|Set Year&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void    RTC_DowTimerSet(rtc_dow_t, uint8_t, uint8_t); &lt;br /&gt;
|set day of week timer&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_DowTimerGet(rtc_dow_t, uint8_t);         &lt;br /&gt;
|get day of week timer&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_DowTimerGetStartOfDay(void);              &lt;br /&gt;
|timer status start of day&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_DowTimerGetActualIndex(void);         &lt;br /&gt;
|timer status now&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_CalibrateRCO(void);&lt;br /&gt;
|calibrate internal rco&lt;br /&gt;
|&#039;&#039;&#039;not tested yet&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
Dow_Timer &lt;br /&gt;
* there are 28 DOW timers (for each DOW 4 Timers)&lt;br /&gt;
* Each timer can be set to a time (multiple of 10 minutes) &lt;br /&gt;
**  time is stored in a byte with the format hh*10+mm/10 e.g.: &lt;br /&gt;
**  10:10=110, 23:50=235, 255=disable&lt;br /&gt;
* when actual time and DOW is eaqual to a timer time and DOW, then &lt;br /&gt;
** callback function is called (during Timer IRQ) with timerindex as argument &lt;br /&gt;
&lt;br /&gt;
= Entwicklungsumgebung =&lt;br /&gt;
* Editor, Debugger, Compiler&lt;br /&gt;
** WinAVR version (20071221), sprich GCC 4.2.2 sowie avr-libc 1.6.0&lt;br /&gt;
** AVR Studio 4 &lt;br /&gt;
* JTAG ICE&lt;br /&gt;
** Atmel AVR JTAGICE MK2 &lt;br /&gt;
** AVR Dragon (z.B. http://elmicro.com/de/atavrdragon.html)&lt;br /&gt;
** Olimex-Seriell http://www.olimex.com/dev/avr-jtag.html  &lt;br /&gt;
** Olimex-USB http://www.olimex.com/dev/avr-usb-jtag.html &lt;br /&gt;
&lt;br /&gt;
= Sonstiges =&lt;br /&gt;
== Altes Protokoll ==&lt;br /&gt;
[[HR20_Protocol_V2 | Hier ]] hat mal einer ein Protokoll eingegeben.&lt;br /&gt;
Das scheint aber nicht zu der Version 2.04 zu passen. &lt;br /&gt;
Ich habe es nicht gelöscht, falls es jemanden interessiert.&lt;br /&gt;
== SVN Anleitung ==&lt;br /&gt;
Eine Anleitung was ein SVN ist und wie man es brauchen wir hier nicht.&lt;br /&gt;
Sonst müsste hier auch ein C-Kurs, Windows-Kurs, und Elektronik-Kurs hin.&lt;br /&gt;
&lt;br /&gt;
[[Category:Projekte|!]]&lt;/div&gt;</summary>
		<author><name>Dario</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=26464</id>
		<title>Heizungssteuerung mit Honeywell HR20</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=26464"/>
		<updated>2008-02-21T08:29:18Z</updated>

		<summary type="html">&lt;p&gt;Dario: /* Benötigte Module */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von DarioC&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Wie alles begann =&lt;br /&gt;
&lt;br /&gt;
Nachdem von Uwe Felgentreu vor nunmehr vor über drei Jahren (genau am 17.11.2004 um 11:26) hier in diesem Forum den Thread mit dem Titel &#039;&#039;Honeywell Rondostat HR20E per AVR steuern und konfigurieren&#039;&#039; gestartet hat ist es nun langsam soweit, dass das Ganze auch ein Projekt wird. &lt;br /&gt;
&lt;br /&gt;
Den Thread dazu kann der interessierte Leser [http://www.mikrocontroller.net/topic/17603 hier nachlesen] &lt;br /&gt;
&lt;br /&gt;
= Projektziel =&lt;br /&gt;
&lt;br /&gt;
Wir konzentrieren uns in erster Linie auf den Honeywell Rondostat HR20E mit ausgelieferten Softwareversion 2.04. Dass es ähnliche andere Geräte gibt behalten wir bei der Entwicklung im Hinterkopf.&lt;br /&gt;
&lt;br /&gt;
Basierend auf dieser Hardware wollen wir eine neue Software entwickeln. &lt;br /&gt;
Dabe können wir ausser der Hardware nichts weiter verwenden, da die Originalsoftware geschützt ist und nicht ausgelesen werden kann.&lt;br /&gt;
&lt;br /&gt;
== Phase 1 ==&lt;br /&gt;
Die Software soll die Funktionen bieten, die die Originalsoftware auch bietet, später können dies dann um zusätzliche Funktionen erweitert werden. Die wichtigsten Funktionen sind:&lt;br /&gt;
&lt;br /&gt;
* Temperaturregelung&lt;br /&gt;
* Echtzeituhr&lt;br /&gt;
* Ausnutzen der Sleep Funktion&lt;br /&gt;
* Anzeige Soll-Temperatur und der Uhrzeit&lt;br /&gt;
* Einstellung der Soll-Temperatur&lt;br /&gt;
* Uhrzeitgesteuerte Einstellung der Soll-Temperatur &lt;br /&gt;
* Fenster-Offen-Erkennung&lt;br /&gt;
* Ventilfreispülungsfunktion&lt;br /&gt;
&lt;br /&gt;
== Phase 2 ==&lt;br /&gt;
&lt;br /&gt;
Hier liegt der Sinn des ganzen Projektes: Durch diese zusätzlichen Funktionen wollen wir den Nutzwert des Thermostaten erheblich steigern:&lt;br /&gt;
&lt;br /&gt;
* Programmierung der Schaltzeiten und Temperaturen über externe Schnittstelle&lt;br /&gt;
* Abfrage der Messwerte und Parameter über externe Schnittstelle&lt;br /&gt;
* Vernetzung der Thermostaten untereinander&lt;br /&gt;
* Zusätzliche externe Schnittstellen (neben UART auch CAN und Funk)&lt;br /&gt;
* Erweiterung der Anzeige um&lt;br /&gt;
** Ist-Temperatur &lt;br /&gt;
** Ventilstellung&lt;br /&gt;
** Funkschnittstelle&lt;br /&gt;
*** RFM12 http://www.hoperf.com/rf_fsk.asp&lt;br /&gt;
*** Zigbee http://www.meshnetics.com/zigbee-modules&lt;br /&gt;
** ...&lt;br /&gt;
* Bootloader, damit Leute mitarbeiten können, die keine JTAG haben. Mit einem JTAG könnte man den Bootloader Flashen, ohne den Thermostaten öffnen zu müssen. Von da an kann man über den Programmierstecker mit einem umgebauten Handykabel den Thermostaten neu flashen.&lt;br /&gt;
&lt;br /&gt;
= Lizenz =&lt;br /&gt;
Die Software wird unter GPL v2 gestellt.&lt;br /&gt;
&lt;br /&gt;
= Subversion Repository =&lt;br /&gt;
Ein SVN Repository liegt auf dem freien SVN Server: https://opensvn.csie.org&lt;br /&gt;
== Zugangsdaten ==&lt;br /&gt;
Repository Location: https://OpenSVN.csie.org/hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
Browse Repository: https://OpenSVN.csie.org/viewcvs.cgi/?root=hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
TRAC: https://opensvn.csie.org/traccgi/hr20&lt;br /&gt;
== Policy ==&lt;br /&gt;
Anonymous check out ist erlaubt. &amp;lt;br&amp;gt;&lt;br /&gt;
Wer was committen will muss freigeschaltet werden. &amp;lt;br&amp;gt;&lt;br /&gt;
Dazu brauche ich ein &#039;&#039;Usernamen, Passwort&#039;&#039; und eine &#039;&#039;Mailadresse&#039;&#039;, dann kann ich das einrichten. &amp;lt;br&amp;gt;&lt;br /&gt;
Tragt Euch dazu einfach selber in die Tabelle ein, ich erledige dann den Rest.&amp;lt;br&amp;gt;&lt;br /&gt;
Das mache ich dann von Hand und da ich nicht alle 10 Minuten Mails bearbeite kann das auch schon mal einen oder zwei Tage dauern. &amp;lt;br&amp;gt;&lt;br /&gt;
Wenn sich ein Maintainer findet, gebe ich die Zugangsdaten gerne weiter.&lt;br /&gt;
== Entwickler ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! width=&amp;quot;150&amp;quot; | Entwickler&lt;br /&gt;
! width=&amp;quot;150&amp;quot; | svn Status&lt;br /&gt;
|-&lt;br /&gt;
| darioc&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|-&lt;br /&gt;
| louk&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|}&lt;br /&gt;
== Verzeichnisstruktur ==&lt;br /&gt;
Eine Verzeichnisstruktur ist auch schon angelegt und die ersten Daten auch drin. Hier die Verzeichnisse:&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
| &#039;&#039;&#039;/doc&#039;&#039;&#039;&lt;br /&gt;
| Für alles an Dokumenten, die selbst erstellt wurden. &amp;lt;br&amp;gt;&lt;br /&gt;
Specs, die man im Internet bekommen kann gehören hier nicht rein, &amp;lt;br&amp;gt;&lt;br /&gt;
die machen das alles nur unnötig gross und das auschecken dauert länger.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/playground&#039;&#039;&#039; &lt;br /&gt;
| Wie der Name schon sagt, zum rumspielen und testen. &amp;lt;br&amp;gt;&lt;br /&gt;
Hier kommt jegliche art von Codeschnipseln hin, die zu Testen da sind &amp;lt;br&amp;gt;&lt;br /&gt;
und (derzeit) noch icht Teil des Programmes sind.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/source&#039;&#039;&#039; &lt;br /&gt;
| Hier kommt die Applikation rein mit allen Modulen und makefiles.&amp;lt;br&amp;gt;&lt;br /&gt;
Bitte haltet das Repository sauber und checkt nur Dateien ein, &amp;lt;br&amp;gt;&lt;br /&gt;
die auch Sinn  machen, &amp;quot;thumbs.db&amp;quot; oder andere Temp-Dateien gehören hier nicht rein.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SVN Client und Anleitung ==&lt;br /&gt;
Windows-User nutzen am besten den Tortoise-SVN-Client, den man kostenfrei [http://tortoisesvn.tigris.org hier runterladen] kann. &amp;lt;br&amp;gt;&lt;br /&gt;
Dort gibt es auch eine Anleitung zum Arbeiten mit SVN.&lt;br /&gt;
&lt;br /&gt;
= Analyse der Hardware =&lt;br /&gt;
Die Analyse hat der Dario schon gemacht, zu finden ist die jeweils aktuelle Version &lt;br /&gt;
[http://www.carluccio.de/img/hr20/analyse.pdf als PDF hier] oder [https://opensvn.csie.org/viewcvs.cgi/doc/analyse.pdf hier im SVN].&lt;br /&gt;
&lt;br /&gt;
= Benötigte Module =&lt;br /&gt;
&lt;br /&gt;
Um das Ganze nun etwas zu koordinieren hier eine Liste der benötigten Module und deren Funktionen. &amp;lt;br&amp;gt;&lt;br /&gt;
Diese dient dazu später die Aufgaben zu verteilen:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Module&lt;br /&gt;
! Function&lt;br /&gt;
! Developer&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| LCD&lt;br /&gt;
| Display Driver:&amp;lt;BR&amp;gt;&lt;br /&gt;
* Init Display - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Set Segments - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Print HEX, DEC, TEMP, DayofWeek - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Blink - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* e.t.c&lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; DONE &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| LCD Simulation&lt;br /&gt;
| Simulation for display in AVR Studio:&amp;lt;BR&amp;gt;&lt;br /&gt;
* Defining Display - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039;  Done by D/L &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Assign Segments to register bits - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; Done by D/L &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Providing samplecode - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039;  Done by Dario &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; 95% &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| RTC&lt;br /&gt;
| Time and Date Handler&lt;br /&gt;
* init timer - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* use IRQ with 32kHz crystal - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* handle time and date - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** daylight saving - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** consult leapyear  - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* calc day of week out of date - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Only one Byte for Year -&amp;gt; (2000 to 2255)&lt;br /&gt;
* Day of week timer with callback - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* Tick counter (seconds since reboot) - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** used to detect long keypress&lt;br /&gt;
** used to detect motor blocked&lt;br /&gt;
** used for additional timer &lt;br /&gt;
* Additional timer based on tick counter value - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* corretion for external Crystal - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* calibrate internal RC - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE, but not tested &#039;&#039;&#039;&amp;lt;/span&amp;gt; &lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; (95%)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UART &lt;br /&gt;
| UART-Driver&lt;br /&gt;
* menue (Debug und Steuerung)&lt;br /&gt;
** show and set desired temperature &lt;br /&gt;
** show and set Time and Date&lt;br /&gt;
** show actual temperature&lt;br /&gt;
** show (and set) actual valveposition &lt;br /&gt;
** show and set timetable and temperatures&lt;br /&gt;
* optional &lt;br /&gt;
** adressierung of HR20 (for BUS, RF)&lt;br /&gt;
** authentication end encryption&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| CONFIG &lt;br /&gt;
| Save Config in EEPROM&lt;br /&gt;
* driver for EEPROM access&lt;br /&gt;
* save values to EEPROM &lt;br /&gt;
* load values from EEPROM &lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| MENU &lt;br /&gt;
| Control Menu State Machine&lt;br /&gt;
* show values on display&lt;br /&gt;
* functionality:&lt;br /&gt;
** show and set desired temperature&lt;br /&gt;
** show and set time and date &lt;br /&gt;
** show actual temperature&lt;br /&gt;
** show actual valveposition &lt;br /&gt;
** show and set timetable and temperatures&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| MAIN&lt;br /&gt;
| Main Loop&lt;br /&gt;
* init everything&lt;br /&gt;
** global vars - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** rtc - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** lcd - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** motor - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** tempsensor &lt;br /&gt;
* get keystate - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE (ISR in main.c)&#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** debounce - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039;not needed&#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** multi keypress (nedded for hidden menue?) - &lt;br /&gt;
** longer keypress / double click (nedded?)&lt;br /&gt;
* get position of wheel (incremental counter) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE (ISR in main.c)&#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
* call menue&lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| MOTOR&lt;br /&gt;
| Motor-Driver &lt;br /&gt;
* set desired valveposition  - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** quick, asympthotic, quiet - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE (speed can be chosen) &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* callibrate for Valve - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt; &lt;br /&gt;
** optimised (less motor consumption depending on desired final position) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Stop motor if not turning (blocked) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* stop calibration if valve is removed - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Genereate ERROR if motor is not turning (blocked or low energy) - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color:yellow;&amp;quot; | &#039;&#039;&#039; dario &#039;&#039;&#039; &lt;br /&gt;
&#039;&#039;&#039; active &#039;&#039;&#039; &lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; (95%)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| TEMP&lt;br /&gt;
| Temperaturesensor-Driver &lt;br /&gt;
* init Sensor &lt;br /&gt;
* IRQ driven (500ms)&lt;br /&gt;
* start A/D conversion (IQR driven)&lt;br /&gt;
* get A/D Value and calc temperature&lt;br /&gt;
* calibration for sensor (needed?)&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| PID&lt;br /&gt;
| PID Algorithm&lt;br /&gt;
* calculate desired valveposition out of&lt;br /&gt;
** last valveposition(s) &lt;br /&gt;
** last temperature(s)&lt;br /&gt;
** actual temperature&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| BOOT&lt;br /&gt;
| Bootloader&lt;br /&gt;
we need a bootloader so that the developers can flash the software &lt;br /&gt;
without a JTAG cable and without disassembling the HR20.&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| LOG&lt;br /&gt;
| Datalogger&lt;br /&gt;
* Operating Hours&lt;br /&gt;
** motor in action&lt;br /&gt;
** ODOmeter&lt;br /&gt;
** since Battery Exchange&lt;br /&gt;
* Errors&lt;br /&gt;
* Logfiles (only with additional hardware)&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UID&lt;br /&gt;
| Unique ID for identification&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= API Beschreibung =&lt;br /&gt;
== LCD ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Funtion&lt;br /&gt;
! Propose&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Init(void);            &lt;br /&gt;
|Init the LCD Controller&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_AllSegments(uint8_t);&lt;br /&gt;
|Set all segments to LCD_MODE&lt;br /&gt;
| done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearAll(void);                       &lt;br /&gt;
|Clear all segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearHour_Bar(void);&lt;br /&gt;
|Clear 24 bar segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearSymbols(void);&lt;br /&gt;
|Clear AUTO MANU PROG SUN MOON SNOW&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearNumbers(void);&lt;br /&gt;
|Clear 7 Segments ans Collumns&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintDec(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print DEC-val in two 7 Segments 0-99&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintHex(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print HEX-val in two 7 Segments 0-ff&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintNo(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print one ditig in one 7 Segment&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintTemp(uint8_t, uint8_t);&lt;br /&gt;
|Print desired temperature (val+4,9)°C&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetSeg(uint8_t, uint8_t);          &lt;br /&gt;
|Set one segment to LCD_MODE (0-69)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetHourBarSeg(uint8_t, uint8_t);    &lt;br /&gt;
|Set one hour bar segment to LCD_MODE (0-23)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetHourBarVal(uint8_t, uint8_t);&lt;br /&gt;
|Set one (val) hour bar segment to LCD_MODE (0-23) reset all other segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetHourBarBar(uint8_t, uint8_t);&lt;br /&gt;
|Set all hour bar segments from 0 to val to LCD_MODE (0-23)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Update(void);                        &lt;br /&gt;
|Request immidiate LCD-Update (normal only when bitplane changes)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t LCD_ContrastAdjust (int8_t);           &lt;br /&gt;
|Adjust the contrast&lt;br /&gt;
|&#039;&#039;&#039;not tested yet&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== RTC ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Funtion&lt;br /&gt;
! Propose&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_Init(RTC_CALLBACK_FUNC);            &lt;br /&gt;
|Sart Timer, activate 500ms IRQ, set callback Function for Dow_Timer&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetHour(void);                    &lt;br /&gt;
|Get Hour&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetMinute(void);                   &lt;br /&gt;
|Get Minute&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetSecond(void);                   &lt;br /&gt;
|Get Second&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetDay(void);                      &lt;br /&gt;
|Get Day&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetMonth(void);                    &lt;br /&gt;
|Get Month&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetYearYY(void);                     &lt;br /&gt;
|Get Year (00-255)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetDayOfWeek(void);                &lt;br /&gt;
|Get Day of Week (0:Monday)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint16_t RTC_GetYearYYYY(void);               &lt;br /&gt;
|Get Year (2000-2255)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetHour(uint8_t);                     &lt;br /&gt;
|Set Hour&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetMinute(uint8_t);                   &lt;br /&gt;
|Set Minute&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetSecond(uint8_t);                   &lt;br /&gt;
|Set Second&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetDay(uint8_t);                      &lt;br /&gt;
|Set Day&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetMonth(uint8_t);                    &lt;br /&gt;
|Set Month&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetYear(uint8_t);                     &lt;br /&gt;
|Set Year&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void    RTC_DowTimerSet(rtc_dow_t, uint8_t, uint8_t); &lt;br /&gt;
|set day of week timer&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_DowTimerGet(rtc_dow_t, uint8_t);         &lt;br /&gt;
|get day of week timer&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_DowTimerGetStartOfDay(void);              &lt;br /&gt;
|timer status start of day&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_DowTimerGetActualIndex(void);         &lt;br /&gt;
|timer status now&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_CalibrateRCO(void);&lt;br /&gt;
|calibrate internal rco&lt;br /&gt;
|&#039;&#039;&#039;not tested yet&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
Dow_Timer &lt;br /&gt;
* there are 28 DOW timers (for each DOW 4 Timers)&lt;br /&gt;
* Each timer can be set to a time (multiple of 10 minutes) &lt;br /&gt;
**  time is stored in a byte with the format hh*10+mm/10 e.g.: &lt;br /&gt;
**  10:10=110, 23:50=235, 255=disable&lt;br /&gt;
* when actual time and DOW is eaqual to a timer time and DOW, then &lt;br /&gt;
** callback function is called (during Timer IRQ) with timerindex as argument &lt;br /&gt;
&lt;br /&gt;
= Entwicklungsumgebung =&lt;br /&gt;
* Editor, Debugger, Compiler&lt;br /&gt;
** WinAVR version (20071221), sprich GCC 4.2.2 sowie avr-libc 1.6.0&lt;br /&gt;
** AVR Studio 4 &lt;br /&gt;
* JTAG ICE&lt;br /&gt;
** Atmel AVR JTAGICE MK2 &lt;br /&gt;
** AVR Dragon (z.B. http://elmicro.com/de/atavrdragon.html)&lt;br /&gt;
** Olimex-Seriell http://www.olimex.com/dev/avr-jtag.html  &lt;br /&gt;
** Olimex-USB http://www.olimex.com/dev/avr-usb-jtag.html &lt;br /&gt;
&lt;br /&gt;
= Sonstiges =&lt;br /&gt;
== Altes Protokoll ==&lt;br /&gt;
[[HR20_Protocol_V2 | Hier ]] hat mal einer ein Protokoll eingegeben.&lt;br /&gt;
Das scheint aber nicht zu der Version 2.04 zu passen. &lt;br /&gt;
Ich habe es nicht gelöscht, falls es jemanden interessiert.&lt;br /&gt;
== SVN Anleitung ==&lt;br /&gt;
Eine Anleitung was ein SVN ist und wie man es brauchen wir hier nicht.&lt;br /&gt;
Sonst müsste hier auch ein C-Kurs, Windows-Kurs, und Elektronik-Kurs hin.&lt;br /&gt;
&lt;br /&gt;
[[Category:Projekte|!]]&lt;/div&gt;</summary>
		<author><name>Dario</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=26463</id>
		<title>Heizungssteuerung mit Honeywell HR20</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=26463"/>
		<updated>2008-02-21T08:28:43Z</updated>

		<summary type="html">&lt;p&gt;Dario: /* Benötigte Module */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von DarioC&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Wie alles begann =&lt;br /&gt;
&lt;br /&gt;
Nachdem von Uwe Felgentreu vor nunmehr vor über drei Jahren (genau am 17.11.2004 um 11:26) hier in diesem Forum den Thread mit dem Titel &#039;&#039;Honeywell Rondostat HR20E per AVR steuern und konfigurieren&#039;&#039; gestartet hat ist es nun langsam soweit, dass das Ganze auch ein Projekt wird. &lt;br /&gt;
&lt;br /&gt;
Den Thread dazu kann der interessierte Leser [http://www.mikrocontroller.net/topic/17603 hier nachlesen] &lt;br /&gt;
&lt;br /&gt;
= Projektziel =&lt;br /&gt;
&lt;br /&gt;
Wir konzentrieren uns in erster Linie auf den Honeywell Rondostat HR20E mit ausgelieferten Softwareversion 2.04. Dass es ähnliche andere Geräte gibt behalten wir bei der Entwicklung im Hinterkopf.&lt;br /&gt;
&lt;br /&gt;
Basierend auf dieser Hardware wollen wir eine neue Software entwickeln. &lt;br /&gt;
Dabe können wir ausser der Hardware nichts weiter verwenden, da die Originalsoftware geschützt ist und nicht ausgelesen werden kann.&lt;br /&gt;
&lt;br /&gt;
== Phase 1 ==&lt;br /&gt;
Die Software soll die Funktionen bieten, die die Originalsoftware auch bietet, später können dies dann um zusätzliche Funktionen erweitert werden. Die wichtigsten Funktionen sind:&lt;br /&gt;
&lt;br /&gt;
* Temperaturregelung&lt;br /&gt;
* Echtzeituhr&lt;br /&gt;
* Ausnutzen der Sleep Funktion&lt;br /&gt;
* Anzeige Soll-Temperatur und der Uhrzeit&lt;br /&gt;
* Einstellung der Soll-Temperatur&lt;br /&gt;
* Uhrzeitgesteuerte Einstellung der Soll-Temperatur &lt;br /&gt;
* Fenster-Offen-Erkennung&lt;br /&gt;
* Ventilfreispülungsfunktion&lt;br /&gt;
&lt;br /&gt;
== Phase 2 ==&lt;br /&gt;
&lt;br /&gt;
Hier liegt der Sinn des ganzen Projektes: Durch diese zusätzlichen Funktionen wollen wir den Nutzwert des Thermostaten erheblich steigern:&lt;br /&gt;
&lt;br /&gt;
* Programmierung der Schaltzeiten und Temperaturen über externe Schnittstelle&lt;br /&gt;
* Abfrage der Messwerte und Parameter über externe Schnittstelle&lt;br /&gt;
* Vernetzung der Thermostaten untereinander&lt;br /&gt;
* Zusätzliche externe Schnittstellen (neben UART auch CAN und Funk)&lt;br /&gt;
* Erweiterung der Anzeige um&lt;br /&gt;
** Ist-Temperatur &lt;br /&gt;
** Ventilstellung&lt;br /&gt;
** Funkschnittstelle&lt;br /&gt;
*** RFM12 http://www.hoperf.com/rf_fsk.asp&lt;br /&gt;
*** Zigbee http://www.meshnetics.com/zigbee-modules&lt;br /&gt;
** ...&lt;br /&gt;
* Bootloader, damit Leute mitarbeiten können, die keine JTAG haben. Mit einem JTAG könnte man den Bootloader Flashen, ohne den Thermostaten öffnen zu müssen. Von da an kann man über den Programmierstecker mit einem umgebauten Handykabel den Thermostaten neu flashen.&lt;br /&gt;
&lt;br /&gt;
= Lizenz =&lt;br /&gt;
Die Software wird unter GPL v2 gestellt.&lt;br /&gt;
&lt;br /&gt;
= Subversion Repository =&lt;br /&gt;
Ein SVN Repository liegt auf dem freien SVN Server: https://opensvn.csie.org&lt;br /&gt;
== Zugangsdaten ==&lt;br /&gt;
Repository Location: https://OpenSVN.csie.org/hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
Browse Repository: https://OpenSVN.csie.org/viewcvs.cgi/?root=hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
TRAC: https://opensvn.csie.org/traccgi/hr20&lt;br /&gt;
== Policy ==&lt;br /&gt;
Anonymous check out ist erlaubt. &amp;lt;br&amp;gt;&lt;br /&gt;
Wer was committen will muss freigeschaltet werden. &amp;lt;br&amp;gt;&lt;br /&gt;
Dazu brauche ich ein &#039;&#039;Usernamen, Passwort&#039;&#039; und eine &#039;&#039;Mailadresse&#039;&#039;, dann kann ich das einrichten. &amp;lt;br&amp;gt;&lt;br /&gt;
Tragt Euch dazu einfach selber in die Tabelle ein, ich erledige dann den Rest.&amp;lt;br&amp;gt;&lt;br /&gt;
Das mache ich dann von Hand und da ich nicht alle 10 Minuten Mails bearbeite kann das auch schon mal einen oder zwei Tage dauern. &amp;lt;br&amp;gt;&lt;br /&gt;
Wenn sich ein Maintainer findet, gebe ich die Zugangsdaten gerne weiter.&lt;br /&gt;
== Entwickler ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! width=&amp;quot;150&amp;quot; | Entwickler&lt;br /&gt;
! width=&amp;quot;150&amp;quot; | svn Status&lt;br /&gt;
|-&lt;br /&gt;
| darioc&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|-&lt;br /&gt;
| louk&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|}&lt;br /&gt;
== Verzeichnisstruktur ==&lt;br /&gt;
Eine Verzeichnisstruktur ist auch schon angelegt und die ersten Daten auch drin. Hier die Verzeichnisse:&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
| &#039;&#039;&#039;/doc&#039;&#039;&#039;&lt;br /&gt;
| Für alles an Dokumenten, die selbst erstellt wurden. &amp;lt;br&amp;gt;&lt;br /&gt;
Specs, die man im Internet bekommen kann gehören hier nicht rein, &amp;lt;br&amp;gt;&lt;br /&gt;
die machen das alles nur unnötig gross und das auschecken dauert länger.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/playground&#039;&#039;&#039; &lt;br /&gt;
| Wie der Name schon sagt, zum rumspielen und testen. &amp;lt;br&amp;gt;&lt;br /&gt;
Hier kommt jegliche art von Codeschnipseln hin, die zu Testen da sind &amp;lt;br&amp;gt;&lt;br /&gt;
und (derzeit) noch icht Teil des Programmes sind.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/source&#039;&#039;&#039; &lt;br /&gt;
| Hier kommt die Applikation rein mit allen Modulen und makefiles.&amp;lt;br&amp;gt;&lt;br /&gt;
Bitte haltet das Repository sauber und checkt nur Dateien ein, &amp;lt;br&amp;gt;&lt;br /&gt;
die auch Sinn  machen, &amp;quot;thumbs.db&amp;quot; oder andere Temp-Dateien gehören hier nicht rein.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SVN Client und Anleitung ==&lt;br /&gt;
Windows-User nutzen am besten den Tortoise-SVN-Client, den man kostenfrei [http://tortoisesvn.tigris.org hier runterladen] kann. &amp;lt;br&amp;gt;&lt;br /&gt;
Dort gibt es auch eine Anleitung zum Arbeiten mit SVN.&lt;br /&gt;
&lt;br /&gt;
= Analyse der Hardware =&lt;br /&gt;
Die Analyse hat der Dario schon gemacht, zu finden ist die jeweils aktuelle Version &lt;br /&gt;
[http://www.carluccio.de/img/hr20/analyse.pdf als PDF hier] oder [https://opensvn.csie.org/viewcvs.cgi/doc/analyse.pdf hier im SVN].&lt;br /&gt;
&lt;br /&gt;
= Benötigte Module =&lt;br /&gt;
&lt;br /&gt;
Um das Ganze nun etwas zu koordinieren hier eine Liste der benötigten Module und deren Funktionen. &amp;lt;br&amp;gt;&lt;br /&gt;
Diese dient dazu später die Aufgaben zu verteilen:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Module&lt;br /&gt;
! Function&lt;br /&gt;
! Developer&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| LCD&lt;br /&gt;
| Display Driver:&amp;lt;BR&amp;gt;&lt;br /&gt;
* Init Display - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Set Segments - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Print HEX, DEC, TEMP, DayofWeek - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Blink - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* e.t.c&lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; DONE &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| LCD Simulation&lt;br /&gt;
| Simulation for display in AVR Studio:&amp;lt;BR&amp;gt;&lt;br /&gt;
* Defining Display - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039;  Done by D/L &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Assign Segments to register bits - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; Done by D/L &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Providing samplecode - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039;  Done by Dario &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* Darker segment color&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; 95% &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| RTC&lt;br /&gt;
| Time and Date Handler&lt;br /&gt;
* init timer - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* use IRQ with 32kHz crystal - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* handle time and date - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** daylight saving - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** consult leapyear  - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* calc day of week out of date - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Only one Byte for Year -&amp;gt; (2000 to 2255)&lt;br /&gt;
* Day of week timer with callback - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* Tick counter (seconds since reboot) - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** used to detect long keypress&lt;br /&gt;
** used to detect motor blocked&lt;br /&gt;
** used for additional timer &lt;br /&gt;
* Additional timer based on tick counter value - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* corretion for external Crystal - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* calibrate internal RC - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE, but not tested &#039;&#039;&#039;&amp;lt;/span&amp;gt; &lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; (95%)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UART &lt;br /&gt;
| UART-Driver&lt;br /&gt;
* menue (Debug und Steuerung)&lt;br /&gt;
** show and set desired temperature &lt;br /&gt;
** show and set Time and Date&lt;br /&gt;
** show actual temperature&lt;br /&gt;
** show (and set) actual valveposition &lt;br /&gt;
** show and set timetable and temperatures&lt;br /&gt;
* optional &lt;br /&gt;
** adressierung of HR20 (for BUS, RF)&lt;br /&gt;
** authentication end encryption&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| CONFIG &lt;br /&gt;
| Save Config in EEPROM&lt;br /&gt;
* driver for EEPROM access&lt;br /&gt;
* save values to EEPROM &lt;br /&gt;
* load values from EEPROM &lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| MENU &lt;br /&gt;
| Control Menu State Machine&lt;br /&gt;
* show values on display&lt;br /&gt;
* functionality:&lt;br /&gt;
** show and set desired temperature&lt;br /&gt;
** show and set time and date &lt;br /&gt;
** show actual temperature&lt;br /&gt;
** show actual valveposition &lt;br /&gt;
** show and set timetable and temperatures&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| MAIN&lt;br /&gt;
| Main Loop&lt;br /&gt;
* init everything&lt;br /&gt;
** global vars - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** rtc - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** lcd - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** motor - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** tempsensor &lt;br /&gt;
* get keystate - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE (ISR in main.c)&#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** debounce - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039;not needed&#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** multi keypress (nedded for hidden menue?) - &lt;br /&gt;
** longer keypress / double click (nedded?)&lt;br /&gt;
* get position of wheel (incremental counter) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE (ISR in main.c)&#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
* call menue&lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| MOTOR&lt;br /&gt;
| Motor-Driver &lt;br /&gt;
* set desired valveposition  - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** quick, asympthotic, quiet - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE (speed can be chosen) &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* callibrate for Valve - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt; &lt;br /&gt;
** optimised (less motor consumption depending on desired final position) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Stop motor if not turning (blocked) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* stop calibration if valve is removed - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Genereate ERROR if motor is not turning (blocked or low energy) - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color:yellow;&amp;quot; | &#039;&#039;&#039; dario &#039;&#039;&#039; &lt;br /&gt;
&#039;&#039;&#039; active &#039;&#039;&#039; &lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; (95%)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| TEMP&lt;br /&gt;
| Temperaturesensor-Driver &lt;br /&gt;
* init Sensor &lt;br /&gt;
* IRQ driven (500ms)&lt;br /&gt;
* start A/D conversion (IQR driven)&lt;br /&gt;
* get A/D Value and calc temperature&lt;br /&gt;
* calibration for sensor (needed?)&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| PID&lt;br /&gt;
| PID Algorithm&lt;br /&gt;
* calculate desired valveposition out of&lt;br /&gt;
** last valveposition(s) &lt;br /&gt;
** last temperature(s)&lt;br /&gt;
** actual temperature&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| BOOT&lt;br /&gt;
| Bootloader&lt;br /&gt;
we need a bootloader so that the developers can flash the software &lt;br /&gt;
without a JTAG cable and without disassembling the HR20.&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| LOG&lt;br /&gt;
| Datalogger&lt;br /&gt;
* Operating Hours&lt;br /&gt;
** motor in action&lt;br /&gt;
** ODOmeter&lt;br /&gt;
** since Battery Exchange&lt;br /&gt;
* Errors&lt;br /&gt;
* Logfiles (only with additional hardware)&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UID&lt;br /&gt;
| Unique ID for identification&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= API Beschreibung =&lt;br /&gt;
== LCD ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Funtion&lt;br /&gt;
! Propose&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Init(void);            &lt;br /&gt;
|Init the LCD Controller&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_AllSegments(uint8_t);&lt;br /&gt;
|Set all segments to LCD_MODE&lt;br /&gt;
| done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearAll(void);                       &lt;br /&gt;
|Clear all segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearHour_Bar(void);&lt;br /&gt;
|Clear 24 bar segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearSymbols(void);&lt;br /&gt;
|Clear AUTO MANU PROG SUN MOON SNOW&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearNumbers(void);&lt;br /&gt;
|Clear 7 Segments ans Collumns&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintDec(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print DEC-val in two 7 Segments 0-99&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintHex(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print HEX-val in two 7 Segments 0-ff&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintNo(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print one ditig in one 7 Segment&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintTemp(uint8_t, uint8_t);&lt;br /&gt;
|Print desired temperature (val+4,9)°C&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetSeg(uint8_t, uint8_t);          &lt;br /&gt;
|Set one segment to LCD_MODE (0-69)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetHourBarSeg(uint8_t, uint8_t);    &lt;br /&gt;
|Set one hour bar segment to LCD_MODE (0-23)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetHourBarVal(uint8_t, uint8_t);&lt;br /&gt;
|Set one (val) hour bar segment to LCD_MODE (0-23) reset all other segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetHourBarBar(uint8_t, uint8_t);&lt;br /&gt;
|Set all hour bar segments from 0 to val to LCD_MODE (0-23)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Update(void);                        &lt;br /&gt;
|Request immidiate LCD-Update (normal only when bitplane changes)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t LCD_ContrastAdjust (int8_t);           &lt;br /&gt;
|Adjust the contrast&lt;br /&gt;
|&#039;&#039;&#039;not tested yet&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== RTC ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Funtion&lt;br /&gt;
! Propose&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_Init(RTC_CALLBACK_FUNC);            &lt;br /&gt;
|Sart Timer, activate 500ms IRQ, set callback Function for Dow_Timer&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetHour(void);                    &lt;br /&gt;
|Get Hour&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetMinute(void);                   &lt;br /&gt;
|Get Minute&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetSecond(void);                   &lt;br /&gt;
|Get Second&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetDay(void);                      &lt;br /&gt;
|Get Day&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetMonth(void);                    &lt;br /&gt;
|Get Month&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetYearYY(void);                     &lt;br /&gt;
|Get Year (00-255)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetDayOfWeek(void);                &lt;br /&gt;
|Get Day of Week (0:Monday)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint16_t RTC_GetYearYYYY(void);               &lt;br /&gt;
|Get Year (2000-2255)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetHour(uint8_t);                     &lt;br /&gt;
|Set Hour&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetMinute(uint8_t);                   &lt;br /&gt;
|Set Minute&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetSecond(uint8_t);                   &lt;br /&gt;
|Set Second&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetDay(uint8_t);                      &lt;br /&gt;
|Set Day&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetMonth(uint8_t);                    &lt;br /&gt;
|Set Month&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetYear(uint8_t);                     &lt;br /&gt;
|Set Year&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void    RTC_DowTimerSet(rtc_dow_t, uint8_t, uint8_t); &lt;br /&gt;
|set day of week timer&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_DowTimerGet(rtc_dow_t, uint8_t);         &lt;br /&gt;
|get day of week timer&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_DowTimerGetStartOfDay(void);              &lt;br /&gt;
|timer status start of day&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_DowTimerGetActualIndex(void);         &lt;br /&gt;
|timer status now&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_CalibrateRCO(void);&lt;br /&gt;
|calibrate internal rco&lt;br /&gt;
|&#039;&#039;&#039;not tested yet&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
Dow_Timer &lt;br /&gt;
* there are 28 DOW timers (for each DOW 4 Timers)&lt;br /&gt;
* Each timer can be set to a time (multiple of 10 minutes) &lt;br /&gt;
**  time is stored in a byte with the format hh*10+mm/10 e.g.: &lt;br /&gt;
**  10:10=110, 23:50=235, 255=disable&lt;br /&gt;
* when actual time and DOW is eaqual to a timer time and DOW, then &lt;br /&gt;
** callback function is called (during Timer IRQ) with timerindex as argument &lt;br /&gt;
&lt;br /&gt;
= Entwicklungsumgebung =&lt;br /&gt;
* Editor, Debugger, Compiler&lt;br /&gt;
** WinAVR version (20071221), sprich GCC 4.2.2 sowie avr-libc 1.6.0&lt;br /&gt;
** AVR Studio 4 &lt;br /&gt;
* JTAG ICE&lt;br /&gt;
** Atmel AVR JTAGICE MK2 &lt;br /&gt;
** AVR Dragon (z.B. http://elmicro.com/de/atavrdragon.html)&lt;br /&gt;
** Olimex-Seriell http://www.olimex.com/dev/avr-jtag.html  &lt;br /&gt;
** Olimex-USB http://www.olimex.com/dev/avr-usb-jtag.html &lt;br /&gt;
&lt;br /&gt;
= Sonstiges =&lt;br /&gt;
== Altes Protokoll ==&lt;br /&gt;
[[HR20_Protocol_V2 | Hier ]] hat mal einer ein Protokoll eingegeben.&lt;br /&gt;
Das scheint aber nicht zu der Version 2.04 zu passen. &lt;br /&gt;
Ich habe es nicht gelöscht, falls es jemanden interessiert.&lt;br /&gt;
== SVN Anleitung ==&lt;br /&gt;
Eine Anleitung was ein SVN ist und wie man es brauchen wir hier nicht.&lt;br /&gt;
Sonst müsste hier auch ein C-Kurs, Windows-Kurs, und Elektronik-Kurs hin.&lt;br /&gt;
&lt;br /&gt;
[[Category:Projekte|!]]&lt;/div&gt;</summary>
		<author><name>Dario</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=26461</id>
		<title>Heizungssteuerung mit Honeywell HR20</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=26461"/>
		<updated>2008-02-21T08:21:50Z</updated>

		<summary type="html">&lt;p&gt;Dario: /* Benötigte Module */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von DarioC&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Wie alles begann =&lt;br /&gt;
&lt;br /&gt;
Nachdem von Uwe Felgentreu vor nunmehr vor über drei Jahren (genau am 17.11.2004 um 11:26) hier in diesem Forum den Thread mit dem Titel &#039;&#039;Honeywell Rondostat HR20E per AVR steuern und konfigurieren&#039;&#039; gestartet hat ist es nun langsam soweit, dass das Ganze auch ein Projekt wird. &lt;br /&gt;
&lt;br /&gt;
Den Thread dazu kann der interessierte Leser [http://www.mikrocontroller.net/topic/17603 hier nachlesen] &lt;br /&gt;
&lt;br /&gt;
= Projektziel =&lt;br /&gt;
&lt;br /&gt;
Wir konzentrieren uns in erster Linie auf den Honeywell Rondostat HR20E mit ausgelieferten Softwareversion 2.04. Dass es ähnliche andere Geräte gibt behalten wir bei der Entwicklung im Hinterkopf.&lt;br /&gt;
&lt;br /&gt;
Basierend auf dieser Hardware wollen wir eine neue Software entwickeln. &lt;br /&gt;
Dabe können wir ausser der Hardware nichts weiter verwenden, da die Originalsoftware geschützt ist und nicht ausgelesen werden kann.&lt;br /&gt;
&lt;br /&gt;
== Phase 1 ==&lt;br /&gt;
Die Software soll die Funktionen bieten, die die Originalsoftware auch bietet, später können dies dann um zusätzliche Funktionen erweitert werden. Die wichtigsten Funktionen sind:&lt;br /&gt;
&lt;br /&gt;
* Temperaturregelung&lt;br /&gt;
* Echtzeituhr&lt;br /&gt;
* Ausnutzen der Sleep Funktion&lt;br /&gt;
* Anzeige Soll-Temperatur und der Uhrzeit&lt;br /&gt;
* Einstellung der Soll-Temperatur&lt;br /&gt;
* Uhrzeitgesteuerte Einstellung der Soll-Temperatur &lt;br /&gt;
* Fenster-Offen-Erkennung&lt;br /&gt;
* Ventilfreispülungsfunktion&lt;br /&gt;
&lt;br /&gt;
== Phase 2 ==&lt;br /&gt;
&lt;br /&gt;
Hier liegt der Sinn des ganzen Projektes: Durch diese zusätzlichen Funktionen wollen wir den Nutzwert des Thermostaten erheblich steigern:&lt;br /&gt;
&lt;br /&gt;
* Programmierung der Schaltzeiten und Temperaturen über externe Schnittstelle&lt;br /&gt;
* Abfrage der Messwerte und Parameter über externe Schnittstelle&lt;br /&gt;
* Vernetzung der Thermostaten untereinander&lt;br /&gt;
* Zusätzliche externe Schnittstellen (neben UART auch CAN und Funk)&lt;br /&gt;
* Erweiterung der Anzeige um&lt;br /&gt;
** Ist-Temperatur &lt;br /&gt;
** Ventilstellung&lt;br /&gt;
** Funkschnittstelle&lt;br /&gt;
*** RFM12 http://www.hoperf.com/rf_fsk.asp&lt;br /&gt;
*** Zigbee http://www.meshnetics.com/zigbee-modules&lt;br /&gt;
** ...&lt;br /&gt;
* Bootloader, damit Leute mitarbeiten können, die keine JTAG haben. Mit einem JTAG könnte man den Bootloader Flashen, ohne den Thermostaten öffnen zu müssen. Von da an kann man über den Programmierstecker mit einem umgebauten Handykabel den Thermostaten neu flashen.&lt;br /&gt;
&lt;br /&gt;
= Lizenz =&lt;br /&gt;
Die Software wird unter GPL v2 gestellt.&lt;br /&gt;
&lt;br /&gt;
= Subversion Repository =&lt;br /&gt;
Ein SVN Repository liegt auf dem freien SVN Server: https://opensvn.csie.org&lt;br /&gt;
== Zugangsdaten ==&lt;br /&gt;
Repository Location: https://OpenSVN.csie.org/hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
Browse Repository: https://OpenSVN.csie.org/viewcvs.cgi/?root=hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
TRAC: https://opensvn.csie.org/traccgi/hr20&lt;br /&gt;
== Policy ==&lt;br /&gt;
Anonymous check out ist erlaubt. &amp;lt;br&amp;gt;&lt;br /&gt;
Wer was committen will muss freigeschaltet werden. &amp;lt;br&amp;gt;&lt;br /&gt;
Dazu brauche ich ein &#039;&#039;Usernamen, Passwort&#039;&#039; und eine &#039;&#039;Mailadresse&#039;&#039;, dann kann ich das einrichten. &amp;lt;br&amp;gt;&lt;br /&gt;
Tragt Euch dazu einfach selber in die Tabelle ein, ich erledige dann den Rest.&amp;lt;br&amp;gt;&lt;br /&gt;
Das mache ich dann von Hand und da ich nicht alle 10 Minuten Mails bearbeite kann das auch schon mal einen oder zwei Tage dauern. &amp;lt;br&amp;gt;&lt;br /&gt;
Wenn sich ein Maintainer findet, gebe ich die Zugangsdaten gerne weiter.&lt;br /&gt;
== Entwickler ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! width=&amp;quot;150&amp;quot; | Entwickler&lt;br /&gt;
! width=&amp;quot;150&amp;quot; | svn Status&lt;br /&gt;
|-&lt;br /&gt;
| darioc&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|-&lt;br /&gt;
| louk&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|}&lt;br /&gt;
== Verzeichnisstruktur ==&lt;br /&gt;
Eine Verzeichnisstruktur ist auch schon angelegt und die ersten Daten auch drin. Hier die Verzeichnisse:&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
| &#039;&#039;&#039;/doc&#039;&#039;&#039;&lt;br /&gt;
| Für alles an Dokumenten, die selbst erstellt wurden. &amp;lt;br&amp;gt;&lt;br /&gt;
Specs, die man im Internet bekommen kann gehören hier nicht rein, &amp;lt;br&amp;gt;&lt;br /&gt;
die machen das alles nur unnötig gross und das auschecken dauert länger.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/playground&#039;&#039;&#039; &lt;br /&gt;
| Wie der Name schon sagt, zum rumspielen und testen. &amp;lt;br&amp;gt;&lt;br /&gt;
Hier kommt jegliche art von Codeschnipseln hin, die zu Testen da sind &amp;lt;br&amp;gt;&lt;br /&gt;
und (derzeit) noch icht Teil des Programmes sind.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/source&#039;&#039;&#039; &lt;br /&gt;
| Hier kommt die Applikation rein mit allen Modulen und makefiles.&amp;lt;br&amp;gt;&lt;br /&gt;
Bitte haltet das Repository sauber und checkt nur Dateien ein, &amp;lt;br&amp;gt;&lt;br /&gt;
die auch Sinn  machen, &amp;quot;thumbs.db&amp;quot; oder andere Temp-Dateien gehören hier nicht rein.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SVN Client und Anleitung ==&lt;br /&gt;
Windows-User nutzen am besten den Tortoise-SVN-Client, den man kostenfrei [http://tortoisesvn.tigris.org hier runterladen] kann. &amp;lt;br&amp;gt;&lt;br /&gt;
Dort gibt es auch eine Anleitung zum Arbeiten mit SVN.&lt;br /&gt;
&lt;br /&gt;
= Analyse der Hardware =&lt;br /&gt;
Die Analyse hat der Dario schon gemacht, zu finden ist die jeweils aktuelle Version &lt;br /&gt;
[http://www.carluccio.de/img/hr20/analyse.pdf als PDF hier] oder [https://opensvn.csie.org/viewcvs.cgi/doc/analyse.pdf hier im SVN].&lt;br /&gt;
&lt;br /&gt;
= Benötigte Module =&lt;br /&gt;
&lt;br /&gt;
Um das Ganze nun etwas zu koordinieren hier eine Liste der benötigten Module und deren Funktionen. &amp;lt;br&amp;gt;&lt;br /&gt;
Diese dient dazu später die Aufgaben zu verteilen:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Module&lt;br /&gt;
! Function&lt;br /&gt;
! Developer&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| LCD&lt;br /&gt;
| Display Driver:&amp;lt;BR&amp;gt;&lt;br /&gt;
* Init Display - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Set Segments - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Print HEX, DEC, TEMP, DayofWeek - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Blink - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* e.t.c&lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; DONE &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| LCD Simulation&lt;br /&gt;
| Simulation for display in AVR Studio:&amp;lt;BR&amp;gt;&lt;br /&gt;
* Defining Display - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039;  Done by D/L &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Assign Segments to register bits - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; Done by D/L &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Providing samplecode - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039;  Done by Dario &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* Darker segment color&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; 95% &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| RTC&lt;br /&gt;
| Time and Date Handler&lt;br /&gt;
* init timer - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* use IRQ with 32kHz crystal - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* handle time and date - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** daylight saving - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** consult leapyear  - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* calc day of week out of date - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Only one Byte for Year -&amp;gt; (2000 to 2255)&lt;br /&gt;
* Day of week timer with callback - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* corretion for external Crystal - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* calibrate internal RC - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE, but not tested &#039;&#039;&#039;&amp;lt;/span&amp;gt; &lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; (95%)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UART &lt;br /&gt;
| UART-Driver&lt;br /&gt;
* menue (Debug und Steuerung)&lt;br /&gt;
** show and set desired temperature &lt;br /&gt;
** show and set Time and Date&lt;br /&gt;
** show actual temperature&lt;br /&gt;
** show (and set) actual valveposition &lt;br /&gt;
** show and set timetable and temperatures&lt;br /&gt;
* optional &lt;br /&gt;
** adressierung of HR20 (for BUS, RF)&lt;br /&gt;
** authentication end encryption&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| CONFIG &lt;br /&gt;
| Save Config in EEPROM&lt;br /&gt;
* driver for EEPROM access&lt;br /&gt;
* save values to EEPROM &lt;br /&gt;
* load values from EEPROM &lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| MENU &lt;br /&gt;
| Display Menu&lt;br /&gt;
* get keystate - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE (ISR in main.c)&#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** debounce - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039;not needed&#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** multi keypress (nedded for hidden menue?) - &lt;br /&gt;
** longer keypress / double click (nedded?)&lt;br /&gt;
* get position of wheel (incremental counter) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE (ISR in main.c)&#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
* controll display&lt;br /&gt;
* functionality:&lt;br /&gt;
** show and set desired temperature&lt;br /&gt;
** show and set time and date &lt;br /&gt;
** show actual temperature&lt;br /&gt;
** show actual valveposition &lt;br /&gt;
** show and set timetable and temperatures&lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| MOTOR&lt;br /&gt;
| Motor-Driver &lt;br /&gt;
* set desired valveposition  - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** quick, asympthotic, quiet - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE (speed can be chosen) &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* callibrate for Valve - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt; &lt;br /&gt;
** optimised (less motor consumption depending on desired final position) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Stop motor if not turning (blocked) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* stop calibration if valve is removed - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Genereate ERROR if motor is not turning (blocked or low energy) - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color:yellow;&amp;quot; | &#039;&#039;&#039; dario &#039;&#039;&#039; &lt;br /&gt;
&#039;&#039;&#039; active &#039;&#039;&#039; &lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; (95%)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| TEMP&lt;br /&gt;
| Temperaturesensor-Driver &lt;br /&gt;
* init Sensor &lt;br /&gt;
* IRQ driven (500ms)&lt;br /&gt;
* start A/D conversion (IQR driven)&lt;br /&gt;
* get A/D Value and calc temperature&lt;br /&gt;
* calibration for sensor (needed?)&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| PID&lt;br /&gt;
| PID Algorithm&lt;br /&gt;
* calculate desired valveposition out of&lt;br /&gt;
** last valveposition(s) &lt;br /&gt;
** last temperature(s)&lt;br /&gt;
** actual temperature&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| BOOT&lt;br /&gt;
| Bootloader&lt;br /&gt;
we need a bootloader so that the developers can flash the software &lt;br /&gt;
without a JTAG cable and without disassembling the HR20.&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| LOG&lt;br /&gt;
| Datalogger&lt;br /&gt;
* Operating Hours&lt;br /&gt;
** motor in action&lt;br /&gt;
** ODOmeter&lt;br /&gt;
** since Battery Exchange&lt;br /&gt;
* Errors&lt;br /&gt;
* Logfiles (only with additional hardware)&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UID&lt;br /&gt;
| Unique ID for identification&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= API Beschreibung =&lt;br /&gt;
== LCD ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Funtion&lt;br /&gt;
! Propose&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Init(void);            &lt;br /&gt;
|Init the LCD Controller&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_AllSegments(uint8_t);&lt;br /&gt;
|Set all segments to LCD_MODE&lt;br /&gt;
| done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearAll(void);                       &lt;br /&gt;
|Clear all segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearHour_Bar(void);&lt;br /&gt;
|Clear 24 bar segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearSymbols(void);&lt;br /&gt;
|Clear AUTO MANU PROG SUN MOON SNOW&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearNumbers(void);&lt;br /&gt;
|Clear 7 Segments ans Collumns&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintDec(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print DEC-val in two 7 Segments 0-99&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintHex(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print HEX-val in two 7 Segments 0-ff&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintNo(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print one ditig in one 7 Segment&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintTemp(uint8_t, uint8_t);&lt;br /&gt;
|Print desired temperature (val+4,9)°C&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetSeg(uint8_t, uint8_t);          &lt;br /&gt;
|Set one segment to LCD_MODE (0-69)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetHourBarSeg(uint8_t, uint8_t);    &lt;br /&gt;
|Set one hour bar segment to LCD_MODE (0-23)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetHourBarVal(uint8_t, uint8_t);&lt;br /&gt;
|Set one (val) hour bar segment to LCD_MODE (0-23) reset all other segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetHourBarBar(uint8_t, uint8_t);&lt;br /&gt;
|Set all hour bar segments from 0 to val to LCD_MODE (0-23)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Update(void);                        &lt;br /&gt;
|Request immidiate LCD-Update (normal only when bitplane changes)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t LCD_ContrastAdjust (int8_t);           &lt;br /&gt;
|Adjust the contrast&lt;br /&gt;
|&#039;&#039;&#039;not tested yet&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== RTC ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Funtion&lt;br /&gt;
! Propose&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_Init(RTC_CALLBACK_FUNC);            &lt;br /&gt;
|Sart Timer, activate 500ms IRQ, set callback Function for Dow_Timer&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetHour(void);                    &lt;br /&gt;
|Get Hour&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetMinute(void);                   &lt;br /&gt;
|Get Minute&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetSecond(void);                   &lt;br /&gt;
|Get Second&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetDay(void);                      &lt;br /&gt;
|Get Day&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetMonth(void);                    &lt;br /&gt;
|Get Month&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetYearYY(void);                     &lt;br /&gt;
|Get Year (00-255)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetDayOfWeek(void);                &lt;br /&gt;
|Get Day of Week (0:Monday)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint16_t RTC_GetYearYYYY(void);               &lt;br /&gt;
|Get Year (2000-2255)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetHour(uint8_t);                     &lt;br /&gt;
|Set Hour&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetMinute(uint8_t);                   &lt;br /&gt;
|Set Minute&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetSecond(uint8_t);                   &lt;br /&gt;
|Set Second&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetDay(uint8_t);                      &lt;br /&gt;
|Set Day&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetMonth(uint8_t);                    &lt;br /&gt;
|Set Month&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetYear(uint8_t);                     &lt;br /&gt;
|Set Year&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void    RTC_DowTimerSet(rtc_dow_t, uint8_t, uint8_t); &lt;br /&gt;
|set day of week timer&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_DowTimerGet(rtc_dow_t, uint8_t);         &lt;br /&gt;
|get day of week timer&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_DowTimerGetStartOfDay(void);              &lt;br /&gt;
|timer status start of day&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_DowTimerGetActualIndex(void);         &lt;br /&gt;
|timer status now&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_CalibrateRCO(void);&lt;br /&gt;
|calibrate internal rco&lt;br /&gt;
|&#039;&#039;&#039;not tested yet&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
Dow_Timer &lt;br /&gt;
* there are 28 DOW timers (for each DOW 4 Timers)&lt;br /&gt;
* Each timer can be set to a time (multiple of 10 minutes) &lt;br /&gt;
**  time is stored in a byte with the format hh*10+mm/10 e.g.: &lt;br /&gt;
**  10:10=110, 23:50=235, 255=disable&lt;br /&gt;
* when actual time and DOW is eaqual to a timer time and DOW, then &lt;br /&gt;
** callback function is called (during Timer IRQ) with timerindex as argument &lt;br /&gt;
&lt;br /&gt;
= Entwicklungsumgebung =&lt;br /&gt;
* Editor, Debugger, Compiler&lt;br /&gt;
** WinAVR version (20071221), sprich GCC 4.2.2 sowie avr-libc 1.6.0&lt;br /&gt;
** AVR Studio 4 &lt;br /&gt;
* JTAG ICE&lt;br /&gt;
** Atmel AVR JTAGICE MK2 &lt;br /&gt;
** AVR Dragon (z.B. http://elmicro.com/de/atavrdragon.html)&lt;br /&gt;
** Olimex-Seriell http://www.olimex.com/dev/avr-jtag.html  &lt;br /&gt;
** Olimex-USB http://www.olimex.com/dev/avr-usb-jtag.html &lt;br /&gt;
&lt;br /&gt;
= Sonstiges =&lt;br /&gt;
== Altes Protokoll ==&lt;br /&gt;
[[HR20_Protocol_V2 | Hier ]] hat mal einer ein Protokoll eingegeben.&lt;br /&gt;
Das scheint aber nicht zu der Version 2.04 zu passen. &lt;br /&gt;
Ich habe es nicht gelöscht, falls es jemanden interessiert.&lt;br /&gt;
== SVN Anleitung ==&lt;br /&gt;
Eine Anleitung was ein SVN ist und wie man es brauchen wir hier nicht.&lt;br /&gt;
Sonst müsste hier auch ein C-Kurs, Windows-Kurs, und Elektronik-Kurs hin.&lt;br /&gt;
&lt;br /&gt;
[[Category:Projekte|!]]&lt;/div&gt;</summary>
		<author><name>Dario</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=26460</id>
		<title>Heizungssteuerung mit Honeywell HR20</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=26460"/>
		<updated>2008-02-21T08:20:58Z</updated>

		<summary type="html">&lt;p&gt;Dario: /* Benötigte Module */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von DarioC&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Wie alles begann =&lt;br /&gt;
&lt;br /&gt;
Nachdem von Uwe Felgentreu vor nunmehr vor über drei Jahren (genau am 17.11.2004 um 11:26) hier in diesem Forum den Thread mit dem Titel &#039;&#039;Honeywell Rondostat HR20E per AVR steuern und konfigurieren&#039;&#039; gestartet hat ist es nun langsam soweit, dass das Ganze auch ein Projekt wird. &lt;br /&gt;
&lt;br /&gt;
Den Thread dazu kann der interessierte Leser [http://www.mikrocontroller.net/topic/17603 hier nachlesen] &lt;br /&gt;
&lt;br /&gt;
= Projektziel =&lt;br /&gt;
&lt;br /&gt;
Wir konzentrieren uns in erster Linie auf den Honeywell Rondostat HR20E mit ausgelieferten Softwareversion 2.04. Dass es ähnliche andere Geräte gibt behalten wir bei der Entwicklung im Hinterkopf.&lt;br /&gt;
&lt;br /&gt;
Basierend auf dieser Hardware wollen wir eine neue Software entwickeln. &lt;br /&gt;
Dabe können wir ausser der Hardware nichts weiter verwenden, da die Originalsoftware geschützt ist und nicht ausgelesen werden kann.&lt;br /&gt;
&lt;br /&gt;
== Phase 1 ==&lt;br /&gt;
Die Software soll die Funktionen bieten, die die Originalsoftware auch bietet, später können dies dann um zusätzliche Funktionen erweitert werden. Die wichtigsten Funktionen sind:&lt;br /&gt;
&lt;br /&gt;
* Temperaturregelung&lt;br /&gt;
* Echtzeituhr&lt;br /&gt;
* Ausnutzen der Sleep Funktion&lt;br /&gt;
* Anzeige Soll-Temperatur und der Uhrzeit&lt;br /&gt;
* Einstellung der Soll-Temperatur&lt;br /&gt;
* Uhrzeitgesteuerte Einstellung der Soll-Temperatur &lt;br /&gt;
* Fenster-Offen-Erkennung&lt;br /&gt;
* Ventilfreispülungsfunktion&lt;br /&gt;
&lt;br /&gt;
== Phase 2 ==&lt;br /&gt;
&lt;br /&gt;
Hier liegt der Sinn des ganzen Projektes: Durch diese zusätzlichen Funktionen wollen wir den Nutzwert des Thermostaten erheblich steigern:&lt;br /&gt;
&lt;br /&gt;
* Programmierung der Schaltzeiten und Temperaturen über externe Schnittstelle&lt;br /&gt;
* Abfrage der Messwerte und Parameter über externe Schnittstelle&lt;br /&gt;
* Vernetzung der Thermostaten untereinander&lt;br /&gt;
* Zusätzliche externe Schnittstellen (neben UART auch CAN und Funk)&lt;br /&gt;
* Erweiterung der Anzeige um&lt;br /&gt;
** Ist-Temperatur &lt;br /&gt;
** Ventilstellung&lt;br /&gt;
** Funkschnittstelle&lt;br /&gt;
*** RFM12 http://www.hoperf.com/rf_fsk.asp&lt;br /&gt;
*** Zigbee http://www.meshnetics.com/zigbee-modules&lt;br /&gt;
** ...&lt;br /&gt;
* Bootloader, damit Leute mitarbeiten können, die keine JTAG haben. Mit einem JTAG könnte man den Bootloader Flashen, ohne den Thermostaten öffnen zu müssen. Von da an kann man über den Programmierstecker mit einem umgebauten Handykabel den Thermostaten neu flashen.&lt;br /&gt;
&lt;br /&gt;
= Lizenz =&lt;br /&gt;
Die Software wird unter GPL v2 gestellt.&lt;br /&gt;
&lt;br /&gt;
= Subversion Repository =&lt;br /&gt;
Ein SVN Repository liegt auf dem freien SVN Server: https://opensvn.csie.org&lt;br /&gt;
== Zugangsdaten ==&lt;br /&gt;
Repository Location: https://OpenSVN.csie.org/hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
Browse Repository: https://OpenSVN.csie.org/viewcvs.cgi/?root=hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
TRAC: https://opensvn.csie.org/traccgi/hr20&lt;br /&gt;
== Policy ==&lt;br /&gt;
Anonymous check out ist erlaubt. &amp;lt;br&amp;gt;&lt;br /&gt;
Wer was committen will muss freigeschaltet werden. &amp;lt;br&amp;gt;&lt;br /&gt;
Dazu brauche ich ein &#039;&#039;Usernamen, Passwort&#039;&#039; und eine &#039;&#039;Mailadresse&#039;&#039;, dann kann ich das einrichten. &amp;lt;br&amp;gt;&lt;br /&gt;
Tragt Euch dazu einfach selber in die Tabelle ein, ich erledige dann den Rest.&amp;lt;br&amp;gt;&lt;br /&gt;
Das mache ich dann von Hand und da ich nicht alle 10 Minuten Mails bearbeite kann das auch schon mal einen oder zwei Tage dauern. &amp;lt;br&amp;gt;&lt;br /&gt;
Wenn sich ein Maintainer findet, gebe ich die Zugangsdaten gerne weiter.&lt;br /&gt;
== Entwickler ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! width=&amp;quot;150&amp;quot; | Entwickler&lt;br /&gt;
! width=&amp;quot;150&amp;quot; | svn Status&lt;br /&gt;
|-&lt;br /&gt;
| darioc&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|-&lt;br /&gt;
| louk&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|}&lt;br /&gt;
== Verzeichnisstruktur ==&lt;br /&gt;
Eine Verzeichnisstruktur ist auch schon angelegt und die ersten Daten auch drin. Hier die Verzeichnisse:&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
| &#039;&#039;&#039;/doc&#039;&#039;&#039;&lt;br /&gt;
| Für alles an Dokumenten, die selbst erstellt wurden. &amp;lt;br&amp;gt;&lt;br /&gt;
Specs, die man im Internet bekommen kann gehören hier nicht rein, &amp;lt;br&amp;gt;&lt;br /&gt;
die machen das alles nur unnötig gross und das auschecken dauert länger.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/playground&#039;&#039;&#039; &lt;br /&gt;
| Wie der Name schon sagt, zum rumspielen und testen. &amp;lt;br&amp;gt;&lt;br /&gt;
Hier kommt jegliche art von Codeschnipseln hin, die zu Testen da sind &amp;lt;br&amp;gt;&lt;br /&gt;
und (derzeit) noch icht Teil des Programmes sind.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/source&#039;&#039;&#039; &lt;br /&gt;
| Hier kommt die Applikation rein mit allen Modulen und makefiles.&amp;lt;br&amp;gt;&lt;br /&gt;
Bitte haltet das Repository sauber und checkt nur Dateien ein, &amp;lt;br&amp;gt;&lt;br /&gt;
die auch Sinn  machen, &amp;quot;thumbs.db&amp;quot; oder andere Temp-Dateien gehören hier nicht rein.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SVN Client und Anleitung ==&lt;br /&gt;
Windows-User nutzen am besten den Tortoise-SVN-Client, den man kostenfrei [http://tortoisesvn.tigris.org hier runterladen] kann. &amp;lt;br&amp;gt;&lt;br /&gt;
Dort gibt es auch eine Anleitung zum Arbeiten mit SVN.&lt;br /&gt;
&lt;br /&gt;
= Analyse der Hardware =&lt;br /&gt;
Die Analyse hat der Dario schon gemacht, zu finden ist die jeweils aktuelle Version &lt;br /&gt;
[http://www.carluccio.de/img/hr20/analyse.pdf als PDF hier] oder [https://opensvn.csie.org/viewcvs.cgi/doc/analyse.pdf hier im SVN].&lt;br /&gt;
&lt;br /&gt;
= Benötigte Module =&lt;br /&gt;
&lt;br /&gt;
Um das Ganze nun etwas zu koordinieren hier eine Liste der benötigten Module und deren Funktionen. &amp;lt;br&amp;gt;&lt;br /&gt;
Diese dient dazu später die Aufgaben zu verteilen:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Module&lt;br /&gt;
! Function&lt;br /&gt;
! Developer&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| LCD&lt;br /&gt;
| Display Driver:&amp;lt;BR&amp;gt;&lt;br /&gt;
* Init Display - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Set Segments - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Print HEX, DEC, TEMP, DayofWeek - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Blink - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* e.t.c&lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; DONE &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| LCD Simulation&lt;br /&gt;
| Simulation for display in AVR Studio:&amp;lt;BR&amp;gt;&lt;br /&gt;
* Defining Display - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039;  Done by D/L &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Assign Segments to register bits - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; Done by D/L &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Providing samplecode - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039;  Done by Dario &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* Darker segment color&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; 95% &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| RTC&lt;br /&gt;
| Time and Date Handler&lt;br /&gt;
* init timer - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* use IRQ with 32kHz crystal - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* handle time and date - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** daylight saving - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** consult leapyear  - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* calc day of week out of date - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Only one Byte for Year -&amp;gt; (2000 to 2255)&lt;br /&gt;
* Day of week timer with callback - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* corretion for external Crystal - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* calibrate internal RC - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE, but not tested &#039;&#039;&#039;&amp;lt;/span&amp;gt; &lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; (95%)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UART &lt;br /&gt;
| UART-Driver&lt;br /&gt;
* menue (Debug und Steuerung)&lt;br /&gt;
** show and set desired temperature &lt;br /&gt;
** show and set Time and Date&lt;br /&gt;
** show actual temperature&lt;br /&gt;
** show (and set) actual valveposition &lt;br /&gt;
** show and set timetable and temperatures&lt;br /&gt;
* optional &lt;br /&gt;
** adressierung of HR20 (for BUS, RF)&lt;br /&gt;
** authentication end encryption&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| CONFIG &lt;br /&gt;
| Save Config in EEPROM&lt;br /&gt;
* driver for EEPROM access&lt;br /&gt;
* save values to EEPROM &lt;br /&gt;
* load values from EEPROM &lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| MENU &lt;br /&gt;
| Display Menu&lt;br /&gt;
* get keystate - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE (ISR in main.c)&#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** debounce - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039;not needed&#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
** multi keypress (nedded for hidden menue?) - &lt;br /&gt;
** longer keypress / double click (nedded?)&lt;br /&gt;
* get position of wheel (incremental counter) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE (ISR in main.c)&#039;&#039;&#039;&amp;lt;/span&amp;gt;  &lt;br /&gt;
* controll display&lt;br /&gt;
* functionality:&lt;br /&gt;
** show and set desired temperature&lt;br /&gt;
** show and set time and date &lt;br /&gt;
** show actual temperature&lt;br /&gt;
** show actual valveposition &lt;br /&gt;
** show and set timetable and temperatures&lt;br /&gt;
| style=&amp;quot;background-color:yellow;&amp;quot; | &#039;&#039;&#039; dario &#039;&#039;&#039; &lt;br /&gt;
&#039;&#039;&#039; active &#039;&#039;&#039; &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| MOTOR&lt;br /&gt;
| Motor-Driver &lt;br /&gt;
* set desired valveposition  - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** quick, asympthotic, quiet - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE (speed can be chosen) &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* callibrate for Valve - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt; &lt;br /&gt;
** optimised (less motor consumption depending on desired final position) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Stop motor if not turning (blocked) - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* stop calibration if valve is removed - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Genereate ERROR if motor is not turning (blocked or low energy) - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color:yellow;&amp;quot; | &#039;&#039;&#039; dario &#039;&#039;&#039; &lt;br /&gt;
&#039;&#039;&#039; active &#039;&#039;&#039; &lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; (95%)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| TEMP&lt;br /&gt;
| Temperaturesensor-Driver &lt;br /&gt;
* init Sensor &lt;br /&gt;
* IRQ driven (500ms)&lt;br /&gt;
* start A/D conversion (IQR driven)&lt;br /&gt;
* get A/D Value and calc temperature&lt;br /&gt;
* calibration for sensor (needed?)&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| PID&lt;br /&gt;
| PID Algorithm&lt;br /&gt;
* calculate desired valveposition out of&lt;br /&gt;
** last valveposition(s) &lt;br /&gt;
** last temperature(s)&lt;br /&gt;
** actual temperature&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| BOOT&lt;br /&gt;
| Bootloader&lt;br /&gt;
we need a bootloader so that the developers can flash the software &lt;br /&gt;
without a JTAG cable and without disassembling the HR20.&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| LOG&lt;br /&gt;
| Datalogger&lt;br /&gt;
* Operating Hours&lt;br /&gt;
** motor in action&lt;br /&gt;
** ODOmeter&lt;br /&gt;
** since Battery Exchange&lt;br /&gt;
* Errors&lt;br /&gt;
* Logfiles (only with additional hardware)&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UID&lt;br /&gt;
| Unique ID for identification&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= API Beschreibung =&lt;br /&gt;
== LCD ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Funtion&lt;br /&gt;
! Propose&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Init(void);            &lt;br /&gt;
|Init the LCD Controller&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_AllSegments(uint8_t);&lt;br /&gt;
|Set all segments to LCD_MODE&lt;br /&gt;
| done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearAll(void);                       &lt;br /&gt;
|Clear all segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearHour_Bar(void);&lt;br /&gt;
|Clear 24 bar segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearSymbols(void);&lt;br /&gt;
|Clear AUTO MANU PROG SUN MOON SNOW&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearNumbers(void);&lt;br /&gt;
|Clear 7 Segments ans Collumns&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintDec(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print DEC-val in two 7 Segments 0-99&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintHex(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print HEX-val in two 7 Segments 0-ff&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintNo(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print one ditig in one 7 Segment&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintTemp(uint8_t, uint8_t);&lt;br /&gt;
|Print desired temperature (val+4,9)°C&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetSeg(uint8_t, uint8_t);          &lt;br /&gt;
|Set one segment to LCD_MODE (0-69)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetHourBarSeg(uint8_t, uint8_t);    &lt;br /&gt;
|Set one hour bar segment to LCD_MODE (0-23)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetHourBarVal(uint8_t, uint8_t);&lt;br /&gt;
|Set one (val) hour bar segment to LCD_MODE (0-23) reset all other segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetHourBarBar(uint8_t, uint8_t);&lt;br /&gt;
|Set all hour bar segments from 0 to val to LCD_MODE (0-23)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Update(void);                        &lt;br /&gt;
|Request immidiate LCD-Update (normal only when bitplane changes)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t LCD_ContrastAdjust (int8_t);           &lt;br /&gt;
|Adjust the contrast&lt;br /&gt;
|&#039;&#039;&#039;not tested yet&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== RTC ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Funtion&lt;br /&gt;
! Propose&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_Init(RTC_CALLBACK_FUNC);            &lt;br /&gt;
|Sart Timer, activate 500ms IRQ, set callback Function for Dow_Timer&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetHour(void);                    &lt;br /&gt;
|Get Hour&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetMinute(void);                   &lt;br /&gt;
|Get Minute&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetSecond(void);                   &lt;br /&gt;
|Get Second&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetDay(void);                      &lt;br /&gt;
|Get Day&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetMonth(void);                    &lt;br /&gt;
|Get Month&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetYearYY(void);                     &lt;br /&gt;
|Get Year (00-255)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetDayOfWeek(void);                &lt;br /&gt;
|Get Day of Week (0:Monday)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint16_t RTC_GetYearYYYY(void);               &lt;br /&gt;
|Get Year (2000-2255)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetHour(uint8_t);                     &lt;br /&gt;
|Set Hour&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetMinute(uint8_t);                   &lt;br /&gt;
|Set Minute&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetSecond(uint8_t);                   &lt;br /&gt;
|Set Second&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetDay(uint8_t);                      &lt;br /&gt;
|Set Day&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetMonth(uint8_t);                    &lt;br /&gt;
|Set Month&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetYear(uint8_t);                     &lt;br /&gt;
|Set Year&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void    RTC_DowTimerSet(rtc_dow_t, uint8_t, uint8_t); &lt;br /&gt;
|set day of week timer&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_DowTimerGet(rtc_dow_t, uint8_t);         &lt;br /&gt;
|get day of week timer&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_DowTimerGetStartOfDay(void);              &lt;br /&gt;
|timer status start of day&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_DowTimerGetActualIndex(void);         &lt;br /&gt;
|timer status now&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_CalibrateRCO(void);&lt;br /&gt;
|calibrate internal rco&lt;br /&gt;
|&#039;&#039;&#039;not tested yet&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
Dow_Timer &lt;br /&gt;
* there are 28 DOW timers (for each DOW 4 Timers)&lt;br /&gt;
* Each timer can be set to a time (multiple of 10 minutes) &lt;br /&gt;
**  time is stored in a byte with the format hh*10+mm/10 e.g.: &lt;br /&gt;
**  10:10=110, 23:50=235, 255=disable&lt;br /&gt;
* when actual time and DOW is eaqual to a timer time and DOW, then &lt;br /&gt;
** callback function is called (during Timer IRQ) with timerindex as argument &lt;br /&gt;
&lt;br /&gt;
= Entwicklungsumgebung =&lt;br /&gt;
* Editor, Debugger, Compiler&lt;br /&gt;
** WinAVR version (20071221), sprich GCC 4.2.2 sowie avr-libc 1.6.0&lt;br /&gt;
** AVR Studio 4 &lt;br /&gt;
* JTAG ICE&lt;br /&gt;
** Atmel AVR JTAGICE MK2 &lt;br /&gt;
** AVR Dragon (z.B. http://elmicro.com/de/atavrdragon.html)&lt;br /&gt;
** Olimex-Seriell http://www.olimex.com/dev/avr-jtag.html  &lt;br /&gt;
** Olimex-USB http://www.olimex.com/dev/avr-usb-jtag.html &lt;br /&gt;
&lt;br /&gt;
= Sonstiges =&lt;br /&gt;
== Altes Protokoll ==&lt;br /&gt;
[[HR20_Protocol_V2 | Hier ]] hat mal einer ein Protokoll eingegeben.&lt;br /&gt;
Das scheint aber nicht zu der Version 2.04 zu passen. &lt;br /&gt;
Ich habe es nicht gelöscht, falls es jemanden interessiert.&lt;br /&gt;
== SVN Anleitung ==&lt;br /&gt;
Eine Anleitung was ein SVN ist und wie man es brauchen wir hier nicht.&lt;br /&gt;
Sonst müsste hier auch ein C-Kurs, Windows-Kurs, und Elektronik-Kurs hin.&lt;br /&gt;
&lt;br /&gt;
[[Category:Projekte|!]]&lt;/div&gt;</summary>
		<author><name>Dario</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=26459</id>
		<title>Heizungssteuerung mit Honeywell HR20</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=26459"/>
		<updated>2008-02-21T08:08:51Z</updated>

		<summary type="html">&lt;p&gt;Dario: /* Subversion Repository */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von DarioC&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Wie alles begann =&lt;br /&gt;
&lt;br /&gt;
Nachdem von Uwe Felgentreu vor nunmehr vor über drei Jahren (genau am 17.11.2004 um 11:26) hier in diesem Forum den Thread mit dem Titel &#039;&#039;Honeywell Rondostat HR20E per AVR steuern und konfigurieren&#039;&#039; gestartet hat ist es nun langsam soweit, dass das Ganze auch ein Projekt wird. &lt;br /&gt;
&lt;br /&gt;
Den Thread dazu kann der interessierte Leser [http://www.mikrocontroller.net/topic/17603 hier nachlesen] &lt;br /&gt;
&lt;br /&gt;
= Projektziel =&lt;br /&gt;
&lt;br /&gt;
Wir konzentrieren uns in erster Linie auf den Honeywell Rondostat HR20E mit ausgelieferten Softwareversion 2.04. Dass es ähnliche andere Geräte gibt behalten wir bei der Entwicklung im Hinterkopf.&lt;br /&gt;
&lt;br /&gt;
Basierend auf dieser Hardware wollen wir eine neue Software entwickeln. &lt;br /&gt;
Dabe können wir ausser der Hardware nichts weiter verwenden, da die Originalsoftware geschützt ist und nicht ausgelesen werden kann.&lt;br /&gt;
&lt;br /&gt;
== Phase 1 ==&lt;br /&gt;
Die Software soll die Funktionen bieten, die die Originalsoftware auch bietet, später können dies dann um zusätzliche Funktionen erweitert werden. Die wichtigsten Funktionen sind:&lt;br /&gt;
&lt;br /&gt;
* Temperaturregelung&lt;br /&gt;
* Echtzeituhr&lt;br /&gt;
* Ausnutzen der Sleep Funktion&lt;br /&gt;
* Anzeige Soll-Temperatur und der Uhrzeit&lt;br /&gt;
* Einstellung der Soll-Temperatur&lt;br /&gt;
* Uhrzeitgesteuerte Einstellung der Soll-Temperatur &lt;br /&gt;
* Fenster-Offen-Erkennung&lt;br /&gt;
* Ventilfreispülungsfunktion&lt;br /&gt;
&lt;br /&gt;
== Phase 2 ==&lt;br /&gt;
&lt;br /&gt;
Hier liegt der Sinn des ganzen Projektes: Durch diese zusätzlichen Funktionen wollen wir den Nutzwert des Thermostaten erheblich steigern:&lt;br /&gt;
&lt;br /&gt;
* Programmierung der Schaltzeiten und Temperaturen über externe Schnittstelle&lt;br /&gt;
* Abfrage der Messwerte und Parameter über externe Schnittstelle&lt;br /&gt;
* Vernetzung der Thermostaten untereinander&lt;br /&gt;
* Zusätzliche externe Schnittstellen (neben UART auch CAN und Funk)&lt;br /&gt;
* Erweiterung der Anzeige um&lt;br /&gt;
** Ist-Temperatur &lt;br /&gt;
** Ventilstellung&lt;br /&gt;
** Funkschnittstelle&lt;br /&gt;
*** RFM12 http://www.hoperf.com/rf_fsk.asp&lt;br /&gt;
*** Zigbee http://www.meshnetics.com/zigbee-modules&lt;br /&gt;
** ...&lt;br /&gt;
* Bootloader, damit Leute mitarbeiten können, die keine JTAG haben. Mit einem JTAG könnte man den Bootloader Flashen, ohne den Thermostaten öffnen zu müssen. Von da an kann man über den Programmierstecker mit einem umgebauten Handykabel den Thermostaten neu flashen.&lt;br /&gt;
&lt;br /&gt;
= Lizenz =&lt;br /&gt;
Die Software wird unter GPL v2 gestellt.&lt;br /&gt;
&lt;br /&gt;
= Subversion Repository =&lt;br /&gt;
Ein SVN Repository liegt auf dem freien SVN Server: https://opensvn.csie.org&lt;br /&gt;
== Zugangsdaten ==&lt;br /&gt;
Repository Location: https://OpenSVN.csie.org/hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
Browse Repository: https://OpenSVN.csie.org/viewcvs.cgi/?root=hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
TRAC: https://opensvn.csie.org/traccgi/hr20&lt;br /&gt;
== Policy ==&lt;br /&gt;
Anonymous check out ist erlaubt. &amp;lt;br&amp;gt;&lt;br /&gt;
Wer was committen will muss freigeschaltet werden. &amp;lt;br&amp;gt;&lt;br /&gt;
Dazu brauche ich ein &#039;&#039;Usernamen, Passwort&#039;&#039; und eine &#039;&#039;Mailadresse&#039;&#039;, dann kann ich das einrichten. &amp;lt;br&amp;gt;&lt;br /&gt;
Tragt Euch dazu einfach selber in die Tabelle ein, ich erledige dann den Rest.&amp;lt;br&amp;gt;&lt;br /&gt;
Das mache ich dann von Hand und da ich nicht alle 10 Minuten Mails bearbeite kann das auch schon mal einen oder zwei Tage dauern. &amp;lt;br&amp;gt;&lt;br /&gt;
Wenn sich ein Maintainer findet, gebe ich die Zugangsdaten gerne weiter.&lt;br /&gt;
== Entwickler ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! width=&amp;quot;150&amp;quot; | Entwickler&lt;br /&gt;
! width=&amp;quot;150&amp;quot; | svn Status&lt;br /&gt;
|-&lt;br /&gt;
| darioc&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|-&lt;br /&gt;
| louk&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|}&lt;br /&gt;
== Verzeichnisstruktur ==&lt;br /&gt;
Eine Verzeichnisstruktur ist auch schon angelegt und die ersten Daten auch drin. Hier die Verzeichnisse:&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
| &#039;&#039;&#039;/doc&#039;&#039;&#039;&lt;br /&gt;
| Für alles an Dokumenten, die selbst erstellt wurden. &amp;lt;br&amp;gt;&lt;br /&gt;
Specs, die man im Internet bekommen kann gehören hier nicht rein, &amp;lt;br&amp;gt;&lt;br /&gt;
die machen das alles nur unnötig gross und das auschecken dauert länger.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/playground&#039;&#039;&#039; &lt;br /&gt;
| Wie der Name schon sagt, zum rumspielen und testen. &amp;lt;br&amp;gt;&lt;br /&gt;
Hier kommt jegliche art von Codeschnipseln hin, die zu Testen da sind &amp;lt;br&amp;gt;&lt;br /&gt;
und (derzeit) noch icht Teil des Programmes sind.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/source&#039;&#039;&#039; &lt;br /&gt;
| Hier kommt die Applikation rein mit allen Modulen und makefiles.&amp;lt;br&amp;gt;&lt;br /&gt;
Bitte haltet das Repository sauber und checkt nur Dateien ein, &amp;lt;br&amp;gt;&lt;br /&gt;
die auch Sinn  machen, &amp;quot;thumbs.db&amp;quot; oder andere Temp-Dateien gehören hier nicht rein.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SVN Client und Anleitung ==&lt;br /&gt;
Windows-User nutzen am besten den Tortoise-SVN-Client, den man kostenfrei [http://tortoisesvn.tigris.org hier runterladen] kann. &amp;lt;br&amp;gt;&lt;br /&gt;
Dort gibt es auch eine Anleitung zum Arbeiten mit SVN.&lt;br /&gt;
&lt;br /&gt;
= Analyse der Hardware =&lt;br /&gt;
Die Analyse hat der Dario schon gemacht, zu finden ist die jeweils aktuelle Version &lt;br /&gt;
[http://www.carluccio.de/img/hr20/analyse.pdf als PDF hier] oder [https://opensvn.csie.org/viewcvs.cgi/doc/analyse.pdf hier im SVN].&lt;br /&gt;
&lt;br /&gt;
= Benötigte Module =&lt;br /&gt;
&lt;br /&gt;
Um das Ganze nun etwas zu koordinieren hier eine Liste der benötigten Module und deren Funktionen. &amp;lt;br&amp;gt;&lt;br /&gt;
Diese dient dazu später die Aufgaben zu verteilen:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Module&lt;br /&gt;
! Function&lt;br /&gt;
! Developer&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| LCD&lt;br /&gt;
| Display Driver:&amp;lt;BR&amp;gt;&lt;br /&gt;
* Init Display - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Set Segments - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Print HEX, DEC, TEMP, DayofWeek - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Blink - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* e.t.c&lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; DONE &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| LCD Simulation&lt;br /&gt;
| Simulation for display in AVR Studio:&amp;lt;BR&amp;gt;&lt;br /&gt;
* Defining Display - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039;  Done by D/L &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Assign Segments to register bits - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; Done by D/L &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Providing samplecode - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039;  Done by Dario &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* Darker segment color&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; 95% &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| RTC&lt;br /&gt;
| Time and Date Handler&lt;br /&gt;
* init timer - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* use IRQ with 32kHz crystal - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* handle time and date - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** daylight saving - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** consult leapyear  - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* calc day of week out of date - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Only one Byte for Year -&amp;gt; (2000 to 2255)&lt;br /&gt;
* Day of week timer with callback - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* corretion for external Crystal - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* calibrate internal RC - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE, but not tested &#039;&#039;&#039;&amp;lt;/span&amp;gt; &lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; (95%)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UART &lt;br /&gt;
| UART-Driver&lt;br /&gt;
* menue (Debug und Steuerung)&lt;br /&gt;
** show and set desired temperature &lt;br /&gt;
** show and set Time and Date&lt;br /&gt;
** show actual temperature&lt;br /&gt;
** show (and set) actual valveposition &lt;br /&gt;
** show and set timetable and temperatures&lt;br /&gt;
* optional &lt;br /&gt;
** adressierung of HR20 (for BUS, RF)&lt;br /&gt;
** authentication end encryption&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| CONFIG &lt;br /&gt;
| Save Config in EEPROM&lt;br /&gt;
* driver for EEPROM access&lt;br /&gt;
* save values to EEPROM &lt;br /&gt;
* load values from EEPROM &lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| MENU&lt;br /&gt;
| Display Menu&lt;br /&gt;
* get keystate (with debounce)&lt;br /&gt;
** multi keypress (nedded for hidden menue?)&lt;br /&gt;
** longer keypress / double click (nedded?)&lt;br /&gt;
* get position of wheel (incremental counter)&lt;br /&gt;
* controll display&lt;br /&gt;
* functionality:&lt;br /&gt;
* show and set desired temperature&lt;br /&gt;
* show and set time and date &lt;br /&gt;
* show actual temperature&lt;br /&gt;
* show actual valveposition &lt;br /&gt;
* show and set timetable and temperatures&lt;br /&gt;
| style=&amp;quot;background-color:yellow;&amp;quot; | &#039;&#039;&#039; dario &#039;&#039;&#039; &lt;br /&gt;
&#039;&#039;&#039; active &#039;&#039;&#039; &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| MOTOR&lt;br /&gt;
| Motor-Driver &lt;br /&gt;
* set desired valveposition &lt;br /&gt;
** quick&lt;br /&gt;
** asympthotic&lt;br /&gt;
** quiet&lt;br /&gt;
* callibrate for Valve&lt;br /&gt;
* Genereate ERROR if motor not turning (low energy)&lt;br /&gt;
| style=&amp;quot;background-color:yellow;&amp;quot; | &#039;&#039;&#039; dario &#039;&#039;&#039; &lt;br /&gt;
&#039;&#039;&#039; active &#039;&#039;&#039; &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| TEMP&lt;br /&gt;
| Temperaturesensor-Driver &lt;br /&gt;
* init Sensor &lt;br /&gt;
* IQR driven (500ms)&lt;br /&gt;
* start A/D conversion (IQR driven)&lt;br /&gt;
* get A/D Value and calc temperature&lt;br /&gt;
* calibration for sensor (needed?)&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| PID&lt;br /&gt;
| PID Algorithm&lt;br /&gt;
* calculate desired valveposition out of&lt;br /&gt;
** last valveposition(s) &lt;br /&gt;
** last temperature(s)&lt;br /&gt;
** actual temperature&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| BOOT&lt;br /&gt;
| Bootloader&lt;br /&gt;
we need a bootloader so that the developers can flash the software &lt;br /&gt;
without a JTAG cable and without disassembling the HR20.&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| LOG&lt;br /&gt;
| Datalogger&lt;br /&gt;
* Operating Hours&lt;br /&gt;
** motor in action&lt;br /&gt;
** ODOmeter&lt;br /&gt;
** since Battery Exchange&lt;br /&gt;
* Errors&lt;br /&gt;
* Logfiles (only with additional hardware)&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UID&lt;br /&gt;
| Unique ID for identification&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= API Beschreibung =&lt;br /&gt;
== LCD ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Funtion&lt;br /&gt;
! Propose&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Init(void);            &lt;br /&gt;
|Init the LCD Controller&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_AllSegments(uint8_t);&lt;br /&gt;
|Set all segments to LCD_MODE&lt;br /&gt;
| done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearAll(void);                       &lt;br /&gt;
|Clear all segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearHour_Bar(void);&lt;br /&gt;
|Clear 24 bar segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearSymbols(void);&lt;br /&gt;
|Clear AUTO MANU PROG SUN MOON SNOW&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearNumbers(void);&lt;br /&gt;
|Clear 7 Segments ans Collumns&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintDec(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print DEC-val in two 7 Segments 0-99&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintHex(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print HEX-val in two 7 Segments 0-ff&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintNo(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print one ditig in one 7 Segment&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintTemp(uint8_t, uint8_t);&lt;br /&gt;
|Print desired temperature (val+4,9)°C&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetSeg(uint8_t, uint8_t);          &lt;br /&gt;
|Set one segment to LCD_MODE (0-69)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetHourBarSeg(uint8_t, uint8_t);    &lt;br /&gt;
|Set one hour bar segment to LCD_MODE (0-23)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetHourBarVal(uint8_t, uint8_t);&lt;br /&gt;
|Set one (val) hour bar segment to LCD_MODE (0-23) reset all other segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetHourBarBar(uint8_t, uint8_t);&lt;br /&gt;
|Set all hour bar segments from 0 to val to LCD_MODE (0-23)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Update(void);                        &lt;br /&gt;
|Request immidiate LCD-Update (normal only when bitplane changes)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t LCD_ContrastAdjust (int8_t);           &lt;br /&gt;
|Adjust the contrast&lt;br /&gt;
|&#039;&#039;&#039;not tested yet&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== RTC ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Funtion&lt;br /&gt;
! Propose&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_Init(RTC_CALLBACK_FUNC);            &lt;br /&gt;
|Sart Timer, activate 500ms IRQ, set callback Function for Dow_Timer&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetHour(void);                    &lt;br /&gt;
|Get Hour&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetMinute(void);                   &lt;br /&gt;
|Get Minute&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetSecond(void);                   &lt;br /&gt;
|Get Second&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetDay(void);                      &lt;br /&gt;
|Get Day&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetMonth(void);                    &lt;br /&gt;
|Get Month&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetYearYY(void);                     &lt;br /&gt;
|Get Year (00-255)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetDayOfWeek(void);                &lt;br /&gt;
|Get Day of Week (0:Monday)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint16_t RTC_GetYearYYYY(void);               &lt;br /&gt;
|Get Year (2000-2255)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetHour(uint8_t);                     &lt;br /&gt;
|Set Hour&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetMinute(uint8_t);                   &lt;br /&gt;
|Set Minute&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetSecond(uint8_t);                   &lt;br /&gt;
|Set Second&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetDay(uint8_t);                      &lt;br /&gt;
|Set Day&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetMonth(uint8_t);                    &lt;br /&gt;
|Set Month&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetYear(uint8_t);                     &lt;br /&gt;
|Set Year&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void    RTC_DowTimerSet(rtc_dow_t, uint8_t, uint8_t); &lt;br /&gt;
|set day of week timer&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_DowTimerGet(rtc_dow_t, uint8_t);         &lt;br /&gt;
|get day of week timer&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_DowTimerGetStartOfDay(void);              &lt;br /&gt;
|timer status start of day&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_DowTimerGetActualIndex(void);         &lt;br /&gt;
|timer status now&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_CalibrateRCO(void);&lt;br /&gt;
|calibrate internal rco&lt;br /&gt;
|&#039;&#039;&#039;not tested yet&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
Dow_Timer &lt;br /&gt;
* there are 28 DOW timers (for each DOW 4 Timers)&lt;br /&gt;
* Each timer can be set to a time (multiple of 10 minutes) &lt;br /&gt;
**  time is stored in a byte with the format hh*10+mm/10 e.g.: &lt;br /&gt;
**  10:10=110, 23:50=235, 255=disable&lt;br /&gt;
* when actual time and DOW is eaqual to a timer time and DOW, then &lt;br /&gt;
** callback function is called (during Timer IRQ) with timerindex as argument &lt;br /&gt;
&lt;br /&gt;
= Entwicklungsumgebung =&lt;br /&gt;
* Editor, Debugger, Compiler&lt;br /&gt;
** WinAVR version (20071221), sprich GCC 4.2.2 sowie avr-libc 1.6.0&lt;br /&gt;
** AVR Studio 4 &lt;br /&gt;
* JTAG ICE&lt;br /&gt;
** Atmel AVR JTAGICE MK2 &lt;br /&gt;
** AVR Dragon (z.B. http://elmicro.com/de/atavrdragon.html)&lt;br /&gt;
** Olimex-Seriell http://www.olimex.com/dev/avr-jtag.html  &lt;br /&gt;
** Olimex-USB http://www.olimex.com/dev/avr-usb-jtag.html &lt;br /&gt;
&lt;br /&gt;
= Sonstiges =&lt;br /&gt;
== Altes Protokoll ==&lt;br /&gt;
[[HR20_Protocol_V2 | Hier ]] hat mal einer ein Protokoll eingegeben.&lt;br /&gt;
Das scheint aber nicht zu der Version 2.04 zu passen. &lt;br /&gt;
Ich habe es nicht gelöscht, falls es jemanden interessiert.&lt;br /&gt;
== SVN Anleitung ==&lt;br /&gt;
Eine Anleitung was ein SVN ist und wie man es brauchen wir hier nicht.&lt;br /&gt;
Sonst müsste hier auch ein C-Kurs, Windows-Kurs, und Elektronik-Kurs hin.&lt;br /&gt;
&lt;br /&gt;
[[Category:Projekte|!]]&lt;/div&gt;</summary>
		<author><name>Dario</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=26230</id>
		<title>Heizungssteuerung mit Honeywell HR20</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=26230"/>
		<updated>2008-02-10T18:17:56Z</updated>

		<summary type="html">&lt;p&gt;Dario: /* Benötigte Module */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von DarioC&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Wie alles begann =&lt;br /&gt;
&lt;br /&gt;
Nachdem von Uwe Felgentreu vor nunmehr vor über drei Jahren (genau am 17.11.2004 um 11:26) hier in diesem Forum den Thread mit dem Titel &#039;&#039;Honeywell Rondostat HR20E per AVR steuern und konfigurieren&#039;&#039; gestartet hat ist es nun langsam soweit, dass das Ganze auch ein Projekt wird. &lt;br /&gt;
&lt;br /&gt;
Den Thread dazu kann der interessierte Leser [http://www.mikrocontroller.net/topic/17603 hier nachlesen] &lt;br /&gt;
&lt;br /&gt;
= Projektziel =&lt;br /&gt;
&lt;br /&gt;
Wir konzentrieren uns in erster Linie auf den Honeywell Rondostat HR20E mit ausgelieferten Softwareversion 2.04. Dass es ähnliche andere Geräte gibt behalten wir bei der Entwicklung im Hinterkopf.&lt;br /&gt;
&lt;br /&gt;
Basierend auf dieser Hardware wollen wir eine neue Software entwickeln. &lt;br /&gt;
Dabe können wir ausser der Hardware nichts weiter verwenden, da die Originalsoftware geschützt ist und nicht ausgelesen werden kann.&lt;br /&gt;
&lt;br /&gt;
== Phase 1 ==&lt;br /&gt;
Die Software soll die Funktionen bieten, die die Originalsoftware auch bietet, später können dies dann um zusätzliche Funktionen erweitert werden. Die wichtigsten Funktionen sind:&lt;br /&gt;
&lt;br /&gt;
* Temperaturregelung&lt;br /&gt;
* Echtzeituhr&lt;br /&gt;
* Ausnutzen der Sleep Funktion&lt;br /&gt;
* Anzeige Soll-Temperatur und der Uhrzeit&lt;br /&gt;
* Einstellung der Soll-Temperatur&lt;br /&gt;
* Uhrzeitgesteuerte Einstellung der Soll-Temperatur &lt;br /&gt;
* Fenster-Offen-Erkennung&lt;br /&gt;
* Ventilfreispülungsfunktion&lt;br /&gt;
&lt;br /&gt;
== Phase 2 ==&lt;br /&gt;
&lt;br /&gt;
Hier liegt der Sinn des ganzen Projektes: Durch diese zusätzlichen Funktionen wollen wir den Nutzwert des Thermostaten erheblich steigern:&lt;br /&gt;
&lt;br /&gt;
* Programmierung der Schaltzeiten und Temperaturen über externe Schnittstelle&lt;br /&gt;
* Abfrage der Messwerte und Parameter über externe Schnittstelle&lt;br /&gt;
* Vernetzung der Thermostaten untereinander&lt;br /&gt;
* Zusätzliche externe Schnittstellen (neben UART auch CAN und Funk)&lt;br /&gt;
* Erweiterung der Anzeige um&lt;br /&gt;
** Ist-Temperatur &lt;br /&gt;
** Ventilstellung&lt;br /&gt;
** Funkschnittstelle&lt;br /&gt;
*** RFM12 http://www.hoperf.com/rf_fsk.asp&lt;br /&gt;
*** Zigbee http://www.meshnetics.com/zigbee-modules&lt;br /&gt;
** ...&lt;br /&gt;
* Bootloader, damit Leute mitarbeiten können, die keine JTAG haben. Mit einem JTAG könnte man den Bootloader Flashen, ohne den Thermostaten öffnen zu müssen. Von da an kann man über den Programmierstecker mit einem umgebauten Handykabel den Thermostaten neu flashen.&lt;br /&gt;
&lt;br /&gt;
= Subversion Repository =&lt;br /&gt;
Ein SVN Repository liegt auf dem freien SVN Server: https://opensvn.csie.org&lt;br /&gt;
== Zugangsdaten ==&lt;br /&gt;
Repository Location: https://OpenSVN.csie.org/hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
Browse Repository: https://OpenSVN.csie.org/viewcvs.cgi/?root=hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
TRAC: https://opensvn.csie.org/traccgi/hr20&lt;br /&gt;
== Policy ==&lt;br /&gt;
Anonymous check out ist erlaubt. &amp;lt;br&amp;gt;&lt;br /&gt;
Wer was committen will muss freigeschaltet werden. &amp;lt;br&amp;gt;&lt;br /&gt;
Dazu brauche ich ein &#039;&#039;Usernamen, Passwort&#039;&#039; und eine &#039;&#039;Mailadresse&#039;&#039;, dann kann ich das einrichten. &amp;lt;br&amp;gt;&lt;br /&gt;
Tragt Euch dazu einfach selber in die Tabelle ein, ich erledige dann den Rest.&amp;lt;br&amp;gt;&lt;br /&gt;
Das mache ich dann von Hand und da ich nicht alle 10 Minuten Mails bearbeite kann das auch schon mal einen oder zwei Tage dauern. &amp;lt;br&amp;gt;&lt;br /&gt;
Wenn sich ein Maintainer findet, gebe ich die Zugangsdaten gerne weiter.&lt;br /&gt;
== Entwickler ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! width=&amp;quot;150&amp;quot; | Entwickler&lt;br /&gt;
! width=&amp;quot;150&amp;quot; | svn Status&lt;br /&gt;
|-&lt;br /&gt;
| darioc&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|-&lt;br /&gt;
| louk&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|}&lt;br /&gt;
== Verzeichnisstruktur ==&lt;br /&gt;
Eine Verzeichnisstruktur ist auch schon angelegt und die ersten Daten auch drin. Hier die Verzeichnisse:&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
| &#039;&#039;&#039;/doc&#039;&#039;&#039;&lt;br /&gt;
| Für alles an Dokumenten, die selbst erstellt wurden. &amp;lt;br&amp;gt;&lt;br /&gt;
Specs, die man im Internet bekommen kann gehören hier nicht rein, &amp;lt;br&amp;gt;&lt;br /&gt;
die machen das alles nur unnötig gross und das auschecken dauert länger.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/playground&#039;&#039;&#039; &lt;br /&gt;
| Wie der Name schon sagt, zum rumspielen und testen. &amp;lt;br&amp;gt;&lt;br /&gt;
Hier kommt jegliche art von Codeschnipseln hin, die zu Testen da sind &amp;lt;br&amp;gt;&lt;br /&gt;
und (derzeit) noch icht Teil des Programmes sind.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/source&#039;&#039;&#039; &lt;br /&gt;
| Hier kommt die Applikation rein mit allen Modulen und makefiles.&amp;lt;br&amp;gt;&lt;br /&gt;
Bitte haltet das Repository sauber und checkt nur Dateien ein, &amp;lt;br&amp;gt;&lt;br /&gt;
die auch Sinn  machen, &amp;quot;thumbs.db&amp;quot; oder andere Temp-Dateien gehören hier nicht rein.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SVN Client und Anleitung ==&lt;br /&gt;
Windows-User nutzen am besten den Tortoise-SVN-Client, den man kostenfrei [http://tortoisesvn.tigris.org hier runterladen] kann. &amp;lt;br&amp;gt;&lt;br /&gt;
Dort gibt es auch eine Anleitung zum Arbeiten mit SVN. &lt;br /&gt;
&lt;br /&gt;
= Analyse der Hardware =&lt;br /&gt;
Die Analyse hat der Dario schon gemacht, zu finden ist die jeweils aktuelle Version &lt;br /&gt;
[http://www.carluccio.de/img/hr20/analyse.pdf als PDF hier] oder [https://opensvn.csie.org/viewcvs.cgi/doc/analyse.pdf hier im SVN].&lt;br /&gt;
&lt;br /&gt;
= Benötigte Module =&lt;br /&gt;
&lt;br /&gt;
Um das Ganze nun etwas zu koordinieren hier eine Liste der benötigten Module und deren Funktionen. &amp;lt;br&amp;gt;&lt;br /&gt;
Diese dient dazu später die Aufgaben zu verteilen:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Module&lt;br /&gt;
! Function&lt;br /&gt;
! Developer&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| LCD&lt;br /&gt;
| Display Driver:&amp;lt;BR&amp;gt;&lt;br /&gt;
* Init Display - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Set Segments - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Print HEX, DEC, TEMP, DayofWeek - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Blink - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* e.t.c&lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; DONE &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| LCD Simulation&lt;br /&gt;
| Simulation for display in AVR Studio:&amp;lt;BR&amp;gt;&lt;br /&gt;
* Defining Display - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039;  In Progress &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Assign Segments to register bits - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Providing samplecode - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039;  &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color:yellow;&amp;quot; | &#039;&#039;&#039; louk &#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;  &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| RTC&lt;br /&gt;
| Time and Date Handler&lt;br /&gt;
* init timer - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* use IRQ with 32kHz crystal - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* handle time and date - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** daylight saving - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** consult leapyear  - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* calc day of week out of date - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Only one Byte for Year -&amp;gt; (2000 to 2255)&lt;br /&gt;
* Day of week timer with callback - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* corretion for external Crystal - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* calibrate internal RC - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE, but not tested &#039;&#039;&#039;&amp;lt;/span&amp;gt; &lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; (95%)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UART &lt;br /&gt;
| UART-Driver&lt;br /&gt;
* menue (Debug und Steuerung)&lt;br /&gt;
** show and set desired temperature &lt;br /&gt;
** show and set Time and Date&lt;br /&gt;
** show actual temperature&lt;br /&gt;
** show (and set) actual valveposition &lt;br /&gt;
** show and set timetable and temperatures&lt;br /&gt;
* optional &lt;br /&gt;
** adressierung of HR20 (for BUS, RF)&lt;br /&gt;
** authentication end encryption&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| CONFIG &lt;br /&gt;
| Save Config in EEPROM&lt;br /&gt;
* driver for EEPROM access&lt;br /&gt;
* save values to EEPROM &lt;br /&gt;
* load values from EEPROM &lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| MENU&lt;br /&gt;
| Display Menu&lt;br /&gt;
* get keystate (with debounce)&lt;br /&gt;
** multi keypress (nedded for hidden menue?)&lt;br /&gt;
** longer keypress / double click (nedded?)&lt;br /&gt;
* get position of wheel (incremental counter)&lt;br /&gt;
* controll display&lt;br /&gt;
* functionality:&lt;br /&gt;
* show and set desired temperature&lt;br /&gt;
* show and set time and date &lt;br /&gt;
* show actual temperature&lt;br /&gt;
* show actual valveposition &lt;br /&gt;
* show and set timetable and temperatures&lt;br /&gt;
| style=&amp;quot;background-color:yellow;&amp;quot; | &#039;&#039;&#039; dario &#039;&#039;&#039; &lt;br /&gt;
&#039;&#039;&#039; active &#039;&#039;&#039; &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| MOTOR&lt;br /&gt;
| Motor-Driver &lt;br /&gt;
* set desired valveposition &lt;br /&gt;
** quick&lt;br /&gt;
** asympthotic&lt;br /&gt;
** quiet&lt;br /&gt;
* callibrate for Valve&lt;br /&gt;
* Genereate ERROR if motor not turning (low energy)&lt;br /&gt;
| style=&amp;quot;background-color:yellow;&amp;quot; | &#039;&#039;&#039; dario &#039;&#039;&#039; &lt;br /&gt;
&#039;&#039;&#039; active &#039;&#039;&#039; &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| TEMP&lt;br /&gt;
| Temperaturesensor-Driver &lt;br /&gt;
* init Sensor &lt;br /&gt;
* IQR driven (500ms)&lt;br /&gt;
* start A/D conversion (IQR driven)&lt;br /&gt;
* get A/D Value and calc temperature&lt;br /&gt;
* calibration for sensor (needed?)&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| PID&lt;br /&gt;
| PID Algorithm&lt;br /&gt;
* calculate desired valveposition out of&lt;br /&gt;
** last valveposition(s) &lt;br /&gt;
** last temperature(s)&lt;br /&gt;
** actual temperature&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| BOOT&lt;br /&gt;
| Bootloader&lt;br /&gt;
we need a bootloader so that the developers can flash the software &lt;br /&gt;
without a JTAG cable and without disassembling the HR20.&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| LOG&lt;br /&gt;
| Datalogger&lt;br /&gt;
* Operating Hours&lt;br /&gt;
** motor in action&lt;br /&gt;
** ODOmeter&lt;br /&gt;
** since Battery Exchange&lt;br /&gt;
* Errors&lt;br /&gt;
* Logfiles (only with additional hardware)&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UID&lt;br /&gt;
| Unique ID for identification&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= API Beschreibung =&lt;br /&gt;
== LCD ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Funtion&lt;br /&gt;
! Propose&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Init(void);            &lt;br /&gt;
|Init the LCD Controller&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_AllSegments(uint8_t);&lt;br /&gt;
|Set all segments to LCD_MODE&lt;br /&gt;
| done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearAll(void);                       &lt;br /&gt;
|Clear all segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearHour_Bar(void);&lt;br /&gt;
|Clear 24 bar segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearSymbols(void);&lt;br /&gt;
|Clear AUTO MANU PROG SUN MOON SNOW&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearNumbers(void);&lt;br /&gt;
|Clear 7 Segments ans Collumns&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintDec(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print DEC-val in two 7 Segments 0-99&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintHex(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print HEX-val in two 7 Segments 0-ff&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintNo(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print one ditig in one 7 Segment&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintTemp(uint8_t, uint8_t);&lt;br /&gt;
|Print desired temperature (val+4,9)°C&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetSeg(uint8_t, uint8_t);          &lt;br /&gt;
|Set one segment to LCD_MODE (0-69)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetHourBarSeg(uint8_t, uint8_t);    &lt;br /&gt;
|Set one hour bar segment to LCD_MODE (0-23)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetHourBarVal(uint8_t, uint8_t);&lt;br /&gt;
|Set one (val) hour bar segment to LCD_MODE (0-23) reset all other segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetHourBarBar(uint8_t, uint8_t);&lt;br /&gt;
|Set all hour bar segments from 0 to val to LCD_MODE (0-23)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Update(void);                        &lt;br /&gt;
|Request immidiate LCD-Update (normal only when bitplane changes)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t LCD_ContrastAdjust (int8_t);           &lt;br /&gt;
|Adjust the contrast&lt;br /&gt;
|&#039;&#039;&#039;not tested yet&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== RTC ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Funtion&lt;br /&gt;
! Propose&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_Init(RTC_CALLBACK_FUNC);            &lt;br /&gt;
|Sart Timer, activate 500ms IRQ, set callback Function for Dow_Timer&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetHour(void);                    &lt;br /&gt;
|Get Hour&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetMinute(void);                   &lt;br /&gt;
|Get Minute&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetSecond(void);                   &lt;br /&gt;
|Get Second&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetDay(void);                      &lt;br /&gt;
|Get Day&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetMonth(void);                    &lt;br /&gt;
|Get Month&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetYearYY(void);                     &lt;br /&gt;
|Get Year (00-255)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetDayOfWeek(void);                &lt;br /&gt;
|Get Day of Week (0:Monday)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint16_t RTC_GetYearYYYY(void);               &lt;br /&gt;
|Get Year (2000-2255)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetHour(uint8_t);                     &lt;br /&gt;
|Set Hour&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetMinute(uint8_t);                   &lt;br /&gt;
|Set Minute&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetSecond(uint8_t);                   &lt;br /&gt;
|Set Second&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetDay(uint8_t);                      &lt;br /&gt;
|Set Day&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetMonth(uint8_t);                    &lt;br /&gt;
|Set Month&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetYear(uint8_t);                     &lt;br /&gt;
|Set Year&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void    RTC_DowTimerSet(rtc_dow_t, uint8_t, uint8_t); &lt;br /&gt;
|set day of week timer&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_DowTimerGet(rtc_dow_t, uint8_t);         &lt;br /&gt;
|get day of week timer&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_DowTimerGetStartOfDay(void);              &lt;br /&gt;
|timer status start of day&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_DowTimerGetActualIndex(void);         &lt;br /&gt;
|timer status now&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_CalibrateRCO(void);&lt;br /&gt;
|calibrate internal rco&lt;br /&gt;
|&#039;&#039;&#039;not tested yet&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
Dow_Timer &lt;br /&gt;
* there are 28 DOW timers (for each DOW 4 Timers)&lt;br /&gt;
* Each timer can be set to a time (multiple of 10 minutes) &lt;br /&gt;
**  time is stored in a byte with the format hh*10+mm/10 e.g.: &lt;br /&gt;
**  10:10=110, 23:50=235, 255=disable&lt;br /&gt;
* when actual time and DOW is eaqual to a timer time and DOW, then &lt;br /&gt;
** callback function is called (during Timer IRQ) with timerindex as argument &lt;br /&gt;
&lt;br /&gt;
= Entwicklungsumgebung =&lt;br /&gt;
* Editor, Debugger, Compiler&lt;br /&gt;
** WinAVR version (20071221), sprich GCC 4.2.2 sowie avr-libc 1.6.0&lt;br /&gt;
** AVR Studio 4 &lt;br /&gt;
* JTAG ICE&lt;br /&gt;
** Atmel AVR JTAGICE MK2 &lt;br /&gt;
** AVR Dragon (z.B. http://elmicro.com/de/atavrdragon.html)&lt;br /&gt;
** Olimex-Seriell http://www.olimex.com/dev/avr-jtag.html  &lt;br /&gt;
** Olimex-USB http://www.olimex.com/dev/avr-usb-jtag.html &lt;br /&gt;
&lt;br /&gt;
= Sonstiges =&lt;br /&gt;
== Altes Protokoll ==&lt;br /&gt;
[[HR20_Protocol_V2 | Hier ]] hat mal einer ein Protokoll eingegeben.&lt;br /&gt;
Das scheint aber nicht zu der Version 2.04 zu passen. &lt;br /&gt;
Ich habe es nicht gelöscht, falls es jemanden interessiert.&lt;br /&gt;
== SVN Anleitung ==&lt;br /&gt;
Eine Anleitung was ein SVN ist und wie man es brauchen wir hier nicht.&lt;br /&gt;
Sonst müsste hier auch ein C-Kurs, Windows-Kurs, und Elektronik-Kurs hin.&lt;br /&gt;
&lt;br /&gt;
[[Category:Projekte|!]]&lt;/div&gt;</summary>
		<author><name>Dario</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=26227</id>
		<title>Heizungssteuerung mit Honeywell HR20</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=26227"/>
		<updated>2008-02-10T01:00:14Z</updated>

		<summary type="html">&lt;p&gt;Dario: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von DarioC&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Wie alles begann =&lt;br /&gt;
&lt;br /&gt;
Nachdem von Uwe Felgentreu vor nunmehr vor über drei Jahren (genau am 17.11.2004 um 11:26) hier in diesem Forum den Thread mit dem Titel &#039;&#039;Honeywell Rondostat HR20E per AVR steuern und konfigurieren&#039;&#039; gestartet hat ist es nun langsam soweit, dass das Ganze auch ein Projekt wird. &lt;br /&gt;
&lt;br /&gt;
Den Thread dazu kann der interessierte Leser [http://www.mikrocontroller.net/topic/17603 hier nachlesen] &lt;br /&gt;
&lt;br /&gt;
= Projektziel =&lt;br /&gt;
&lt;br /&gt;
Wir konzentrieren uns in erster Linie auf den Honeywell Rondostat HR20E mit ausgelieferten Softwareversion 2.04. Dass es ähnliche andere Geräte gibt behalten wir bei der Entwicklung im Hinterkopf.&lt;br /&gt;
&lt;br /&gt;
Basierend auf dieser Hardware wollen wir eine neue Software entwickeln. &lt;br /&gt;
Dabe können wir ausser der Hardware nichts weiter verwenden, da die Originalsoftware geschützt ist und nicht ausgelesen werden kann.&lt;br /&gt;
&lt;br /&gt;
== Phase 1 ==&lt;br /&gt;
Die Software soll die Funktionen bieten, die die Originalsoftware auch bietet, später können dies dann um zusätzliche Funktionen erweitert werden. Die wichtigsten Funktionen sind:&lt;br /&gt;
&lt;br /&gt;
* Temperaturregelung&lt;br /&gt;
* Echtzeituhr&lt;br /&gt;
* Ausnutzen der Sleep Funktion&lt;br /&gt;
* Anzeige Soll-Temperatur und der Uhrzeit&lt;br /&gt;
* Einstellung der Soll-Temperatur&lt;br /&gt;
* Uhrzeitgesteuerte Einstellung der Soll-Temperatur &lt;br /&gt;
* Fenster-Offen-Erkennung&lt;br /&gt;
* Ventilfreispülungsfunktion&lt;br /&gt;
&lt;br /&gt;
== Phase 2 ==&lt;br /&gt;
&lt;br /&gt;
Hier liegt der Sinn des ganzen Projektes: Durch diese zusätzlichen Funktionen wollen wir den Nutzwert des Thermostaten erheblich steigern:&lt;br /&gt;
&lt;br /&gt;
* Programmierung der Schaltzeiten und Temperaturen über externe Schnittstelle&lt;br /&gt;
* Abfrage der Messwerte und Parameter über externe Schnittstelle&lt;br /&gt;
* Vernetzung der Thermostaten untereinander&lt;br /&gt;
* Zusätzliche externe Schnittstellen (neben UART auch CAN und Funk)&lt;br /&gt;
* Erweiterung der Anzeige um&lt;br /&gt;
** Ist-Temperatur &lt;br /&gt;
** Ventilstellung&lt;br /&gt;
** Funkschnittstelle&lt;br /&gt;
*** RFM12 http://www.hoperf.com/rf_fsk.asp&lt;br /&gt;
*** Zigbee http://www.meshnetics.com/zigbee-modules&lt;br /&gt;
** ...&lt;br /&gt;
* Bootloader, damit Leute mitarbeiten können, die keine JTAG haben. Mit einem JTAG könnte man den Bootloader Flashen, ohne den Thermostaten öffnen zu müssen. Von da an kann man über den Programmierstecker mit einem umgebauten Handykabel den Thermostaten neu flashen.&lt;br /&gt;
&lt;br /&gt;
= Subversion Repository =&lt;br /&gt;
Ein SVN Repository liegt auf dem freien SVN Server: https://opensvn.csie.org&lt;br /&gt;
== Zugangsdaten ==&lt;br /&gt;
Repository Location: https://OpenSVN.csie.org/hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
Browse Repository: https://OpenSVN.csie.org/viewcvs.cgi/?root=hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
TRAC: https://opensvn.csie.org/traccgi/hr20&lt;br /&gt;
== Policy ==&lt;br /&gt;
Anonymous check out ist erlaubt. &amp;lt;br&amp;gt;&lt;br /&gt;
Wer was committen will muss freigeschaltet werden. &amp;lt;br&amp;gt;&lt;br /&gt;
Dazu brauche ich ein &#039;&#039;Usernamen, Passwort&#039;&#039; und eine &#039;&#039;Mailadresse&#039;&#039;, dann kann ich das einrichten. &amp;lt;br&amp;gt;&lt;br /&gt;
Tragt Euch dazu einfach selber in die Tabelle ein, ich erledige dann den Rest.&amp;lt;br&amp;gt;&lt;br /&gt;
Das mache ich dann von Hand und da ich nicht alle 10 Minuten Mails bearbeite kann das auch schon mal einen oder zwei Tage dauern. &amp;lt;br&amp;gt;&lt;br /&gt;
Wenn sich ein Maintainer findet, gebe ich die Zugangsdaten gerne weiter.&lt;br /&gt;
== Entwickler ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! width=&amp;quot;150&amp;quot; | Entwickler&lt;br /&gt;
! width=&amp;quot;150&amp;quot; | svn Status&lt;br /&gt;
|-&lt;br /&gt;
| darioc&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|-&lt;br /&gt;
| louk&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|}&lt;br /&gt;
== Verzeichnisstruktur ==&lt;br /&gt;
Eine Verzeichnisstruktur ist auch schon angelegt und die ersten Daten auch drin. Hier die Verzeichnisse:&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
| &#039;&#039;&#039;/doc&#039;&#039;&#039;&lt;br /&gt;
| Für alles an Dokumenten, die selbst erstellt wurden. &amp;lt;br&amp;gt;&lt;br /&gt;
Specs, die man im Internet bekommen kann gehören hier nicht rein, &amp;lt;br&amp;gt;&lt;br /&gt;
die machen das alles nur unnötig gross und das auschecken dauert länger.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/playground&#039;&#039;&#039; &lt;br /&gt;
| Wie der Name schon sagt, zum rumspielen und testen. &amp;lt;br&amp;gt;&lt;br /&gt;
Hier kommt jegliche art von Codeschnipseln hin, die zu Testen da sind &amp;lt;br&amp;gt;&lt;br /&gt;
und (derzeit) noch icht Teil des Programmes sind.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/source&#039;&#039;&#039; &lt;br /&gt;
| Hier kommt die Applikation rein mit allen Modulen und makefiles.&amp;lt;br&amp;gt;&lt;br /&gt;
Bitte haltet das Repository sauber und checkt nur Dateien ein, &amp;lt;br&amp;gt;&lt;br /&gt;
die auch Sinn  machen, &amp;quot;thumbs.db&amp;quot; oder andere Temp-Dateien gehören hier nicht rein.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SVN Client und Anleitung ==&lt;br /&gt;
Windows-User nutzen am besten den Tortoise-SVN-Client, den man kostenfrei [http://tortoisesvn.tigris.org hier runterladen] kann. &amp;lt;br&amp;gt;&lt;br /&gt;
Dort gibt es auch eine Anleitung zum Arbeiten mit SVN. &lt;br /&gt;
&lt;br /&gt;
= Analyse der Hardware =&lt;br /&gt;
Die Analyse hat der Dario schon gemacht, zu finden ist die jeweils aktuelle Version &lt;br /&gt;
[http://www.carluccio.de/img/hr20/analyse.pdf als PDF hier] oder [https://opensvn.csie.org/viewcvs.cgi/doc/analyse.pdf hier im SVN].&lt;br /&gt;
&lt;br /&gt;
= Benötigte Module =&lt;br /&gt;
&lt;br /&gt;
Um das Ganze nun etwas zu koordinieren hier eine Liste der benötigten Module und deren Funktionen. &amp;lt;br&amp;gt;&lt;br /&gt;
Diese dient dazu später die Aufgaben zu verteilen:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Module&lt;br /&gt;
! Function&lt;br /&gt;
! Developer&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| LCD&lt;br /&gt;
| Display Driver:&amp;lt;BR&amp;gt;&lt;br /&gt;
* Init Display - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Set Segments - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Print HEX, DEC, TEMP, DayofWeek - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Blink - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* e.t.c&lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; DONE &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| LCD Simulation&lt;br /&gt;
| Simulation for display in AVR Studio:&amp;lt;BR&amp;gt;&lt;br /&gt;
* Defining Display - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039;  In Progress &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Assign Segments to register bits - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Providing samplecode - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039;  &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
| style=&amp;quot;background-color:yellow;&amp;quot; | &#039;&#039;&#039; louk &#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;  &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| RTC&lt;br /&gt;
| Time and Date Handler&lt;br /&gt;
* init timer - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* use IRQ with 32kHz crystal - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* handle time and date - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** daylight saving - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** consult leapyear  - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* calc day of week out of date - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Only one Byte for Year -&amp;gt; (2000 to 2255)&lt;br /&gt;
* Day of week timer with callback - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* corretion for external Crystal - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* calibrate internal RC - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE, but not tested &#039;&#039;&#039;&amp;lt;/span&amp;gt; &lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; (95%)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UART &lt;br /&gt;
| UART-Driver&lt;br /&gt;
* menue (Debug und Steuerung)&lt;br /&gt;
** show and set desired temperature &lt;br /&gt;
** show and set Time and Date&lt;br /&gt;
** show actual temperature&lt;br /&gt;
** show (and set) actual valveposition &lt;br /&gt;
** show and set timetable and temperatures&lt;br /&gt;
* optional &lt;br /&gt;
** adressierung of HR20 (for BUS, RF)&lt;br /&gt;
** authentication end encryption&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| MENU&lt;br /&gt;
| Display Menu&lt;br /&gt;
* get keystate (with debounce)&lt;br /&gt;
** multi keypress (nedded for hidden menue?)&lt;br /&gt;
** longer keypress / double click (nedded?)&lt;br /&gt;
* get position of wheel (incremental counter)&lt;br /&gt;
* controll display&lt;br /&gt;
* functionality:&lt;br /&gt;
* show and set desired temperature&lt;br /&gt;
* show and set time and date &lt;br /&gt;
* show actual temperature&lt;br /&gt;
* show actual valveposition &lt;br /&gt;
* show and set timetable and temperatures&lt;br /&gt;
| style=&amp;quot;background-color:yellow;&amp;quot; | &#039;&#039;&#039; dario &#039;&#039;&#039; &lt;br /&gt;
&#039;&#039;&#039; active &#039;&#039;&#039; &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| MOTOR&lt;br /&gt;
| Motor-Driver &lt;br /&gt;
* set desired valveposition &lt;br /&gt;
** quick&lt;br /&gt;
** asympthotic&lt;br /&gt;
** quiet&lt;br /&gt;
* callibrate for Valve&lt;br /&gt;
* Genereate ERROR if motor not turning (low energy)&lt;br /&gt;
| style=&amp;quot;background-color:yellow;&amp;quot; | &#039;&#039;&#039; dario &#039;&#039;&#039; &lt;br /&gt;
&#039;&#039;&#039; active &#039;&#039;&#039; &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| TEMP&lt;br /&gt;
| Temperaturesensor-Driver &lt;br /&gt;
* init Sensor &lt;br /&gt;
* IQR driven (500ms)&lt;br /&gt;
* start A/D conversion (IQR driven)&lt;br /&gt;
* get A/D Value and calc temperature&lt;br /&gt;
* calibration for sensor (needed?)&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| PID&lt;br /&gt;
| PID Algorithm&lt;br /&gt;
* calculate desired valveposition out of&lt;br /&gt;
** last valveposition(s) &lt;br /&gt;
** last temperature(s)&lt;br /&gt;
** actual temperature&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| BOOT&lt;br /&gt;
| Bootloader&lt;br /&gt;
we need a bootloader so that the developers can flash the software &lt;br /&gt;
without a JTAG cable and without disassembling the HR20.&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| LOG&lt;br /&gt;
| Datalogger&lt;br /&gt;
* Operating Hours&lt;br /&gt;
** motor in action&lt;br /&gt;
** ODOmeter&lt;br /&gt;
** since Battery Exchange&lt;br /&gt;
* Errors&lt;br /&gt;
* Logfiles (only with additional hardware)&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UID&lt;br /&gt;
| Unique ID for identification&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= API Beschreibung =&lt;br /&gt;
== LCD ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Funtion&lt;br /&gt;
! Propose&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Init(void);            &lt;br /&gt;
|Init the LCD Controller&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_AllSegments(uint8_t);&lt;br /&gt;
|Set all segments to LCD_MODE&lt;br /&gt;
| done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearAll(void);                       &lt;br /&gt;
|Clear all segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearHour_Bar(void);&lt;br /&gt;
|Clear 24 bar segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearSymbols(void);&lt;br /&gt;
|Clear AUTO MANU PROG SUN MOON SNOW&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearNumbers(void);&lt;br /&gt;
|Clear 7 Segments ans Collumns&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintDec(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print DEC-val in two 7 Segments 0-99&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintHex(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print HEX-val in two 7 Segments 0-ff&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintNo(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print one ditig in one 7 Segment&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintTemp(uint8_t, uint8_t);&lt;br /&gt;
|Print desired temperature (val+4,9)°C&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetSeg(uint8_t, uint8_t);          &lt;br /&gt;
|Set one segment to LCD_MODE (0-69)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetHourBarSeg(uint8_t, uint8_t);    &lt;br /&gt;
|Set one hour bar segment to LCD_MODE (0-23)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetHourBarVal(uint8_t, uint8_t);&lt;br /&gt;
|Set one (val) hour bar segment to LCD_MODE (0-23) reset all other segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetHourBarBar(uint8_t, uint8_t);&lt;br /&gt;
|Set all hour bar segments from 0 to val to LCD_MODE (0-23)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Update(void);                        &lt;br /&gt;
|Request immidiate LCD-Update (normal only when bitplane changes)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t LCD_ContrastAdjust (int8_t);           &lt;br /&gt;
|Adjust the contrast&lt;br /&gt;
|&#039;&#039;&#039;not tested yet&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== RTC ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Funtion&lt;br /&gt;
! Propose&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_Init(RTC_CALLBACK_FUNC);            &lt;br /&gt;
|Sart Timer, activate 500ms IRQ, set callback Function for Dow_Timer&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetHour(void);                    &lt;br /&gt;
|Get Hour&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetMinute(void);                   &lt;br /&gt;
|Get Minute&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetSecond(void);                   &lt;br /&gt;
|Get Second&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetDay(void);                      &lt;br /&gt;
|Get Day&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetMonth(void);                    &lt;br /&gt;
|Get Month&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetYearYY(void);                     &lt;br /&gt;
|Get Year (00-255)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetDayOfWeek(void);                &lt;br /&gt;
|Get Day of Week (0:Monday)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint16_t RTC_GetYearYYYY(void);               &lt;br /&gt;
|Get Year (2000-2255)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetHour(uint8_t);                     &lt;br /&gt;
|Set Hour&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetMinute(uint8_t);                   &lt;br /&gt;
|Set Minute&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetSecond(uint8_t);                   &lt;br /&gt;
|Set Second&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetDay(uint8_t);                      &lt;br /&gt;
|Set Day&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetMonth(uint8_t);                    &lt;br /&gt;
|Set Month&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetYear(uint8_t);                     &lt;br /&gt;
|Set Year&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void    RTC_DowTimerSet(rtc_dow_t, uint8_t, uint8_t); &lt;br /&gt;
|set day of week timer&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_DowTimerGet(rtc_dow_t, uint8_t);         &lt;br /&gt;
|get day of week timer&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_DowTimerGetStartOfDay(void);              &lt;br /&gt;
|timer status start of day&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_DowTimerGetActualIndex(void);         &lt;br /&gt;
|timer status now&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_CalibrateRCO(void);&lt;br /&gt;
|calibrate internal rco&lt;br /&gt;
|&#039;&#039;&#039;not tested yet&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
Dow_Timer &lt;br /&gt;
* there are 28 DOW timers (for each DOW 4 Timers)&lt;br /&gt;
* Each timer can be set to a time (multiple of 10 minutes) &lt;br /&gt;
**  time is stored in a byte with the format hh*10+mm/10 e.g.: &lt;br /&gt;
**  10:10=110, 23:50=235, 255=disable&lt;br /&gt;
* when actual time and DOW is eaqual to a timer time and DOW, then &lt;br /&gt;
** callback function is called (during Timer IRQ) with timerindex as argument &lt;br /&gt;
&lt;br /&gt;
= Entwicklungsumgebung =&lt;br /&gt;
* Editor, Debugger, Compiler&lt;br /&gt;
** WinAVR version (20071221), sprich GCC 4.2.2 sowie avr-libc 1.6.0&lt;br /&gt;
** AVR Studio 4 &lt;br /&gt;
* JTAG ICE&lt;br /&gt;
** Atmel AVR JTAGICE MK2 &lt;br /&gt;
** AVR Dragon (z.B. http://elmicro.com/de/atavrdragon.html)&lt;br /&gt;
** Olimex-Seriell http://www.olimex.com/dev/avr-jtag.html  &lt;br /&gt;
** Olimex-USB http://www.olimex.com/dev/avr-usb-jtag.html &lt;br /&gt;
&lt;br /&gt;
= Sonstiges =&lt;br /&gt;
== Altes Protokoll ==&lt;br /&gt;
[[HR20_Protocol_V2 | Hier ]] hat mal einer ein Protokoll eingegeben.&lt;br /&gt;
Das scheint aber nicht zu der Version 2.04 zu passen. &lt;br /&gt;
Ich habe es nicht gelöscht, falls es jemanden interessiert.&lt;br /&gt;
== SVN Anleitung ==&lt;br /&gt;
Eine Anleitung was ein SVN ist und wie man es brauchen wir hier nicht.&lt;br /&gt;
Sonst müsste hier auch ein C-Kurs, Windows-Kurs, und Elektronik-Kurs hin.&lt;br /&gt;
&lt;br /&gt;
[[Category:Projekte|!]]&lt;/div&gt;</summary>
		<author><name>Dario</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=26161</id>
		<title>Heizungssteuerung mit Honeywell HR20</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=26161"/>
		<updated>2008-02-07T22:24:02Z</updated>

		<summary type="html">&lt;p&gt;Dario: /* Benötigte Module */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von DarioC&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Wie alles begann =&lt;br /&gt;
&lt;br /&gt;
Nachdem von Uwe Felgentreu vor nunmehr vor über drei Jahren (genau am 17.11.2004 um 11:26) hier in diesem Forum den Thread mit dem Titel &#039;&#039;Honeywell Rondostat HR20E per AVR steuern und konfigurieren&#039;&#039; gestartet hat ist es nun langsam soweit, dass das Ganze auch ein Projekt wird. &lt;br /&gt;
&lt;br /&gt;
Den Thread dazu kann der interessierte Leser [http://www.mikrocontroller.net/topic/17603 hier nachlesen] &lt;br /&gt;
&lt;br /&gt;
= Projektziel =&lt;br /&gt;
&lt;br /&gt;
Wir konzentrieren uns in erster Linie auf den Honeywell Rondostat HR20E mit ausgelieferten Softwareversion 2.04. Dass es ähnliche andere Geräte gibt behalten wir bei der Entwicklung im Hinterkopf.&lt;br /&gt;
&lt;br /&gt;
Basierend auf dieser Hardware wollen wir eine neue Software entwickeln. &lt;br /&gt;
Dabe können wir ausser der Hardware nichts weiter verwenden, da die Originalsoftware geschützt ist und nicht ausgelesen werden kann.&lt;br /&gt;
&lt;br /&gt;
== Phase 1 ==&lt;br /&gt;
Die Software soll die Funktionen bieten, die die Originalsoftware auch bietet, später können dies dann um zusätzliche Funktionen erweitert werden. Die wichtigsten Funktionen sind:&lt;br /&gt;
&lt;br /&gt;
* Temperaturregelung&lt;br /&gt;
* Echtzeituhr&lt;br /&gt;
* Ausnutzen der Sleep Funktion&lt;br /&gt;
* Anzeige Soll-Temperatur und der Uhrzeit&lt;br /&gt;
* Einstellung der Soll-Temperatur&lt;br /&gt;
* Uhrzeitgesteuerte Einstellung der Soll-Temperatur &lt;br /&gt;
* Fenster-Offen-Erkennung&lt;br /&gt;
* Ventilfreispülungsfunktion&lt;br /&gt;
&lt;br /&gt;
== Phase 2 ==&lt;br /&gt;
&lt;br /&gt;
Hier liegt der Sinn des ganzen Projektes: Durch diese zusätzlichen Funktionen wollen wir den Nutzwert des Thermostaten erheblich steigern:&lt;br /&gt;
&lt;br /&gt;
* Programmierung der Schaltzeiten und Temperaturen über externe Schnittstelle&lt;br /&gt;
* Abfrage der Messwerte und Parameter über externe Schnittstelle&lt;br /&gt;
* Vernetzung der Thermostaten untereinander&lt;br /&gt;
* Zusätzliche externe Schnittstellen (neben UART auch CAN und Funk)&lt;br /&gt;
* Erweiterung der Anzeige um&lt;br /&gt;
** Ist-Temperatur &lt;br /&gt;
** Ventilstellung&lt;br /&gt;
** Funkschnittstelle&lt;br /&gt;
*** RFM12 http://www.hoperf.com/rf_fsk.asp&lt;br /&gt;
*** Zigbee http://www.meshnetics.com/zigbee-modules&lt;br /&gt;
** ...&lt;br /&gt;
* Bootloader, damit Leute mitarbeiten können, die keine JTAG haben. Mit einem JTAG könnte man den Bootloader Flashen, ohne den Thermostaten öffnen zu müssen. Von da an kann man über den Programmierstecker mit einem umgebauten Handykabel den Thermostaten neu flashen.&lt;br /&gt;
&lt;br /&gt;
= Subversion Repository =&lt;br /&gt;
Ein SVN Repository liegt auf dem freien SVN Server: https://opensvn.csie.org&lt;br /&gt;
== Zugangsdaten ==&lt;br /&gt;
Repository Location: https://OpenSVN.csie.org/hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
Browse Repository: https://OpenSVN.csie.org/viewcvs.cgi/?root=hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
TRAC: https://opensvn.csie.org/traccgi/hr20&lt;br /&gt;
== Policy ==&lt;br /&gt;
Anonymous check out ist erlaubt. &amp;lt;br&amp;gt;&lt;br /&gt;
Wer was committen will muss freigeschaltet werden. &amp;lt;br&amp;gt;&lt;br /&gt;
Dazu brauche ich ein &#039;&#039;Usernamen, Passwort&#039;&#039; und eine &#039;&#039;Mailadresse&#039;&#039;, dann kann ich das einrichten. &amp;lt;br&amp;gt;&lt;br /&gt;
Tragt Euch dazu einfach selber in die Tabelle ein, ich erledige dann den Rest.&amp;lt;br&amp;gt;&lt;br /&gt;
Das mache ich dann von Hand und da ich nicht alle 10 Minuten Mails bearbeite kann das auch schon mal einen oder zwei Tage dauern. &amp;lt;br&amp;gt;&lt;br /&gt;
Wenn sich ein Maintainer findet, gebe ich die Zugangsdaten gerne weiter.&lt;br /&gt;
== Entwickler ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! width=&amp;quot;150&amp;quot; | Entwickler&lt;br /&gt;
! width=&amp;quot;150&amp;quot; | svn Status&lt;br /&gt;
|-&lt;br /&gt;
| darioc&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|-&lt;br /&gt;
| louk&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|}&lt;br /&gt;
== Verzeichnisstruktur ==&lt;br /&gt;
Eine Verzeichnisstruktur ist auch schon angelegt und die ersten Daten auch drin. Hier die Verzeichnisse:&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
| &#039;&#039;&#039;/doc&#039;&#039;&#039;&lt;br /&gt;
| Für alles an Dokumenten, die selbst erstellt wurden. &amp;lt;br&amp;gt;&lt;br /&gt;
Specs, die man im Internet bekommen kann gehören hier nicht rein, &amp;lt;br&amp;gt;&lt;br /&gt;
die machen das alles nur unnötig gross und das auschecken dauert länger.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/playground&#039;&#039;&#039; &lt;br /&gt;
| Wie der Name schon sagt, zum rumspielen und testen. &amp;lt;br&amp;gt;&lt;br /&gt;
Hier kommt jegliche art von Codeschnipseln hin, die zu Testen da sind &amp;lt;br&amp;gt;&lt;br /&gt;
und (derzeit) noch icht Teil des Programmes sind.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/source&#039;&#039;&#039; &lt;br /&gt;
| Hier kommt die Applikation rein mit allen Modulen und makefiles.&amp;lt;br&amp;gt;&lt;br /&gt;
Bitte haltet das Repository sauber und checkt nur Dateien ein, &amp;lt;br&amp;gt;&lt;br /&gt;
die auch Sinn  machen, &amp;quot;thumbs.db&amp;quot; oder andere Temp-Dateien gehören hier nicht rein.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SVN Client und Anleitung ==&lt;br /&gt;
Windows-User nutzen am besten den Tortoise-SVN-Client, den man kostenfrei [http://tortoisesvn.tigris.org hier runterladen] kann. &amp;lt;br&amp;gt;&lt;br /&gt;
Dort gibt es auch eine Anleitung zum Arbeiten mit SVN. &lt;br /&gt;
&lt;br /&gt;
= Analyse der Hardware =&lt;br /&gt;
Die Analyse hat der Dario schon gemacht, zu finden ist die jeweils aktuelle Version &lt;br /&gt;
[http://www.carluccio.de/img/hr20/analyse.pdf als PDF hier] oder [https://opensvn.csie.org/viewcvs.cgi/doc/analyse.pdf hier im SVN].&lt;br /&gt;
&lt;br /&gt;
= Benötigte Module =&lt;br /&gt;
&lt;br /&gt;
Um das Ganze nun etwas zu koordinieren hier eine Liste der benötigten Module und deren Funktionen. &amp;lt;br&amp;gt;&lt;br /&gt;
Diese dient dazu später die Aufgaben zu verteilen:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Module&lt;br /&gt;
! Function&lt;br /&gt;
! Developer&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| LCD&lt;br /&gt;
| Display Driver:&amp;lt;BR&amp;gt;&lt;br /&gt;
* Init Display - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Set Segments - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Print HEX, DEC, TEMP, DayofWeek - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Blink - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* e.t.c&lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; DONE &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| RTC&lt;br /&gt;
| Time and Date Handler&lt;br /&gt;
* init timer - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* use IRQ with 32kHz crystal - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* handle time and date - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** daylight saving - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** consult leapyear  - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* calc day of week out of date - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Only one Byte for Year -&amp;gt; (2000 to 2255)&lt;br /&gt;
* Day of week timer with callback - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* corretion for external Crystal - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* calibrate internal RC - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE, but not tested &#039;&#039;&#039;&amp;lt;/span&amp;gt; &lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; (95%)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UART &lt;br /&gt;
| UART-Driver&lt;br /&gt;
* menue (Debug und Steuerung)&lt;br /&gt;
** show and set desired temperature &lt;br /&gt;
** show and set Time and Date&lt;br /&gt;
** show actual temperature&lt;br /&gt;
** show (and set) actual valveposition &lt;br /&gt;
** show and set timetable and temperatures&lt;br /&gt;
* optional &lt;br /&gt;
** adressierung of HR20 (for BUS, RF)&lt;br /&gt;
** authentication end encryption&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| MENU&lt;br /&gt;
| Display Menu&lt;br /&gt;
* get keystate (with debounce)&lt;br /&gt;
** multi keypress (nedded for hidden menue?)&lt;br /&gt;
** longer keypress / double click (nedded?)&lt;br /&gt;
* get position of wheel (incremental counter)&lt;br /&gt;
* controll display&lt;br /&gt;
* functionality:&lt;br /&gt;
* show and set desired temperature&lt;br /&gt;
* show and set time and date &lt;br /&gt;
* show actual temperature&lt;br /&gt;
* show actual valveposition &lt;br /&gt;
* show and set timetable and temperatures&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| MOTOR&lt;br /&gt;
| Motor-Driver &lt;br /&gt;
* set desired valveposition &lt;br /&gt;
** quick&lt;br /&gt;
** asympthotic&lt;br /&gt;
** quiet&lt;br /&gt;
* callibrate for Valve&lt;br /&gt;
* Genereate ERROR if motor not turning (low energy)&lt;br /&gt;
| style=&amp;quot;background-color:yellow;&amp;quot; | &#039;&#039;&#039; dario &#039;&#039;&#039; &lt;br /&gt;
&#039;&#039;&#039; active &#039;&#039;&#039; &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| TEMP&lt;br /&gt;
| Temperaturesensor-Driver &lt;br /&gt;
* init Sensor &lt;br /&gt;
* IQR driven (500ms)&lt;br /&gt;
* start A/D conversion (IQR driven)&lt;br /&gt;
* get A/D Value and calc temperature&lt;br /&gt;
* calibration for sensor (needed?)&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| PID&lt;br /&gt;
| PID Algorithm&lt;br /&gt;
* calculate desired valveposition out of&lt;br /&gt;
** last valveposition(s) &lt;br /&gt;
** last temperature(s)&lt;br /&gt;
** actual temperature&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| BOOT&lt;br /&gt;
| Bootloader&lt;br /&gt;
we need a bootloader so that the developers can flash the software &lt;br /&gt;
without a JTAG cable and without disassembling the HR20.&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| LOG&lt;br /&gt;
| Datalogger&lt;br /&gt;
* Operating Hours&lt;br /&gt;
** motor in action&lt;br /&gt;
** ODOmeter&lt;br /&gt;
** since Battery Exchange&lt;br /&gt;
* Errors&lt;br /&gt;
* Logfiles (only with additional hardware)&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UID&lt;br /&gt;
| Unique ID for identification&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= API Beschreibung =&lt;br /&gt;
== LCD ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Funtion&lt;br /&gt;
! Propose&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Init(void);            &lt;br /&gt;
|Init the LCD Controller&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_AllSegments(uint8_t);&lt;br /&gt;
|Set all segments to LCD_MODE&lt;br /&gt;
| done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearAll(void);                       &lt;br /&gt;
|Clear all segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearHour_Bar(void);&lt;br /&gt;
|Clear 24 bar segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearSymbols(void);&lt;br /&gt;
|Clear AUTO MANU PROG SUN MOON SNOW&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearNumbers(void);&lt;br /&gt;
|Clear 7 Segments ans Collumns&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintDec(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print DEC-val in two 7 Segments 0-99&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintHex(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print HEX-val in two 7 Segments 0-ff&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintNo(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print one ditig in one 7 Segment&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintTemp(uint8_t, uint8_t);&lt;br /&gt;
|Print desired temperature (val+4,9)°C&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetSeg(uint8_t, uint8_t);          &lt;br /&gt;
|Set one segment to LCD_MODE (0-69)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetHourBarSeg(uint8_t, uint8_t);    &lt;br /&gt;
|Set one hour bar segment to LCD_MODE (0-23)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetHourBarVal(uint8_t, uint8_t);&lt;br /&gt;
|Set one (val) hour bar segment to LCD_MODE (0-23) reset all other segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetHourBarBar(uint8_t, uint8_t);&lt;br /&gt;
|Set all hour bar segments from 0 to val to LCD_MODE (0-23)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Update(void);                        &lt;br /&gt;
|Request immidiate LCD-Update (normal only when bitplane changes)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t LCD_ContrastAdjust (int8_t);           &lt;br /&gt;
|Adjust the contrast&lt;br /&gt;
|&#039;&#039;&#039;not tested yet&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== RTC ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Funtion&lt;br /&gt;
! Propose&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_Init(RTC_CALLBACK_FUNC);            &lt;br /&gt;
|Sart Timer, activate 500ms IRQ, set callback Function for Dow_Timer&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetHour(void);                    &lt;br /&gt;
|Get Hour&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetMinute(void);                   &lt;br /&gt;
|Get Minute&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetSecond(void);                   &lt;br /&gt;
|Get Second&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetDay(void);                      &lt;br /&gt;
|Get Day&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetMonth(void);                    &lt;br /&gt;
|Get Month&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetYearYY(void);                     &lt;br /&gt;
|Get Year (00-255)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetDayOfWeek(void);                &lt;br /&gt;
|Get Day of Week (0:Monday)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint16_t RTC_GetYearYYYY(void);               &lt;br /&gt;
|Get Year (2000-2255)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetHour(uint8_t);                     &lt;br /&gt;
|Set Hour&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetMinute(uint8_t);                   &lt;br /&gt;
|Set Minute&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetSecond(uint8_t);                   &lt;br /&gt;
|Set Second&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetDay(uint8_t);                      &lt;br /&gt;
|Set Day&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetMonth(uint8_t);                    &lt;br /&gt;
|Set Month&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetYear(uint8_t);                     &lt;br /&gt;
|Set Year&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void    RTC_DowTimerSet(rtc_dow_t, uint8_t, uint8_t); &lt;br /&gt;
|set day of week timer&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_DowTimerGet(rtc_dow_t, uint8_t);         &lt;br /&gt;
|get day of week timer&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_DowTimerGetStartOfDay(void);              &lt;br /&gt;
|timer status start of day&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_DowTimerGetActualIndex(void);         &lt;br /&gt;
|timer status now&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_CalibrateRCO(void);&lt;br /&gt;
|calibrate internal rco&lt;br /&gt;
|&#039;&#039;&#039;not tested yet&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
Dow_Timer &lt;br /&gt;
* there are 28 DOW timers (for each DOW 4 Timers)&lt;br /&gt;
* Each timer can be set to a time (multiple of 10 minutes) &lt;br /&gt;
**  time is stored in a byte with the format hh*10+mm/10 e.g.: &lt;br /&gt;
**  10:10=110, 23:50=235, 255=disable&lt;br /&gt;
* when actual time and DOW is eaqual to a timer time and DOW, then &lt;br /&gt;
** callback function is called (during Timer IRQ) with timerindex as argument &lt;br /&gt;
&lt;br /&gt;
= Entwicklungsumgebung =&lt;br /&gt;
* Editor, Debugger, Compiler&lt;br /&gt;
** WinAVR version (20071221), sprich GCC 4.2.2 sowie avr-libc 1.6.0&lt;br /&gt;
** AVR Studio 4 &lt;br /&gt;
* JTAG ICE&lt;br /&gt;
** Atmel AVR JTAGICE MK2 &lt;br /&gt;
** AVR Dragon (z.B. http://elmicro.com/de/atavrdragon.html)&lt;br /&gt;
** Olimex-Seriell http://www.olimex.com/dev/avr-jtag.html  &lt;br /&gt;
** Olimex-USB http://www.olimex.com/dev/avr-usb-jtag.html &lt;br /&gt;
&lt;br /&gt;
= Sonstiges =&lt;br /&gt;
== Altes Protokoll ==&lt;br /&gt;
[[HR20_Protocol_V2 | Hier ]] hat mal einer ein Protokoll eingegeben.&lt;br /&gt;
Das scheint aber nicht zu der Version 2.04 zu passen. &lt;br /&gt;
Ich habe es nicht gelöscht, falls es jemanden interessiert.&lt;br /&gt;
== SVN Anleitung ==&lt;br /&gt;
Eine Anleitung was ein SVN ist und wie man es brauchen wir hier nicht.&lt;br /&gt;
Sonst müsste hier auch ein C-Kurs, Windows-Kurs, und Elektronik-Kurs hin.&lt;br /&gt;
&lt;br /&gt;
[[Category:Projekte|!]]&lt;/div&gt;</summary>
		<author><name>Dario</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=26160</id>
		<title>Heizungssteuerung mit Honeywell HR20</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=26160"/>
		<updated>2008-02-07T21:55:04Z</updated>

		<summary type="html">&lt;p&gt;Dario: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von DarioC&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Wie alles begann =&lt;br /&gt;
&lt;br /&gt;
Nachdem von Uwe Felgentreu vor nunmehr vor über drei Jahren (genau am 17.11.2004 um 11:26) hier in diesem Forum den Thread mit dem Titel &#039;&#039;Honeywell Rondostat HR20E per AVR steuern und konfigurieren&#039;&#039; gestartet hat ist es nun langsam soweit, dass das Ganze auch ein Projekt wird. &lt;br /&gt;
&lt;br /&gt;
Den Thread dazu kann der interessierte Leser [http://www.mikrocontroller.net/topic/17603 hier nachlesen] &lt;br /&gt;
&lt;br /&gt;
= Projektziel =&lt;br /&gt;
&lt;br /&gt;
Wir konzentrieren uns in erster Linie auf den Honeywell Rondostat HR20E mit ausgelieferten Softwareversion 2.04. Dass es ähnliche andere Geräte gibt behalten wir bei der Entwicklung im Hinterkopf.&lt;br /&gt;
&lt;br /&gt;
Basierend auf dieser Hardware wollen wir eine neue Software entwickeln. &lt;br /&gt;
Dabe können wir ausser der Hardware nichts weiter verwenden, da die Originalsoftware geschützt ist und nicht ausgelesen werden kann.&lt;br /&gt;
&lt;br /&gt;
== Phase 1 ==&lt;br /&gt;
Die Software soll die Funktionen bieten, die die Originalsoftware auch bietet, später können dies dann um zusätzliche Funktionen erweitert werden. Die wichtigsten Funktionen sind:&lt;br /&gt;
&lt;br /&gt;
* Temperaturregelung&lt;br /&gt;
* Echtzeituhr&lt;br /&gt;
* Ausnutzen der Sleep Funktion&lt;br /&gt;
* Anzeige Soll-Temperatur und der Uhrzeit&lt;br /&gt;
* Einstellung der Soll-Temperatur&lt;br /&gt;
* Uhrzeitgesteuerte Einstellung der Soll-Temperatur &lt;br /&gt;
* Fenster-Offen-Erkennung&lt;br /&gt;
* Ventilfreispülungsfunktion&lt;br /&gt;
&lt;br /&gt;
== Phase 2 ==&lt;br /&gt;
&lt;br /&gt;
Hier liegt der Sinn des ganzen Projektes: Durch diese zusätzlichen Funktionen wollen wir den Nutzwert des Thermostaten erheblich steigern:&lt;br /&gt;
&lt;br /&gt;
* Programmierung der Schaltzeiten und Temperaturen über externe Schnittstelle&lt;br /&gt;
* Abfrage der Messwerte und Parameter über externe Schnittstelle&lt;br /&gt;
* Vernetzung der Thermostaten untereinander&lt;br /&gt;
* Zusätzliche externe Schnittstellen (neben UART auch CAN und Funk)&lt;br /&gt;
* Erweiterung der Anzeige um&lt;br /&gt;
** Ist-Temperatur &lt;br /&gt;
** Ventilstellung&lt;br /&gt;
** Funkschnittstelle&lt;br /&gt;
*** RFM12 http://www.hoperf.com/rf_fsk.asp&lt;br /&gt;
*** Zigbee http://www.meshnetics.com/zigbee-modules&lt;br /&gt;
** ...&lt;br /&gt;
* Bootloader, damit Leute mitarbeiten können, die keine JTAG haben. Mit einem JTAG könnte man den Bootloader Flashen, ohne den Thermostaten öffnen zu müssen. Von da an kann man über den Programmierstecker mit einem umgebauten Handykabel den Thermostaten neu flashen.&lt;br /&gt;
&lt;br /&gt;
= Subversion Repository =&lt;br /&gt;
Ein SVN Repository liegt auf dem freien SVN Server: https://opensvn.csie.org&lt;br /&gt;
== Zugangsdaten ==&lt;br /&gt;
Repository Location: https://OpenSVN.csie.org/hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
Browse Repository: https://OpenSVN.csie.org/viewcvs.cgi/?root=hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
TRAC: https://opensvn.csie.org/traccgi/hr20&lt;br /&gt;
== Policy ==&lt;br /&gt;
Anonymous check out ist erlaubt. &amp;lt;br&amp;gt;&lt;br /&gt;
Wer was committen will muss freigeschaltet werden. &amp;lt;br&amp;gt;&lt;br /&gt;
Dazu brauche ich ein &#039;&#039;Usernamen, Passwort&#039;&#039; und eine &#039;&#039;Mailadresse&#039;&#039;, dann kann ich das einrichten. &amp;lt;br&amp;gt;&lt;br /&gt;
Tragt Euch dazu einfach selber in die Tabelle ein, ich erledige dann den Rest.&amp;lt;br&amp;gt;&lt;br /&gt;
Das mache ich dann von Hand und da ich nicht alle 10 Minuten Mails bearbeite kann das auch schon mal einen oder zwei Tage dauern. &amp;lt;br&amp;gt;&lt;br /&gt;
Wenn sich ein Maintainer findet, gebe ich die Zugangsdaten gerne weiter.&lt;br /&gt;
== Entwickler ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! width=&amp;quot;150&amp;quot; | Entwickler&lt;br /&gt;
! width=&amp;quot;150&amp;quot; | svn Status&lt;br /&gt;
|-&lt;br /&gt;
| darioc&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|-&lt;br /&gt;
| louk&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|}&lt;br /&gt;
== Verzeichnisstruktur ==&lt;br /&gt;
Eine Verzeichnisstruktur ist auch schon angelegt und die ersten Daten auch drin. Hier die Verzeichnisse:&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
| &#039;&#039;&#039;/doc&#039;&#039;&#039;&lt;br /&gt;
| Für alles an Dokumenten, die selbst erstellt wurden. &amp;lt;br&amp;gt;&lt;br /&gt;
Specs, die man im Internet bekommen kann gehören hier nicht rein, &amp;lt;br&amp;gt;&lt;br /&gt;
die machen das alles nur unnötig gross und das auschecken dauert länger.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/playground&#039;&#039;&#039; &lt;br /&gt;
| Wie der Name schon sagt, zum rumspielen und testen. &amp;lt;br&amp;gt;&lt;br /&gt;
Hier kommt jegliche art von Codeschnipseln hin, die zu Testen da sind &amp;lt;br&amp;gt;&lt;br /&gt;
und (derzeit) noch icht Teil des Programmes sind.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/source&#039;&#039;&#039; &lt;br /&gt;
| Hier kommt die Applikation rein mit allen Modulen und makefiles.&amp;lt;br&amp;gt;&lt;br /&gt;
Bitte haltet das Repository sauber und checkt nur Dateien ein, &amp;lt;br&amp;gt;&lt;br /&gt;
die auch Sinn  machen, &amp;quot;thumbs.db&amp;quot; oder andere Temp-Dateien gehören hier nicht rein.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SVN Client und Anleitung ==&lt;br /&gt;
Windows-User nutzen am besten den Tortoise-SVN-Client, den man kostenfrei [http://tortoisesvn.tigris.org hier runterladen] kann. &amp;lt;br&amp;gt;&lt;br /&gt;
Dort gibt es auch eine Anleitung zum Arbeiten mit SVN. &lt;br /&gt;
&lt;br /&gt;
= Analyse der Hardware =&lt;br /&gt;
Die Analyse hat der Dario schon gemacht, zu finden ist die jeweils aktuelle Version &lt;br /&gt;
[http://www.carluccio.de/img/hr20/analyse.pdf als PDF hier] oder [https://opensvn.csie.org/viewcvs.cgi/doc/analyse.pdf hier im SVN].&lt;br /&gt;
&lt;br /&gt;
= Benötigte Module =&lt;br /&gt;
&lt;br /&gt;
Um das Ganze nun etwas zu koordinieren hier eine Liste der benötigten Module und deren Funktionen. &amp;lt;br&amp;gt;&lt;br /&gt;
Diese dient dazu später die Aufgaben zu verteilen:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Module&lt;br /&gt;
! Function&lt;br /&gt;
! Developer&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| LCD&lt;br /&gt;
| Display Driver:&amp;lt;BR&amp;gt;&lt;br /&gt;
* Init Display - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Set Segments - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Print HEX, DEC, TEMP, DayofWeek - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Blink - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* e.t.c&lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; DONE &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| RTC&lt;br /&gt;
| Time and Date Handler&lt;br /&gt;
* init timer - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* use IRQ with 32kHz crystal - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* handle time and date - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** daylight saving - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** consult leapyear  - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* calc day of week out of date - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Only one Byte for Year -&amp;gt; (2000 to 2255)&lt;br /&gt;
* Day of week timer with callback - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* corretion for external Crystal - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* calibrate internal RC - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE, but not tested &#039;&#039;&#039;&amp;lt;/span&amp;gt; &lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; (95%)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UART &lt;br /&gt;
| UART-Driver&lt;br /&gt;
* menue (Debug und Steuerung)&lt;br /&gt;
** show and set desired temperature &lt;br /&gt;
** show and set Time and Date&lt;br /&gt;
** show actual temperature&lt;br /&gt;
** show (and set) actual valveposition &lt;br /&gt;
** show and set timetable and temperatures&lt;br /&gt;
* optional &lt;br /&gt;
** adressierung of HR20 (for BUS, RF)&lt;br /&gt;
** authentication end encryption&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| MENU&lt;br /&gt;
| Display Menu&lt;br /&gt;
* get keystate (with debounce)&lt;br /&gt;
** multi keypress (nedded for hidden menue?)&lt;br /&gt;
** longer keypress / double click (nedded?)&lt;br /&gt;
* get position of wheel (incremental counter)&lt;br /&gt;
* controll display&lt;br /&gt;
* functionality:&lt;br /&gt;
* show and set desired temperature&lt;br /&gt;
* show and set time and date &lt;br /&gt;
* show actual temperature&lt;br /&gt;
* show actual valveposition &lt;br /&gt;
* show and set timetable and temperatures&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| MOTOR&lt;br /&gt;
| Motor-Driver &lt;br /&gt;
* set desired valveposition &lt;br /&gt;
** quick&lt;br /&gt;
** asympthotic&lt;br /&gt;
** quiet&lt;br /&gt;
* callibrate for Valve&lt;br /&gt;
* Genereate ERROR if motor not turning (low energie)&lt;br /&gt;
| style=&amp;quot;background-color:yellow;&amp;quot; | &#039;&#039;&#039; dario &#039;&#039;&#039; &lt;br /&gt;
&#039;&#039;&#039; active &#039;&#039;&#039; &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| TEMP&lt;br /&gt;
| Temperaturesensor-Driver &lt;br /&gt;
* init Sensor &lt;br /&gt;
* IQR driven (500ms)&lt;br /&gt;
* start A/D conversion (IQR driven)&lt;br /&gt;
* get A/D Value and calc temperature&lt;br /&gt;
* calibration for sensor (needed?)&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| PID&lt;br /&gt;
| PID Algorithm&lt;br /&gt;
* calculate desired valveposition out of&lt;br /&gt;
** last valveposition(s) &lt;br /&gt;
** last temperature(s)&lt;br /&gt;
** actual temperature&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| BOOT&lt;br /&gt;
| Bootloader&lt;br /&gt;
we need a bootloader so that the developers can flash the software &lt;br /&gt;
without a JTAG cable and without disassembling the HR20.&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| LOG&lt;br /&gt;
| Datalogger&lt;br /&gt;
* Operating Hours&lt;br /&gt;
** motor in action&lt;br /&gt;
** ODOmeter&lt;br /&gt;
** since Battery Exchange&lt;br /&gt;
* Errors&lt;br /&gt;
* Logfiles (only with additional hardware)&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UID&lt;br /&gt;
| Unique ID for identification&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= API Beschreibung =&lt;br /&gt;
== LCD ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Funtion&lt;br /&gt;
! Propose&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Init(void);            &lt;br /&gt;
|Init the LCD Controller&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_AllSegments(uint8_t);&lt;br /&gt;
|Set all segments to LCD_MODE&lt;br /&gt;
| done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearAll(void);                       &lt;br /&gt;
|Clear all segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearHour_Bar(void);&lt;br /&gt;
|Clear 24 bar segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearSymbols(void);&lt;br /&gt;
|Clear AUTO MANU PROG SUN MOON SNOW&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearNumbers(void);&lt;br /&gt;
|Clear 7 Segments ans Collumns&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintDec(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print DEC-val in two 7 Segments 0-99&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintHex(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print HEX-val in two 7 Segments 0-ff&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintNo(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print one ditig in one 7 Segment&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintTemp(uint8_t, uint8_t);&lt;br /&gt;
|Print desired temperature (val+4,9)°C&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetSeg(uint8_t, uint8_t);          &lt;br /&gt;
|Set one segment to LCD_MODE (0-69)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetHourBarSeg(uint8_t, uint8_t);    &lt;br /&gt;
|Set one hour bar segment to LCD_MODE (0-23)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetHourBarVal(uint8_t, uint8_t);&lt;br /&gt;
|Set one (val) hour bar segment to LCD_MODE (0-23) reset all other segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetHourBarBar(uint8_t, uint8_t);&lt;br /&gt;
|Set all hour bar segments from 0 to val to LCD_MODE (0-23)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Update(void);                        &lt;br /&gt;
|Request immidiate LCD-Update (normal only when bitplane changes)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t LCD_ContrastAdjust (int8_t);           &lt;br /&gt;
|Adjust the contrast&lt;br /&gt;
|&#039;&#039;&#039;not tested yet&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== RTC ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Funtion&lt;br /&gt;
! Propose&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_Init(RTC_CALLBACK_FUNC);            &lt;br /&gt;
|Sart Timer, activate 500ms IRQ, set callback Function for Dow_Timer&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetHour(void);                    &lt;br /&gt;
|Get Hour&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetMinute(void);                   &lt;br /&gt;
|Get Minute&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetSecond(void);                   &lt;br /&gt;
|Get Second&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetDay(void);                      &lt;br /&gt;
|Get Day&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetMonth(void);                    &lt;br /&gt;
|Get Month&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetYearYY(void);                     &lt;br /&gt;
|Get Year (00-255)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetDayOfWeek(void);                &lt;br /&gt;
|Get Day of Week (0:Monday)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint16_t RTC_GetYearYYYY(void);               &lt;br /&gt;
|Get Year (2000-2255)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetHour(uint8_t);                     &lt;br /&gt;
|Set Hour&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetMinute(uint8_t);                   &lt;br /&gt;
|Set Minute&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetSecond(uint8_t);                   &lt;br /&gt;
|Set Second&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetDay(uint8_t);                      &lt;br /&gt;
|Set Day&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetMonth(uint8_t);                    &lt;br /&gt;
|Set Month&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetYear(uint8_t);                     &lt;br /&gt;
|Set Year&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void    RTC_DowTimerSet(rtc_dow_t, uint8_t, uint8_t); &lt;br /&gt;
|set day of week timer&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_DowTimerGet(rtc_dow_t, uint8_t);         &lt;br /&gt;
|get day of week timer&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_DowTimerGetStartOfDay(void);              &lt;br /&gt;
|timer status start of day&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_DowTimerGetActualIndex(void);         &lt;br /&gt;
|timer status now&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_CalibrateRCO(void);&lt;br /&gt;
|calibrate internal rco&lt;br /&gt;
|&#039;&#039;&#039;not tested yet&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
Dow_Timer &lt;br /&gt;
* there are 28 DOW timers (for each DOW 4 Timers)&lt;br /&gt;
* Each timer can be set to a time (multiple of 10 minutes) &lt;br /&gt;
**  time is stored in a byte with the format hh*10+mm/10 e.g.: &lt;br /&gt;
**  10:10=110, 23:50=235, 255=disable&lt;br /&gt;
* when actual time and DOW is eaqual to a timer time and DOW, then &lt;br /&gt;
** callback function is called (during Timer IRQ) with timerindex as argument &lt;br /&gt;
&lt;br /&gt;
= Entwicklungsumgebung =&lt;br /&gt;
* Editor, Debugger, Compiler&lt;br /&gt;
** WinAVR version (20071221), sprich GCC 4.2.2 sowie avr-libc 1.6.0&lt;br /&gt;
** AVR Studio 4 &lt;br /&gt;
* JTAG ICE&lt;br /&gt;
** Atmel AVR JTAGICE MK2 &lt;br /&gt;
** AVR Dragon (z.B. http://elmicro.com/de/atavrdragon.html)&lt;br /&gt;
** Olimex-Seriell http://www.olimex.com/dev/avr-jtag.html  &lt;br /&gt;
** Olimex-USB http://www.olimex.com/dev/avr-usb-jtag.html &lt;br /&gt;
&lt;br /&gt;
= Sonstiges =&lt;br /&gt;
== Altes Protokoll ==&lt;br /&gt;
[[HR20_Protocol_V2 | Hier ]] hat mal einer ein Protokoll eingegeben.&lt;br /&gt;
Das scheint aber nicht zu der Version 2.04 zu passen. &lt;br /&gt;
Ich habe es nicht gelöscht, falls es jemanden interessiert.&lt;br /&gt;
== SVN Anleitung ==&lt;br /&gt;
Eine Anleitung was ein SVN ist und wie man es brauchen wir hier nicht.&lt;br /&gt;
Sonst müsste hier auch ein C-Kurs, Windows-Kurs, und Elektronik-Kurs hin.&lt;br /&gt;
&lt;br /&gt;
[[Category:Projekte|!]]&lt;/div&gt;</summary>
		<author><name>Dario</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=26099</id>
		<title>Heizungssteuerung mit Honeywell HR20</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=26099"/>
		<updated>2008-02-06T08:46:09Z</updated>

		<summary type="html">&lt;p&gt;Dario: /* Benötigte Module */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von DarioC&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Wie alles begann =&lt;br /&gt;
&lt;br /&gt;
Nachdem von Uwe Felgentreu vor nunmehr vor über drei Jahren (genau am 17.11.2004 um 11:26) hier in diesem Forum den Thread mit dem Titel &#039;&#039;Honeywell Rondostat HR20E per AVR steuern und konfigurieren&#039;&#039; gestartet hat ist es nun langsam soweit, dass das Ganze auch ein Projekt wird. &lt;br /&gt;
&lt;br /&gt;
Den Thread dazu kann der interessierte Leser [http://www.mikrocontroller.net/topic/17603 hier nachlesen] &lt;br /&gt;
&lt;br /&gt;
= Projektziel =&lt;br /&gt;
&lt;br /&gt;
Wir konzentrieren uns in erster Linie auf den Honeywell Rondostat HR20E mit ausgelieferten Softwareversion 2.04. Dass es ähnliche andere Geräte gibt behalten wir bei der Entwicklung im Hinterkopf.&lt;br /&gt;
&lt;br /&gt;
Basierend auf dieser Hardware wollen wir eine neue Software entwickeln. &lt;br /&gt;
Dabe können wir ausser der Hardware nichts weiter verwenden, da die Originalsoftware geschützt ist und nicht ausgelesen werden kann.&lt;br /&gt;
&lt;br /&gt;
== Phase 1 ==&lt;br /&gt;
Die Software soll die Funktionen bieten, die die Originalsoftware auch bietet, später können dies dann um zusätzliche Funktionen erweitert werden. Die wichtigsten Funktionen sind:&lt;br /&gt;
&lt;br /&gt;
* Temperaturregelung&lt;br /&gt;
* Echtzeituhr&lt;br /&gt;
* Ausnutzen der Sleep Funktion&lt;br /&gt;
* Anzeige Soll-Temperatur und der Uhrzeit&lt;br /&gt;
* Einstellung der Soll-Temperatur&lt;br /&gt;
* Uhrzeitgesteuerte Einstellung der Soll-Temperatur &lt;br /&gt;
* Fenster-Offen-Erkennung&lt;br /&gt;
* Ventilfreispülungsfunktion&lt;br /&gt;
&lt;br /&gt;
== Phase 2 ==&lt;br /&gt;
&lt;br /&gt;
Hier liegt der Sinn des ganzen Projektes: Durch diese zusätzlichen Funktionen wollen wir den Nutzwert des Thermostaten erheblich steigern:&lt;br /&gt;
&lt;br /&gt;
* Programmierung der Schaltzeiten und Temperaturen über externe Schnittstelle&lt;br /&gt;
* Abfrage der Messwerte und Parameter über externe Schnittstelle&lt;br /&gt;
* Vernetzung der Thermostaten untereinander&lt;br /&gt;
* Zusätzliche externe Schnittstellen (neben UART auch CAN und Funk)&lt;br /&gt;
* Erweiterung der Anzeige um&lt;br /&gt;
** Ist-Temperatur &lt;br /&gt;
** Ventilstellung&lt;br /&gt;
** Funkschnittstelle&lt;br /&gt;
*** RFM12 http://www.hoperf.com/rf_fsk.asp&lt;br /&gt;
*** Zigbee http://www.meshnetics.com/zigbee-modules&lt;br /&gt;
** ...&lt;br /&gt;
* Bootloader, damit Leute mitarbeiten können, die keine JTAG haben. Mit einem JTAG könnte man den Bootloader Flashen, ohne den Thermostaten öffnen zu müssen. Von da an kann man über den Programmierstecker mit einem umgebauten Handykabel den Thermostaten neu flashen.&lt;br /&gt;
&lt;br /&gt;
= Subversion Repository =&lt;br /&gt;
Ein SVN Repository liegt auf dem freien SVN Server: https://opensvn.csie.org&lt;br /&gt;
== Zugangsdaten ==&lt;br /&gt;
Repository Location: https://OpenSVN.csie.org/hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
Browse Repository: https://OpenSVN.csie.org/viewcvs.cgi/?root=hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
TRAC: https://opensvn.csie.org/traccgi/hr20&lt;br /&gt;
== Policy ==&lt;br /&gt;
Anonymous check out ist erlaubt. &amp;lt;br&amp;gt;&lt;br /&gt;
Wer was committen will muss freigeschaltet werden. &amp;lt;br&amp;gt;&lt;br /&gt;
Dazu brauche ich ein &#039;&#039;Usernamen, Passwort&#039;&#039; und eine &#039;&#039;Mailadresse&#039;&#039;, dann kann ich das einrichten. &amp;lt;br&amp;gt;&lt;br /&gt;
Tragt Euch dazu einfach selber in die Tabelle ein, ich erledige dann den Rest.&amp;lt;br&amp;gt;&lt;br /&gt;
Das mache ich dann von Hand und da ich nicht alle 10 Minuten Mails bearbeite kann das auch schon mal einen oder zwei Tage dauern. &amp;lt;br&amp;gt;&lt;br /&gt;
Wenn sich ein Maintainer findet, gebe ich die Zugangsdaten gerne weiter.&lt;br /&gt;
== Entwickler ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! width=&amp;quot;150&amp;quot; | Entwickler&lt;br /&gt;
! width=&amp;quot;150&amp;quot; | svn Status&lt;br /&gt;
|-&lt;br /&gt;
| darioc&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|-&lt;br /&gt;
| louk&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|}&lt;br /&gt;
== Verzeichnisstruktur ==&lt;br /&gt;
Eine Verzeichnisstruktur ist auch schon angelegt und die ersten Daten auch drin. Hier die Verzeichnisse:&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
| &#039;&#039;&#039;/doc&#039;&#039;&#039;&lt;br /&gt;
| Für alles an Dokumenten, die selbst erstellt wurden. &amp;lt;br&amp;gt;&lt;br /&gt;
Specs, die man im Internet bekommen kann gehören hier nicht rein, &amp;lt;br&amp;gt;&lt;br /&gt;
die machen das alles nur unnötig gross und das auschecken dauert länger.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/playground&#039;&#039;&#039; &lt;br /&gt;
| Wie der Name schon sagt, zum rumspielen und testen. &amp;lt;br&amp;gt;&lt;br /&gt;
Hier kommt jegliche art von Codeschnipseln hin, die zu Testen da sind &amp;lt;br&amp;gt;&lt;br /&gt;
und (derzeit) noch icht Teil des Programmes sind.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/source&#039;&#039;&#039; &lt;br /&gt;
| Hier kommt die Applikation rein mit allen Modulen und makefiles.&amp;lt;br&amp;gt;&lt;br /&gt;
Bitte haltet das Repository sauber und checkt nur Dateien ein, &amp;lt;br&amp;gt;&lt;br /&gt;
die auch Sinn  machen, &amp;quot;thumbs.db&amp;quot; oder andere Temp-Dateien gehören hier nicht rein.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SVN Client und Anleitung ==&lt;br /&gt;
Windows-User nutzen am besten den Tortoise-SVN-Client, den man kostenfrei [http://tortoisesvn.tigris.org hier runterladen] kann. &amp;lt;br&amp;gt;&lt;br /&gt;
Dort gibt es auch eine Anleitung zum Arbeiten mit SVN. &lt;br /&gt;
&lt;br /&gt;
= Analyse der Hardware =&lt;br /&gt;
Die Analyse hat der Dario schon gemacht, zu finden ist die jeweils aktuelle Version &lt;br /&gt;
[http://www.carluccio.de/img/hr20/analyse.pdf als PDF hier] oder [https://opensvn.csie.org/viewcvs.cgi/doc/analyse.pdf hier im SVN].&lt;br /&gt;
&lt;br /&gt;
= Benötigte Module =&lt;br /&gt;
&lt;br /&gt;
Um das Ganze nun etwas zu koordinieren hier eine Liste der benötigten Module und deren Funktionen. &amp;lt;br&amp;gt;&lt;br /&gt;
Diese dient dazu später die Aufgaben zu verteilen:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Module&lt;br /&gt;
! Function&lt;br /&gt;
! Developer&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| LCD&lt;br /&gt;
| Display Driver:&amp;lt;BR&amp;gt;&lt;br /&gt;
* Init Display - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Set Segments - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Print HEX, DEC, TEMP, DayofWeek - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Blink - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* e.t.c&lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; DONE &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| RTC&lt;br /&gt;
| Time and Date Handler&lt;br /&gt;
* init timer - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* use IRQ with 32kHz crystal - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* handle time and date - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** daylight saving - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** consult leapyear  - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* calc day of week out of date - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Only one Byte for Year -&amp;gt; (2000 to 2255)&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* timer - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; open &#039;&#039;&#039;&amp;lt;/span&amp;gt; &lt;br /&gt;
* corretion for external Crystal - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* calibrate internal RC - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE, but not tested &#039;&#039;&#039;&amp;lt;/span&amp;gt; &lt;br /&gt;
| style=&amp;quot;background-color:yellow;&amp;quot; | &#039;&#039;&#039; dario &#039;&#039;&#039; &lt;br /&gt;
&#039;&#039;&#039; active &#039;&#039;&#039; &lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; (95%)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UART &lt;br /&gt;
| UART-Driver&lt;br /&gt;
* menue (Debug und Steuerung)&lt;br /&gt;
** show and set desired temperature &lt;br /&gt;
** show and set Time and Date&lt;br /&gt;
** show actual temperature&lt;br /&gt;
** show (and set) actual valveposition &lt;br /&gt;
** show and set timetable and temperatures&lt;br /&gt;
* optional &lt;br /&gt;
** adressierung of HR20 (for BUS, RF)&lt;br /&gt;
** authentication end encryption&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| MENU&lt;br /&gt;
| Display Menu&lt;br /&gt;
* get keystate (with debounce)&lt;br /&gt;
** multi keypress (nedded for hidden menue?)&lt;br /&gt;
** longer keypress / double click (nedded?)&lt;br /&gt;
* get position of wheel (incremental counter)&lt;br /&gt;
* controll display&lt;br /&gt;
* functionality:&lt;br /&gt;
* show and set desired temperature&lt;br /&gt;
* show and set time and date &lt;br /&gt;
* show actual temperature&lt;br /&gt;
* show actual valveposition &lt;br /&gt;
* show and set timetable and temperatures&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| MOTOR&lt;br /&gt;
| Motor-Driver &lt;br /&gt;
* set desired valveposition &lt;br /&gt;
** quick&lt;br /&gt;
** asympthotic&lt;br /&gt;
** quiet&lt;br /&gt;
* callibrate for Valve&lt;br /&gt;
* Genereate ERROR if motor not turning (low energie)&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| TEMP&lt;br /&gt;
| Temperaturesensor-Driver &lt;br /&gt;
* init Sensor &lt;br /&gt;
* IQR driven (500ms)&lt;br /&gt;
* start A/D conversion (IQR driven)&lt;br /&gt;
* get A/D Value and calc temperature&lt;br /&gt;
* calibration for sensor (needed?)&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| PID&lt;br /&gt;
| PID Algorithm&lt;br /&gt;
* calculate desired valveposition out of&lt;br /&gt;
** last valveposition(s) &lt;br /&gt;
** last temperature(s)&lt;br /&gt;
** actual temperature&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| BOOT&lt;br /&gt;
| Bootloader&lt;br /&gt;
we need a bootloader so that the developers can flash the software &lt;br /&gt;
without a JTAG cable and without disassembling the HR20.&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| LOG&lt;br /&gt;
| Datalogger&lt;br /&gt;
* Operating Hours&lt;br /&gt;
** motor in action&lt;br /&gt;
** ODOmeter&lt;br /&gt;
** since Battery Exchange&lt;br /&gt;
* Errors&lt;br /&gt;
* Logfiles (only with additional hardware)&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UID&lt;br /&gt;
| Unique ID for identification&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= API Beschreibung =&lt;br /&gt;
== LCD ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Funtion&lt;br /&gt;
! Propose&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Init(void);            &lt;br /&gt;
|Init the LCD Controller&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_AllSegments(uint8_t);&lt;br /&gt;
|Set all segments to LCD_MODE&lt;br /&gt;
| done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearAll(void);                       &lt;br /&gt;
|Clear all segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearHour_Bar(void);&lt;br /&gt;
|Clear 24 bar segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearSymbols(void);&lt;br /&gt;
|Clear AUTO MANU PROG SUN MOON SNOW&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearNumbers(void);&lt;br /&gt;
|Clear 7 Segments ans Collumns&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintDec(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print DEC-val in two 7 Segments 0-99&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintHex(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print HEX-val in two 7 Segments 0-ff&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintNo(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print one ditig in one 7 Segment&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintTemp(uint8_t, uint8_t);&lt;br /&gt;
|Print desired temperature (val+4,9)°C&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetSeg(uint8_t, uint8_t);          &lt;br /&gt;
|Set one Segment to LCD_MODE (0-69)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetHourBarSeg(uint8_t, uint8_t);    &lt;br /&gt;
|Set one Hour Bar Segment to LCD_MODE (0-23)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetHourBarVal(uint8_t, uint8_t);&lt;br /&gt;
|Set all Hour Bar Segments from 0 to val to LCD_MODE (0-23)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Update(void);                        &lt;br /&gt;
|Request immidiate LCD-Update (normal only when bitplane changes)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t LCD_ContrastAdjust (int8_t);           &lt;br /&gt;
|Adjust the contrast&lt;br /&gt;
|&#039;&#039;&#039;not tested yet&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== RTC ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Funtion&lt;br /&gt;
! Propose&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_Init(void);            &lt;br /&gt;
|Sart Timer, activate 500ms IRQ&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetHour(void);                    &lt;br /&gt;
|Get Hour&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetMinute(void);                   &lt;br /&gt;
|Get Minute&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetSecond(void);                   &lt;br /&gt;
|Get Second&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetDay(void);                      &lt;br /&gt;
|Get Day&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetMonth(void);                    &lt;br /&gt;
|Get Month&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetYearYY(void);                     &lt;br /&gt;
|Get Year (00-255)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetDayOfWeek(void);                &lt;br /&gt;
|Get Day of Week (0:Monday)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint16_t RTC_GetYearYYYY(void);               &lt;br /&gt;
|Get Year (2000-2255)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetHour(uint8_t);                     &lt;br /&gt;
|Set Hour&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetMinute(uint8_t);                   &lt;br /&gt;
|Set Minute&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetSecond(uint8_t);                   &lt;br /&gt;
|Set Second&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetDay(uint8_t);                      &lt;br /&gt;
|Set Day&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetMonth(uint8_t);                    &lt;br /&gt;
|Set Month&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetYear(uint8_t);                     &lt;br /&gt;
|Set Year&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_AddOneSecond(void);                  &lt;br /&gt;
|Add one second to actual time&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_AddOneDay(void);                     &lt;br /&gt;
|Add one day to actual date&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_NoLeapyear(uint8_t);               &lt;br /&gt;
|is year a leapyear?&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_DaysOfMonth(uint8_t, uint8_t);    &lt;br /&gt;
|how many days in (month, year)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_DayOfWeek(uint8_t, uint8_t, uint8_t);  &lt;br /&gt;
|calc day of week&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_IsLastsunday(void);                &lt;br /&gt;
|Check if last Sunday in march / october&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GenerateTimer(void);&lt;br /&gt;
|Generate an internal Timer&lt;br /&gt;
|&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039;open&#039;&#039;&#039; &amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|timer_entry_type RTC_GetTimer(uint8_t);&lt;br /&gt;
|Get data of internal Timer(handle)&lt;br /&gt;
|&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039;open&#039;&#039;&#039; &amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetTimer(uint8_t, timer_entry_type);&lt;br /&gt;
|Set data of internal Timer(handle)&lt;br /&gt;
|&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039;open&#039;&#039;&#039; &amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_DelTimer(uint8_t);&lt;br /&gt;
|Delete internal Timer(handle)&lt;br /&gt;
|&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039;open&#039;&#039;&#039; &amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_CalibrateRCO(void);&lt;br /&gt;
|calibrate internal rco&lt;br /&gt;
|&#039;&#039;&#039;not tested yet&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 typedef enum { MO, DI, MI, DO, FR, SA, SO} dow_t;&lt;br /&gt;
 &lt;br /&gt;
 typedef struct &lt;br /&gt;
 {&lt;br /&gt;
    uint8_8 dow;     // one bit for each day of week =&amp;gt; one entry for more dow  &lt;br /&gt;
                     // bit 7 is used as timer active bit&lt;br /&gt;
    uint8_8 hour;    &lt;br /&gt;
    uint8_8 minute;    &lt;br /&gt;
 } timer_entry_type;&lt;br /&gt;
&lt;br /&gt;
= Entwicklungsumgebung =&lt;br /&gt;
* Editor, Debugger, Compiler&lt;br /&gt;
** WinAVR version (20071221), sprich GCC 4.2.2 sowie avr-libc 1.6.0&lt;br /&gt;
** AVR Studio 4 &lt;br /&gt;
* JTAG ICE&lt;br /&gt;
** Atmel AVR JTAGICE MK2 &lt;br /&gt;
** AVR Dragon (z.B. http://elmicro.com/de/atavrdragon.html)&lt;br /&gt;
** Olimex-Seriell http://www.olimex.com/dev/avr-jtag.html  &lt;br /&gt;
** Olimex-USB http://www.olimex.com/dev/avr-usb-jtag.html &lt;br /&gt;
&lt;br /&gt;
= Sonstiges =&lt;br /&gt;
== Altes Protokoll ==&lt;br /&gt;
[[HR20_Protocol_V2 | Hier ]] hat mal einer ein Protokoll eingegeben.&lt;br /&gt;
Das scheint aber nicht zu der Version 2.04 zu passen. &lt;br /&gt;
Ich habe es nicht gelöscht, falls es jemanden interessiert.&lt;br /&gt;
== SVN Anleitung ==&lt;br /&gt;
Eine Anleitung was ein SVN ist und wie man es brauchen wir hier nicht.&lt;br /&gt;
Sonst müsste hier auch ein C-Kurs, Windows-Kurs, und Elektronik-Kurs hin.&lt;br /&gt;
&lt;br /&gt;
[[Category:Projekte|!]]&lt;/div&gt;</summary>
		<author><name>Dario</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=26098</id>
		<title>Heizungssteuerung mit Honeywell HR20</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=26098"/>
		<updated>2008-02-06T08:40:02Z</updated>

		<summary type="html">&lt;p&gt;Dario: /* RTC */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von DarioC&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Wie alles begann =&lt;br /&gt;
&lt;br /&gt;
Nachdem von Uwe Felgentreu vor nunmehr vor über drei Jahren (genau am 17.11.2004 um 11:26) hier in diesem Forum den Thread mit dem Titel &#039;&#039;Honeywell Rondostat HR20E per AVR steuern und konfigurieren&#039;&#039; gestartet hat ist es nun langsam soweit, dass das Ganze auch ein Projekt wird. &lt;br /&gt;
&lt;br /&gt;
Den Thread dazu kann der interessierte Leser [http://www.mikrocontroller.net/topic/17603 hier nachlesen] &lt;br /&gt;
&lt;br /&gt;
= Projektziel =&lt;br /&gt;
&lt;br /&gt;
Wir konzentrieren uns in erster Linie auf den Honeywell Rondostat HR20E mit ausgelieferten Softwareversion 2.04. Dass es ähnliche andere Geräte gibt behalten wir bei der Entwicklung im Hinterkopf.&lt;br /&gt;
&lt;br /&gt;
Basierend auf dieser Hardware wollen wir eine neue Software entwickeln. &lt;br /&gt;
Dabe können wir ausser der Hardware nichts weiter verwenden, da die Originalsoftware geschützt ist und nicht ausgelesen werden kann.&lt;br /&gt;
&lt;br /&gt;
== Phase 1 ==&lt;br /&gt;
Die Software soll die Funktionen bieten, die die Originalsoftware auch bietet, später können dies dann um zusätzliche Funktionen erweitert werden. Die wichtigsten Funktionen sind:&lt;br /&gt;
&lt;br /&gt;
* Temperaturregelung&lt;br /&gt;
* Echtzeituhr&lt;br /&gt;
* Ausnutzen der Sleep Funktion&lt;br /&gt;
* Anzeige Soll-Temperatur und der Uhrzeit&lt;br /&gt;
* Einstellung der Soll-Temperatur&lt;br /&gt;
* Uhrzeitgesteuerte Einstellung der Soll-Temperatur &lt;br /&gt;
* Fenster-Offen-Erkennung&lt;br /&gt;
* Ventilfreispülungsfunktion&lt;br /&gt;
&lt;br /&gt;
== Phase 2 ==&lt;br /&gt;
&lt;br /&gt;
Hier liegt der Sinn des ganzen Projektes: Durch diese zusätzlichen Funktionen wollen wir den Nutzwert des Thermostaten erheblich steigern:&lt;br /&gt;
&lt;br /&gt;
* Programmierung der Schaltzeiten und Temperaturen über externe Schnittstelle&lt;br /&gt;
* Abfrage der Messwerte und Parameter über externe Schnittstelle&lt;br /&gt;
* Vernetzung der Thermostaten untereinander&lt;br /&gt;
* Zusätzliche externe Schnittstellen (neben UART auch CAN und Funk)&lt;br /&gt;
* Erweiterung der Anzeige um&lt;br /&gt;
** Ist-Temperatur &lt;br /&gt;
** Ventilstellung&lt;br /&gt;
** Funkschnittstelle&lt;br /&gt;
*** RFM12 http://www.hoperf.com/rf_fsk.asp&lt;br /&gt;
*** Zigbee http://www.meshnetics.com/zigbee-modules&lt;br /&gt;
** ...&lt;br /&gt;
* Bootloader, damit Leute mitarbeiten können, die keine JTAG haben. Mit einem JTAG könnte man den Bootloader Flashen, ohne den Thermostaten öffnen zu müssen. Von da an kann man über den Programmierstecker mit einem umgebauten Handykabel den Thermostaten neu flashen.&lt;br /&gt;
&lt;br /&gt;
= Subversion Repository =&lt;br /&gt;
Ein SVN Repository liegt auf dem freien SVN Server: https://opensvn.csie.org&lt;br /&gt;
== Zugangsdaten ==&lt;br /&gt;
Repository Location: https://OpenSVN.csie.org/hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
Browse Repository: https://OpenSVN.csie.org/viewcvs.cgi/?root=hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
TRAC: https://opensvn.csie.org/traccgi/hr20&lt;br /&gt;
== Policy ==&lt;br /&gt;
Anonymous check out ist erlaubt. &amp;lt;br&amp;gt;&lt;br /&gt;
Wer was committen will muss freigeschaltet werden. &amp;lt;br&amp;gt;&lt;br /&gt;
Dazu brauche ich ein &#039;&#039;Usernamen, Passwort&#039;&#039; und eine &#039;&#039;Mailadresse&#039;&#039;, dann kann ich das einrichten. &amp;lt;br&amp;gt;&lt;br /&gt;
Tragt Euch dazu einfach selber in die Tabelle ein, ich erledige dann den Rest.&amp;lt;br&amp;gt;&lt;br /&gt;
Das mache ich dann von Hand und da ich nicht alle 10 Minuten Mails bearbeite kann das auch schon mal einen oder zwei Tage dauern. &amp;lt;br&amp;gt;&lt;br /&gt;
Wenn sich ein Maintainer findet, gebe ich die Zugangsdaten gerne weiter.&lt;br /&gt;
== Entwickler ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! width=&amp;quot;150&amp;quot; | Entwickler&lt;br /&gt;
! width=&amp;quot;150&amp;quot; | svn Status&lt;br /&gt;
|-&lt;br /&gt;
| darioc&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|-&lt;br /&gt;
| louk&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|}&lt;br /&gt;
== Verzeichnisstruktur ==&lt;br /&gt;
Eine Verzeichnisstruktur ist auch schon angelegt und die ersten Daten auch drin. Hier die Verzeichnisse:&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
| &#039;&#039;&#039;/doc&#039;&#039;&#039;&lt;br /&gt;
| Für alles an Dokumenten, die selbst erstellt wurden. &amp;lt;br&amp;gt;&lt;br /&gt;
Specs, die man im Internet bekommen kann gehören hier nicht rein, &amp;lt;br&amp;gt;&lt;br /&gt;
die machen das alles nur unnötig gross und das auschecken dauert länger.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/playground&#039;&#039;&#039; &lt;br /&gt;
| Wie der Name schon sagt, zum rumspielen und testen. &amp;lt;br&amp;gt;&lt;br /&gt;
Hier kommt jegliche art von Codeschnipseln hin, die zu Testen da sind &amp;lt;br&amp;gt;&lt;br /&gt;
und (derzeit) noch icht Teil des Programmes sind.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/source&#039;&#039;&#039; &lt;br /&gt;
| Hier kommt die Applikation rein mit allen Modulen und makefiles.&amp;lt;br&amp;gt;&lt;br /&gt;
Bitte haltet das Repository sauber und checkt nur Dateien ein, &amp;lt;br&amp;gt;&lt;br /&gt;
die auch Sinn  machen, &amp;quot;thumbs.db&amp;quot; oder andere Temp-Dateien gehören hier nicht rein.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SVN Client und Anleitung ==&lt;br /&gt;
Windows-User nutzen am besten den Tortoise-SVN-Client, den man kostenfrei [http://tortoisesvn.tigris.org hier runterladen] kann. &amp;lt;br&amp;gt;&lt;br /&gt;
Dort gibt es auch eine Anleitung zum Arbeiten mit SVN. &lt;br /&gt;
&lt;br /&gt;
= Analyse der Hardware =&lt;br /&gt;
Die Analyse hat der Dario schon gemacht, zu finden ist die jeweils aktuelle Version &lt;br /&gt;
[http://www.carluccio.de/img/hr20/analyse.pdf als PDF hier] oder [https://opensvn.csie.org/viewcvs.cgi/doc/analyse.pdf hier im SVN].&lt;br /&gt;
&lt;br /&gt;
= Benötigte Module =&lt;br /&gt;
&lt;br /&gt;
Um das Ganze nun etwas zu koordinieren hier eine Liste der benötigten Module und deren Funktionen. &amp;lt;br&amp;gt;&lt;br /&gt;
Diese dient dazu später die Aufgaben zu verteilen:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Module&lt;br /&gt;
! Function&lt;br /&gt;
! Developer&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| LCD&lt;br /&gt;
| Display Driver:&amp;lt;BR&amp;gt;&lt;br /&gt;
* Init Display - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Set Segments - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Print HEX, DEC, TEMP, DayofWeek - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Blink - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* e.t.c&lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; DONE &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| RTC&lt;br /&gt;
| Time and Date Handler&lt;br /&gt;
* init timer - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* use IRQ with 32kHz crystal - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* handle time and date - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** daylight saving - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** consult leapyear  - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* calc day of week out of date - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Only one Byte for Year -&amp;gt; (2000 to 2255)&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* timer - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; open &#039;&#039;&#039;&amp;lt;/span&amp;gt; &lt;br /&gt;
* corretion for external Crystal - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* calibrate internal RC - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE, but not tested &#039;&#039;&#039;&amp;lt;/span&amp;gt; &lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; (95%)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UART &lt;br /&gt;
| UART-Driver&lt;br /&gt;
* menue (Debug und Steuerung)&lt;br /&gt;
** show and set desired temperature &lt;br /&gt;
** show and set Time and Date&lt;br /&gt;
** show actual temperature&lt;br /&gt;
** show (and set) actual valveposition &lt;br /&gt;
** show and set timetable and temperatures&lt;br /&gt;
* optional &lt;br /&gt;
** adressierung of HR20 (for BUS, RF)&lt;br /&gt;
** authentication end encryption&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| MENU&lt;br /&gt;
| Display Menu&lt;br /&gt;
* get keystate (with debounce)&lt;br /&gt;
** multi keypress (nedded for hidden menue?)&lt;br /&gt;
** longer keypress / double click (nedded?)&lt;br /&gt;
* get position of wheel (incremental counter)&lt;br /&gt;
* controll display&lt;br /&gt;
* functionality:&lt;br /&gt;
* show and set desired temperature&lt;br /&gt;
* show and set time and date &lt;br /&gt;
* show actual temperature&lt;br /&gt;
* show actual valveposition &lt;br /&gt;
* show and set timetable and temperatures&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| MOTOR&lt;br /&gt;
| Motor-Driver &lt;br /&gt;
* set desired valveposition &lt;br /&gt;
** quick&lt;br /&gt;
** asympthotic&lt;br /&gt;
** quiet&lt;br /&gt;
* callibrate for Valve&lt;br /&gt;
* Genereate ERROR if motor not turning (low energie)&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| TEMP&lt;br /&gt;
| Temperaturesensor-Driver &lt;br /&gt;
* init Sensor &lt;br /&gt;
* IQR driven (500ms)&lt;br /&gt;
* start A/D conversion (IQR driven)&lt;br /&gt;
* get A/D Value and calc temperature&lt;br /&gt;
* calibration for sensor (needed?)&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| PID&lt;br /&gt;
| PID Algorithm&lt;br /&gt;
* calculate desired valveposition out of&lt;br /&gt;
** last valveposition(s) &lt;br /&gt;
** last temperature(s)&lt;br /&gt;
** actual temperature&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| BOOT&lt;br /&gt;
| Bootloader&lt;br /&gt;
we need a bootloader so that the developers can flash the software &lt;br /&gt;
without a JTAG cable and without disassembling the HR20.&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| LOG&lt;br /&gt;
| Datalogger&lt;br /&gt;
* Operating Hours&lt;br /&gt;
** motor in action&lt;br /&gt;
** ODOmeter&lt;br /&gt;
** since Battery Exchange&lt;br /&gt;
* Errors&lt;br /&gt;
* Logfiles (only with additional hardware)&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UID&lt;br /&gt;
| Unique ID for identification&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= API Beschreibung =&lt;br /&gt;
== LCD ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Funtion&lt;br /&gt;
! Propose&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Init(void);            &lt;br /&gt;
|Init the LCD Controller&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_AllSegments(uint8_t);&lt;br /&gt;
|Set all segments to LCD_MODE&lt;br /&gt;
| done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearAll(void);                       &lt;br /&gt;
|Clear all segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearHour_Bar(void);&lt;br /&gt;
|Clear 24 bar segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearSymbols(void);&lt;br /&gt;
|Clear AUTO MANU PROG SUN MOON SNOW&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearNumbers(void);&lt;br /&gt;
|Clear 7 Segments ans Collumns&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintDec(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print DEC-val in two 7 Segments 0-99&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintHex(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print HEX-val in two 7 Segments 0-ff&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintNo(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print one ditig in one 7 Segment&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintTemp(uint8_t, uint8_t);&lt;br /&gt;
|Print desired temperature (val+4,9)°C&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetSeg(uint8_t, uint8_t);          &lt;br /&gt;
|Set one Segment to LCD_MODE (0-69)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetHourBarSeg(uint8_t, uint8_t);    &lt;br /&gt;
|Set one Hour Bar Segment to LCD_MODE (0-23)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetHourBarVal(uint8_t, uint8_t);&lt;br /&gt;
|Set all Hour Bar Segments from 0 to val to LCD_MODE (0-23)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Update(void);                        &lt;br /&gt;
|Request immidiate LCD-Update (normal only when bitplane changes)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t LCD_ContrastAdjust (int8_t);           &lt;br /&gt;
|Adjust the contrast&lt;br /&gt;
|&#039;&#039;&#039;not tested yet&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== RTC ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Funtion&lt;br /&gt;
! Propose&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_Init(void);            &lt;br /&gt;
|Sart Timer, activate 500ms IRQ&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetHour(void);                    &lt;br /&gt;
|Get Hour&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetMinute(void);                   &lt;br /&gt;
|Get Minute&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetSecond(void);                   &lt;br /&gt;
|Get Second&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetDay(void);                      &lt;br /&gt;
|Get Day&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetMonth(void);                    &lt;br /&gt;
|Get Month&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetYearYY(void);                     &lt;br /&gt;
|Get Year (00-255)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetDayOfWeek(void);                &lt;br /&gt;
|Get Day of Week (0:Monday)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint16_t RTC_GetYearYYYY(void);               &lt;br /&gt;
|Get Year (2000-2255)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetHour(uint8_t);                     &lt;br /&gt;
|Set Hour&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetMinute(uint8_t);                   &lt;br /&gt;
|Set Minute&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetSecond(uint8_t);                   &lt;br /&gt;
|Set Second&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetDay(uint8_t);                      &lt;br /&gt;
|Set Day&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetMonth(uint8_t);                    &lt;br /&gt;
|Set Month&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetYear(uint8_t);                     &lt;br /&gt;
|Set Year&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_AddOneSecond(void);                  &lt;br /&gt;
|Add one second to actual time&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_AddOneDay(void);                     &lt;br /&gt;
|Add one day to actual date&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_NoLeapyear(uint8_t);               &lt;br /&gt;
|is year a leapyear?&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_DaysOfMonth(uint8_t, uint8_t);    &lt;br /&gt;
|how many days in (month, year)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_DayOfWeek(uint8_t, uint8_t, uint8_t);  &lt;br /&gt;
|calc day of week&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_IsLastsunday(void);                &lt;br /&gt;
|Check if last Sunday in march / october&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GenerateTimer(void);&lt;br /&gt;
|Generate an internal Timer&lt;br /&gt;
|&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039;open&#039;&#039;&#039; &amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|timer_entry_type RTC_GetTimer(uint8_t);&lt;br /&gt;
|Get data of internal Timer(handle)&lt;br /&gt;
|&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039;open&#039;&#039;&#039; &amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetTimer(uint8_t, timer_entry_type);&lt;br /&gt;
|Set data of internal Timer(handle)&lt;br /&gt;
|&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039;open&#039;&#039;&#039; &amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_DelTimer(uint8_t);&lt;br /&gt;
|Delete internal Timer(handle)&lt;br /&gt;
|&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039;open&#039;&#039;&#039; &amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_CalibrateRCO(void);&lt;br /&gt;
|calibrate internal rco&lt;br /&gt;
|&#039;&#039;&#039;not tested yet&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 typedef enum { MO, DI, MI, DO, FR, SA, SO} dow_t;&lt;br /&gt;
 &lt;br /&gt;
 typedef struct &lt;br /&gt;
 {&lt;br /&gt;
    uint8_8 dow;     // one bit for each day of week =&amp;gt; one entry for more dow  &lt;br /&gt;
                     // bit 7 is used as timer active bit&lt;br /&gt;
    uint8_8 hour;    &lt;br /&gt;
    uint8_8 minute;    &lt;br /&gt;
 } timer_entry_type;&lt;br /&gt;
&lt;br /&gt;
= Entwicklungsumgebung =&lt;br /&gt;
* Editor, Debugger, Compiler&lt;br /&gt;
** WinAVR version (20071221), sprich GCC 4.2.2 sowie avr-libc 1.6.0&lt;br /&gt;
** AVR Studio 4 &lt;br /&gt;
* JTAG ICE&lt;br /&gt;
** Atmel AVR JTAGICE MK2 &lt;br /&gt;
** AVR Dragon (z.B. http://elmicro.com/de/atavrdragon.html)&lt;br /&gt;
** Olimex-Seriell http://www.olimex.com/dev/avr-jtag.html  &lt;br /&gt;
** Olimex-USB http://www.olimex.com/dev/avr-usb-jtag.html &lt;br /&gt;
&lt;br /&gt;
= Sonstiges =&lt;br /&gt;
== Altes Protokoll ==&lt;br /&gt;
[[HR20_Protocol_V2 | Hier ]] hat mal einer ein Protokoll eingegeben.&lt;br /&gt;
Das scheint aber nicht zu der Version 2.04 zu passen. &lt;br /&gt;
Ich habe es nicht gelöscht, falls es jemanden interessiert.&lt;br /&gt;
== SVN Anleitung ==&lt;br /&gt;
Eine Anleitung was ein SVN ist und wie man es brauchen wir hier nicht.&lt;br /&gt;
Sonst müsste hier auch ein C-Kurs, Windows-Kurs, und Elektronik-Kurs hin.&lt;br /&gt;
&lt;br /&gt;
[[Category:Projekte|!]]&lt;/div&gt;</summary>
		<author><name>Dario</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=26097</id>
		<title>Heizungssteuerung mit Honeywell HR20</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=26097"/>
		<updated>2008-02-06T08:34:34Z</updated>

		<summary type="html">&lt;p&gt;Dario: /* RTC */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von DarioC&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Wie alles begann =&lt;br /&gt;
&lt;br /&gt;
Nachdem von Uwe Felgentreu vor nunmehr vor über drei Jahren (genau am 17.11.2004 um 11:26) hier in diesem Forum den Thread mit dem Titel &#039;&#039;Honeywell Rondostat HR20E per AVR steuern und konfigurieren&#039;&#039; gestartet hat ist es nun langsam soweit, dass das Ganze auch ein Projekt wird. &lt;br /&gt;
&lt;br /&gt;
Den Thread dazu kann der interessierte Leser [http://www.mikrocontroller.net/topic/17603 hier nachlesen] &lt;br /&gt;
&lt;br /&gt;
= Projektziel =&lt;br /&gt;
&lt;br /&gt;
Wir konzentrieren uns in erster Linie auf den Honeywell Rondostat HR20E mit ausgelieferten Softwareversion 2.04. Dass es ähnliche andere Geräte gibt behalten wir bei der Entwicklung im Hinterkopf.&lt;br /&gt;
&lt;br /&gt;
Basierend auf dieser Hardware wollen wir eine neue Software entwickeln. &lt;br /&gt;
Dabe können wir ausser der Hardware nichts weiter verwenden, da die Originalsoftware geschützt ist und nicht ausgelesen werden kann.&lt;br /&gt;
&lt;br /&gt;
== Phase 1 ==&lt;br /&gt;
Die Software soll die Funktionen bieten, die die Originalsoftware auch bietet, später können dies dann um zusätzliche Funktionen erweitert werden. Die wichtigsten Funktionen sind:&lt;br /&gt;
&lt;br /&gt;
* Temperaturregelung&lt;br /&gt;
* Echtzeituhr&lt;br /&gt;
* Ausnutzen der Sleep Funktion&lt;br /&gt;
* Anzeige Soll-Temperatur und der Uhrzeit&lt;br /&gt;
* Einstellung der Soll-Temperatur&lt;br /&gt;
* Uhrzeitgesteuerte Einstellung der Soll-Temperatur &lt;br /&gt;
* Fenster-Offen-Erkennung&lt;br /&gt;
* Ventilfreispülungsfunktion&lt;br /&gt;
&lt;br /&gt;
== Phase 2 ==&lt;br /&gt;
&lt;br /&gt;
Hier liegt der Sinn des ganzen Projektes: Durch diese zusätzlichen Funktionen wollen wir den Nutzwert des Thermostaten erheblich steigern:&lt;br /&gt;
&lt;br /&gt;
* Programmierung der Schaltzeiten und Temperaturen über externe Schnittstelle&lt;br /&gt;
* Abfrage der Messwerte und Parameter über externe Schnittstelle&lt;br /&gt;
* Vernetzung der Thermostaten untereinander&lt;br /&gt;
* Zusätzliche externe Schnittstellen (neben UART auch CAN und Funk)&lt;br /&gt;
* Erweiterung der Anzeige um&lt;br /&gt;
** Ist-Temperatur &lt;br /&gt;
** Ventilstellung&lt;br /&gt;
** Funkschnittstelle&lt;br /&gt;
*** RFM12 http://www.hoperf.com/rf_fsk.asp&lt;br /&gt;
*** Zigbee http://www.meshnetics.com/zigbee-modules&lt;br /&gt;
** ...&lt;br /&gt;
* Bootloader, damit Leute mitarbeiten können, die keine JTAG haben. Mit einem JTAG könnte man den Bootloader Flashen, ohne den Thermostaten öffnen zu müssen. Von da an kann man über den Programmierstecker mit einem umgebauten Handykabel den Thermostaten neu flashen.&lt;br /&gt;
&lt;br /&gt;
= Subversion Repository =&lt;br /&gt;
Ein SVN Repository liegt auf dem freien SVN Server: https://opensvn.csie.org&lt;br /&gt;
== Zugangsdaten ==&lt;br /&gt;
Repository Location: https://OpenSVN.csie.org/hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
Browse Repository: https://OpenSVN.csie.org/viewcvs.cgi/?root=hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
TRAC: https://opensvn.csie.org/traccgi/hr20&lt;br /&gt;
== Policy ==&lt;br /&gt;
Anonymous check out ist erlaubt. &amp;lt;br&amp;gt;&lt;br /&gt;
Wer was committen will muss freigeschaltet werden. &amp;lt;br&amp;gt;&lt;br /&gt;
Dazu brauche ich ein &#039;&#039;Usernamen, Passwort&#039;&#039; und eine &#039;&#039;Mailadresse&#039;&#039;, dann kann ich das einrichten. &amp;lt;br&amp;gt;&lt;br /&gt;
Tragt Euch dazu einfach selber in die Tabelle ein, ich erledige dann den Rest.&amp;lt;br&amp;gt;&lt;br /&gt;
Das mache ich dann von Hand und da ich nicht alle 10 Minuten Mails bearbeite kann das auch schon mal einen oder zwei Tage dauern. &amp;lt;br&amp;gt;&lt;br /&gt;
Wenn sich ein Maintainer findet, gebe ich die Zugangsdaten gerne weiter.&lt;br /&gt;
== Entwickler ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! width=&amp;quot;150&amp;quot; | Entwickler&lt;br /&gt;
! width=&amp;quot;150&amp;quot; | svn Status&lt;br /&gt;
|-&lt;br /&gt;
| darioc&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|-&lt;br /&gt;
| louk&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|}&lt;br /&gt;
== Verzeichnisstruktur ==&lt;br /&gt;
Eine Verzeichnisstruktur ist auch schon angelegt und die ersten Daten auch drin. Hier die Verzeichnisse:&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
| &#039;&#039;&#039;/doc&#039;&#039;&#039;&lt;br /&gt;
| Für alles an Dokumenten, die selbst erstellt wurden. &amp;lt;br&amp;gt;&lt;br /&gt;
Specs, die man im Internet bekommen kann gehören hier nicht rein, &amp;lt;br&amp;gt;&lt;br /&gt;
die machen das alles nur unnötig gross und das auschecken dauert länger.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/playground&#039;&#039;&#039; &lt;br /&gt;
| Wie der Name schon sagt, zum rumspielen und testen. &amp;lt;br&amp;gt;&lt;br /&gt;
Hier kommt jegliche art von Codeschnipseln hin, die zu Testen da sind &amp;lt;br&amp;gt;&lt;br /&gt;
und (derzeit) noch icht Teil des Programmes sind.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/source&#039;&#039;&#039; &lt;br /&gt;
| Hier kommt die Applikation rein mit allen Modulen und makefiles.&amp;lt;br&amp;gt;&lt;br /&gt;
Bitte haltet das Repository sauber und checkt nur Dateien ein, &amp;lt;br&amp;gt;&lt;br /&gt;
die auch Sinn  machen, &amp;quot;thumbs.db&amp;quot; oder andere Temp-Dateien gehören hier nicht rein.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SVN Client und Anleitung ==&lt;br /&gt;
Windows-User nutzen am besten den Tortoise-SVN-Client, den man kostenfrei [http://tortoisesvn.tigris.org hier runterladen] kann. &amp;lt;br&amp;gt;&lt;br /&gt;
Dort gibt es auch eine Anleitung zum Arbeiten mit SVN. &lt;br /&gt;
&lt;br /&gt;
= Analyse der Hardware =&lt;br /&gt;
Die Analyse hat der Dario schon gemacht, zu finden ist die jeweils aktuelle Version &lt;br /&gt;
[http://www.carluccio.de/img/hr20/analyse.pdf als PDF hier] oder [https://opensvn.csie.org/viewcvs.cgi/doc/analyse.pdf hier im SVN].&lt;br /&gt;
&lt;br /&gt;
= Benötigte Module =&lt;br /&gt;
&lt;br /&gt;
Um das Ganze nun etwas zu koordinieren hier eine Liste der benötigten Module und deren Funktionen. &amp;lt;br&amp;gt;&lt;br /&gt;
Diese dient dazu später die Aufgaben zu verteilen:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Module&lt;br /&gt;
! Function&lt;br /&gt;
! Developer&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| LCD&lt;br /&gt;
| Display Driver:&amp;lt;BR&amp;gt;&lt;br /&gt;
* Init Display - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Set Segments - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Print HEX, DEC, TEMP, DayofWeek - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Blink - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* e.t.c&lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; DONE &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| RTC&lt;br /&gt;
| Time and Date Handler&lt;br /&gt;
* init timer - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* use IRQ with 32kHz crystal - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* handle time and date - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** daylight saving - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** consult leapyear  - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* calc day of week out of date - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Only one Byte for Year -&amp;gt; (2000 to 2255)&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* timer - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; open &#039;&#039;&#039;&amp;lt;/span&amp;gt; &lt;br /&gt;
* corretion for external Crystal - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* calibrate internal RC - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE, but not tested &#039;&#039;&#039;&amp;lt;/span&amp;gt; &lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; (95%)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UART &lt;br /&gt;
| UART-Driver&lt;br /&gt;
* menue (Debug und Steuerung)&lt;br /&gt;
** show and set desired temperature &lt;br /&gt;
** show and set Time and Date&lt;br /&gt;
** show actual temperature&lt;br /&gt;
** show (and set) actual valveposition &lt;br /&gt;
** show and set timetable and temperatures&lt;br /&gt;
* optional &lt;br /&gt;
** adressierung of HR20 (for BUS, RF)&lt;br /&gt;
** authentication end encryption&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| MENU&lt;br /&gt;
| Display Menu&lt;br /&gt;
* get keystate (with debounce)&lt;br /&gt;
** multi keypress (nedded for hidden menue?)&lt;br /&gt;
** longer keypress / double click (nedded?)&lt;br /&gt;
* get position of wheel (incremental counter)&lt;br /&gt;
* controll display&lt;br /&gt;
* functionality:&lt;br /&gt;
* show and set desired temperature&lt;br /&gt;
* show and set time and date &lt;br /&gt;
* show actual temperature&lt;br /&gt;
* show actual valveposition &lt;br /&gt;
* show and set timetable and temperatures&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| MOTOR&lt;br /&gt;
| Motor-Driver &lt;br /&gt;
* set desired valveposition &lt;br /&gt;
** quick&lt;br /&gt;
** asympthotic&lt;br /&gt;
** quiet&lt;br /&gt;
* callibrate for Valve&lt;br /&gt;
* Genereate ERROR if motor not turning (low energie)&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| TEMP&lt;br /&gt;
| Temperaturesensor-Driver &lt;br /&gt;
* init Sensor &lt;br /&gt;
* IQR driven (500ms)&lt;br /&gt;
* start A/D conversion (IQR driven)&lt;br /&gt;
* get A/D Value and calc temperature&lt;br /&gt;
* calibration for sensor (needed?)&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| PID&lt;br /&gt;
| PID Algorithm&lt;br /&gt;
* calculate desired valveposition out of&lt;br /&gt;
** last valveposition(s) &lt;br /&gt;
** last temperature(s)&lt;br /&gt;
** actual temperature&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| BOOT&lt;br /&gt;
| Bootloader&lt;br /&gt;
we need a bootloader so that the developers can flash the software &lt;br /&gt;
without a JTAG cable and without disassembling the HR20.&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| LOG&lt;br /&gt;
| Datalogger&lt;br /&gt;
* Operating Hours&lt;br /&gt;
** motor in action&lt;br /&gt;
** ODOmeter&lt;br /&gt;
** since Battery Exchange&lt;br /&gt;
* Errors&lt;br /&gt;
* Logfiles (only with additional hardware)&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UID&lt;br /&gt;
| Unique ID for identification&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= API Beschreibung =&lt;br /&gt;
== LCD ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Funtion&lt;br /&gt;
! Propose&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Init(void);            &lt;br /&gt;
|Init the LCD Controller&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_AllSegments(uint8_t);&lt;br /&gt;
|Set all segments to LCD_MODE&lt;br /&gt;
| done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearAll(void);                       &lt;br /&gt;
|Clear all segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearHour_Bar(void);&lt;br /&gt;
|Clear 24 bar segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearSymbols(void);&lt;br /&gt;
|Clear AUTO MANU PROG SUN MOON SNOW&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearNumbers(void);&lt;br /&gt;
|Clear 7 Segments ans Collumns&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintDec(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print DEC-val in two 7 Segments 0-99&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintHex(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print HEX-val in two 7 Segments 0-ff&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintNo(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print one ditig in one 7 Segment&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintTemp(uint8_t, uint8_t);&lt;br /&gt;
|Print desired temperature (val+4,9)°C&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetSeg(uint8_t, uint8_t);          &lt;br /&gt;
|Set one Segment to LCD_MODE (0-69)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetHourBarSeg(uint8_t, uint8_t);    &lt;br /&gt;
|Set one Hour Bar Segment to LCD_MODE (0-23)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetHourBarVal(uint8_t, uint8_t);&lt;br /&gt;
|Set all Hour Bar Segments from 0 to val to LCD_MODE (0-23)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Update(void);                        &lt;br /&gt;
|Request immidiate LCD-Update (normal only when bitplane changes)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t LCD_ContrastAdjust (int8_t);           &lt;br /&gt;
|Adjust the contrast&lt;br /&gt;
|&#039;&#039;&#039;not tested yet&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== RTC ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Funtion&lt;br /&gt;
! Propose&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_Init(void);            &lt;br /&gt;
|Sart Timer, activate 500ms IRQ&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetHour(void);                    &lt;br /&gt;
|Get Hour&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetMinute(void);                   &lt;br /&gt;
|Get Minute&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetSecond(void);                   &lt;br /&gt;
|Get Second&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetDay(void);                      &lt;br /&gt;
|Get Day&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetMonth(void);                    &lt;br /&gt;
|Get Month&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetYearYY(void);                     &lt;br /&gt;
|Get Year (00-255)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetDayOfWeek(void);                &lt;br /&gt;
|Get Day of Week (0:Monday)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint16_t RTC_GetYearYYYY(void);               &lt;br /&gt;
|Get Year (2000-2255)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetHour(uint8_t);                     &lt;br /&gt;
|Set Hour&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetMinute(uint8_t);                   &lt;br /&gt;
|Set Minute&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetSecond(uint8_t);                   &lt;br /&gt;
|Set Second&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetDay(uint8_t);                      &lt;br /&gt;
|Set Day&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetMonth(uint8_t);                    &lt;br /&gt;
|Set Month&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetYear(uint8_t);                     &lt;br /&gt;
|Set Year&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_AddOneSecond(void);                  &lt;br /&gt;
|Add one second to actual time&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_AddOneDay(void);                     &lt;br /&gt;
|Add one day to actual date&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_NoLeapyear(uint8_t);               &lt;br /&gt;
|is year a leapyear?&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_DaysOfMonth(uint8_t, uint8_t);    &lt;br /&gt;
|how many days in (month, year)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_DayOfWeek(uint8_t, uint8_t, uint8_t);  &lt;br /&gt;
|calc day of week&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_IsLastsunday(void);                &lt;br /&gt;
|Check if last Sunday in march / october&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GenerateTimer(void);&lt;br /&gt;
|Generate an internal Timer&lt;br /&gt;
|&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039;open&#039;&#039;&#039; &amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|timer_entry_type RTC_GetTimer(uint8_t);&lt;br /&gt;
|Get data of internal Timer(handle)&lt;br /&gt;
|&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039;open&#039;&#039;&#039; &amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetTimer(uint8_t, timer_entry_type);&lt;br /&gt;
|Set data of internal Timer(handle)&lt;br /&gt;
|&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039;open&#039;&#039;&#039; &amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_DelTimer(uint8_t);&lt;br /&gt;
|Delete internal Timer(handle)&lt;br /&gt;
|&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039;open&#039;&#039;&#039; &amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_CalibrateRCO(void);&lt;br /&gt;
|calibrate internal rco&lt;br /&gt;
|&#039;&#039;&#039;not tested yet&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
 typedef enum { MO, DI, MI, DO, FR, SA, SO} dow_t;&lt;br /&gt;
 &lt;br /&gt;
 typedef struct &lt;br /&gt;
 {&lt;br /&gt;
    uint8_8 dow;     // one bit for each day of week =&amp;gt; one entry for more dow  &lt;br /&gt;
    uint8_8 hour;    &lt;br /&gt;
    uint8_8 minute;    &lt;br /&gt;
 } timer_entry_type;&lt;br /&gt;
&lt;br /&gt;
= Entwicklungsumgebung =&lt;br /&gt;
* Editor, Debugger, Compiler&lt;br /&gt;
** WinAVR version (20071221), sprich GCC 4.2.2 sowie avr-libc 1.6.0&lt;br /&gt;
** AVR Studio 4 &lt;br /&gt;
* JTAG ICE&lt;br /&gt;
** Atmel AVR JTAGICE MK2 &lt;br /&gt;
** AVR Dragon (z.B. http://elmicro.com/de/atavrdragon.html)&lt;br /&gt;
** Olimex-Seriell http://www.olimex.com/dev/avr-jtag.html  &lt;br /&gt;
** Olimex-USB http://www.olimex.com/dev/avr-usb-jtag.html &lt;br /&gt;
&lt;br /&gt;
= Sonstiges =&lt;br /&gt;
== Altes Protokoll ==&lt;br /&gt;
[[HR20_Protocol_V2 | Hier ]] hat mal einer ein Protokoll eingegeben.&lt;br /&gt;
Das scheint aber nicht zu der Version 2.04 zu passen. &lt;br /&gt;
Ich habe es nicht gelöscht, falls es jemanden interessiert.&lt;br /&gt;
== SVN Anleitung ==&lt;br /&gt;
Eine Anleitung was ein SVN ist und wie man es brauchen wir hier nicht.&lt;br /&gt;
Sonst müsste hier auch ein C-Kurs, Windows-Kurs, und Elektronik-Kurs hin.&lt;br /&gt;
&lt;br /&gt;
[[Category:Projekte|!]]&lt;/div&gt;</summary>
		<author><name>Dario</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=26096</id>
		<title>Heizungssteuerung mit Honeywell HR20</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=26096"/>
		<updated>2008-02-06T08:28:04Z</updated>

		<summary type="html">&lt;p&gt;Dario: /* RTC */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von DarioC&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Wie alles begann =&lt;br /&gt;
&lt;br /&gt;
Nachdem von Uwe Felgentreu vor nunmehr vor über drei Jahren (genau am 17.11.2004 um 11:26) hier in diesem Forum den Thread mit dem Titel &#039;&#039;Honeywell Rondostat HR20E per AVR steuern und konfigurieren&#039;&#039; gestartet hat ist es nun langsam soweit, dass das Ganze auch ein Projekt wird. &lt;br /&gt;
&lt;br /&gt;
Den Thread dazu kann der interessierte Leser [http://www.mikrocontroller.net/topic/17603 hier nachlesen] &lt;br /&gt;
&lt;br /&gt;
= Projektziel =&lt;br /&gt;
&lt;br /&gt;
Wir konzentrieren uns in erster Linie auf den Honeywell Rondostat HR20E mit ausgelieferten Softwareversion 2.04. Dass es ähnliche andere Geräte gibt behalten wir bei der Entwicklung im Hinterkopf.&lt;br /&gt;
&lt;br /&gt;
Basierend auf dieser Hardware wollen wir eine neue Software entwickeln. &lt;br /&gt;
Dabe können wir ausser der Hardware nichts weiter verwenden, da die Originalsoftware geschützt ist und nicht ausgelesen werden kann.&lt;br /&gt;
&lt;br /&gt;
== Phase 1 ==&lt;br /&gt;
Die Software soll die Funktionen bieten, die die Originalsoftware auch bietet, später können dies dann um zusätzliche Funktionen erweitert werden. Die wichtigsten Funktionen sind:&lt;br /&gt;
&lt;br /&gt;
* Temperaturregelung&lt;br /&gt;
* Echtzeituhr&lt;br /&gt;
* Ausnutzen der Sleep Funktion&lt;br /&gt;
* Anzeige Soll-Temperatur und der Uhrzeit&lt;br /&gt;
* Einstellung der Soll-Temperatur&lt;br /&gt;
* Uhrzeitgesteuerte Einstellung der Soll-Temperatur &lt;br /&gt;
* Fenster-Offen-Erkennung&lt;br /&gt;
* Ventilfreispülungsfunktion&lt;br /&gt;
&lt;br /&gt;
== Phase 2 ==&lt;br /&gt;
&lt;br /&gt;
Hier liegt der Sinn des ganzen Projektes: Durch diese zusätzlichen Funktionen wollen wir den Nutzwert des Thermostaten erheblich steigern:&lt;br /&gt;
&lt;br /&gt;
* Programmierung der Schaltzeiten und Temperaturen über externe Schnittstelle&lt;br /&gt;
* Abfrage der Messwerte und Parameter über externe Schnittstelle&lt;br /&gt;
* Vernetzung der Thermostaten untereinander&lt;br /&gt;
* Zusätzliche externe Schnittstellen (neben UART auch CAN und Funk)&lt;br /&gt;
* Erweiterung der Anzeige um&lt;br /&gt;
** Ist-Temperatur &lt;br /&gt;
** Ventilstellung&lt;br /&gt;
** Funkschnittstelle&lt;br /&gt;
*** RFM12 http://www.hoperf.com/rf_fsk.asp&lt;br /&gt;
*** Zigbee http://www.meshnetics.com/zigbee-modules&lt;br /&gt;
** ...&lt;br /&gt;
* Bootloader, damit Leute mitarbeiten können, die keine JTAG haben. Mit einem JTAG könnte man den Bootloader Flashen, ohne den Thermostaten öffnen zu müssen. Von da an kann man über den Programmierstecker mit einem umgebauten Handykabel den Thermostaten neu flashen.&lt;br /&gt;
&lt;br /&gt;
= Subversion Repository =&lt;br /&gt;
Ein SVN Repository liegt auf dem freien SVN Server: https://opensvn.csie.org&lt;br /&gt;
== Zugangsdaten ==&lt;br /&gt;
Repository Location: https://OpenSVN.csie.org/hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
Browse Repository: https://OpenSVN.csie.org/viewcvs.cgi/?root=hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
TRAC: https://opensvn.csie.org/traccgi/hr20&lt;br /&gt;
== Policy ==&lt;br /&gt;
Anonymous check out ist erlaubt. &amp;lt;br&amp;gt;&lt;br /&gt;
Wer was committen will muss freigeschaltet werden. &amp;lt;br&amp;gt;&lt;br /&gt;
Dazu brauche ich ein &#039;&#039;Usernamen, Passwort&#039;&#039; und eine &#039;&#039;Mailadresse&#039;&#039;, dann kann ich das einrichten. &amp;lt;br&amp;gt;&lt;br /&gt;
Tragt Euch dazu einfach selber in die Tabelle ein, ich erledige dann den Rest.&amp;lt;br&amp;gt;&lt;br /&gt;
Das mache ich dann von Hand und da ich nicht alle 10 Minuten Mails bearbeite kann das auch schon mal einen oder zwei Tage dauern. &amp;lt;br&amp;gt;&lt;br /&gt;
Wenn sich ein Maintainer findet, gebe ich die Zugangsdaten gerne weiter.&lt;br /&gt;
== Entwickler ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! width=&amp;quot;150&amp;quot; | Entwickler&lt;br /&gt;
! width=&amp;quot;150&amp;quot; | svn Status&lt;br /&gt;
|-&lt;br /&gt;
| darioc&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|-&lt;br /&gt;
| louk&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|}&lt;br /&gt;
== Verzeichnisstruktur ==&lt;br /&gt;
Eine Verzeichnisstruktur ist auch schon angelegt und die ersten Daten auch drin. Hier die Verzeichnisse:&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
| &#039;&#039;&#039;/doc&#039;&#039;&#039;&lt;br /&gt;
| Für alles an Dokumenten, die selbst erstellt wurden. &amp;lt;br&amp;gt;&lt;br /&gt;
Specs, die man im Internet bekommen kann gehören hier nicht rein, &amp;lt;br&amp;gt;&lt;br /&gt;
die machen das alles nur unnötig gross und das auschecken dauert länger.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/playground&#039;&#039;&#039; &lt;br /&gt;
| Wie der Name schon sagt, zum rumspielen und testen. &amp;lt;br&amp;gt;&lt;br /&gt;
Hier kommt jegliche art von Codeschnipseln hin, die zu Testen da sind &amp;lt;br&amp;gt;&lt;br /&gt;
und (derzeit) noch icht Teil des Programmes sind.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/source&#039;&#039;&#039; &lt;br /&gt;
| Hier kommt die Applikation rein mit allen Modulen und makefiles.&amp;lt;br&amp;gt;&lt;br /&gt;
Bitte haltet das Repository sauber und checkt nur Dateien ein, &amp;lt;br&amp;gt;&lt;br /&gt;
die auch Sinn  machen, &amp;quot;thumbs.db&amp;quot; oder andere Temp-Dateien gehören hier nicht rein.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SVN Client und Anleitung ==&lt;br /&gt;
Windows-User nutzen am besten den Tortoise-SVN-Client, den man kostenfrei [http://tortoisesvn.tigris.org hier runterladen] kann. &amp;lt;br&amp;gt;&lt;br /&gt;
Dort gibt es auch eine Anleitung zum Arbeiten mit SVN. &lt;br /&gt;
&lt;br /&gt;
= Analyse der Hardware =&lt;br /&gt;
Die Analyse hat der Dario schon gemacht, zu finden ist die jeweils aktuelle Version &lt;br /&gt;
[http://www.carluccio.de/img/hr20/analyse.pdf als PDF hier] oder [https://opensvn.csie.org/viewcvs.cgi/doc/analyse.pdf hier im SVN].&lt;br /&gt;
&lt;br /&gt;
= Benötigte Module =&lt;br /&gt;
&lt;br /&gt;
Um das Ganze nun etwas zu koordinieren hier eine Liste der benötigten Module und deren Funktionen. &amp;lt;br&amp;gt;&lt;br /&gt;
Diese dient dazu später die Aufgaben zu verteilen:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Module&lt;br /&gt;
! Function&lt;br /&gt;
! Developer&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| LCD&lt;br /&gt;
| Display Driver:&amp;lt;BR&amp;gt;&lt;br /&gt;
* Init Display - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Set Segments - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Print HEX, DEC, TEMP, DayofWeek - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Blink - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* e.t.c&lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; DONE &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| RTC&lt;br /&gt;
| Time and Date Handler&lt;br /&gt;
* init timer - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* use IRQ with 32kHz crystal - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* handle time and date - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** daylight saving - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** consult leapyear  - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* calc day of week out of date - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Only one Byte for Year -&amp;gt; (2000 to 2255)&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* timer - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; open &#039;&#039;&#039;&amp;lt;/span&amp;gt; &lt;br /&gt;
* corretion for external Crystal - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* calibrate internal RC - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE, but not tested &#039;&#039;&#039;&amp;lt;/span&amp;gt; &lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; (95%)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UART &lt;br /&gt;
| UART-Driver&lt;br /&gt;
* menue (Debug und Steuerung)&lt;br /&gt;
** show and set desired temperature &lt;br /&gt;
** show and set Time and Date&lt;br /&gt;
** show actual temperature&lt;br /&gt;
** show (and set) actual valveposition &lt;br /&gt;
** show and set timetable and temperatures&lt;br /&gt;
* optional &lt;br /&gt;
** adressierung of HR20 (for BUS, RF)&lt;br /&gt;
** authentication end encryption&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| MENU&lt;br /&gt;
| Display Menu&lt;br /&gt;
* get keystate (with debounce)&lt;br /&gt;
** multi keypress (nedded for hidden menue?)&lt;br /&gt;
** longer keypress / double click (nedded?)&lt;br /&gt;
* get position of wheel (incremental counter)&lt;br /&gt;
* controll display&lt;br /&gt;
* functionality:&lt;br /&gt;
* show and set desired temperature&lt;br /&gt;
* show and set time and date &lt;br /&gt;
* show actual temperature&lt;br /&gt;
* show actual valveposition &lt;br /&gt;
* show and set timetable and temperatures&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| MOTOR&lt;br /&gt;
| Motor-Driver &lt;br /&gt;
* set desired valveposition &lt;br /&gt;
** quick&lt;br /&gt;
** asympthotic&lt;br /&gt;
** quiet&lt;br /&gt;
* callibrate for Valve&lt;br /&gt;
* Genereate ERROR if motor not turning (low energie)&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| TEMP&lt;br /&gt;
| Temperaturesensor-Driver &lt;br /&gt;
* init Sensor &lt;br /&gt;
* IQR driven (500ms)&lt;br /&gt;
* start A/D conversion (IQR driven)&lt;br /&gt;
* get A/D Value and calc temperature&lt;br /&gt;
* calibration for sensor (needed?)&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| PID&lt;br /&gt;
| PID Algorithm&lt;br /&gt;
* calculate desired valveposition out of&lt;br /&gt;
** last valveposition(s) &lt;br /&gt;
** last temperature(s)&lt;br /&gt;
** actual temperature&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| BOOT&lt;br /&gt;
| Bootloader&lt;br /&gt;
we need a bootloader so that the developers can flash the software &lt;br /&gt;
without a JTAG cable and without disassembling the HR20.&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| LOG&lt;br /&gt;
| Datalogger&lt;br /&gt;
* Operating Hours&lt;br /&gt;
** motor in action&lt;br /&gt;
** ODOmeter&lt;br /&gt;
** since Battery Exchange&lt;br /&gt;
* Errors&lt;br /&gt;
* Logfiles (only with additional hardware)&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UID&lt;br /&gt;
| Unique ID for identification&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= API Beschreibung =&lt;br /&gt;
== LCD ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Funtion&lt;br /&gt;
! Propose&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Init(void);            &lt;br /&gt;
|Init the LCD Controller&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_AllSegments(uint8_t);&lt;br /&gt;
|Set all segments to LCD_MODE&lt;br /&gt;
| done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearAll(void);                       &lt;br /&gt;
|Clear all segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearHour_Bar(void);&lt;br /&gt;
|Clear 24 bar segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearSymbols(void);&lt;br /&gt;
|Clear AUTO MANU PROG SUN MOON SNOW&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearNumbers(void);&lt;br /&gt;
|Clear 7 Segments ans Collumns&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintDec(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print DEC-val in two 7 Segments 0-99&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintHex(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print HEX-val in two 7 Segments 0-ff&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintNo(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print one ditig in one 7 Segment&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintTemp(uint8_t, uint8_t);&lt;br /&gt;
|Print desired temperature (val+4,9)°C&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetSeg(uint8_t, uint8_t);          &lt;br /&gt;
|Set one Segment to LCD_MODE (0-69)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetHourBarSeg(uint8_t, uint8_t);    &lt;br /&gt;
|Set one Hour Bar Segment to LCD_MODE (0-23)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetHourBarVal(uint8_t, uint8_t);&lt;br /&gt;
|Set all Hour Bar Segments from 0 to val to LCD_MODE (0-23)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Update(void);                        &lt;br /&gt;
|Request immidiate LCD-Update (normal only when bitplane changes)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t LCD_ContrastAdjust (int8_t);           &lt;br /&gt;
|Adjust the contrast&lt;br /&gt;
|&#039;&#039;&#039;not tested yet&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== RTC ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Funtion&lt;br /&gt;
! Propose&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_Init(void);            &lt;br /&gt;
|Sart Timer, activate 500ms IRQ&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetHour(void);                    &lt;br /&gt;
|Get Hour&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetMinute(void);                   &lt;br /&gt;
|Get Minute&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetSecond(void);                   &lt;br /&gt;
|Get Second&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetDay(void);                      &lt;br /&gt;
|Get Day&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetMonth(void);                    &lt;br /&gt;
|Get Month&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetYearYY(void);                     &lt;br /&gt;
|Get Year (00-255)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetDayOfWeek(void);                &lt;br /&gt;
|Get Day of Week (0:Monday)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint16_t RTC_GetYearYYYY(void);               &lt;br /&gt;
|Get Year (2000-2255)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetHour(uint8_t);                     &lt;br /&gt;
|Set Hour&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetMinute(uint8_t);                   &lt;br /&gt;
|Set Minute&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetSecond(uint8_t);                   &lt;br /&gt;
|Set Second&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetDay(uint8_t);                      &lt;br /&gt;
|Set Day&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetMonth(uint8_t);                    &lt;br /&gt;
|Set Month&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetYear(uint8_t);                     &lt;br /&gt;
|Set Year&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_AddOneSecond(void);                  &lt;br /&gt;
|Add one second to actual time&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_AddOneDay(void);                     &lt;br /&gt;
|Add one day to actual date&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_NoLeapyear(uint8_t);               &lt;br /&gt;
|is year a leapyear?&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_DaysOfMonth(uint8_t, uint8_t);    &lt;br /&gt;
|how many days in (month, year)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_DayOfWeek(uint8_t, uint8_t, uint8_t);  &lt;br /&gt;
|calc day of week&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_IsLastsunday(void);                &lt;br /&gt;
|Check if last Sunday in march / october&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GenerateTimer(void);&lt;br /&gt;
|Generate an internal Timer&lt;br /&gt;
|&#039;&#039;&#039;open&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|timer_entry_type RTC_GetTimer(uint8_t);&lt;br /&gt;
|Get data of internal Timer(handle)&lt;br /&gt;
|&#039;&#039;&#039;open&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetTimer(uint8_t, timer_entry_type);&lt;br /&gt;
|Set data of internal Timer(handle)&lt;br /&gt;
|&#039;&#039;&#039;open&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_DelTimer(uint8_t);&lt;br /&gt;
|Delete internal Timer(handle)&lt;br /&gt;
|&#039;&#039;&#039;open&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_CalibrateRCO(void);&lt;br /&gt;
|calibrate internal rco&lt;br /&gt;
|&#039;&#039;&#039;not tested yet&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Entwicklungsumgebung =&lt;br /&gt;
* Editor, Debugger, Compiler&lt;br /&gt;
** WinAVR version (20071221), sprich GCC 4.2.2 sowie avr-libc 1.6.0&lt;br /&gt;
** AVR Studio 4 &lt;br /&gt;
* JTAG ICE&lt;br /&gt;
** Atmel AVR JTAGICE MK2 &lt;br /&gt;
** AVR Dragon (z.B. http://elmicro.com/de/atavrdragon.html)&lt;br /&gt;
** Olimex-Seriell http://www.olimex.com/dev/avr-jtag.html  &lt;br /&gt;
** Olimex-USB http://www.olimex.com/dev/avr-usb-jtag.html &lt;br /&gt;
&lt;br /&gt;
= Sonstiges =&lt;br /&gt;
== Altes Protokoll ==&lt;br /&gt;
[[HR20_Protocol_V2 | Hier ]] hat mal einer ein Protokoll eingegeben.&lt;br /&gt;
Das scheint aber nicht zu der Version 2.04 zu passen. &lt;br /&gt;
Ich habe es nicht gelöscht, falls es jemanden interessiert.&lt;br /&gt;
== SVN Anleitung ==&lt;br /&gt;
Eine Anleitung was ein SVN ist und wie man es brauchen wir hier nicht.&lt;br /&gt;
Sonst müsste hier auch ein C-Kurs, Windows-Kurs, und Elektronik-Kurs hin.&lt;br /&gt;
&lt;br /&gt;
[[Category:Projekte|!]]&lt;/div&gt;</summary>
		<author><name>Dario</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=26095</id>
		<title>Heizungssteuerung mit Honeywell HR20</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=26095"/>
		<updated>2008-02-06T08:23:37Z</updated>

		<summary type="html">&lt;p&gt;Dario: /* Benötigte Module */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von DarioC&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Wie alles begann =&lt;br /&gt;
&lt;br /&gt;
Nachdem von Uwe Felgentreu vor nunmehr vor über drei Jahren (genau am 17.11.2004 um 11:26) hier in diesem Forum den Thread mit dem Titel &#039;&#039;Honeywell Rondostat HR20E per AVR steuern und konfigurieren&#039;&#039; gestartet hat ist es nun langsam soweit, dass das Ganze auch ein Projekt wird. &lt;br /&gt;
&lt;br /&gt;
Den Thread dazu kann der interessierte Leser [http://www.mikrocontroller.net/topic/17603 hier nachlesen] &lt;br /&gt;
&lt;br /&gt;
= Projektziel =&lt;br /&gt;
&lt;br /&gt;
Wir konzentrieren uns in erster Linie auf den Honeywell Rondostat HR20E mit ausgelieferten Softwareversion 2.04. Dass es ähnliche andere Geräte gibt behalten wir bei der Entwicklung im Hinterkopf.&lt;br /&gt;
&lt;br /&gt;
Basierend auf dieser Hardware wollen wir eine neue Software entwickeln. &lt;br /&gt;
Dabe können wir ausser der Hardware nichts weiter verwenden, da die Originalsoftware geschützt ist und nicht ausgelesen werden kann.&lt;br /&gt;
&lt;br /&gt;
== Phase 1 ==&lt;br /&gt;
Die Software soll die Funktionen bieten, die die Originalsoftware auch bietet, später können dies dann um zusätzliche Funktionen erweitert werden. Die wichtigsten Funktionen sind:&lt;br /&gt;
&lt;br /&gt;
* Temperaturregelung&lt;br /&gt;
* Echtzeituhr&lt;br /&gt;
* Ausnutzen der Sleep Funktion&lt;br /&gt;
* Anzeige Soll-Temperatur und der Uhrzeit&lt;br /&gt;
* Einstellung der Soll-Temperatur&lt;br /&gt;
* Uhrzeitgesteuerte Einstellung der Soll-Temperatur &lt;br /&gt;
* Fenster-Offen-Erkennung&lt;br /&gt;
* Ventilfreispülungsfunktion&lt;br /&gt;
&lt;br /&gt;
== Phase 2 ==&lt;br /&gt;
&lt;br /&gt;
Hier liegt der Sinn des ganzen Projektes: Durch diese zusätzlichen Funktionen wollen wir den Nutzwert des Thermostaten erheblich steigern:&lt;br /&gt;
&lt;br /&gt;
* Programmierung der Schaltzeiten und Temperaturen über externe Schnittstelle&lt;br /&gt;
* Abfrage der Messwerte und Parameter über externe Schnittstelle&lt;br /&gt;
* Vernetzung der Thermostaten untereinander&lt;br /&gt;
* Zusätzliche externe Schnittstellen (neben UART auch CAN und Funk)&lt;br /&gt;
* Erweiterung der Anzeige um&lt;br /&gt;
** Ist-Temperatur &lt;br /&gt;
** Ventilstellung&lt;br /&gt;
** Funkschnittstelle&lt;br /&gt;
*** RFM12 http://www.hoperf.com/rf_fsk.asp&lt;br /&gt;
*** Zigbee http://www.meshnetics.com/zigbee-modules&lt;br /&gt;
** ...&lt;br /&gt;
* Bootloader, damit Leute mitarbeiten können, die keine JTAG haben. Mit einem JTAG könnte man den Bootloader Flashen, ohne den Thermostaten öffnen zu müssen. Von da an kann man über den Programmierstecker mit einem umgebauten Handykabel den Thermostaten neu flashen.&lt;br /&gt;
&lt;br /&gt;
= Subversion Repository =&lt;br /&gt;
Ein SVN Repository liegt auf dem freien SVN Server: https://opensvn.csie.org&lt;br /&gt;
== Zugangsdaten ==&lt;br /&gt;
Repository Location: https://OpenSVN.csie.org/hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
Browse Repository: https://OpenSVN.csie.org/viewcvs.cgi/?root=hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
TRAC: https://opensvn.csie.org/traccgi/hr20&lt;br /&gt;
== Policy ==&lt;br /&gt;
Anonymous check out ist erlaubt. &amp;lt;br&amp;gt;&lt;br /&gt;
Wer was committen will muss freigeschaltet werden. &amp;lt;br&amp;gt;&lt;br /&gt;
Dazu brauche ich ein &#039;&#039;Usernamen, Passwort&#039;&#039; und eine &#039;&#039;Mailadresse&#039;&#039;, dann kann ich das einrichten. &amp;lt;br&amp;gt;&lt;br /&gt;
Tragt Euch dazu einfach selber in die Tabelle ein, ich erledige dann den Rest.&amp;lt;br&amp;gt;&lt;br /&gt;
Das mache ich dann von Hand und da ich nicht alle 10 Minuten Mails bearbeite kann das auch schon mal einen oder zwei Tage dauern. &amp;lt;br&amp;gt;&lt;br /&gt;
Wenn sich ein Maintainer findet, gebe ich die Zugangsdaten gerne weiter.&lt;br /&gt;
== Entwickler ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! width=&amp;quot;150&amp;quot; | Entwickler&lt;br /&gt;
! width=&amp;quot;150&amp;quot; | svn Status&lt;br /&gt;
|-&lt;br /&gt;
| darioc&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|-&lt;br /&gt;
| louk&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|}&lt;br /&gt;
== Verzeichnisstruktur ==&lt;br /&gt;
Eine Verzeichnisstruktur ist auch schon angelegt und die ersten Daten auch drin. Hier die Verzeichnisse:&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
| &#039;&#039;&#039;/doc&#039;&#039;&#039;&lt;br /&gt;
| Für alles an Dokumenten, die selbst erstellt wurden. &amp;lt;br&amp;gt;&lt;br /&gt;
Specs, die man im Internet bekommen kann gehören hier nicht rein, &amp;lt;br&amp;gt;&lt;br /&gt;
die machen das alles nur unnötig gross und das auschecken dauert länger.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/playground&#039;&#039;&#039; &lt;br /&gt;
| Wie der Name schon sagt, zum rumspielen und testen. &amp;lt;br&amp;gt;&lt;br /&gt;
Hier kommt jegliche art von Codeschnipseln hin, die zu Testen da sind &amp;lt;br&amp;gt;&lt;br /&gt;
und (derzeit) noch icht Teil des Programmes sind.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/source&#039;&#039;&#039; &lt;br /&gt;
| Hier kommt die Applikation rein mit allen Modulen und makefiles.&amp;lt;br&amp;gt;&lt;br /&gt;
Bitte haltet das Repository sauber und checkt nur Dateien ein, &amp;lt;br&amp;gt;&lt;br /&gt;
die auch Sinn  machen, &amp;quot;thumbs.db&amp;quot; oder andere Temp-Dateien gehören hier nicht rein.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== SVN Client und Anleitung ==&lt;br /&gt;
Windows-User nutzen am besten den Tortoise-SVN-Client, den man kostenfrei [http://tortoisesvn.tigris.org hier runterladen] kann. &amp;lt;br&amp;gt;&lt;br /&gt;
Dort gibt es auch eine Anleitung zum Arbeiten mit SVN. &lt;br /&gt;
&lt;br /&gt;
= Analyse der Hardware =&lt;br /&gt;
Die Analyse hat der Dario schon gemacht, zu finden ist die jeweils aktuelle Version &lt;br /&gt;
[http://www.carluccio.de/img/hr20/analyse.pdf als PDF hier] oder [https://opensvn.csie.org/viewcvs.cgi/doc/analyse.pdf hier im SVN].&lt;br /&gt;
&lt;br /&gt;
= Benötigte Module =&lt;br /&gt;
&lt;br /&gt;
Um das Ganze nun etwas zu koordinieren hier eine Liste der benötigten Module und deren Funktionen. &amp;lt;br&amp;gt;&lt;br /&gt;
Diese dient dazu später die Aufgaben zu verteilen:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Module&lt;br /&gt;
! Function&lt;br /&gt;
! Developer&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| LCD&lt;br /&gt;
| Display Driver:&amp;lt;BR&amp;gt;&lt;br /&gt;
* Init Display - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Set Segments - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Print HEX, DEC, TEMP, DayofWeek - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Blink - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* e.t.c&lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; DONE &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| RTC&lt;br /&gt;
| Time and Date Handler&lt;br /&gt;
* init timer - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* use IRQ with 32kHz crystal - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* handle time and date - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** daylight saving - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** consult leapyear  - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* calc day of week out of date - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Only one Byte for Year -&amp;gt; (2000 to 2255)&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* timer - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; open &#039;&#039;&#039;&amp;lt;/span&amp;gt; &lt;br /&gt;
* corretion for external Crystal - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* calibrate internal RC - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE, but not tested &#039;&#039;&#039;&amp;lt;/span&amp;gt; &lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; (95%)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UART &lt;br /&gt;
| UART-Driver&lt;br /&gt;
* menue (Debug und Steuerung)&lt;br /&gt;
** show and set desired temperature &lt;br /&gt;
** show and set Time and Date&lt;br /&gt;
** show actual temperature&lt;br /&gt;
** show (and set) actual valveposition &lt;br /&gt;
** show and set timetable and temperatures&lt;br /&gt;
* optional &lt;br /&gt;
** adressierung of HR20 (for BUS, RF)&lt;br /&gt;
** authentication end encryption&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| MENU&lt;br /&gt;
| Display Menu&lt;br /&gt;
* get keystate (with debounce)&lt;br /&gt;
** multi keypress (nedded for hidden menue?)&lt;br /&gt;
** longer keypress / double click (nedded?)&lt;br /&gt;
* get position of wheel (incremental counter)&lt;br /&gt;
* controll display&lt;br /&gt;
* functionality:&lt;br /&gt;
* show and set desired temperature&lt;br /&gt;
* show and set time and date &lt;br /&gt;
* show actual temperature&lt;br /&gt;
* show actual valveposition &lt;br /&gt;
* show and set timetable and temperatures&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| MOTOR&lt;br /&gt;
| Motor-Driver &lt;br /&gt;
* set desired valveposition &lt;br /&gt;
** quick&lt;br /&gt;
** asympthotic&lt;br /&gt;
** quiet&lt;br /&gt;
* callibrate for Valve&lt;br /&gt;
* Genereate ERROR if motor not turning (low energie)&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| TEMP&lt;br /&gt;
| Temperaturesensor-Driver &lt;br /&gt;
* init Sensor &lt;br /&gt;
* IQR driven (500ms)&lt;br /&gt;
* start A/D conversion (IQR driven)&lt;br /&gt;
* get A/D Value and calc temperature&lt;br /&gt;
* calibration for sensor (needed?)&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| PID&lt;br /&gt;
| PID Algorithm&lt;br /&gt;
* calculate desired valveposition out of&lt;br /&gt;
** last valveposition(s) &lt;br /&gt;
** last temperature(s)&lt;br /&gt;
** actual temperature&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| BOOT&lt;br /&gt;
| Bootloader&lt;br /&gt;
we need a bootloader so that the developers can flash the software &lt;br /&gt;
without a JTAG cable and without disassembling the HR20.&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| LOG&lt;br /&gt;
| Datalogger&lt;br /&gt;
* Operating Hours&lt;br /&gt;
** motor in action&lt;br /&gt;
** ODOmeter&lt;br /&gt;
** since Battery Exchange&lt;br /&gt;
* Errors&lt;br /&gt;
* Logfiles (only with additional hardware)&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UID&lt;br /&gt;
| Unique ID for identification&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= API Beschreibung =&lt;br /&gt;
== LCD ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Funtion&lt;br /&gt;
! Propose&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Init(void);            &lt;br /&gt;
|Init the LCD Controller&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_AllSegments(uint8_t);&lt;br /&gt;
|Set all segments to LCD_MODE&lt;br /&gt;
| done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearAll(void);                       &lt;br /&gt;
|Clear all segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearHour_Bar(void);&lt;br /&gt;
|Clear 24 bar segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearSymbols(void);&lt;br /&gt;
|Clear AUTO MANU PROG SUN MOON SNOW&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearNumbers(void);&lt;br /&gt;
|Clear 7 Segments ans Collumns&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintDec(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print DEC-val in two 7 Segments 0-99&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintHex(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print HEX-val in two 7 Segments 0-ff&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintNo(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print one ditig in one 7 Segment&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintTemp(uint8_t, uint8_t);&lt;br /&gt;
|Print desired temperature (val+4,9)°C&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetSeg(uint8_t, uint8_t);          &lt;br /&gt;
|Set one Segment to LCD_MODE (0-69)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetHourBarSeg(uint8_t, uint8_t);    &lt;br /&gt;
|Set one Hour Bar Segment to LCD_MODE (0-23)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetHourBarVal(uint8_t, uint8_t);&lt;br /&gt;
|Set all Hour Bar Segments from 0 to val to LCD_MODE (0-23)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Update(void);                        &lt;br /&gt;
|Request immidiate LCD-Update (normal only when bitplane changes)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t LCD_ContrastAdjust (int8_t);           &lt;br /&gt;
|Adjust the contrast&lt;br /&gt;
|&#039;&#039;&#039;not tested yet&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== RTC ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Funtion&lt;br /&gt;
! Propose&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_Init(void);            &lt;br /&gt;
|Sart Timer, activate 500ms IRQ&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetHour(void);                    &lt;br /&gt;
|Get Hour&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetMinute(void);                   &lt;br /&gt;
|Get Minute&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetSecond(void);                   &lt;br /&gt;
|Get Second&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetDay(void);                      &lt;br /&gt;
|Get Day&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetMonth(void);                    &lt;br /&gt;
|Get Month&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetYearYY(void);                     &lt;br /&gt;
|Get Year (00-255)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetDayOfWeek(void);                &lt;br /&gt;
|Get Day of Week (0:Monday)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint16_t RTC_GetYearYYYY(void);               &lt;br /&gt;
|Get Year (2000-2255)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetHour(uint8_t);                     &lt;br /&gt;
|Set Hour&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetMinute(uint8_t);                   &lt;br /&gt;
|Set Minute&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetSecond(uint8_t);                   &lt;br /&gt;
|Set Second&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetDay(uint8_t);                      &lt;br /&gt;
|Set Day&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetMonth(uint8_t);                    &lt;br /&gt;
|Set Month&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetYear(uint8_t);                     &lt;br /&gt;
|Set Year&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_AddOneSecond(void);                  &lt;br /&gt;
|Add one second to actual time&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_AddOneDay(void);                     &lt;br /&gt;
|Add one day to actual date&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_NoLeapyear(uint8_t);               &lt;br /&gt;
|is year a leapyear?&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_DaysOfMonth(uint8_t, uint8_t);    &lt;br /&gt;
|how many days in (month, year)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_DayOfWeek(uint8_t, uint8_t, uint8_t);  &lt;br /&gt;
|calc day of week&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_IsLastsunday(void);                &lt;br /&gt;
|Check if last Sunday in march / october&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_CalibrateRCO(void);&lt;br /&gt;
|calibrate internal rco&lt;br /&gt;
|&#039;&#039;&#039;not tested yet&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Entwicklungsumgebung =&lt;br /&gt;
* Editor, Debugger, Compiler&lt;br /&gt;
** WinAVR version (20071221), sprich GCC 4.2.2 sowie avr-libc 1.6.0&lt;br /&gt;
** AVR Studio 4 &lt;br /&gt;
* JTAG ICE&lt;br /&gt;
** Atmel AVR JTAGICE MK2 &lt;br /&gt;
** AVR Dragon (z.B. http://elmicro.com/de/atavrdragon.html)&lt;br /&gt;
** Olimex-Seriell http://www.olimex.com/dev/avr-jtag.html  &lt;br /&gt;
** Olimex-USB http://www.olimex.com/dev/avr-usb-jtag.html &lt;br /&gt;
&lt;br /&gt;
= Sonstiges =&lt;br /&gt;
== Altes Protokoll ==&lt;br /&gt;
[[HR20_Protocol_V2 | Hier ]] hat mal einer ein Protokoll eingegeben.&lt;br /&gt;
Das scheint aber nicht zu der Version 2.04 zu passen. &lt;br /&gt;
Ich habe es nicht gelöscht, falls es jemanden interessiert.&lt;br /&gt;
== SVN Anleitung ==&lt;br /&gt;
Eine Anleitung was ein SVN ist und wie man es brauchen wir hier nicht.&lt;br /&gt;
Sonst müsste hier auch ein C-Kurs, Windows-Kurs, und Elektronik-Kurs hin.&lt;br /&gt;
&lt;br /&gt;
[[Category:Projekte|!]]&lt;/div&gt;</summary>
		<author><name>Dario</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=26048</id>
		<title>Heizungssteuerung mit Honeywell HR20</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=26048"/>
		<updated>2008-02-04T14:10:24Z</updated>

		<summary type="html">&lt;p&gt;Dario: /* RTC */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von DarioC&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Wie alles begann =&lt;br /&gt;
&lt;br /&gt;
Nachdem von Uwe Felgentreu vor nunmehr vor über drei Jahren (genau am 17.11.2004 um 11:26) hier in diesem Forum den Thread mit dem Titel &#039;&#039;Honeywell Rondostat HR20E per AVR steuern und konfigurieren&#039;&#039; gestartet hat ist es nun langsam soweit, dass das Ganze auch ein Projekt wird. &lt;br /&gt;
&lt;br /&gt;
Den Thread dazu kann der interessierte Leser [http://www.mikrocontroller.net/topic/17603 hier nachlesen] &lt;br /&gt;
&lt;br /&gt;
= Projektziel =&lt;br /&gt;
&lt;br /&gt;
Wir konzentrieren uns in erster Linie auf den Honeywell Rondostat HR20E mit ausgelieferten Softwareversion 2.04. Dass es ähnliche andere Geräte gibt behalten wir bei der Entwicklung im Hinterkopf.&lt;br /&gt;
&lt;br /&gt;
Basierend auf dieser Hardware wollen wir eine neue Software entwickeln. &lt;br /&gt;
Dabe können wir ausser der Hardware nichts weiter verwenden, da die Originalsoftware geschützt ist und nicht ausgelesen werden kann.&lt;br /&gt;
&lt;br /&gt;
== Phase 1 ==&lt;br /&gt;
Die Software soll die Funktionen bieten, die die Originalsoftware auch bietet, später können dies dann um zusätzliche Funktionen erweitert werden. Die wichtigsten Funktionen sind:&lt;br /&gt;
&lt;br /&gt;
* Temperaturregelung&lt;br /&gt;
* Echtzeituhr&lt;br /&gt;
* Ausnutzen der Sleep Funktion&lt;br /&gt;
* Anzeige Soll-Temperatur und der Uhrzeit&lt;br /&gt;
* Einstellung der Soll-Temperatur&lt;br /&gt;
* Uhrzeitgesteuerte Einstellung der Soll-Temperatur &lt;br /&gt;
* Fenster-Offen-Erkennung&lt;br /&gt;
* Ventilfreispülungsfunktion&lt;br /&gt;
&lt;br /&gt;
== Phase 2 ==&lt;br /&gt;
&lt;br /&gt;
Hier liegt der Sinn des ganzen Projektes: Durch diese zusätzlichen Funktionen wollen wir den Nutzwert des Thermostaten erheblich steigern:&lt;br /&gt;
&lt;br /&gt;
* Programmierung der Schaltzeiten und Temperaturen über externe Schnittstelle&lt;br /&gt;
* Abfrage der Messwerte und Parameter über externe Schnittstelle&lt;br /&gt;
* Vernetzung der Thermostaten untereinander&lt;br /&gt;
* Zusätzliche externe Schnittstellen (neben UART auch CAN und Funk)&lt;br /&gt;
* Erweiterung der Anzeige um&lt;br /&gt;
** Ist-Temperatur &lt;br /&gt;
** Ventilstellung&lt;br /&gt;
** Funkschnittstelle&lt;br /&gt;
*** RFM12 http://www.hoperf.com/rf_fsk.asp&lt;br /&gt;
*** Zigbee http://www.meshnetics.com/zigbee-modules&lt;br /&gt;
** ...&lt;br /&gt;
* Bootloader, damit Leute mitarbeiten können, die keine JTAG haben. Mit einem JTAG könnte man den Bootloader Flashen, ohne den Thermostaten öffnen zu müssen. Von da an kann man über den Programmierstecker mit einem umgebauten Handykabel den Thermostaten neu flashen.&lt;br /&gt;
&lt;br /&gt;
= Subversion Repository =&lt;br /&gt;
Ein SVN Repository liegt auf dem freien SVN Server: https://opensvn.csie.org&lt;br /&gt;
== Zugangsdaten ==&lt;br /&gt;
Repository Location: https://OpenSVN.csie.org/hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
Browse Repository: https://OpenSVN.csie.org/viewcvs.cgi/?root=hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
TRAC: https://opensvn.csie.org/traccgi/hr20&lt;br /&gt;
== Policy ==&lt;br /&gt;
Anonymous check out ist erlaubt. &amp;lt;br&amp;gt;&lt;br /&gt;
Wer was committen will muss freigeschaltet werden. &amp;lt;br&amp;gt;&lt;br /&gt;
Dazu brauche ich ein &#039;&#039;Usernamen, Passwort&#039;&#039; und eine &#039;&#039;Mailadresse&#039;&#039;, dann kann ich das einrichten. &amp;lt;br&amp;gt;&lt;br /&gt;
Tragt Euch dazu einfach selber in die Tabelle ein, ich erledige dann den Rest.&amp;lt;br&amp;gt;&lt;br /&gt;
Das mache ich dann von Hand und da ich nicht alle 10 Minuten Mails bearbeite kann das auch schon mal einen oder zwei Tage dauern. &amp;lt;br&amp;gt;&lt;br /&gt;
Wenn sich ein Maintainer findet, gebe ich die Zugangsdaten gerne weiter.&lt;br /&gt;
== Entwickler ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! width=&amp;quot;150&amp;quot; | Entwickler&lt;br /&gt;
! width=&amp;quot;150&amp;quot; | svn Status&lt;br /&gt;
|-&lt;br /&gt;
| darioc&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|-&lt;br /&gt;
| louk&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|}&lt;br /&gt;
== Verzeichnisstrucktur ==&lt;br /&gt;
Eine Verzeichnisstrucktur ist auch schon angelegt und die ersten Daten auch drin. Hier die Verzeichnisse:&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
| &#039;&#039;&#039;/doc&#039;&#039;&#039;&lt;br /&gt;
| Für alles an Dokumenten, die selbst erstellt wurden. &amp;lt;br&amp;gt;&lt;br /&gt;
Specs, die man im Internet bekommen kann gehören hier nicht rein, &amp;lt;br&amp;gt;&lt;br /&gt;
die machen das alles nur unnötig gross und das auschecken dauert länger.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/playground&#039;&#039;&#039; &lt;br /&gt;
| Wie der Name schon sagt, zum rumspielen und testen. &amp;lt;br&amp;gt;&lt;br /&gt;
Hier kommt jegliche art von Codeschnipseln hin, die zu Testen da sind &amp;lt;br&amp;gt;&lt;br /&gt;
und (derzeit) noch icht Teil des Programmes sind.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/source&#039;&#039;&#039; &lt;br /&gt;
| Hier kommt die Applikation rein mit allen Modulen und makefiles.&amp;lt;br&amp;gt;&lt;br /&gt;
Bitte haltet das Repository sauber und checkt nur Dateien ein, &amp;lt;br&amp;gt;&lt;br /&gt;
die auch Sinn  machen, &amp;quot;thumbs.db&amp;quot; oder andere Temp-Dateien gehören hier nicht rein.&lt;br /&gt;
|}&lt;br /&gt;
== SVN Client und Anleitung ==&lt;br /&gt;
Windows-User nutzen am besten den Tortoise-SVN-Client, den man kostenfrei [http://tortoisesvn.tigris.org hier runterladen] kann. &amp;lt;br&amp;gt;&lt;br /&gt;
Dort gibt es auch eine Anleitung zum Arbeiten mit SVN. &lt;br /&gt;
&lt;br /&gt;
= Analyse der Hardware =&lt;br /&gt;
Die Analyse hat der Dario schon gemacht, zu finden ist die jeweils aktuelle Version &lt;br /&gt;
[http://www.carluccio.de/img/hr20/analyse.pdf als PDF hier] oder [https://opensvn.csie.org/viewcvs.cgi/doc/analyse.pdf hier im SVN].&lt;br /&gt;
&lt;br /&gt;
= Benötigte Module =&lt;br /&gt;
&lt;br /&gt;
Um das Ganze nun etwas zu koordinieren hier eine Liste der benötigten Module und deren Funktionen. &amp;lt;br&amp;gt;&lt;br /&gt;
Diese dient dazu später die Aufgaben zu verteilen:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Module&lt;br /&gt;
! Function&lt;br /&gt;
! Developer&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| LCD&lt;br /&gt;
| Display Driver:&amp;lt;BR&amp;gt;&lt;br /&gt;
* Init Display - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Set Segments - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Print HEX, DEC, TEMP, DayofWeek - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Blink - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* e.t.c&lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; DONE &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| RTC&lt;br /&gt;
| Time and Date Handler&lt;br /&gt;
* init timer - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* use IRQ with 32kHz crystal - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* handle time and date - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** daylight saving - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** consult leapyear  - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* calc day of week out of date - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Only one Byte for Year -&amp;gt; (2000 to 2255)&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* calibrate internal RC - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE, but not tested &#039;&#039;&#039;&amp;lt;/span&amp;gt; &lt;br /&gt;
* corretion for external Crystal - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; (95%)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UART &lt;br /&gt;
| UART-Driver&lt;br /&gt;
* menue (Debug und Steuerung)&lt;br /&gt;
** show and set desired temperature &lt;br /&gt;
** show and set Time and Date&lt;br /&gt;
** show actual temperature&lt;br /&gt;
** show (and set) actual valveposition &lt;br /&gt;
** show and set timetable and temperatures&lt;br /&gt;
* optional &lt;br /&gt;
** adressierung of HR20 (for BUS, RF)&lt;br /&gt;
** authentication end encryption&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| MENU&lt;br /&gt;
| Display Menu&lt;br /&gt;
* get keystate (with debounce)&lt;br /&gt;
** multi keypress (nedded for hidden menue?)&lt;br /&gt;
** longer keypress / double click (nedded?)&lt;br /&gt;
* get position of wheel (incremental counter)&lt;br /&gt;
* controll display&lt;br /&gt;
* functionality:&lt;br /&gt;
* show and set desired temperature&lt;br /&gt;
* show and set time and date &lt;br /&gt;
* show actual temperature&lt;br /&gt;
* show actual valveposition &lt;br /&gt;
* show and set timetable and temperatures&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| MOTOR&lt;br /&gt;
| Motor-Driver &lt;br /&gt;
* set desired valveposition &lt;br /&gt;
** quick&lt;br /&gt;
** asympthotic&lt;br /&gt;
** quiet&lt;br /&gt;
* callibrate for Valve&lt;br /&gt;
* Genereate ERROR if motor not turning (low energie)&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| TEMP&lt;br /&gt;
| Temperaturesensor-Driver &lt;br /&gt;
* init Sensor &lt;br /&gt;
* IQR driven (500ms)&lt;br /&gt;
* start A/D conversion (IQR driven)&lt;br /&gt;
* get A/D Value and calc temperature&lt;br /&gt;
* calibration for sensor (needed?)&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| PID&lt;br /&gt;
| PID Algorithm&lt;br /&gt;
* calculate desired valveposition out of&lt;br /&gt;
** last valveposition(s) &lt;br /&gt;
** last temperature(s)&lt;br /&gt;
** actual temperature&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| BOOT&lt;br /&gt;
| Bootloader&lt;br /&gt;
we need a bootloader so that the developers can flash the software &lt;br /&gt;
without a JTAG cable and without disassembling the HR20.&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| LOG&lt;br /&gt;
| Datalogger&lt;br /&gt;
* Operating Hours&lt;br /&gt;
** motor in action&lt;br /&gt;
** ODOmeter&lt;br /&gt;
** since Battery Exchange&lt;br /&gt;
* Errors&lt;br /&gt;
* Logfiles (only with additional hardware)&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UID&lt;br /&gt;
| Unique ID for identification&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= API Beschreibung =&lt;br /&gt;
== LCD ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Funtion&lt;br /&gt;
! Propose&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Init(void);            &lt;br /&gt;
|Init the LCD Controller&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_AllSegments(uint8_t);&lt;br /&gt;
|Set all segments to LCD_MODE&lt;br /&gt;
| done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearAll(void);                       &lt;br /&gt;
|Clear all segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearHour_Bar(void);&lt;br /&gt;
|Clear 24 bar segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearSymbols(void);&lt;br /&gt;
|Clear AUTO MANU PROG SUN MOON SNOW&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearNumbers(void);&lt;br /&gt;
|Clear 7 Segments ans Collumns&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintDec(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print DEC-val in two 7 Segments 0-99&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintHex(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print HEX-val in two 7 Segments 0-ff&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintNo(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print one ditig in one 7 Segment&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintTemp(uint8_t, uint8_t);&lt;br /&gt;
|Print desired temperature (val+4,9)°C&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetSeg(uint8_t, uint8_t);          &lt;br /&gt;
|Set one Segment to LCD_MODE (0-69)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetHourBarSeg(uint8_t, uint8_t);    &lt;br /&gt;
|Set one Hour Bar Segment to LCD_MODE (0-23)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetHourBarVal(uint8_t, uint8_t);&lt;br /&gt;
|Set all Hour Bar Segments from 0 to val to LCD_MODE (0-23)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Update(void);                        &lt;br /&gt;
|Request immidiate LCD-Update (normal only when bitplane changes)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t LCD_ContrastAdjust (int8_t);           &lt;br /&gt;
|Adjust the contrast&lt;br /&gt;
|&#039;&#039;&#039;not tested yet&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== RTC ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Funtion&lt;br /&gt;
! Propose&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_Init(void);            &lt;br /&gt;
|Sart Timer, activate 500ms IRQ&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetHour(void);                    &lt;br /&gt;
|Get Hour&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetMinute(void);                   &lt;br /&gt;
|Get Minute&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetSecond(void);                   &lt;br /&gt;
|Get Second&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetDay(void);                      &lt;br /&gt;
|Get Day&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetMonth(void);                    &lt;br /&gt;
|Get Month&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetYearYY(void);                     &lt;br /&gt;
|Get Year (00-255)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_GetDayOfWeek(void);                &lt;br /&gt;
|Get Day of Week (0:Monday)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint16_t RTC_GetYearYYYY(void);               &lt;br /&gt;
|Get Year (2000-2255)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetHour(uint8_t);                     &lt;br /&gt;
|Set Hour&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetMinute(uint8_t);                   &lt;br /&gt;
|Set Minute&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetSecond(uint8_t);                   &lt;br /&gt;
|Set Second&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetDay(uint8_t);                      &lt;br /&gt;
|Set Day&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetMonth(uint8_t);                    &lt;br /&gt;
|Set Month&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_SetYear(uint8_t);                     &lt;br /&gt;
|Set Year&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_AddOneSecond(void);                  &lt;br /&gt;
|Add one second to actual time&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_AddOneDay(void);                     &lt;br /&gt;
|Add one day to actual date&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_NoLeapyear(uint8_t);               &lt;br /&gt;
|is year a leapyear?&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_DaysOfMonth(uint8_t, uint8_t);    &lt;br /&gt;
|how many days in (month, year)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_DayOfWeek(uint8_t, uint8_t, uint8_t);  &lt;br /&gt;
|calc day of week&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_IsLastsunday(void);                &lt;br /&gt;
|Check if last Sunday in march / october&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_CalibrateRCO(void);&lt;br /&gt;
|calibrate internal rco&lt;br /&gt;
|&#039;&#039;&#039;not tested yet&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Entwicklungsumgebung =&lt;br /&gt;
* Editor, Debugger, Compiler&lt;br /&gt;
** WinAVR version (20071221), sprich GCC 4.2.2 sowie avr-libc 1.6.0&lt;br /&gt;
** AVR Studio 4 &lt;br /&gt;
* JTAG ICE&lt;br /&gt;
** Atmel AVR JTAGICE MK2 &lt;br /&gt;
** AVR Dragon (z.B. http://elmicro.com/de/atavrdragon.html)&lt;br /&gt;
** Olimex-Seriell http://www.olimex.com/dev/avr-jtag.html  &lt;br /&gt;
** Olimex-USB http://www.olimex.com/dev/avr-usb-jtag.html &lt;br /&gt;
&lt;br /&gt;
= Sonstiges =&lt;br /&gt;
== Altes Protokoll ==&lt;br /&gt;
[[HR20_Protocol_V2 | Hier ]] hat mal einer ein Protokoll eingegeben.&lt;br /&gt;
Das scheint aber nicht zu der Version 2.04 zu passen. &lt;br /&gt;
Ich habe es nicht gelöscht, falls es jemanden interessiert.&lt;br /&gt;
== SVN Anleitung ==&lt;br /&gt;
Eine Anleitung was ein SVN ist und wie man es brauchen wir hier nicht.&lt;br /&gt;
Sonst müsste hier auch ein C-Kurs, Windows-Kurs, und Elektronik-Kurs hin.&lt;br /&gt;
&lt;br /&gt;
[[Category:Projekte|!]]&lt;/div&gt;</summary>
		<author><name>Dario</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=26046</id>
		<title>Heizungssteuerung mit Honeywell HR20</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=26046"/>
		<updated>2008-02-04T14:09:05Z</updated>

		<summary type="html">&lt;p&gt;Dario: /* LCD */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von DarioC&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Wie alles begann =&lt;br /&gt;
&lt;br /&gt;
Nachdem von Uwe Felgentreu vor nunmehr vor über drei Jahren (genau am 17.11.2004 um 11:26) hier in diesem Forum den Thread mit dem Titel &#039;&#039;Honeywell Rondostat HR20E per AVR steuern und konfigurieren&#039;&#039; gestartet hat ist es nun langsam soweit, dass das Ganze auch ein Projekt wird. &lt;br /&gt;
&lt;br /&gt;
Den Thread dazu kann der interessierte Leser [http://www.mikrocontroller.net/topic/17603 hier nachlesen] &lt;br /&gt;
&lt;br /&gt;
= Projektziel =&lt;br /&gt;
&lt;br /&gt;
Wir konzentrieren uns in erster Linie auf den Honeywell Rondostat HR20E mit ausgelieferten Softwareversion 2.04. Dass es ähnliche andere Geräte gibt behalten wir bei der Entwicklung im Hinterkopf.&lt;br /&gt;
&lt;br /&gt;
Basierend auf dieser Hardware wollen wir eine neue Software entwickeln. &lt;br /&gt;
Dabe können wir ausser der Hardware nichts weiter verwenden, da die Originalsoftware geschützt ist und nicht ausgelesen werden kann.&lt;br /&gt;
&lt;br /&gt;
== Phase 1 ==&lt;br /&gt;
Die Software soll die Funktionen bieten, die die Originalsoftware auch bietet, später können dies dann um zusätzliche Funktionen erweitert werden. Die wichtigsten Funktionen sind:&lt;br /&gt;
&lt;br /&gt;
* Temperaturregelung&lt;br /&gt;
* Echtzeituhr&lt;br /&gt;
* Ausnutzen der Sleep Funktion&lt;br /&gt;
* Anzeige Soll-Temperatur und der Uhrzeit&lt;br /&gt;
* Einstellung der Soll-Temperatur&lt;br /&gt;
* Uhrzeitgesteuerte Einstellung der Soll-Temperatur &lt;br /&gt;
* Fenster-Offen-Erkennung&lt;br /&gt;
* Ventilfreispülungsfunktion&lt;br /&gt;
&lt;br /&gt;
== Phase 2 ==&lt;br /&gt;
&lt;br /&gt;
Hier liegt der Sinn des ganzen Projektes: Durch diese zusätzlichen Funktionen wollen wir den Nutzwert des Thermostaten erheblich steigern:&lt;br /&gt;
&lt;br /&gt;
* Programmierung der Schaltzeiten und Temperaturen über externe Schnittstelle&lt;br /&gt;
* Abfrage der Messwerte und Parameter über externe Schnittstelle&lt;br /&gt;
* Vernetzung der Thermostaten untereinander&lt;br /&gt;
* Zusätzliche externe Schnittstellen (neben UART auch CAN und Funk)&lt;br /&gt;
* Erweiterung der Anzeige um&lt;br /&gt;
** Ist-Temperatur &lt;br /&gt;
** Ventilstellung&lt;br /&gt;
** Funkschnittstelle&lt;br /&gt;
*** RFM12 http://www.hoperf.com/rf_fsk.asp&lt;br /&gt;
*** Zigbee http://www.meshnetics.com/zigbee-modules&lt;br /&gt;
** ...&lt;br /&gt;
* Bootloader, damit Leute mitarbeiten können, die keine JTAG haben. Mit einem JTAG könnte man den Bootloader Flashen, ohne den Thermostaten öffnen zu müssen. Von da an kann man über den Programmierstecker mit einem umgebauten Handykabel den Thermostaten neu flashen.&lt;br /&gt;
&lt;br /&gt;
= Subversion Repository =&lt;br /&gt;
Ein SVN Repository liegt auf dem freien SVN Server: https://opensvn.csie.org&lt;br /&gt;
== Zugangsdaten ==&lt;br /&gt;
Repository Location: https://OpenSVN.csie.org/hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
Browse Repository: https://OpenSVN.csie.org/viewcvs.cgi/?root=hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
TRAC: https://opensvn.csie.org/traccgi/hr20&lt;br /&gt;
== Policy ==&lt;br /&gt;
Anonymous check out ist erlaubt. &amp;lt;br&amp;gt;&lt;br /&gt;
Wer was committen will muss freigeschaltet werden. &amp;lt;br&amp;gt;&lt;br /&gt;
Dazu brauche ich ein &#039;&#039;Usernamen, Passwort&#039;&#039; und eine &#039;&#039;Mailadresse&#039;&#039;, dann kann ich das einrichten. &amp;lt;br&amp;gt;&lt;br /&gt;
Tragt Euch dazu einfach selber in die Tabelle ein, ich erledige dann den Rest.&amp;lt;br&amp;gt;&lt;br /&gt;
Das mache ich dann von Hand und da ich nicht alle 10 Minuten Mails bearbeite kann das auch schon mal einen oder zwei Tage dauern. &amp;lt;br&amp;gt;&lt;br /&gt;
Wenn sich ein Maintainer findet, gebe ich die Zugangsdaten gerne weiter.&lt;br /&gt;
== Entwickler ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! width=&amp;quot;150&amp;quot; | Entwickler&lt;br /&gt;
! width=&amp;quot;150&amp;quot; | svn Status&lt;br /&gt;
|-&lt;br /&gt;
| darioc&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|-&lt;br /&gt;
| louk&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|}&lt;br /&gt;
== Verzeichnisstrucktur ==&lt;br /&gt;
Eine Verzeichnisstrucktur ist auch schon angelegt und die ersten Daten auch drin. Hier die Verzeichnisse:&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
| &#039;&#039;&#039;/doc&#039;&#039;&#039;&lt;br /&gt;
| Für alles an Dokumenten, die selbst erstellt wurden. &amp;lt;br&amp;gt;&lt;br /&gt;
Specs, die man im Internet bekommen kann gehören hier nicht rein, &amp;lt;br&amp;gt;&lt;br /&gt;
die machen das alles nur unnötig gross und das auschecken dauert länger.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/playground&#039;&#039;&#039; &lt;br /&gt;
| Wie der Name schon sagt, zum rumspielen und testen. &amp;lt;br&amp;gt;&lt;br /&gt;
Hier kommt jegliche art von Codeschnipseln hin, die zu Testen da sind &amp;lt;br&amp;gt;&lt;br /&gt;
und (derzeit) noch icht Teil des Programmes sind.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/source&#039;&#039;&#039; &lt;br /&gt;
| Hier kommt die Applikation rein mit allen Modulen und makefiles.&amp;lt;br&amp;gt;&lt;br /&gt;
Bitte haltet das Repository sauber und checkt nur Dateien ein, &amp;lt;br&amp;gt;&lt;br /&gt;
die auch Sinn  machen, &amp;quot;thumbs.db&amp;quot; oder andere Temp-Dateien gehören hier nicht rein.&lt;br /&gt;
|}&lt;br /&gt;
== SVN Client und Anleitung ==&lt;br /&gt;
Windows-User nutzen am besten den Tortoise-SVN-Client, den man kostenfrei [http://tortoisesvn.tigris.org hier runterladen] kann. &amp;lt;br&amp;gt;&lt;br /&gt;
Dort gibt es auch eine Anleitung zum Arbeiten mit SVN. &lt;br /&gt;
&lt;br /&gt;
= Analyse der Hardware =&lt;br /&gt;
Die Analyse hat der Dario schon gemacht, zu finden ist die jeweils aktuelle Version &lt;br /&gt;
[http://www.carluccio.de/img/hr20/analyse.pdf als PDF hier] oder [https://opensvn.csie.org/viewcvs.cgi/doc/analyse.pdf hier im SVN].&lt;br /&gt;
&lt;br /&gt;
= Benötigte Module =&lt;br /&gt;
&lt;br /&gt;
Um das Ganze nun etwas zu koordinieren hier eine Liste der benötigten Module und deren Funktionen. &amp;lt;br&amp;gt;&lt;br /&gt;
Diese dient dazu später die Aufgaben zu verteilen:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Module&lt;br /&gt;
! Function&lt;br /&gt;
! Developer&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| LCD&lt;br /&gt;
| Display Driver:&amp;lt;BR&amp;gt;&lt;br /&gt;
* Init Display - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Set Segments - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Print HEX, DEC, TEMP, DayofWeek - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Blink - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* e.t.c&lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; DONE &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| RTC&lt;br /&gt;
| Time and Date Handler&lt;br /&gt;
* init timer - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* use IRQ with 32kHz crystal - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* handle time and date - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** daylight saving - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** consult leapyear  - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* calc day of week out of date - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Only one Byte for Year -&amp;gt; (2000 to 2255)&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* calibrate internal RC - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE, but not tested &#039;&#039;&#039;&amp;lt;/span&amp;gt; &lt;br /&gt;
* corretion for external Crystal - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; (95%)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UART &lt;br /&gt;
| UART-Driver&lt;br /&gt;
* menue (Debug und Steuerung)&lt;br /&gt;
** show and set desired temperature &lt;br /&gt;
** show and set Time and Date&lt;br /&gt;
** show actual temperature&lt;br /&gt;
** show (and set) actual valveposition &lt;br /&gt;
** show and set timetable and temperatures&lt;br /&gt;
* optional &lt;br /&gt;
** adressierung of HR20 (for BUS, RF)&lt;br /&gt;
** authentication end encryption&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| MENU&lt;br /&gt;
| Display Menu&lt;br /&gt;
* get keystate (with debounce)&lt;br /&gt;
** multi keypress (nedded for hidden menue?)&lt;br /&gt;
** longer keypress / double click (nedded?)&lt;br /&gt;
* get position of wheel (incremental counter)&lt;br /&gt;
* controll display&lt;br /&gt;
* functionality:&lt;br /&gt;
* show and set desired temperature&lt;br /&gt;
* show and set time and date &lt;br /&gt;
* show actual temperature&lt;br /&gt;
* show actual valveposition &lt;br /&gt;
* show and set timetable and temperatures&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| MOTOR&lt;br /&gt;
| Motor-Driver &lt;br /&gt;
* set desired valveposition &lt;br /&gt;
** quick&lt;br /&gt;
** asympthotic&lt;br /&gt;
** quiet&lt;br /&gt;
* callibrate for Valve&lt;br /&gt;
* Genereate ERROR if motor not turning (low energie)&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| TEMP&lt;br /&gt;
| Temperaturesensor-Driver &lt;br /&gt;
* init Sensor &lt;br /&gt;
* IQR driven (500ms)&lt;br /&gt;
* start A/D conversion (IQR driven)&lt;br /&gt;
* get A/D Value and calc temperature&lt;br /&gt;
* calibration for sensor (needed?)&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| PID&lt;br /&gt;
| PID Algorithm&lt;br /&gt;
* calculate desired valveposition out of&lt;br /&gt;
** last valveposition(s) &lt;br /&gt;
** last temperature(s)&lt;br /&gt;
** actual temperature&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| BOOT&lt;br /&gt;
| Bootloader&lt;br /&gt;
we need a bootloader so that the developers can flash the software &lt;br /&gt;
without a JTAG cable and without disassembling the HR20.&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| LOG&lt;br /&gt;
| Datalogger&lt;br /&gt;
* Operating Hours&lt;br /&gt;
** motor in action&lt;br /&gt;
** ODOmeter&lt;br /&gt;
** since Battery Exchange&lt;br /&gt;
* Errors&lt;br /&gt;
* Logfiles (only with additional hardware)&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UID&lt;br /&gt;
| Unique ID for identification&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= API Beschreibung =&lt;br /&gt;
== LCD ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Funtion&lt;br /&gt;
! Propose&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Init(void);            &lt;br /&gt;
|Init the LCD Controller&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_AllSegments(uint8_t);&lt;br /&gt;
|Set all segments to LCD_MODE&lt;br /&gt;
| done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearAll(void);                       &lt;br /&gt;
|Clear all segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearHour_Bar(void);&lt;br /&gt;
|Clear 24 bar segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearSymbols(void);&lt;br /&gt;
|Clear AUTO MANU PROG SUN MOON SNOW&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_ClearNumbers(void);&lt;br /&gt;
|Clear 7 Segments ans Collumns&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintDec(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print DEC-val in two 7 Segments 0-99&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintHex(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print HEX-val in two 7 Segments 0-ff&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintNo(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print one ditig in one 7 Segment&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_PrintTemp(uint8_t, uint8_t);&lt;br /&gt;
|Print desired temperature (val+4,9)°C&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetSeg(uint8_t, uint8_t);          &lt;br /&gt;
|Set one Segment to LCD_MODE (0-69)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetHourBarSeg(uint8_t, uint8_t);    &lt;br /&gt;
|Set one Hour Bar Segment to LCD_MODE (0-23)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_SetHourBarVal(uint8_t, uint8_t);&lt;br /&gt;
|Set all Hour Bar Segments from 0 to val to LCD_MODE (0-23)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Update(void);                        &lt;br /&gt;
|Request immidiate LCD-Update (normal only when bitplane changes)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t LCD_ContrastAdjust (int8_t);           &lt;br /&gt;
|Adjust the contrast&lt;br /&gt;
|&#039;&#039;&#039;not tested yet&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== RTC ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Funtion&lt;br /&gt;
! Propose&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_Init(void);            &lt;br /&gt;
|Sart Timer, activate 500ms IRQ&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_Get_Hour(void);                    &lt;br /&gt;
|Get Hour&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_Get_Minute(void);                   &lt;br /&gt;
|Get Minute&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_Get_Second(void);                   &lt;br /&gt;
|Get Second&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_Get_Day(void);                      &lt;br /&gt;
|Get Day&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_Get_Month(void);                    &lt;br /&gt;
|Get Month&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_Get_Year(void);                     &lt;br /&gt;
|Get Year (00-255)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_Get_DayOfWeek(void);                &lt;br /&gt;
|Get Day of Week (0:Monday)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint16_t RTC_Get_Year_2000(void);               &lt;br /&gt;
|Get Year (2000-2255)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_Set_Hour(uint8_t);                     &lt;br /&gt;
|Set Hour&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_Set_Minute(uint8_t);                   &lt;br /&gt;
|Set Minute&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_Set_Second(uint8_t);                   &lt;br /&gt;
|Set Second&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_Set_Day(uint8_t);                      &lt;br /&gt;
|Set Day&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_Set_Month(uint8_t);                    &lt;br /&gt;
|Set Month&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_Set_Year(uint8_t);                     &lt;br /&gt;
|Set Year&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_Add_One_Second(void);                  &lt;br /&gt;
|Add one second to actual time&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_Add_One_Day(void);                     &lt;br /&gt;
|Add one day to actual date&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_No_Leapyear(uint8_t);               &lt;br /&gt;
|is year a leapyear?&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_Days_Of_Month(uint8_t, uint8_t);    &lt;br /&gt;
|how many days in (month, year)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_Day_Of_Week(uint8_t, uint8_t, uint8_t);  &lt;br /&gt;
|calc day of week&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_Is_Lastsunday(void);                &lt;br /&gt;
|Check if last Sunday in march / october&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void calibrate_rco(void);&lt;br /&gt;
|calibrate internal rco&lt;br /&gt;
|&#039;&#039;&#039;not tested yet&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Entwicklungsumgebung =&lt;br /&gt;
* Editor, Debugger, Compiler&lt;br /&gt;
** WinAVR version (20071221), sprich GCC 4.2.2 sowie avr-libc 1.6.0&lt;br /&gt;
** AVR Studio 4 &lt;br /&gt;
* JTAG ICE&lt;br /&gt;
** Atmel AVR JTAGICE MK2 &lt;br /&gt;
** AVR Dragon (z.B. http://elmicro.com/de/atavrdragon.html)&lt;br /&gt;
** Olimex-Seriell http://www.olimex.com/dev/avr-jtag.html  &lt;br /&gt;
** Olimex-USB http://www.olimex.com/dev/avr-usb-jtag.html &lt;br /&gt;
&lt;br /&gt;
= Sonstiges =&lt;br /&gt;
== Altes Protokoll ==&lt;br /&gt;
[[HR20_Protocol_V2 | Hier ]] hat mal einer ein Protokoll eingegeben.&lt;br /&gt;
Das scheint aber nicht zu der Version 2.04 zu passen. &lt;br /&gt;
Ich habe es nicht gelöscht, falls es jemanden interessiert.&lt;br /&gt;
== SVN Anleitung ==&lt;br /&gt;
Eine Anleitung was ein SVN ist und wie man es brauchen wir hier nicht.&lt;br /&gt;
Sonst müsste hier auch ein C-Kurs, Windows-Kurs, und Elektronik-Kurs hin.&lt;br /&gt;
&lt;br /&gt;
[[Category:Projekte|!]]&lt;/div&gt;</summary>
		<author><name>Dario</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=25987</id>
		<title>Heizungssteuerung mit Honeywell HR20</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=25987"/>
		<updated>2008-02-02T13:06:29Z</updated>

		<summary type="html">&lt;p&gt;Dario: /* Benötigte Module */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von DarioC&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Wie alles begann =&lt;br /&gt;
&lt;br /&gt;
Nachdem von Uwe Felgentreu vor nunmehr vor über drei Jahren (genau am 17.11.2004 um 11:26) hier in diesem Forum den Thread mit dem Titel &#039;&#039;Honeywell Rondostat HR20E per AVR steuern und konfigurieren&#039;&#039; gestartet hat ist es nun langsam soweit, dass das Ganze auch ein Projekt wird. &lt;br /&gt;
&lt;br /&gt;
Den Thread dazu kann der interessierte Leser [http://www.mikrocontroller.net/topic/17603 hier nachlesen] &lt;br /&gt;
&lt;br /&gt;
= Projektziel =&lt;br /&gt;
&lt;br /&gt;
Wir konzentrieren uns in erster Linie auf den Honeywell Rondostat HR20E mit ausgelieferten Softwareversion 2.04. Dass es ähnliche andere Geräte gibt behalten wir bei der Entwicklung im Hinterkopf.&lt;br /&gt;
&lt;br /&gt;
Basierend auf dieser Hardware wollen wir eine neue Software entwickeln. &lt;br /&gt;
Dabe können wir ausser der Hardware nichts weiter verwenden, da die Originalsoftware geschützt ist und nicht ausgelesen werden kann.&lt;br /&gt;
&lt;br /&gt;
== Phase 1 ==&lt;br /&gt;
Die Software soll die Funktionen bieten, die die Originalsoftware auch bietet, später können dies dann um zusätzliche Funktionen erweitert werden. Die wichtigsten Funktionen sind:&lt;br /&gt;
&lt;br /&gt;
* Temperaturregelung&lt;br /&gt;
* Echtzeituhr&lt;br /&gt;
* Ausnutzen der Sleep Funktion&lt;br /&gt;
* Anzeige Soll-Temperatur und der Uhrzeit&lt;br /&gt;
* Einstellung der Soll-Temperatur&lt;br /&gt;
* Uhrzeitgesteuerte Einstellung der Soll-Temperatur &lt;br /&gt;
* Fenster-Offen-Erkennung&lt;br /&gt;
* Ventilfreispülungsfunktion&lt;br /&gt;
&lt;br /&gt;
== Phase 2 ==&lt;br /&gt;
&lt;br /&gt;
Hier liegt der Sinn des ganzen Projektes: Durch diese zusätzlichen Funktionen wollen wir den Nutzwert des Thermostaten erheblich steigern:&lt;br /&gt;
&lt;br /&gt;
* Programmierung der Schaltzeiten und Temperaturen über externe Schnittstelle&lt;br /&gt;
* Abfrage der Messwerte und Parameter über externe Schnittstelle&lt;br /&gt;
* Vernetzung der Thermostaten untereinander&lt;br /&gt;
* Zusätzliche externe Schnittstellen (neben UART auch CAN und Funk)&lt;br /&gt;
* Erweiterung der Anzeige um&lt;br /&gt;
** Ist-Temperatur &lt;br /&gt;
** Ventilstellung&lt;br /&gt;
** Funkschnittstelle&lt;br /&gt;
*** RFM12 http://www.hoperf.com/rf_fsk.asp&lt;br /&gt;
*** Zigbee http://www.meshnetics.com/zigbee-modules&lt;br /&gt;
** ...&lt;br /&gt;
* Bootloader, damit Leute mitarbeiten können, die keine JTAG haben. Mit einem JTAG könnte man den Bootloader Flashen, ohne den Thermostaten öffnen zu müssen. Von da an kann man über den Programmierstecker mit einem umgebauten Handykabel den Thermostaten neu flashen.&lt;br /&gt;
&lt;br /&gt;
= Subversion Repository =&lt;br /&gt;
Ein SVN Repository liegt auf dem freien SVN Server: https://opensvn.csie.org&lt;br /&gt;
== Zugangsdaten ==&lt;br /&gt;
Repository Location: https://OpenSVN.csie.org/hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
Browse Repository: https://OpenSVN.csie.org/viewcvs.cgi/?root=hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
TRAC: https://opensvn.csie.org/traccgi/hr20&lt;br /&gt;
== Policy ==&lt;br /&gt;
Anonymous check out ist erlaubt. &amp;lt;br&amp;gt;&lt;br /&gt;
Wer was committen will muss freigeschaltet werden. &amp;lt;br&amp;gt;&lt;br /&gt;
Dazu brauche ich ein &#039;&#039;Usernamen, Passwort&#039;&#039; und eine &#039;&#039;Mailadresse&#039;&#039;, dann kann ich das einrichten. &amp;lt;br&amp;gt;&lt;br /&gt;
Tragt Euch dazu einfach selber in die Tabelle ein, ich erledige dann den Rest.&amp;lt;br&amp;gt;&lt;br /&gt;
Das mache ich dann von Hand und da ich nicht alle 10 Minuten Mails bearbeite kann das auch schon mal einen oder zwei Tage dauern. &amp;lt;br&amp;gt;&lt;br /&gt;
Wenn sich ein Maintainer findet, gebe ich die Zugangsdaten gerne weiter.&lt;br /&gt;
== Entwickler ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! width=&amp;quot;150&amp;quot; | Entwickler&lt;br /&gt;
! width=&amp;quot;150&amp;quot; | svn Status&lt;br /&gt;
|-&lt;br /&gt;
| darioc&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|-&lt;br /&gt;
| louk&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|}&lt;br /&gt;
== Verzeichnisstrucktur ==&lt;br /&gt;
Eine Verzeichnisstrucktur ist auch schon angelegt und die ersten Daten auch drin. Hier die Verzeichnisse:&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
| &#039;&#039;&#039;/doc&#039;&#039;&#039;&lt;br /&gt;
| Für alles an Dokumenten, die selbst erstellt wurden. &amp;lt;br&amp;gt;&lt;br /&gt;
Specs, die man im Internet bekommen kann gehören hier nicht rein, &amp;lt;br&amp;gt;&lt;br /&gt;
die machen das alles nur unnötig gross und das auschecken dauert länger.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/playground&#039;&#039;&#039; &lt;br /&gt;
| Wie der Name schon sagt, zum rumspielen und testen. &amp;lt;br&amp;gt;&lt;br /&gt;
Hier kommt jegliche art von Codeschnipseln hin, die zu Testen da sind &amp;lt;br&amp;gt;&lt;br /&gt;
und (derzeit) noch icht Teil des Programmes sind.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/source&#039;&#039;&#039; &lt;br /&gt;
| Hier kommt die Applikation rein mit allen Modulen und makefiles.&amp;lt;br&amp;gt;&lt;br /&gt;
Bitte haltet das Repository sauber und checkt nur Dateien ein, &amp;lt;br&amp;gt;&lt;br /&gt;
die auch Sinn  machen, &amp;quot;thumbs.db&amp;quot; oder andere Temp-Dateien gehören hier nicht rein.&lt;br /&gt;
|}&lt;br /&gt;
== SVN Client und Anleitung ==&lt;br /&gt;
Windows-User nutzen am besten den Tortoise-SVN-Client, den man kostenfrei [http://tortoisesvn.tigris.org hier runterladen] kann. &amp;lt;br&amp;gt;&lt;br /&gt;
Dort gibt es auch eine Anleitung zum Arbeiten mit SVN. &lt;br /&gt;
&lt;br /&gt;
= Analyse der Hardware =&lt;br /&gt;
Die Analyse hat der Dario schon gemacht, zu finden ist die jeweils aktuelle Version &lt;br /&gt;
[http://www.carluccio.de/img/hr20/analyse.pdf als PDF hier] oder [https://opensvn.csie.org/viewcvs.cgi/doc/analyse.pdf hier im SVN].&lt;br /&gt;
&lt;br /&gt;
= Benötigte Module =&lt;br /&gt;
&lt;br /&gt;
Um das Ganze nun etwas zu koordinieren hier eine Liste der benötigten Module und deren Funktionen. &amp;lt;br&amp;gt;&lt;br /&gt;
Diese dient dazu später die Aufgaben zu verteilen:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Module&lt;br /&gt;
! Function&lt;br /&gt;
! Developer&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| LCD&lt;br /&gt;
| Display Driver:&amp;lt;BR&amp;gt;&lt;br /&gt;
* Init Display - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Set Segments - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Print HEX, DEC, TEMP, DayofWeek - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Blink - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* e.t.c&lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; DONE &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| RTC&lt;br /&gt;
| Time and Date Handler&lt;br /&gt;
* init timer - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* use IRQ with 32kHz crystal - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* handle time and date - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** daylight saving - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** consult leapyear  - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* calc day of week out of date - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Only one Byte for Year -&amp;gt; (2000 to 2255)&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* calibrate internal RC - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE, but not tested &#039;&#039;&#039;&amp;lt;/span&amp;gt; &lt;br /&gt;
* corretion for external Crystal - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
| dario&lt;br /&gt;
| style=&amp;quot;background-color:#00FF7F;&amp;quot; | &#039;&#039;&#039; (95%)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UART &lt;br /&gt;
| UART-Driver&lt;br /&gt;
* menue (Debug und Steuerung)&lt;br /&gt;
** show and set desired temperature &lt;br /&gt;
** show and set Time and Date&lt;br /&gt;
** show actual temperature&lt;br /&gt;
** show (and set) actual valveposition &lt;br /&gt;
** show and set timetable and temperatures&lt;br /&gt;
* optional &lt;br /&gt;
** adressierung of HR20 (for BUS, RF)&lt;br /&gt;
** authentication end encryption&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| MENU&lt;br /&gt;
| Display Menu&lt;br /&gt;
* get keystate (with debounce)&lt;br /&gt;
** multi keypress (nedded for hidden menue?)&lt;br /&gt;
** longer keypress / double click (nedded?)&lt;br /&gt;
* get position of wheel (incremental counter)&lt;br /&gt;
* controll display&lt;br /&gt;
* functionality:&lt;br /&gt;
* show and set desired temperature&lt;br /&gt;
* show and set time and date &lt;br /&gt;
* show actual temperature&lt;br /&gt;
* show actual valveposition &lt;br /&gt;
* show and set timetable and temperatures&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| MOTOR&lt;br /&gt;
| Motor-Driver &lt;br /&gt;
* set desired valveposition &lt;br /&gt;
** quick&lt;br /&gt;
** asympthotic&lt;br /&gt;
** quiet&lt;br /&gt;
* callibrate for Valve&lt;br /&gt;
* Genereate ERROR if motor not turning (low energie)&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| TEMP&lt;br /&gt;
| Temperaturesensor-Driver &lt;br /&gt;
* init Sensor &lt;br /&gt;
* IQR driven (500ms)&lt;br /&gt;
* start A/D conversion (IQR driven)&lt;br /&gt;
* get A/D Value and calc temperature&lt;br /&gt;
* calibration for sensor (needed?)&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| PID&lt;br /&gt;
| PID Algorithm&lt;br /&gt;
* calculate desired valveposition out of&lt;br /&gt;
** last valveposition(s) &lt;br /&gt;
** last temperature(s)&lt;br /&gt;
** actual temperature&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| BOOT&lt;br /&gt;
| Bootloader&lt;br /&gt;
we need a bootloader so that the developers can flash the software &lt;br /&gt;
without a JTAG cable and without disassembling the HR20.&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| LOG&lt;br /&gt;
| Datalogger&lt;br /&gt;
* Operating Hours&lt;br /&gt;
** motor in action&lt;br /&gt;
** ODOmeter&lt;br /&gt;
** since Battery Exchange&lt;br /&gt;
* Errors&lt;br /&gt;
* Logfiles (only with additional hardware)&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UID&lt;br /&gt;
| Unique ID for identification&lt;br /&gt;
|&lt;br /&gt;
| style=&amp;quot;background-color:#FF8C69;&amp;quot; | &#039;&#039;&#039;      &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= API Beschreibung =&lt;br /&gt;
== LCD ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Funtion&lt;br /&gt;
! Propose&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Init(void);            &lt;br /&gt;
|Init the LCD Controller&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_All_Segments(uint8_t);&lt;br /&gt;
|Set all segments to LCD_MODE&lt;br /&gt;
| done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Clear_All(void);                       &lt;br /&gt;
|Clear all segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Clear_Hour_Bar(void);&lt;br /&gt;
|Clear 24 bar segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Clear_Symbols(void);&lt;br /&gt;
|Clear AUTO MANU PROG SUN MOON SNOW&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Clear_Numbers(void);&lt;br /&gt;
|Clear 7 Segments ans Collumns&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Print_Dec(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print DEC-val in two 7 Segments 0-99&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Print_Hex(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print HEX-val in two 7 Segments 0-ff&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Print_No(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print one ditig in one 7 Segment&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Print_Temp(uint8_t, uint8_t);&lt;br /&gt;
|Print desired temperature (val+4,9)°C&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Set_Seg(uint8_t, uint8_t);          &lt;br /&gt;
|Set one Segment to LCD_MODE (0-69)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Set_Hour_Bar_Seg(uint8_t, uint8_t);    &lt;br /&gt;
|Set one Hour Bar Segment to LCD_MODE (0-23)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Set_Hour_Bar_Val(uint8_t, uint8_t);&lt;br /&gt;
|Set all Hour Bar Segments from 0 to val to LCD_MODE (0-23)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Update(void);                        &lt;br /&gt;
|Request immidiate LCD-Update (normal only when bitplane changes)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t LCD_Contrast_Adjust (int8_t);           &lt;br /&gt;
|Adjust the contrast&lt;br /&gt;
|&#039;&#039;&#039;not tested yet&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
== RTC ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Funtion&lt;br /&gt;
! Propose&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_Init(void);            &lt;br /&gt;
|Sart Timer, activate 500ms IRQ&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_Get_Hour(void);                    &lt;br /&gt;
|Get Hour&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_Get_Minute(void);                   &lt;br /&gt;
|Get Minute&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_Get_Second(void);                   &lt;br /&gt;
|Get Second&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_Get_Day(void);                      &lt;br /&gt;
|Get Day&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_Get_Month(void);                    &lt;br /&gt;
|Get Month&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_Get_Year(void);                     &lt;br /&gt;
|Get Year (00-255)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_Get_DayOfWeek(void);                &lt;br /&gt;
|Get Day of Week (0:Monday)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint16_t RTC_Get_Year_2000(void);               &lt;br /&gt;
|Get Year (2000-2255)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_Set_Hour(uint8_t);                     &lt;br /&gt;
|Set Hour&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_Set_Minute(uint8_t);                   &lt;br /&gt;
|Set Minute&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_Set_Second(uint8_t);                   &lt;br /&gt;
|Set Second&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_Set_Day(uint8_t);                      &lt;br /&gt;
|Set Day&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_Set_Month(uint8_t);                    &lt;br /&gt;
|Set Month&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_Set_Year(uint8_t);                     &lt;br /&gt;
|Set Year&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_Add_One_Second(void);                  &lt;br /&gt;
|Add one second to actual time&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_Add_One_Day(void);                     &lt;br /&gt;
|Add one day to actual date&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_No_Leapyear(uint8_t);               &lt;br /&gt;
|is year a leapyear?&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_Days_Of_Month(uint8_t, uint8_t);    &lt;br /&gt;
|how many days in (month, year)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_Day_Of_Week(uint8_t, uint8_t, uint8_t);  &lt;br /&gt;
|calc day of week&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_Is_Lastsunday(void);                &lt;br /&gt;
|Check if last Sunday in march / october&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void calibrate_rco(void);&lt;br /&gt;
|calibrate internal rco&lt;br /&gt;
|&#039;&#039;&#039;not tested yet&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Entwicklungsumgebung =&lt;br /&gt;
* Editor, Debugger, Compiler&lt;br /&gt;
** WinAVR version (20071221), sprich GCC 4.2.2 sowie avr-libc 1.6.0&lt;br /&gt;
** AVR Studio 4 &lt;br /&gt;
* JTAG ICE&lt;br /&gt;
** Atmel AVR JTAGICE MK2 &lt;br /&gt;
** AVR Dragon (z.B. http://elmicro.com/de/atavrdragon.html)&lt;br /&gt;
** Olimex-Seriell http://www.olimex.com/dev/avr-jtag.html  &lt;br /&gt;
** Olimex-USB http://www.olimex.com/dev/avr-usb-jtag.html &lt;br /&gt;
&lt;br /&gt;
= Sonstiges =&lt;br /&gt;
== Altes Protokoll ==&lt;br /&gt;
[[HR20_Protocol_V2 | Hier ]] hat mal einer ein Protokoll eingegeben.&lt;br /&gt;
Das scheint aber nicht zu der Version 2.04 zu passen. &lt;br /&gt;
Ich habe es nicht gelöscht, falls es jemanden interessiert.&lt;br /&gt;
== SVN Anleitung ==&lt;br /&gt;
Eine Anleitung was ein SVN ist und wie man es brauchen wir hier nicht.&lt;br /&gt;
Sonst müsste hier auch ein C-Kurs, Windows-Kurs, und Elektronik-Kurs hin.&lt;br /&gt;
&lt;br /&gt;
[[Category:Projekte|!]]&lt;/div&gt;</summary>
		<author><name>Dario</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=25986</id>
		<title>Heizungssteuerung mit Honeywell HR20</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=25986"/>
		<updated>2008-02-02T13:00:47Z</updated>

		<summary type="html">&lt;p&gt;Dario: /* API Beschreibung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von DarioC&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Wie alles begann =&lt;br /&gt;
&lt;br /&gt;
Nachdem von Uwe Felgentreu vor nunmehr vor über drei Jahren (genau am 17.11.2004 um 11:26) hier in diesem Forum den Thread mit dem Titel &#039;&#039;Honeywell Rondostat HR20E per AVR steuern und konfigurieren&#039;&#039; gestartet hat ist es nun langsam soweit, dass das Ganze auch ein Projekt wird. &lt;br /&gt;
&lt;br /&gt;
Den Thread dazu kann der interessierte Leser [http://www.mikrocontroller.net/topic/17603 hier nachlesen] &lt;br /&gt;
&lt;br /&gt;
= Projektziel =&lt;br /&gt;
&lt;br /&gt;
Wir konzentrieren uns in erster Linie auf den Honeywell Rondostat HR20E mit ausgelieferten Softwareversion 2.04. Dass es ähnliche andere Geräte gibt behalten wir bei der Entwicklung im Hinterkopf.&lt;br /&gt;
&lt;br /&gt;
Basierend auf dieser Hardware wollen wir eine neue Software entwickeln. &lt;br /&gt;
Dabe können wir ausser der Hardware nichts weiter verwenden, da die Originalsoftware geschützt ist und nicht ausgelesen werden kann.&lt;br /&gt;
&lt;br /&gt;
== Phase 1 ==&lt;br /&gt;
Die Software soll die Funktionen bieten, die die Originalsoftware auch bietet, später können dies dann um zusätzliche Funktionen erweitert werden. Die wichtigsten Funktionen sind:&lt;br /&gt;
&lt;br /&gt;
* Temperaturregelung&lt;br /&gt;
* Echtzeituhr&lt;br /&gt;
* Ausnutzen der Sleep Funktion&lt;br /&gt;
* Anzeige Soll-Temperatur und der Uhrzeit&lt;br /&gt;
* Einstellung der Soll-Temperatur&lt;br /&gt;
* Uhrzeitgesteuerte Einstellung der Soll-Temperatur &lt;br /&gt;
* Fenster-Offen-Erkennung&lt;br /&gt;
* Ventilfreispülungsfunktion&lt;br /&gt;
&lt;br /&gt;
== Phase 2 ==&lt;br /&gt;
&lt;br /&gt;
Hier liegt der Sinn des ganzen Projektes: Durch diese zusätzlichen Funktionen wollen wir den Nutzwert des Thermostaten erheblich steigern:&lt;br /&gt;
&lt;br /&gt;
* Programmierung der Schaltzeiten und Temperaturen über externe Schnittstelle&lt;br /&gt;
* Abfrage der Messwerte und Parameter über externe Schnittstelle&lt;br /&gt;
* Vernetzung der Thermostaten untereinander&lt;br /&gt;
* Zusätzliche externe Schnittstellen (neben UART auch CAN und Funk)&lt;br /&gt;
* Erweiterung der Anzeige um&lt;br /&gt;
** Ist-Temperatur &lt;br /&gt;
** Ventilstellung&lt;br /&gt;
** Funkschnittstelle&lt;br /&gt;
*** RFM12 http://www.hoperf.com/rf_fsk.asp&lt;br /&gt;
*** Zigbee http://www.meshnetics.com/zigbee-modules&lt;br /&gt;
** ...&lt;br /&gt;
* Bootloader, damit Leute mitarbeiten können, die keine JTAG haben. Mit einem JTAG könnte man den Bootloader Flashen, ohne den Thermostaten öffnen zu müssen. Von da an kann man über den Programmierstecker mit einem umgebauten Handykabel den Thermostaten neu flashen.&lt;br /&gt;
&lt;br /&gt;
= Subversion Repository =&lt;br /&gt;
Ein SVN Repository liegt auf dem freien SVN Server: https://opensvn.csie.org&lt;br /&gt;
== Zugangsdaten ==&lt;br /&gt;
Repository Location: https://OpenSVN.csie.org/hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
Browse Repository: https://OpenSVN.csie.org/viewcvs.cgi/?root=hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
TRAC: https://opensvn.csie.org/traccgi/hr20&lt;br /&gt;
== Policy ==&lt;br /&gt;
Anonymous check out ist erlaubt. &amp;lt;br&amp;gt;&lt;br /&gt;
Wer was committen will muss freigeschaltet werden. &amp;lt;br&amp;gt;&lt;br /&gt;
Dazu brauche ich ein &#039;&#039;Usernamen, Passwort&#039;&#039; und eine &#039;&#039;Mailadresse&#039;&#039;, dann kann ich das einrichten. &amp;lt;br&amp;gt;&lt;br /&gt;
Tragt Euch dazu einfach selber in die Tabelle ein, ich erledige dann den Rest.&amp;lt;br&amp;gt;&lt;br /&gt;
Das mache ich dann von Hand und da ich nicht alle 10 Minuten Mails bearbeite kann das auch schon mal einen oder zwei Tage dauern. &amp;lt;br&amp;gt;&lt;br /&gt;
Wenn sich ein Maintainer findet, gebe ich die Zugangsdaten gerne weiter.&lt;br /&gt;
== Entwickler ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! width=&amp;quot;150&amp;quot; | Entwickler&lt;br /&gt;
! width=&amp;quot;150&amp;quot; | svn Status&lt;br /&gt;
|-&lt;br /&gt;
| darioc&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|-&lt;br /&gt;
| louk&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|}&lt;br /&gt;
== Verzeichnisstrucktur ==&lt;br /&gt;
Eine Verzeichnisstrucktur ist auch schon angelegt und die ersten Daten auch drin. Hier die Verzeichnisse:&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
| &#039;&#039;&#039;/doc&#039;&#039;&#039;&lt;br /&gt;
| Für alles an Dokumenten, die selbst erstellt wurden. &amp;lt;br&amp;gt;&lt;br /&gt;
Specs, die man im Internet bekommen kann gehören hier nicht rein, &amp;lt;br&amp;gt;&lt;br /&gt;
die machen das alles nur unnötig gross und das auschecken dauert länger.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/playground&#039;&#039;&#039; &lt;br /&gt;
| Wie der Name schon sagt, zum rumspielen und testen. &amp;lt;br&amp;gt;&lt;br /&gt;
Hier kommt jegliche art von Codeschnipseln hin, die zu Testen da sind &amp;lt;br&amp;gt;&lt;br /&gt;
und (derzeit) noch icht Teil des Programmes sind.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/source&#039;&#039;&#039; &lt;br /&gt;
| Hier kommt die Applikation rein mit allen Modulen und makefiles.&amp;lt;br&amp;gt;&lt;br /&gt;
Bitte haltet das Repository sauber und checkt nur Dateien ein, &amp;lt;br&amp;gt;&lt;br /&gt;
die auch Sinn  machen, &amp;quot;thumbs.db&amp;quot; oder andere Temp-Dateien gehören hier nicht rein.&lt;br /&gt;
|}&lt;br /&gt;
== SVN Client und Anleitung ==&lt;br /&gt;
Windows-User nutzen am besten den Tortoise-SVN-Client, den man kostenfrei [http://tortoisesvn.tigris.org hier runterladen] kann. &amp;lt;br&amp;gt;&lt;br /&gt;
Dort gibt es auch eine Anleitung zum Arbeiten mit SVN. &lt;br /&gt;
&lt;br /&gt;
= Analyse der Hardware =&lt;br /&gt;
Die Analyse hat der Dario schon gemacht, zu finden ist die jeweils aktuelle Version &lt;br /&gt;
[http://www.carluccio.de/img/hr20/analyse.pdf als PDF hier] oder [https://opensvn.csie.org/viewcvs.cgi/doc/analyse.pdf hier im SVN].&lt;br /&gt;
&lt;br /&gt;
= Benötigte Module =&lt;br /&gt;
&lt;br /&gt;
Um das Ganze nun etwas zu koordinieren hier eine Liste der benötigten Module und deren Funktionen. &amp;lt;br&amp;gt;&lt;br /&gt;
Diese dient dazu später die Aufgaben zu verteilen:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Module&lt;br /&gt;
! Function&lt;br /&gt;
! Developer&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| LCD&lt;br /&gt;
| Display Driver:&amp;lt;BR&amp;gt;&lt;br /&gt;
* Init Display - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Set Segments - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Print HEX, DEC, TEMP, DayofWeek - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Blink - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* e.t.c&lt;br /&gt;
| dario&lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| RTC&lt;br /&gt;
| Time and Date Handler&lt;br /&gt;
* init timer - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* use IRQ with 32kHz crystal - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* handle time and date - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** daylight saving - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** consult leapyear  - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* calc day of week out of date - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Only one Byte for Year -&amp;gt; (2000 to 2255)&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* calibrate internal RC - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE, but not tested &#039;&#039;&#039;&amp;lt;/span&amp;gt; &lt;br /&gt;
* corretion for external Crystal - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
| dario&lt;br /&gt;
| &#039;&#039;&#039; (90%)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UART &lt;br /&gt;
| UART-Driver&lt;br /&gt;
* menue (Debug und Steuerung)&lt;br /&gt;
** show and set desired temperature &lt;br /&gt;
** show and set Time and Date&lt;br /&gt;
** show actual temperature&lt;br /&gt;
** show (and set) actual valveposition &lt;br /&gt;
** show and set timetable and temperatures&lt;br /&gt;
* optional &lt;br /&gt;
** adressierung of HR20 (for BUS, RF)&lt;br /&gt;
** authentication end encryption&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| MENU&lt;br /&gt;
| Display Menu&lt;br /&gt;
* get keystate (with debounce)&lt;br /&gt;
** multi keypress (nedded for hidden menue?)&lt;br /&gt;
** longer keypress / double click (nedded?)&lt;br /&gt;
* get position of wheel (incremental counter)&lt;br /&gt;
* controll display&lt;br /&gt;
* functionality:&lt;br /&gt;
* show and set desired temperature&lt;br /&gt;
* show and set time and date &lt;br /&gt;
* show actual temperature&lt;br /&gt;
* show actual valveposition &lt;br /&gt;
* show and set timetable and temperatures&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| MOTOR&lt;br /&gt;
| Motor-Driver &lt;br /&gt;
* set desired valveposition &lt;br /&gt;
** quick&lt;br /&gt;
** asympthotic&lt;br /&gt;
** quiet&lt;br /&gt;
* callibrate for Valve&lt;br /&gt;
* Genereate ERROR if motor not turning (low energie)&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| TEMP&lt;br /&gt;
| Temperaturesensor-Driver &lt;br /&gt;
* init Sensor &lt;br /&gt;
* IQR driven (500ms)&lt;br /&gt;
* start A/D conversion (IQR driven)&lt;br /&gt;
* get A/D Value and calc temperature&lt;br /&gt;
* calibration for sensor (needed?)&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| PID&lt;br /&gt;
| PID Algorithm&lt;br /&gt;
* calculate desired valveposition out of&lt;br /&gt;
** last valveposition(s) &lt;br /&gt;
** last temperature(s)&lt;br /&gt;
** actual temperature&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| BOOT&lt;br /&gt;
| Bootloader&lt;br /&gt;
we need a bootloader so that the developers can flash the software &lt;br /&gt;
without a JTAG cable and without disassembling the HR20.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| LOG&lt;br /&gt;
| Datalogger&lt;br /&gt;
* Operating Hours&lt;br /&gt;
** motor in action&lt;br /&gt;
** ODOmeter&lt;br /&gt;
** since Battery Exchange&lt;br /&gt;
* Errors&lt;br /&gt;
* Logfiles (only with additional hardware)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| UID&lt;br /&gt;
| Unique ID for identification&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= API Beschreibung =&lt;br /&gt;
== LCD ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Funtion&lt;br /&gt;
! Propose&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Init(void);            &lt;br /&gt;
|Init the LCD Controller&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_All_Segments(uint8_t);&lt;br /&gt;
|Set all segments to LCD_MODE&lt;br /&gt;
| done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Clear_All(void);                       &lt;br /&gt;
|Clear all segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Clear_Hour_Bar(void);&lt;br /&gt;
|Clear 24 bar segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Clear_Symbols(void);&lt;br /&gt;
|Clear AUTO MANU PROG SUN MOON SNOW&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Clear_Numbers(void);&lt;br /&gt;
|Clear 7 Segments ans Collumns&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Print_Dec(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print DEC-val in two 7 Segments 0-99&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Print_Hex(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print HEX-val in two 7 Segments 0-ff&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Print_No(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print one ditig in one 7 Segment&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Print_Temp(uint8_t, uint8_t);&lt;br /&gt;
|Print desired temperature (val+4,9)°C&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Set_Seg(uint8_t, uint8_t);          &lt;br /&gt;
|Set one Segment to LCD_MODE (0-69)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Set_Hour_Bar_Seg(uint8_t, uint8_t);    &lt;br /&gt;
|Set one Hour Bar Segment to LCD_MODE (0-23)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Set_Hour_Bar_Val(uint8_t, uint8_t);&lt;br /&gt;
|Set all Hour Bar Segments from 0 to val to LCD_MODE (0-23)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Update(void);                        &lt;br /&gt;
|Request immidiate LCD-Update (normal only when bitplane changes)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t LCD_Contrast_Adjust (int8_t);           &lt;br /&gt;
|Adjust the contrast&lt;br /&gt;
|&#039;&#039;&#039;not tested yet&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
== RTC ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Funtion&lt;br /&gt;
! Propose&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_Init(void);            &lt;br /&gt;
|Sart Timer, activate 500ms IRQ&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_Get_Hour(void);                    &lt;br /&gt;
|Get Hour&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_Get_Minute(void);                   &lt;br /&gt;
|Get Minute&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_Get_Second(void);                   &lt;br /&gt;
|Get Second&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_Get_Day(void);                      &lt;br /&gt;
|Get Day&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_Get_Month(void);                    &lt;br /&gt;
|Get Month&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_Get_Year(void);                     &lt;br /&gt;
|Get Year (00-255)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_Get_DayOfWeek(void);                &lt;br /&gt;
|Get Day of Week (0:Monday)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint16_t RTC_Get_Year_2000(void);               &lt;br /&gt;
|Get Year (2000-2255)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_Set_Hour(uint8_t);                     &lt;br /&gt;
|Set Hour&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_Set_Minute(uint8_t);                   &lt;br /&gt;
|Set Minute&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_Set_Second(uint8_t);                   &lt;br /&gt;
|Set Second&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_Set_Day(uint8_t);                      &lt;br /&gt;
|Set Day&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_Set_Month(uint8_t);                    &lt;br /&gt;
|Set Month&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_Set_Year(uint8_t);                     &lt;br /&gt;
|Set Year&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_Add_One_Second(void);                  &lt;br /&gt;
|Add one second to actual time&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void RTC_Add_One_Day(void);                     &lt;br /&gt;
|Add one day to actual date&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_No_Leapyear(uint8_t);               &lt;br /&gt;
|is year a leapyear?&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_Days_Of_Month(uint8_t, uint8_t);    &lt;br /&gt;
|how many days in (month, year)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_Day_Of_Week(uint8_t, uint8_t, uint8_t);  &lt;br /&gt;
|calc day of week&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t RTC_Is_Lastsunday(void);                &lt;br /&gt;
|Check if last Sunday in march / october&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void calibrate_rco(void);&lt;br /&gt;
|calibrate internal rco&lt;br /&gt;
|&#039;&#039;&#039;not tested yet&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Entwicklungsumgebung =&lt;br /&gt;
* Editor, Debugger, Compiler&lt;br /&gt;
** WinAVR version (20071221), sprich GCC 4.2.2 sowie avr-libc 1.6.0&lt;br /&gt;
** AVR Studio 4 &lt;br /&gt;
* JTAG ICE&lt;br /&gt;
** Atmel AVR JTAGICE MK2 &lt;br /&gt;
** AVR Dragon (z.B. http://elmicro.com/de/atavrdragon.html)&lt;br /&gt;
** Olimex-Seriell http://www.olimex.com/dev/avr-jtag.html  &lt;br /&gt;
** Olimex-USB http://www.olimex.com/dev/avr-usb-jtag.html &lt;br /&gt;
&lt;br /&gt;
= Sonstiges =&lt;br /&gt;
== Altes Protokoll ==&lt;br /&gt;
[[HR20_Protocol_V2 | Hier ]] hat mal einer ein Protokoll eingegeben.&lt;br /&gt;
Das scheint aber nicht zu der Version 2.04 zu passen. &lt;br /&gt;
Ich habe es nicht gelöscht, falls es jemanden interessiert.&lt;br /&gt;
== SVN Anleitung ==&lt;br /&gt;
Eine Anleitung was ein SVN ist und wie man es brauchen wir hier nicht.&lt;br /&gt;
Sonst müsste hier auch ein C-Kurs, Windows-Kurs, und Elektronik-Kurs hin.&lt;br /&gt;
&lt;br /&gt;
[[Category:Projekte|!]]&lt;/div&gt;</summary>
		<author><name>Dario</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=25984</id>
		<title>Heizungssteuerung mit Honeywell HR20</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=25984"/>
		<updated>2008-02-02T12:55:06Z</updated>

		<summary type="html">&lt;p&gt;Dario: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von DarioC&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Wie alles begann =&lt;br /&gt;
&lt;br /&gt;
Nachdem von Uwe Felgentreu vor nunmehr vor über drei Jahren (genau am 17.11.2004 um 11:26) hier in diesem Forum den Thread mit dem Titel &#039;&#039;Honeywell Rondostat HR20E per AVR steuern und konfigurieren&#039;&#039; gestartet hat ist es nun langsam soweit, dass das Ganze auch ein Projekt wird. &lt;br /&gt;
&lt;br /&gt;
Den Thread dazu kann der interessierte Leser [http://www.mikrocontroller.net/topic/17603 hier nachlesen] &lt;br /&gt;
&lt;br /&gt;
= Projektziel =&lt;br /&gt;
&lt;br /&gt;
Wir konzentrieren uns in erster Linie auf den Honeywell Rondostat HR20E mit ausgelieferten Softwareversion 2.04. Dass es ähnliche andere Geräte gibt behalten wir bei der Entwicklung im Hinterkopf.&lt;br /&gt;
&lt;br /&gt;
Basierend auf dieser Hardware wollen wir eine neue Software entwickeln. &lt;br /&gt;
Dabe können wir ausser der Hardware nichts weiter verwenden, da die Originalsoftware geschützt ist und nicht ausgelesen werden kann.&lt;br /&gt;
&lt;br /&gt;
== Phase 1 ==&lt;br /&gt;
Die Software soll die Funktionen bieten, die die Originalsoftware auch bietet, später können dies dann um zusätzliche Funktionen erweitert werden. Die wichtigsten Funktionen sind:&lt;br /&gt;
&lt;br /&gt;
* Temperaturregelung&lt;br /&gt;
* Echtzeituhr&lt;br /&gt;
* Ausnutzen der Sleep Funktion&lt;br /&gt;
* Anzeige Soll-Temperatur und der Uhrzeit&lt;br /&gt;
* Einstellung der Soll-Temperatur&lt;br /&gt;
* Uhrzeitgesteuerte Einstellung der Soll-Temperatur &lt;br /&gt;
* Fenster-Offen-Erkennung&lt;br /&gt;
* Ventilfreispülungsfunktion&lt;br /&gt;
&lt;br /&gt;
== Phase 2 ==&lt;br /&gt;
&lt;br /&gt;
Hier liegt der Sinn des ganzen Projektes: Durch diese zusätzlichen Funktionen wollen wir den Nutzwert des Thermostaten erheblich steigern:&lt;br /&gt;
&lt;br /&gt;
* Programmierung der Schaltzeiten und Temperaturen über externe Schnittstelle&lt;br /&gt;
* Abfrage der Messwerte und Parameter über externe Schnittstelle&lt;br /&gt;
* Vernetzung der Thermostaten untereinander&lt;br /&gt;
* Zusätzliche externe Schnittstellen (neben UART auch CAN und Funk)&lt;br /&gt;
* Erweiterung der Anzeige um&lt;br /&gt;
** Ist-Temperatur &lt;br /&gt;
** Ventilstellung&lt;br /&gt;
** Funkschnittstelle&lt;br /&gt;
*** RFM12 http://www.hoperf.com/rf_fsk.asp&lt;br /&gt;
*** Zigbee http://www.meshnetics.com/zigbee-modules&lt;br /&gt;
** ...&lt;br /&gt;
* Bootloader, damit Leute mitarbeiten können, die keine JTAG haben. Mit einem JTAG könnte man den Bootloader Flashen, ohne den Thermostaten öffnen zu müssen. Von da an kann man über den Programmierstecker mit einem umgebauten Handykabel den Thermostaten neu flashen.&lt;br /&gt;
&lt;br /&gt;
= Subversion Repository =&lt;br /&gt;
Ein SVN Repository liegt auf dem freien SVN Server: https://opensvn.csie.org&lt;br /&gt;
== Zugangsdaten ==&lt;br /&gt;
Repository Location: https://OpenSVN.csie.org/hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
Browse Repository: https://OpenSVN.csie.org/viewcvs.cgi/?root=hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
TRAC: https://opensvn.csie.org/traccgi/hr20&lt;br /&gt;
== Policy ==&lt;br /&gt;
Anonymous check out ist erlaubt. &amp;lt;br&amp;gt;&lt;br /&gt;
Wer was committen will muss freigeschaltet werden. &amp;lt;br&amp;gt;&lt;br /&gt;
Dazu brauche ich ein &#039;&#039;Usernamen, Passwort&#039;&#039; und eine &#039;&#039;Mailadresse&#039;&#039;, dann kann ich das einrichten. &amp;lt;br&amp;gt;&lt;br /&gt;
Tragt Euch dazu einfach selber in die Tabelle ein, ich erledige dann den Rest.&amp;lt;br&amp;gt;&lt;br /&gt;
Das mache ich dann von Hand und da ich nicht alle 10 Minuten Mails bearbeite kann das auch schon mal einen oder zwei Tage dauern. &amp;lt;br&amp;gt;&lt;br /&gt;
Wenn sich ein Maintainer findet, gebe ich die Zugangsdaten gerne weiter.&lt;br /&gt;
== Entwickler ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! width=&amp;quot;150&amp;quot; | Entwickler&lt;br /&gt;
! width=&amp;quot;150&amp;quot; | svn Status&lt;br /&gt;
|-&lt;br /&gt;
| darioc&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|-&lt;br /&gt;
| louk&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|}&lt;br /&gt;
== Verzeichnisstrucktur ==&lt;br /&gt;
Eine Verzeichnisstrucktur ist auch schon angelegt und die ersten Daten auch drin. Hier die Verzeichnisse:&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
| &#039;&#039;&#039;/doc&#039;&#039;&#039;&lt;br /&gt;
| Für alles an Dokumenten, die selbst erstellt wurden. &amp;lt;br&amp;gt;&lt;br /&gt;
Specs, die man im Internet bekommen kann gehören hier nicht rein, &amp;lt;br&amp;gt;&lt;br /&gt;
die machen das alles nur unnötig gross und das auschecken dauert länger.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/playground&#039;&#039;&#039; &lt;br /&gt;
| Wie der Name schon sagt, zum rumspielen und testen. &amp;lt;br&amp;gt;&lt;br /&gt;
Hier kommt jegliche art von Codeschnipseln hin, die zu Testen da sind &amp;lt;br&amp;gt;&lt;br /&gt;
und (derzeit) noch icht Teil des Programmes sind.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/source&#039;&#039;&#039; &lt;br /&gt;
| Hier kommt die Applikation rein mit allen Modulen und makefiles.&amp;lt;br&amp;gt;&lt;br /&gt;
Bitte haltet das Repository sauber und checkt nur Dateien ein, &amp;lt;br&amp;gt;&lt;br /&gt;
die auch Sinn  machen, &amp;quot;thumbs.db&amp;quot; oder andere Temp-Dateien gehören hier nicht rein.&lt;br /&gt;
|}&lt;br /&gt;
== SVN Client und Anleitung ==&lt;br /&gt;
Windows-User nutzen am besten den Tortoise-SVN-Client, den man kostenfrei [http://tortoisesvn.tigris.org hier runterladen] kann. &amp;lt;br&amp;gt;&lt;br /&gt;
Dort gibt es auch eine Anleitung zum Arbeiten mit SVN. &lt;br /&gt;
&lt;br /&gt;
= Analyse der Hardware =&lt;br /&gt;
Die Analyse hat der Dario schon gemacht, zu finden ist die jeweils aktuelle Version &lt;br /&gt;
[http://www.carluccio.de/img/hr20/analyse.pdf als PDF hier] oder [https://opensvn.csie.org/viewcvs.cgi/doc/analyse.pdf hier im SVN].&lt;br /&gt;
&lt;br /&gt;
= Benötigte Module =&lt;br /&gt;
&lt;br /&gt;
Um das Ganze nun etwas zu koordinieren hier eine Liste der benötigten Module und deren Funktionen. &amp;lt;br&amp;gt;&lt;br /&gt;
Diese dient dazu später die Aufgaben zu verteilen:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Module&lt;br /&gt;
! Function&lt;br /&gt;
! Developer&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| LCD&lt;br /&gt;
| Display Driver:&amp;lt;BR&amp;gt;&lt;br /&gt;
* Init Display - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Set Segments - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Print HEX, DEC, TEMP, DayofWeek - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Blink - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* e.t.c&lt;br /&gt;
| dario&lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| RTC&lt;br /&gt;
| Time and Date Handler&lt;br /&gt;
* init timer - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* use IRQ with 32kHz crystal - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* handle time and date - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** daylight saving - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
** consult leapyear  - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* calc day of week out of date - &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
* Only one Byte for Year -&amp;gt; (2000 to 2255)&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;&lt;br /&gt;
* calibrate internal RC - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; DONE, but not tested &#039;&#039;&#039;&amp;lt;/span&amp;gt; &lt;br /&gt;
* corretion for external Crystal - &amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;&#039;&#039;&#039; OPEN &#039;&#039;&#039;&amp;lt;/span&amp;gt;&lt;br /&gt;
| dario&lt;br /&gt;
| &#039;&#039;&#039; (90%)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UART &lt;br /&gt;
| UART-Driver&lt;br /&gt;
* menue (Debug und Steuerung)&lt;br /&gt;
** show and set desired temperature &lt;br /&gt;
** show and set Time and Date&lt;br /&gt;
** show actual temperature&lt;br /&gt;
** show (and set) actual valveposition &lt;br /&gt;
** show and set timetable and temperatures&lt;br /&gt;
* optional &lt;br /&gt;
** adressierung of HR20 (for BUS, RF)&lt;br /&gt;
** authentication end encryption&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| MENU&lt;br /&gt;
| Display Menu&lt;br /&gt;
* get keystate (with debounce)&lt;br /&gt;
** multi keypress (nedded for hidden menue?)&lt;br /&gt;
** longer keypress / double click (nedded?)&lt;br /&gt;
* get position of wheel (incremental counter)&lt;br /&gt;
* controll display&lt;br /&gt;
* functionality:&lt;br /&gt;
* show and set desired temperature&lt;br /&gt;
* show and set time and date &lt;br /&gt;
* show actual temperature&lt;br /&gt;
* show actual valveposition &lt;br /&gt;
* show and set timetable and temperatures&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| MOTOR&lt;br /&gt;
| Motor-Driver &lt;br /&gt;
* set desired valveposition &lt;br /&gt;
** quick&lt;br /&gt;
** asympthotic&lt;br /&gt;
** quiet&lt;br /&gt;
* callibrate for Valve&lt;br /&gt;
* Genereate ERROR if motor not turning (low energie)&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| TEMP&lt;br /&gt;
| Temperaturesensor-Driver &lt;br /&gt;
* init Sensor &lt;br /&gt;
* IQR driven (500ms)&lt;br /&gt;
* start A/D conversion (IQR driven)&lt;br /&gt;
* get A/D Value and calc temperature&lt;br /&gt;
* calibration for sensor (needed?)&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| PID&lt;br /&gt;
| PID Algorithm&lt;br /&gt;
* calculate desired valveposition out of&lt;br /&gt;
** last valveposition(s) &lt;br /&gt;
** last temperature(s)&lt;br /&gt;
** actual temperature&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| BOOT&lt;br /&gt;
| Bootloader&lt;br /&gt;
we need a bootloader so that the developers can flash the software &lt;br /&gt;
without a JTAG cable and without disassembling the HR20.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| LOG&lt;br /&gt;
| Datalogger&lt;br /&gt;
* Operating Hours&lt;br /&gt;
** motor in action&lt;br /&gt;
** ODOmeter&lt;br /&gt;
** since Battery Exchange&lt;br /&gt;
* Errors&lt;br /&gt;
* Logfiles (only with additional hardware)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| UID&lt;br /&gt;
| Unique ID for identification&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= API Beschreibung =&lt;br /&gt;
== LCD ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Funtion&lt;br /&gt;
! Propose&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Init(void);            &lt;br /&gt;
|Init the LCD Controller&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_All_Segments(uint8_t);&lt;br /&gt;
|Set all segments to LCD_MODE&lt;br /&gt;
| done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Clear_All(void);                       &lt;br /&gt;
|Clear all segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Clear_Hour_Bar(void);&lt;br /&gt;
|Clear 24 bar segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Clear_Symbols(void);&lt;br /&gt;
|Clear AUTO MANU PROG SUN MOON SNOW&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Clear_Numbers(void);&lt;br /&gt;
|Clear 7 Segments ans Collumns&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Print_Dec(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print DEC-val in two 7 Segments 0-99&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Print_Hex(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print HEX-val in two 7 Segments 0-ff&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Print_No(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print one ditig in one 7 Segment&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Print_Temp(uint8_t, uint8_t);&lt;br /&gt;
|Print desired temperature (val+4,9)°C&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Set_Seg(uint8_t, uint8_t);          &lt;br /&gt;
|Set one Segment to LCD_MODE (0-69)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Set_Hour_Bar_Seg(uint8_t, uint8_t);    &lt;br /&gt;
|Set one Hour Bar Segment to LCD_MODE (0-23)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Set_Hour_Bar_Val(uint8_t, uint8_t);&lt;br /&gt;
|Set all Hour Bar Segments from 0 to val to LCD_MODE (0-23)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Update(void);                        &lt;br /&gt;
|Request immidiate LCD-Update (normal only when bitplane changes)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t LCD_Contrast_Adjust (int8_t);           &lt;br /&gt;
|Adjust the contrast&lt;br /&gt;
|&#039;&#039;&#039;not tested yet&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Entwicklungsumgebung =&lt;br /&gt;
* Editor, Debugger, Compiler&lt;br /&gt;
** WinAVR version (20071221), sprich GCC 4.2.2 sowie avr-libc 1.6.0&lt;br /&gt;
** AVR Studio 4 &lt;br /&gt;
* JTAG ICE&lt;br /&gt;
** Atmel AVR JTAGICE MK2 &lt;br /&gt;
** AVR Dragon (z.B. http://elmicro.com/de/atavrdragon.html)&lt;br /&gt;
** Olimex-Seriell http://www.olimex.com/dev/avr-jtag.html  &lt;br /&gt;
** Olimex-USB http://www.olimex.com/dev/avr-usb-jtag.html &lt;br /&gt;
&lt;br /&gt;
= Sonstiges =&lt;br /&gt;
== Altes Protokoll ==&lt;br /&gt;
[[HR20_Protocol_V2 | Hier ]] hat mal einer ein Protokoll eingegeben.&lt;br /&gt;
Das scheint aber nicht zu der Version 2.04 zu passen. &lt;br /&gt;
Ich habe es nicht gelöscht, falls es jemanden interessiert.&lt;br /&gt;
== SVN Anleitung ==&lt;br /&gt;
Eine Anleitung was ein SVN ist und wie man es brauchen wir hier nicht.&lt;br /&gt;
Sonst müsste hier auch ein C-Kurs, Windows-Kurs, und Elektronik-Kurs hin.&lt;br /&gt;
&lt;br /&gt;
[[Category:Projekte|!]]&lt;/div&gt;</summary>
		<author><name>Dario</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=25977</id>
		<title>Heizungssteuerung mit Honeywell HR20</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=25977"/>
		<updated>2008-02-02T00:53:30Z</updated>

		<summary type="html">&lt;p&gt;Dario: /* Benötigte Module */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von DarioC&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Wie alles begann =&lt;br /&gt;
&lt;br /&gt;
Nachdem von Uwe Felgentreu vor nunmehr vor über drei Jahren (genau am 17.11.2004 um 11:26) hier in diesem Forum den Thread mit dem Titel &#039;&#039;Honeywell Rondostat HR20E per AVR steuern und konfigurieren&#039;&#039; gestartet hat ist es nun langsam soweit, dass das Ganze auch ein Projekt wird. &lt;br /&gt;
&lt;br /&gt;
Den Thread dazu kann der interessierte Leser [http://www.mikrocontroller.net/topic/17603 hier nachlesen] &lt;br /&gt;
&lt;br /&gt;
= Projektziel =&lt;br /&gt;
&lt;br /&gt;
Wir konzentrieren uns in erster Linie auf den Honeywell Rondostat HR20E mit ausgelieferten Softwareversion 2.04. Dass es ähnliche andere Geräte gibt behalten wir bei der Entwicklung im Hinterkopf.&lt;br /&gt;
&lt;br /&gt;
Basierend auf dieser Hardware wollen wir eine neue Software entwickeln. &lt;br /&gt;
Dabe können wir ausser der Hardware nichts weiter verwenden, da die Originalsoftware geschützt ist und nicht ausgelesen werden kann.&lt;br /&gt;
&lt;br /&gt;
== Phase 1 ==&lt;br /&gt;
Die Software soll die Funktionen bieten, die die Originalsoftware auch bietet, später können dies dann um zusätzliche Funktionen erweitert werden. Die wichtigsten Funktionen sind:&lt;br /&gt;
&lt;br /&gt;
* Temperaturregelung&lt;br /&gt;
* Echtzeituhr&lt;br /&gt;
* Ausnutzen der Sleep Funktion&lt;br /&gt;
* Anzeige Soll-Temperatur und der Uhrzeit&lt;br /&gt;
* Einstellung der Soll-Temperatur&lt;br /&gt;
* Uhrzeitgesteuerte Einstellung der Soll-Temperatur &lt;br /&gt;
* Fenster-Offen-Erkennung&lt;br /&gt;
* Ventilfreispülungsfunktion&lt;br /&gt;
&lt;br /&gt;
== Phase 2 ==&lt;br /&gt;
&lt;br /&gt;
Hier liegt der Sinn des ganzen Projektes: Durch diese zusätzlichen Funktionen wollen wir den Nutzwert des Thermostaten erheblich steigern:&lt;br /&gt;
&lt;br /&gt;
* Programmierung der Schaltzeiten und Temperaturen über externe Schnittstelle&lt;br /&gt;
* Abfrage der Messwerte und Parameter über externe Schnittstelle&lt;br /&gt;
* Vernetzung der Thermostaten untereinander&lt;br /&gt;
* Zusätzliche externe Schnittstellen (neben UART auch CAN und Funk)&lt;br /&gt;
* Erweiterung der Anzeige um&lt;br /&gt;
** Ist-Temperatur &lt;br /&gt;
** Ventilstellung&lt;br /&gt;
** Funkschnittstelle&lt;br /&gt;
*** RFM12 http://www.hoperf.com/rf_fsk.asp&lt;br /&gt;
*** Zigbee http://www.meshnetics.com/zigbee-modules&lt;br /&gt;
** ...&lt;br /&gt;
* Bootloader, damit Leute mitarbeiten können, die keine JTAG haben. Mit einem JTAG könnte man den Bootloader Flashen, ohne den Thermostaten öffnen zu müssen. Von da an kann man über den Programmierstecker mit einem umgebauten Handykabel den Thermostaten neu flashen.&lt;br /&gt;
&lt;br /&gt;
= Subversion Repository =&lt;br /&gt;
Ein SVN Repository liegt auf dem freien SVN Server: https://opensvn.csie.org&lt;br /&gt;
== Zugangsdaten ==&lt;br /&gt;
Repository Location: https://OpenSVN.csie.org/hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
Browse Repository: https://OpenSVN.csie.org/viewcvs.cgi/?root=hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
TRAC: https://opensvn.csie.org/traccgi/hr20&lt;br /&gt;
== Policy ==&lt;br /&gt;
Anonymous check out ist erlaubt. &amp;lt;br&amp;gt;&lt;br /&gt;
Wer was committen will muss freigeschaltet werden. &amp;lt;br&amp;gt;&lt;br /&gt;
Dazu brauche ich ein &#039;&#039;Usernamen, Passwort&#039;&#039; und eine &#039;&#039;Mailadresse&#039;&#039;, dann kann ich das einrichten. &amp;lt;br&amp;gt;&lt;br /&gt;
Tragt Euch dazu einfach selber in die Tabelle ein, ich erledige dann den Rest.&amp;lt;br&amp;gt;&lt;br /&gt;
Das mache ich dann von Hand und da ich nicht alle 10 Minuten Mails bearbeite kann das auch schon mal einen oder zwei Tage dauern. &amp;lt;br&amp;gt;&lt;br /&gt;
Wenn sich ein Maintainer findet, gebe ich die Zugangsdaten gerne weiter.&lt;br /&gt;
== Entwickler ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! width=&amp;quot;150&amp;quot; | Entwickler&lt;br /&gt;
! width=&amp;quot;150&amp;quot; | svn Status&lt;br /&gt;
|-&lt;br /&gt;
| darioc&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|-&lt;br /&gt;
| louk&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|}&lt;br /&gt;
== Verzeichnisstrucktur ==&lt;br /&gt;
Eine Verzeichnisstrucktur ist auch schon angelegt und die ersten Daten auch drin. Hier die Verzeichnisse:&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
| &#039;&#039;&#039;/doc&#039;&#039;&#039;&lt;br /&gt;
| Für alles an Dokumenten, die selbst erstellt wurden. &amp;lt;br&amp;gt;&lt;br /&gt;
Specs, die man im Internet bekommen kann gehören hier nicht rein, &amp;lt;br&amp;gt;&lt;br /&gt;
die machen das alles nur unnötig gross und das auschecken dauert länger.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/playground&#039;&#039;&#039; &lt;br /&gt;
| Wie der Name schon sagt, zum rumspielen und testen. &amp;lt;br&amp;gt;&lt;br /&gt;
Hier kommt jegliche art von Codeschnipseln hin, die zu Testen da sind &amp;lt;br&amp;gt;&lt;br /&gt;
und (derzeit) noch icht Teil des Programmes sind.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/source&#039;&#039;&#039; &lt;br /&gt;
| Hier kommt die Applikation rein mit allen Modulen und makefiles.&amp;lt;br&amp;gt;&lt;br /&gt;
Bitte haltet das Repository sauber und checkt nur Dateien ein, &amp;lt;br&amp;gt;&lt;br /&gt;
die auch Sinn  machen, &amp;quot;thumbs.db&amp;quot; oder andere Temp-Dateien gehören hier nicht rein.&lt;br /&gt;
|}&lt;br /&gt;
== SVN Client und Anleitung ==&lt;br /&gt;
Windows-User nutzen am besten den Tortoise-SVN-Client, den man kostenfrei [http://tortoisesvn.tigris.org hier runterladen] kann. &amp;lt;br&amp;gt;&lt;br /&gt;
Dort gibt es auch eine Anleitung zum Arbeiten mit SVN. &lt;br /&gt;
&lt;br /&gt;
= Analyse der Hardware =&lt;br /&gt;
Die Analyse hat der Dario schon gemacht, zu finden ist die jeweils aktuelle Version &lt;br /&gt;
[http://www.carluccio.de/img/hr20/analyse.pdf als PDF hier] oder [https://opensvn.csie.org/viewcvs.cgi/doc/analyse.pdf hier im SVN].&lt;br /&gt;
&lt;br /&gt;
= Benötigte Module =&lt;br /&gt;
&lt;br /&gt;
Um das Ganze nun etwas zu koordinieren hier eine Liste der benötigten Module und deren Funktionen. &amp;lt;br&amp;gt;&lt;br /&gt;
Diese dient dazu später die Aufgaben zu verteilen:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Module&lt;br /&gt;
! Function&lt;br /&gt;
! Developer&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| LCD&lt;br /&gt;
| Display Driver:&amp;lt;BR&amp;gt;&lt;br /&gt;
* Init Display - &#039;&#039;&#039;DONE&#039;&#039;&#039;&lt;br /&gt;
* Set Segments - &#039;&#039;&#039;DONE&#039;&#039;&#039;&lt;br /&gt;
* Print HEX, DEC, TEMP - &#039;&#039;&#039;DONE&#039;&#039;&#039;&lt;br /&gt;
* Blink - &#039;&#039;&#039;DONE&#039;&#039;&#039;&lt;br /&gt;
* e.t.c&lt;br /&gt;
| dario&lt;br /&gt;
| &#039;&#039;&#039;DONE&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| RTC&lt;br /&gt;
| Time and Date Handler&lt;br /&gt;
* init timer - &#039;&#039;&#039;DONE&#039;&#039;&#039;&lt;br /&gt;
* use IRQ with 32kHz crystal - &#039;&#039;&#039;DONE&#039;&#039;&#039;&lt;br /&gt;
* handle time and date - &#039;&#039;&#039;DONE&#039;&#039;&#039;&lt;br /&gt;
** daylight saving &lt;br /&gt;
** consult leapyear  - &#039;&#039;&#039;DONE&#039;&#039;&#039;&lt;br /&gt;
| dario&lt;br /&gt;
| &#039;&#039;&#039;(90%)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UART &lt;br /&gt;
| UART-Driver&lt;br /&gt;
* menue (Debug und Steuerung)&lt;br /&gt;
** show and set desired temperature &lt;br /&gt;
** show and set Time and Date&lt;br /&gt;
** show actual temperature&lt;br /&gt;
** show (and set) actual valveposition &lt;br /&gt;
** show and set timetable and temperatures&lt;br /&gt;
* optional &lt;br /&gt;
** adressierung of HR20 (for BUS, RF)&lt;br /&gt;
** authentication end encryption&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| MENU&lt;br /&gt;
| Display Menu&lt;br /&gt;
* get keystate (with debounce)&lt;br /&gt;
** multi keypress (nedded for hidden menue?)&lt;br /&gt;
** longer keypress / double click (nedded?)&lt;br /&gt;
* get position of wheel (incremental counter)&lt;br /&gt;
* controll display&lt;br /&gt;
* functionality:&lt;br /&gt;
* show and set desired temperature&lt;br /&gt;
* show and set time and date &lt;br /&gt;
* show actual temperature&lt;br /&gt;
* show actual valveposition &lt;br /&gt;
* show and set timetable and temperatures&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| MOTOR&lt;br /&gt;
| Motor-Driver &lt;br /&gt;
* set desired valveposition &lt;br /&gt;
** quick&lt;br /&gt;
** asympthotic&lt;br /&gt;
** quiet&lt;br /&gt;
* callibrate for Valve&lt;br /&gt;
* Genereate ERROR if motor not turning (low energie)&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| TEMP&lt;br /&gt;
| Temperaturesensor-Driver &lt;br /&gt;
* init Sensor &lt;br /&gt;
* IQR driven (500ms)&lt;br /&gt;
* start A/D conversion (IQR driven)&lt;br /&gt;
* get A/D Value and calc temperature&lt;br /&gt;
* calibration for sensor (needed?)&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| PID&lt;br /&gt;
| PID Algorithm&lt;br /&gt;
* calculate desired valveposition out of&lt;br /&gt;
** last valveposition(s) &lt;br /&gt;
** last temperature(s)&lt;br /&gt;
** actual temperature&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| BOOT&lt;br /&gt;
| Bootloader&lt;br /&gt;
we need a bootloader so that the developers can flash the software &lt;br /&gt;
without a JTAG cable and without disassembling the HR20.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| LOG&lt;br /&gt;
| Datalogger&lt;br /&gt;
* Operating Hours&lt;br /&gt;
** motor in action&lt;br /&gt;
** ODOmeter&lt;br /&gt;
** since Battery Exchange&lt;br /&gt;
* Errors&lt;br /&gt;
* Logfiles (only with additional hardware)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| UID&lt;br /&gt;
| Unique ID for identification&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= API Beschreibung =&lt;br /&gt;
== LCD ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Funtion&lt;br /&gt;
! Propose&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Init(void);            &lt;br /&gt;
|Init the LCD Controller&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_All_Segments(uint8_t);&lt;br /&gt;
|Set all segments to LCD_MODE&lt;br /&gt;
| done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Clear_All(void);                       &lt;br /&gt;
|Clear all segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Clear_Hour_Bar(void);&lt;br /&gt;
|Clear 24 bar segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Clear_Symbols(void);&lt;br /&gt;
|Clear AUTO MANU PROG SUN MOON SNOW&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Clear_Numbers(void);&lt;br /&gt;
|Clear 7 Segments ans Collumns&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Print_Dec(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print DEC-val in two 7 Segments 0-99&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Print_Hex(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print HEX-val in two 7 Segments 0-ff&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Print_No(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print one ditig in one 7 Segment&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Print_Temp(uint8_t, uint8_t);&lt;br /&gt;
|Print desired temperature (val+4,9)°C&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Set_Seg(uint8_t, uint8_t);          &lt;br /&gt;
|Set one Segment to LCD_MODE (0-69)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Set_Hour_Bar_Seg(uint8_t, uint8_t);    &lt;br /&gt;
|Set one Hour Bar Segment to LCD_MODE (0-23)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Set_Hour_Bar_Val(uint8_t, uint8_t);&lt;br /&gt;
|Set all Hour Bar Segments from 0 to val to LCD_MODE (0-23)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Update(void);                        &lt;br /&gt;
|Request immidiate LCD-Update (normal only when bitplane changes)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t LCD_Contrast_Adjust (int8_t);           &lt;br /&gt;
|Adjust the contrast&lt;br /&gt;
|&#039;&#039;&#039;not tested yet&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Entwicklungsumgebung =&lt;br /&gt;
* Editor, Debugger, Compiler&lt;br /&gt;
** WinAVR version (20071221), sprich GCC 4.2.2 sowie avr-libc 1.6.0&lt;br /&gt;
** AVR Studio 4 &lt;br /&gt;
* JTAG ICE&lt;br /&gt;
** Atmel AVR JTAGICE MK2 &lt;br /&gt;
** AVR Dragon (z.B. http://elmicro.com/de/atavrdragon.html)&lt;br /&gt;
** Olimex-Seriell http://www.olimex.com/dev/avr-jtag.html  &lt;br /&gt;
** Olimex-USB http://www.olimex.com/dev/avr-usb-jtag.html &lt;br /&gt;
&lt;br /&gt;
= Sonstiges =&lt;br /&gt;
== Altes Protokoll ==&lt;br /&gt;
[[HR20_Protocol_V2 | Hier ]] hat mal einer ein Protokoll eingegeben.&lt;br /&gt;
Das scheint aber nicht zu der Version 2.04 zu passen. &lt;br /&gt;
Ich habe es nicht gelöscht, falls es jemanden interessiert.&lt;br /&gt;
== SVN Anleitung ==&lt;br /&gt;
Eine Anleitung was ein SVN ist und wie man es brauchen wir hier nicht.&lt;br /&gt;
Sonst müsste hier auch ein C-Kurs, Windows-Kurs, und Elektronik-Kurs hin.&lt;br /&gt;
&lt;br /&gt;
[[Category:Projekte|!]]&lt;/div&gt;</summary>
		<author><name>Dario</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=25976</id>
		<title>Heizungssteuerung mit Honeywell HR20</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=25976"/>
		<updated>2008-02-02T00:52:37Z</updated>

		<summary type="html">&lt;p&gt;Dario: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von DarioC&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Wie alles begann =&lt;br /&gt;
&lt;br /&gt;
Nachdem von Uwe Felgentreu vor nunmehr vor über drei Jahren (genau am 17.11.2004 um 11:26) hier in diesem Forum den Thread mit dem Titel &#039;&#039;Honeywell Rondostat HR20E per AVR steuern und konfigurieren&#039;&#039; gestartet hat ist es nun langsam soweit, dass das Ganze auch ein Projekt wird. &lt;br /&gt;
&lt;br /&gt;
Den Thread dazu kann der interessierte Leser [http://www.mikrocontroller.net/topic/17603 hier nachlesen] &lt;br /&gt;
&lt;br /&gt;
= Projektziel =&lt;br /&gt;
&lt;br /&gt;
Wir konzentrieren uns in erster Linie auf den Honeywell Rondostat HR20E mit ausgelieferten Softwareversion 2.04. Dass es ähnliche andere Geräte gibt behalten wir bei der Entwicklung im Hinterkopf.&lt;br /&gt;
&lt;br /&gt;
Basierend auf dieser Hardware wollen wir eine neue Software entwickeln. &lt;br /&gt;
Dabe können wir ausser der Hardware nichts weiter verwenden, da die Originalsoftware geschützt ist und nicht ausgelesen werden kann.&lt;br /&gt;
&lt;br /&gt;
== Phase 1 ==&lt;br /&gt;
Die Software soll die Funktionen bieten, die die Originalsoftware auch bietet, später können dies dann um zusätzliche Funktionen erweitert werden. Die wichtigsten Funktionen sind:&lt;br /&gt;
&lt;br /&gt;
* Temperaturregelung&lt;br /&gt;
* Echtzeituhr&lt;br /&gt;
* Ausnutzen der Sleep Funktion&lt;br /&gt;
* Anzeige Soll-Temperatur und der Uhrzeit&lt;br /&gt;
* Einstellung der Soll-Temperatur&lt;br /&gt;
* Uhrzeitgesteuerte Einstellung der Soll-Temperatur &lt;br /&gt;
* Fenster-Offen-Erkennung&lt;br /&gt;
* Ventilfreispülungsfunktion&lt;br /&gt;
&lt;br /&gt;
== Phase 2 ==&lt;br /&gt;
&lt;br /&gt;
Hier liegt der Sinn des ganzen Projektes: Durch diese zusätzlichen Funktionen wollen wir den Nutzwert des Thermostaten erheblich steigern:&lt;br /&gt;
&lt;br /&gt;
* Programmierung der Schaltzeiten und Temperaturen über externe Schnittstelle&lt;br /&gt;
* Abfrage der Messwerte und Parameter über externe Schnittstelle&lt;br /&gt;
* Vernetzung der Thermostaten untereinander&lt;br /&gt;
* Zusätzliche externe Schnittstellen (neben UART auch CAN und Funk)&lt;br /&gt;
* Erweiterung der Anzeige um&lt;br /&gt;
** Ist-Temperatur &lt;br /&gt;
** Ventilstellung&lt;br /&gt;
** Funkschnittstelle&lt;br /&gt;
*** RFM12 http://www.hoperf.com/rf_fsk.asp&lt;br /&gt;
*** Zigbee http://www.meshnetics.com/zigbee-modules&lt;br /&gt;
** ...&lt;br /&gt;
* Bootloader, damit Leute mitarbeiten können, die keine JTAG haben. Mit einem JTAG könnte man den Bootloader Flashen, ohne den Thermostaten öffnen zu müssen. Von da an kann man über den Programmierstecker mit einem umgebauten Handykabel den Thermostaten neu flashen.&lt;br /&gt;
&lt;br /&gt;
= Subversion Repository =&lt;br /&gt;
Ein SVN Repository liegt auf dem freien SVN Server: https://opensvn.csie.org&lt;br /&gt;
== Zugangsdaten ==&lt;br /&gt;
Repository Location: https://OpenSVN.csie.org/hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
Browse Repository: https://OpenSVN.csie.org/viewcvs.cgi/?root=hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
TRAC: https://opensvn.csie.org/traccgi/hr20&lt;br /&gt;
== Policy ==&lt;br /&gt;
Anonymous check out ist erlaubt. &amp;lt;br&amp;gt;&lt;br /&gt;
Wer was committen will muss freigeschaltet werden. &amp;lt;br&amp;gt;&lt;br /&gt;
Dazu brauche ich ein &#039;&#039;Usernamen, Passwort&#039;&#039; und eine &#039;&#039;Mailadresse&#039;&#039;, dann kann ich das einrichten. &amp;lt;br&amp;gt;&lt;br /&gt;
Tragt Euch dazu einfach selber in die Tabelle ein, ich erledige dann den Rest.&amp;lt;br&amp;gt;&lt;br /&gt;
Das mache ich dann von Hand und da ich nicht alle 10 Minuten Mails bearbeite kann das auch schon mal einen oder zwei Tage dauern. &amp;lt;br&amp;gt;&lt;br /&gt;
Wenn sich ein Maintainer findet, gebe ich die Zugangsdaten gerne weiter.&lt;br /&gt;
== Entwickler ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! width=&amp;quot;150&amp;quot; | Entwickler&lt;br /&gt;
! width=&amp;quot;150&amp;quot; | svn Status&lt;br /&gt;
|-&lt;br /&gt;
| darioc&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|-&lt;br /&gt;
| louk&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|}&lt;br /&gt;
== Verzeichnisstrucktur ==&lt;br /&gt;
Eine Verzeichnisstrucktur ist auch schon angelegt und die ersten Daten auch drin. Hier die Verzeichnisse:&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
| &#039;&#039;&#039;/doc&#039;&#039;&#039;&lt;br /&gt;
| Für alles an Dokumenten, die selbst erstellt wurden. &amp;lt;br&amp;gt;&lt;br /&gt;
Specs, die man im Internet bekommen kann gehören hier nicht rein, &amp;lt;br&amp;gt;&lt;br /&gt;
die machen das alles nur unnötig gross und das auschecken dauert länger.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/playground&#039;&#039;&#039; &lt;br /&gt;
| Wie der Name schon sagt, zum rumspielen und testen. &amp;lt;br&amp;gt;&lt;br /&gt;
Hier kommt jegliche art von Codeschnipseln hin, die zu Testen da sind &amp;lt;br&amp;gt;&lt;br /&gt;
und (derzeit) noch icht Teil des Programmes sind.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/source&#039;&#039;&#039; &lt;br /&gt;
| Hier kommt die Applikation rein mit allen Modulen und makefiles.&amp;lt;br&amp;gt;&lt;br /&gt;
Bitte haltet das Repository sauber und checkt nur Dateien ein, &amp;lt;br&amp;gt;&lt;br /&gt;
die auch Sinn  machen, &amp;quot;thumbs.db&amp;quot; oder andere Temp-Dateien gehören hier nicht rein.&lt;br /&gt;
|}&lt;br /&gt;
== SVN Client und Anleitung ==&lt;br /&gt;
Windows-User nutzen am besten den Tortoise-SVN-Client, den man kostenfrei [http://tortoisesvn.tigris.org hier runterladen] kann. &amp;lt;br&amp;gt;&lt;br /&gt;
Dort gibt es auch eine Anleitung zum Arbeiten mit SVN. &lt;br /&gt;
&lt;br /&gt;
= Analyse der Hardware =&lt;br /&gt;
Die Analyse hat der Dario schon gemacht, zu finden ist die jeweils aktuelle Version &lt;br /&gt;
[http://www.carluccio.de/img/hr20/analyse.pdf als PDF hier] oder [https://opensvn.csie.org/viewcvs.cgi/doc/analyse.pdf hier im SVN].&lt;br /&gt;
&lt;br /&gt;
= Benötigte Module =&lt;br /&gt;
&lt;br /&gt;
Um das Ganze nun etwas zu koordinieren hier eine Liste der benötigten Module und deren Funktionen. &amp;lt;br&amp;gt;&lt;br /&gt;
Diese dient dazu später die Aufgaben zu verteilen:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Module&lt;br /&gt;
! Function&lt;br /&gt;
! Developer&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| LCD&lt;br /&gt;
| Display Driver:&amp;lt;BR&amp;gt;&lt;br /&gt;
* Init Display&lt;br /&gt;
* Set Segments&lt;br /&gt;
* Print HEX, DEC, TEMP&lt;br /&gt;
* Blink&lt;br /&gt;
* e.t.c&lt;br /&gt;
| dario&lt;br /&gt;
| &#039;&#039;&#039;DONE&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| RTC&lt;br /&gt;
| Time and Date Handler&lt;br /&gt;
* init timer&lt;br /&gt;
* use IRQ with 32kHz crystal&lt;br /&gt;
* handle time and date&lt;br /&gt;
** daylight saving &#039;&#039;&#039;OPEN&#039;&#039;&#039;&lt;br /&gt;
** consult leapyear &lt;br /&gt;
| dario&lt;br /&gt;
| &#039;&#039;&#039;DONE (90%)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UART &lt;br /&gt;
| UART-Driver&lt;br /&gt;
* menue (Debug und Steuerung)&lt;br /&gt;
** show and set desired temperature &lt;br /&gt;
** show and set Time and Date&lt;br /&gt;
** show actual temperature&lt;br /&gt;
** show (and set) actual valveposition &lt;br /&gt;
** show and set timetable and temperatures&lt;br /&gt;
* optional &lt;br /&gt;
** adressierung of HR20 (for BUS, RF)&lt;br /&gt;
** authentication end encryption&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| MENU&lt;br /&gt;
| Display Menu&lt;br /&gt;
* get keystate (with debounce)&lt;br /&gt;
** multi keypress (nedded for hidden menue?)&lt;br /&gt;
** longer keypress / double click (nedded?)&lt;br /&gt;
* get position of wheel (incremental counter)&lt;br /&gt;
* controll display&lt;br /&gt;
* functionality:&lt;br /&gt;
* show and set desired temperature&lt;br /&gt;
* show and set time and date &lt;br /&gt;
* show actual temperature&lt;br /&gt;
* show actual valveposition &lt;br /&gt;
* show and set timetable and temperatures&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| MOTOR&lt;br /&gt;
| Motor-Driver &lt;br /&gt;
* set desired valveposition &lt;br /&gt;
** quick&lt;br /&gt;
** asympthotic&lt;br /&gt;
** quiet&lt;br /&gt;
* callibrate for Valve&lt;br /&gt;
* Genereate ERROR if motor not turning (low energie)&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| TEMP&lt;br /&gt;
| Temperaturesensor-Driver &lt;br /&gt;
* init Sensor &lt;br /&gt;
* IQR driven (500ms)&lt;br /&gt;
* start A/D conversion (IQR driven)&lt;br /&gt;
* get A/D Value and calc temperature&lt;br /&gt;
* calibration for sensor (needed?)&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| PID&lt;br /&gt;
| PID Algorithm&lt;br /&gt;
* calculate desired valveposition out of&lt;br /&gt;
** last valveposition(s) &lt;br /&gt;
** last temperature(s)&lt;br /&gt;
** actual temperature&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| BOOT&lt;br /&gt;
| Bootloader&lt;br /&gt;
we need a bootloader so that the developers can flash the software &lt;br /&gt;
without a JTAG cable and without disassembling the HR20.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| LOG&lt;br /&gt;
| Datalogger&lt;br /&gt;
* Operating Hours&lt;br /&gt;
** motor in action&lt;br /&gt;
** ODOmeter&lt;br /&gt;
** since Battery Exchange&lt;br /&gt;
* Errors&lt;br /&gt;
* Logfiles (only with additional hardware)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| UID&lt;br /&gt;
| Unique ID for identification&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= API Beschreibung =&lt;br /&gt;
== LCD ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Funtion&lt;br /&gt;
! Propose&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Init(void);            &lt;br /&gt;
|Init the LCD Controller&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_All_Segments(uint8_t);&lt;br /&gt;
|Set all segments to LCD_MODE&lt;br /&gt;
| done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Clear_All(void);                       &lt;br /&gt;
|Clear all segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Clear_Hour_Bar(void);&lt;br /&gt;
|Clear 24 bar segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Clear_Symbols(void);&lt;br /&gt;
|Clear AUTO MANU PROG SUN MOON SNOW&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Clear_Numbers(void);&lt;br /&gt;
|Clear 7 Segments ans Collumns&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Print_Dec(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print DEC-val in two 7 Segments 0-99&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Print_Hex(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print HEX-val in two 7 Segments 0-ff&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Print_No(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print one ditig in one 7 Segment&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Print_Temp(uint8_t, uint8_t);&lt;br /&gt;
|Print desired temperature (val+4,9)°C&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Set_Seg(uint8_t, uint8_t);          &lt;br /&gt;
|Set one Segment to LCD_MODE (0-69)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Set_Hour_Bar_Seg(uint8_t, uint8_t);    &lt;br /&gt;
|Set one Hour Bar Segment to LCD_MODE (0-23)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Set_Hour_Bar_Val(uint8_t, uint8_t);&lt;br /&gt;
|Set all Hour Bar Segments from 0 to val to LCD_MODE (0-23)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Update(void);                        &lt;br /&gt;
|Request immidiate LCD-Update (normal only when bitplane changes)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t LCD_Contrast_Adjust (int8_t);           &lt;br /&gt;
|Adjust the contrast&lt;br /&gt;
|&#039;&#039;&#039;not tested yet&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Entwicklungsumgebung =&lt;br /&gt;
* Editor, Debugger, Compiler&lt;br /&gt;
** WinAVR version (20071221), sprich GCC 4.2.2 sowie avr-libc 1.6.0&lt;br /&gt;
** AVR Studio 4 &lt;br /&gt;
* JTAG ICE&lt;br /&gt;
** Atmel AVR JTAGICE MK2 &lt;br /&gt;
** AVR Dragon (z.B. http://elmicro.com/de/atavrdragon.html)&lt;br /&gt;
** Olimex-Seriell http://www.olimex.com/dev/avr-jtag.html  &lt;br /&gt;
** Olimex-USB http://www.olimex.com/dev/avr-usb-jtag.html &lt;br /&gt;
&lt;br /&gt;
= Sonstiges =&lt;br /&gt;
== Altes Protokoll ==&lt;br /&gt;
[[HR20_Protocol_V2 | Hier ]] hat mal einer ein Protokoll eingegeben.&lt;br /&gt;
Das scheint aber nicht zu der Version 2.04 zu passen. &lt;br /&gt;
Ich habe es nicht gelöscht, falls es jemanden interessiert.&lt;br /&gt;
== SVN Anleitung ==&lt;br /&gt;
Eine Anleitung was ein SVN ist und wie man es brauchen wir hier nicht.&lt;br /&gt;
Sonst müsste hier auch ein C-Kurs, Windows-Kurs, und Elektronik-Kurs hin.&lt;br /&gt;
&lt;br /&gt;
[[Category:Projekte|!]]&lt;/div&gt;</summary>
		<author><name>Dario</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=25975</id>
		<title>Heizungssteuerung mit Honeywell HR20</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=25975"/>
		<updated>2008-02-02T00:52:06Z</updated>

		<summary type="html">&lt;p&gt;Dario: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von DarioC&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Wie alles begann =&lt;br /&gt;
&lt;br /&gt;
Nachdem von Uwe Felgentreu vor nunmehr vor über drei Jahren (genau am 17.11.2004 um 11:26) hier in diesem Forum den Thread mit dem Titel &#039;&#039;Honeywell Rondostat HR20E per AVR steuern und konfigurieren&#039;&#039; gestartet hat ist es nun langsam soweit, dass das Ganze auch ein Projekt wird. &lt;br /&gt;
&lt;br /&gt;
Den Thread dazu kann der interessierte Leser [http://www.mikrocontroller.net/topic/17603 hier nachlesen] &lt;br /&gt;
&lt;br /&gt;
= Projektziel =&lt;br /&gt;
&lt;br /&gt;
Wir konzentrieren uns in erster Linie auf den Honeywell Rondostat HR20E mit ausgelieferten Softwareversion 2.04. Dass es ähnliche andere Geräte gibt behalten wir bei der Entwicklung im Hinterkopf.&lt;br /&gt;
&lt;br /&gt;
Basierend auf dieser Hardware wollen wir eine neue Software entwickeln. &lt;br /&gt;
Dabe können wir ausser der Hardware nichts weiter verwenden, da die Originalsoftware geschützt ist und nicht ausgelesen werden kann.&lt;br /&gt;
&lt;br /&gt;
== Phase 1 ==&lt;br /&gt;
Die Software soll die Funktionen bieten, die die Originalsoftware auch bietet, später können dies dann um zusätzliche Funktionen erweitert werden. Die wichtigsten Funktionen sind:&lt;br /&gt;
&lt;br /&gt;
* Temperaturregelung&lt;br /&gt;
* Echtzeituhr&lt;br /&gt;
* Ausnutzen der Sleep Funktion&lt;br /&gt;
* Anzeige Soll-Temperatur und der Uhrzeit&lt;br /&gt;
* Einstellung der Soll-Temperatur&lt;br /&gt;
* Uhrzeitgesteuerte Einstellung der Soll-Temperatur &lt;br /&gt;
* Fenster-Offen-Erkennung&lt;br /&gt;
* Ventilfreispülungsfunktion&lt;br /&gt;
&lt;br /&gt;
== Phase 2 ==&lt;br /&gt;
&lt;br /&gt;
Hier liegt der Sinn des ganzen Projektes: Durch diese zusätzlichen Funktionen wollen wir den Nutzwert des Thermostaten erheblich steigern:&lt;br /&gt;
&lt;br /&gt;
* Programmierung der Schaltzeiten und Temperaturen über externe Schnittstelle&lt;br /&gt;
* Abfrage der Messwerte und Parameter über externe Schnittstelle&lt;br /&gt;
* Vernetzung der Thermostaten untereinander&lt;br /&gt;
* Zusätzliche externe Schnittstellen (neben UART auch CAN und Funk)&lt;br /&gt;
* Erweiterung der Anzeige um&lt;br /&gt;
** Ist-Temperatur &lt;br /&gt;
** Ventilstellung&lt;br /&gt;
** Funkschnittstelle&lt;br /&gt;
*** RFM12 http://www.hoperf.com/rf_fsk.asp&lt;br /&gt;
*** Zigbee http://www.meshnetics.com/zigbee-modules&lt;br /&gt;
** ...&lt;br /&gt;
* Bootloader, damit Leute mitarbeiten können, die keine JTAG haben. Mit einem JTAG könnte man den Bootloader Flashen, ohne den Thermostaten öffnen zu müssen. Von da an kann man über den Programmierstecker mit einem umgebauten Handykabel den Thermostaten neu flashen.&lt;br /&gt;
&lt;br /&gt;
= Subversion Repository =&lt;br /&gt;
Ein SVN Repository liegt auf dem freien SVN Server: https://opensvn.csie.org&lt;br /&gt;
== Zugangsdaten ==&lt;br /&gt;
Repository Location: https://OpenSVN.csie.org/hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
Browse Repository: https://OpenSVN.csie.org/viewcvs.cgi/?root=hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
TRAC: https://opensvn.csie.org/traccgi/hr20&lt;br /&gt;
== Policy ==&lt;br /&gt;
Anonymous check out ist erlaubt. &amp;lt;br&amp;gt;&lt;br /&gt;
Wer was committen will muss freigeschaltet werden. &amp;lt;br&amp;gt;&lt;br /&gt;
Dazu brauche ich ein &#039;&#039;Usernamen, Passwort&#039;&#039; und eine &#039;&#039;Mailadresse&#039;&#039;, dann kann ich das einrichten. &amp;lt;br&amp;gt;&lt;br /&gt;
Tragt Euch dazu einfach selber in die Tabelle ein, ich erledige dann den Rest.&amp;lt;br&amp;gt;&lt;br /&gt;
Das mache ich dann von Hand und da ich nicht alle 10 Minuten Mails bearbeite kann das auch schon mal einen oder zwei Tage dauern. &amp;lt;br&amp;gt;&lt;br /&gt;
Wenn sich ein Maintainer findet, gebe ich die Zugangsdaten gerne weiter.&lt;br /&gt;
== Entwickler ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! width=&amp;quot;150&amp;quot; | Entwickler&lt;br /&gt;
! width=&amp;quot;150&amp;quot; | svn Status&lt;br /&gt;
|-&lt;br /&gt;
| darioc&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|-&lt;br /&gt;
| louk&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|}&lt;br /&gt;
== Verzeichnisstrucktur ==&lt;br /&gt;
Eine Verzeichnisstrucktur ist auch schon angelegt und die ersten Daten auch drin. Hier die Verzeichnisse:&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
| &#039;&#039;&#039;/doc&#039;&#039;&#039;&lt;br /&gt;
| Für alles an Dokumenten, die selbst erstellt wurden. &amp;lt;br&amp;gt;&lt;br /&gt;
Specs, die man im Internet bekommen kann gehören hier nicht rein, &amp;lt;br&amp;gt;&lt;br /&gt;
die machen das alles nur unnötig gross und das auschecken dauert länger.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/playground&#039;&#039;&#039; &lt;br /&gt;
| Wie der Name schon sagt, zum rumspielen und testen. &amp;lt;br&amp;gt;&lt;br /&gt;
Hier kommt jegliche art von Codeschnipseln hin, die zu Testen da sind &amp;lt;br&amp;gt;&lt;br /&gt;
und (derzeit) noch icht Teil des Programmes sind.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/source&#039;&#039;&#039; &lt;br /&gt;
| Hier kommt die Applikation rein mit allen Modulen und makefiles.&amp;lt;br&amp;gt;&lt;br /&gt;
Bitte haltet das Repository sauber und checkt nur Dateien ein, &amp;lt;br&amp;gt;&lt;br /&gt;
die auch Sinn  machen, &amp;quot;thumbs.db&amp;quot; oder andere Temp-Dateien gehören hier nicht rein.&lt;br /&gt;
|}&lt;br /&gt;
== SVN Client und Anleitung ==&lt;br /&gt;
Windows-User nutzen am besten den Tortoise-SVN-Client, den man kostenfrei [http://tortoisesvn.tigris.org hier runterladen] kann. &amp;lt;br&amp;gt;&lt;br /&gt;
Dort gibt es auch eine Anleitung zum Arbeiten mit SVN. &lt;br /&gt;
&lt;br /&gt;
= Analyse der Hardware =&lt;br /&gt;
Die Analyse hat der Dario schon gemacht, zu finden ist die jeweils aktuelle Version &lt;br /&gt;
[http://www.carluccio.de/img/hr20/analyse.pdf als PDF hier] oder [https://opensvn.csie.org/viewcvs.cgi/doc/analyse.pdf hier im SVN].&lt;br /&gt;
&lt;br /&gt;
= Benötigte Module =&lt;br /&gt;
&lt;br /&gt;
Um das Ganze nun etwas zu koordinieren hier eine Liste der benötigten Module und deren Funktionen. &amp;lt;br&amp;gt;&lt;br /&gt;
Diese dient dazu später die Aufgaben zu verteilen:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Module&lt;br /&gt;
! Function&lt;br /&gt;
! Developer&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| LCD&lt;br /&gt;
| Display Driver:&amp;lt;BR&amp;gt;&lt;br /&gt;
* Init Display&lt;br /&gt;
* Set Segments&lt;br /&gt;
* Print HEX, DEC, TEMP&lt;br /&gt;
* Blink&lt;br /&gt;
* e.t.c&lt;br /&gt;
| dario&lt;br /&gt;
| &#039;&#039;&#039;DONE&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| RTC&lt;br /&gt;
| Time and Date Handler&lt;br /&gt;
* init timer&lt;br /&gt;
* use IRQ with 32kHz crystal&lt;br /&gt;
* handle time and date&lt;br /&gt;
** daylight saving &#039;&#039;&#039;OPEN&#039;&#039;&#039;&lt;br /&gt;
** consult leapyear &lt;br /&gt;
| dario&lt;br /&gt;
| &#039;&#039;&#039;DONE (90%)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UART &lt;br /&gt;
| UART-Driver&lt;br /&gt;
* menue (Debug und Steuerung)&lt;br /&gt;
** show and set desired temperature &lt;br /&gt;
** show and set Time and Date&lt;br /&gt;
** show actual temperature&lt;br /&gt;
** show (and set) actual valveposition &lt;br /&gt;
** show and set timetable and temperatures&lt;br /&gt;
* optional &lt;br /&gt;
** adressierung of HR20 (for BUS, RF)&lt;br /&gt;
** authentication end encryption&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| MENU&lt;br /&gt;
| Display Menu&lt;br /&gt;
* get keystate (with debounce)&lt;br /&gt;
** multi keypress (nedded for hidden menue?)&lt;br /&gt;
** longer keypress / double click (nedded?)&lt;br /&gt;
* get position of wheel (incremental counter)&lt;br /&gt;
* controll display&lt;br /&gt;
* functionality:&lt;br /&gt;
* show and set desired temperature&lt;br /&gt;
* show and set time and date &lt;br /&gt;
* show actual temperature&lt;br /&gt;
* show actual valveposition &lt;br /&gt;
* show and set timetable and temperatures&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| MOTOR&lt;br /&gt;
| Motor-Driver &lt;br /&gt;
* set desired valveposition &lt;br /&gt;
** quick&lt;br /&gt;
** asympthotic&lt;br /&gt;
** quiet&lt;br /&gt;
* callibrate for Valve&lt;br /&gt;
* Genereate ERROR if motor not turning (low energie)&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| TEMP&lt;br /&gt;
| Temperaturesensor-Driver &lt;br /&gt;
* init Sensor &lt;br /&gt;
* IQR driven (500ms)&lt;br /&gt;
* start A/D conversion (IQR driven)&lt;br /&gt;
* get A/D Value and calc temperature&lt;br /&gt;
* calibration for sensor (needed?)&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| PID&lt;br /&gt;
| PID Algorithm&lt;br /&gt;
* calculate desired valveposition out of&lt;br /&gt;
** last valveposition(s) &lt;br /&gt;
** last temperature(s)&lt;br /&gt;
** actual temperature&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| BOOT&lt;br /&gt;
| Bootloader&lt;br /&gt;
we need a bootloader so that the developers can flash the software &lt;br /&gt;
without a JTAG cable and without disassembling the HR20.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| LOG&lt;br /&gt;
| Datalogger&lt;br /&gt;
* Operating Hours&lt;br /&gt;
** motor in action&lt;br /&gt;
** ODOmeter&lt;br /&gt;
** since Battery Exchange&lt;br /&gt;
* Errors&lt;br /&gt;
* Logfiles (only with additional hardware)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| UID&lt;br /&gt;
| Unique ID for identification&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== API Beschreibung ==&lt;br /&gt;
=== LCD ===&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Funtion&lt;br /&gt;
! Propose&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Init(void);            &lt;br /&gt;
|Init the LCD Controller&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_All_Segments(uint8_t);&lt;br /&gt;
|Set all segments to LCD_MODE&lt;br /&gt;
| done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Clear_All(void);                       &lt;br /&gt;
|Clear all segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Clear_Hour_Bar(void);&lt;br /&gt;
|Clear 24 bar segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Clear_Symbols(void);&lt;br /&gt;
|Clear AUTO MANU PROG SUN MOON SNOW&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Clear_Numbers(void);&lt;br /&gt;
|Clear 7 Segments ans Collumns&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Print_Dec(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print DEC-val in two 7 Segments 0-99&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Print_Hex(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print HEX-val in two 7 Segments 0-ff&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Print_No(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print one ditig in one 7 Segment&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Print_Temp(uint8_t, uint8_t);&lt;br /&gt;
|Print desired temperature (val+4,9)°C&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Set_Seg(uint8_t, uint8_t);          &lt;br /&gt;
|Set one Segment to LCD_MODE (0-69)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Set_Hour_Bar_Seg(uint8_t, uint8_t);    &lt;br /&gt;
|Set one Hour Bar Segment to LCD_MODE (0-23)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Set_Hour_Bar_Val(uint8_t, uint8_t);&lt;br /&gt;
|Set all Hour Bar Segments from 0 to val to LCD_MODE (0-23)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Update(void);                        &lt;br /&gt;
|Request immidiate LCD-Update (normal only when bitplane changes)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t LCD_Contrast_Adjust (int8_t);           &lt;br /&gt;
|Adjust the contrast&lt;br /&gt;
|&#039;&#039;&#039;not tested yet&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Entwicklungsumgebung =&lt;br /&gt;
* Editor, Debugger, Compiler&lt;br /&gt;
** WinAVR version (20071221), sprich GCC 4.2.2 sowie avr-libc 1.6.0&lt;br /&gt;
** AVR Studio 4 &lt;br /&gt;
* JTAG ICE&lt;br /&gt;
** Atmel AVR JTAGICE MK2 &lt;br /&gt;
** AVR Dragon (z.B. http://elmicro.com/de/atavrdragon.html)&lt;br /&gt;
** Olimex-Seriell http://www.olimex.com/dev/avr-jtag.html  &lt;br /&gt;
** Olimex-USB http://www.olimex.com/dev/avr-usb-jtag.html &lt;br /&gt;
&lt;br /&gt;
= Sonstiges =&lt;br /&gt;
== Altes Protokoll ==&lt;br /&gt;
[[HR20_Protocol_V2 | Hier ]] hat mal einer ein Protokoll eingegeben.&lt;br /&gt;
Das scheint aber nicht zu der Version 2.04 zu passen. &lt;br /&gt;
Ich habe es nicht gelöscht, falls es jemanden interessiert.&lt;br /&gt;
== SVN Anleitung ==&lt;br /&gt;
Eine Anleitung was ein SVN ist und wie man es brauchen wir hier nicht.&lt;br /&gt;
Sonst müsste hier auch ein C-Kurs, Windows-Kurs, und Elektronik-Kurs hin.&lt;br /&gt;
&lt;br /&gt;
[[Category:Projekte|!]]&lt;/div&gt;</summary>
		<author><name>Dario</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=25964</id>
		<title>Heizungssteuerung mit Honeywell HR20</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=25964"/>
		<updated>2008-02-01T14:27:41Z</updated>

		<summary type="html">&lt;p&gt;Dario: /* Benötigte Module */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von DarioC&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Wie alles begann =&lt;br /&gt;
&lt;br /&gt;
Nachdem von Uwe Felgentreu vor nunmehr vor über drei Jahren (genau am 17.11.2004 um 11:26) hier in diesem Forum den Thread mit dem Titel &#039;&#039;Honeywell Rondostat HR20E per AVR steuern und konfigurieren&#039;&#039; gestartet hat ist es nun langsam soweit, dass das Ganze auch ein Projekt wird. &lt;br /&gt;
&lt;br /&gt;
Den Thread dazu kann der interessierte Leser [http://www.mikrocontroller.net/topic/17603 hier nachlesen] &lt;br /&gt;
&lt;br /&gt;
= Projektziel =&lt;br /&gt;
&lt;br /&gt;
Wir konzentrieren uns in erster Linie auf den Honeywell Rondostat HR20E mit ausgelieferten Softwareversion 2.04. Dass es ähnliche andere Geräte gibt behalten wir bei der Entwicklung im Hinterkopf.&lt;br /&gt;
&lt;br /&gt;
Basierend auf dieser Hardware wollen wir eine neue Software entwickeln. &lt;br /&gt;
Dabe können wir ausser der Hardware nichts weiter verwenden, da die Originalsoftware geschützt ist und nicht ausgelesen werden kann.&lt;br /&gt;
&lt;br /&gt;
== Phase 1 ==&lt;br /&gt;
Die Software soll die Funktionen bieten, die die Originalsoftware auch bietet, später können dies dann um zusätzliche Funktionen erweitert werden. Die wichtigsten Funktionen sind:&lt;br /&gt;
&lt;br /&gt;
* Temperaturregelung&lt;br /&gt;
* Echtzeituhr&lt;br /&gt;
* Ausnutzen der Sleep Funktion&lt;br /&gt;
* Anzeige Soll-Temperatur und der Uhrzeit&lt;br /&gt;
* Einstellung der Soll-Temperatur&lt;br /&gt;
* Uhrzeitgesteuerte Einstellung der Soll-Temperatur &lt;br /&gt;
* Fenster-Offen-Erkennung&lt;br /&gt;
* Ventilfreispülungsfunktion&lt;br /&gt;
&lt;br /&gt;
== Phase 2 ==&lt;br /&gt;
&lt;br /&gt;
Hier liegt der Sinn des ganzen Projektes: Durch diese zusätzlichen Funktionen wollen wir den Nutzwert des Thermostaten erheblich steigern:&lt;br /&gt;
&lt;br /&gt;
* Programmierung der Schaltzeiten und Temperaturen über externe Schnittstelle&lt;br /&gt;
* Abfrage der Messwerte und Parameter über externe Schnittstelle&lt;br /&gt;
* Vernetzung der Thermostaten untereinander&lt;br /&gt;
* Zusätzliche externe Schnittstellen (neben UART auch CAN und Funk)&lt;br /&gt;
* Erweiterung der Anzeige um&lt;br /&gt;
** Ist-Temperatur &lt;br /&gt;
** Ventilstellung&lt;br /&gt;
** Funkschnittstelle&lt;br /&gt;
*** RFM12 http://www.hoperf.com/rf_fsk.asp&lt;br /&gt;
*** Zigbee http://www.meshnetics.com/zigbee-modules&lt;br /&gt;
** ...&lt;br /&gt;
* Bootloader, damit Leute mitarbeiten können, die keine JTAG haben. Mit einem JTAG könnte man den Bootloader Flashen, ohne den Thermostaten öffnen zu müssen. Von da an kann man über den Programmierstecker mit einem umgebauten Handykabel den Thermostaten neu flashen.&lt;br /&gt;
&lt;br /&gt;
= Subversion Repository =&lt;br /&gt;
Ein SVN Repository liegt auf dem freien SVN Server: https://opensvn.csie.org&lt;br /&gt;
== Zugangsdaten ==&lt;br /&gt;
Repository Location: https://OpenSVN.csie.org/hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
Browse Repository: https://OpenSVN.csie.org/viewcvs.cgi/?root=hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
TRAC: https://opensvn.csie.org/traccgi/hr20&lt;br /&gt;
== Policy ==&lt;br /&gt;
Anonymous check out ist erlaubt. &amp;lt;br&amp;gt;&lt;br /&gt;
Wer was committen will muss freigeschaltet werden. &amp;lt;br&amp;gt;&lt;br /&gt;
Dazu brauche ich ein &#039;&#039;Usernamen, Passwort&#039;&#039; und eine &#039;&#039;Mailadresse&#039;&#039;, dann kann ich das einrichten. &amp;lt;br&amp;gt;&lt;br /&gt;
Tragt Euch dazu einfach selber in die Tabelle ein, ich erledige dann den Rest.&amp;lt;br&amp;gt;&lt;br /&gt;
Das mache ich dann von Hand und da ich nicht alle 10 Minuten Mails bearbeite kann das auch schon mal einen oder zwei Tage dauern. &amp;lt;br&amp;gt;&lt;br /&gt;
Wenn sich ein Maintainer findet, gebe ich die Zugangsdaten gerne weiter.&lt;br /&gt;
== Entwickler ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! width=&amp;quot;150&amp;quot; | Entwickler&lt;br /&gt;
! width=&amp;quot;150&amp;quot; | svn Status&lt;br /&gt;
|-&lt;br /&gt;
| darioc&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|-&lt;br /&gt;
| louk&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|}&lt;br /&gt;
== Verzeichnisstrucktur ==&lt;br /&gt;
Eine Verzeichnisstrucktur ist auch schon angelegt und die ersten Daten auch drin. Hier die Verzeichnisse:&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
| &#039;&#039;&#039;/doc&#039;&#039;&#039;&lt;br /&gt;
| Für alles an Dokumenten, die selbst erstellt wurden. &amp;lt;br&amp;gt;&lt;br /&gt;
Specs, die man im Internet bekommen kann gehören hier nicht rein, &amp;lt;br&amp;gt;&lt;br /&gt;
die machen das alles nur unnötig gross und das auschecken dauert länger.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/playground&#039;&#039;&#039; &lt;br /&gt;
| Wie der Name schon sagt, zum rumspielen und testen. &amp;lt;br&amp;gt;&lt;br /&gt;
Hier kommt jegliche art von Codeschnipseln hin, die zu Testen da sind &amp;lt;br&amp;gt;&lt;br /&gt;
und (derzeit) noch icht Teil des Programmes sind.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/source&#039;&#039;&#039; &lt;br /&gt;
| Hier kommt die Applikation rein mit allen Modulen und makefiles.&amp;lt;br&amp;gt;&lt;br /&gt;
Bitte haltet das Repository sauber und checkt nur Dateien ein, &amp;lt;br&amp;gt;&lt;br /&gt;
die auch Sinn  machen, &amp;quot;thumbs.db&amp;quot; oder andere Temp-Dateien gehören hier nicht rein.&lt;br /&gt;
|}&lt;br /&gt;
== SVN Client und Anleitung ==&lt;br /&gt;
Windows-User nutzen am besten den Tortoise-SVN-Client, den man kostenfrei [http://tortoisesvn.tigris.org hier runterladen] kann. &amp;lt;br&amp;gt;&lt;br /&gt;
Dort gibt es auch eine Anleitung zum Arbeiten mit SVN. &lt;br /&gt;
&lt;br /&gt;
= Analyse der Hardware =&lt;br /&gt;
Die Analyse hat der Dario schon gemacht, zu finden ist die jeweils aktuelle Version &lt;br /&gt;
[http://www.carluccio.de/img/hr20/analyse.pdf als PDF hier] oder [https://opensvn.csie.org/viewcvs.cgi/doc/analyse.pdf hier im SVN].&lt;br /&gt;
&lt;br /&gt;
= Benötigte Module =&lt;br /&gt;
&lt;br /&gt;
Um das Ganze nun etwas zu koordinieren hier eine Liste der benötigten Module und deren Funktionen. &amp;lt;br&amp;gt;&lt;br /&gt;
Diese dient dazu später die Aufgaben zu verteilen:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Module&lt;br /&gt;
! Function&lt;br /&gt;
! Developer&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| LCD&lt;br /&gt;
| Display Driver:&amp;lt;BR&amp;gt;&lt;br /&gt;
* Init Display&lt;br /&gt;
* Set Segments&lt;br /&gt;
* Print HEX, DEC, TEMP&lt;br /&gt;
* Blink&lt;br /&gt;
* e.t.c&lt;br /&gt;
| dario&lt;br /&gt;
| &#039;&#039;&#039;DONE&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UART &lt;br /&gt;
| UART-Driver&lt;br /&gt;
* menue (Debug und Steuerung)&lt;br /&gt;
** show and set desired temperature &lt;br /&gt;
** show and set Time and Date&lt;br /&gt;
** show actual temperature&lt;br /&gt;
** show (and set) actual valveposition &lt;br /&gt;
** show and set timetable and temperatures&lt;br /&gt;
* optional &lt;br /&gt;
** adressierung of HR20 (for BUS, RF)&lt;br /&gt;
** authentication end encryption&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| RTC&lt;br /&gt;
| Time and Date Handler&lt;br /&gt;
* init timer&lt;br /&gt;
* use IRQ with 32kHz crystal&lt;br /&gt;
* handle time and date&lt;br /&gt;
** daylight saving&lt;br /&gt;
** consult leapyear &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| MENU&lt;br /&gt;
| Display Menu&lt;br /&gt;
* get keystate (with debounce)&lt;br /&gt;
** multi keypress (nedded for hidden menue?)&lt;br /&gt;
** longer keypress / double click (nedded?)&lt;br /&gt;
* get position of wheel (incremental counter)&lt;br /&gt;
* controll display&lt;br /&gt;
* functionality:&lt;br /&gt;
* show and set desired temperature&lt;br /&gt;
* show and set time and date &lt;br /&gt;
* show actual temperature&lt;br /&gt;
* show actual valveposition &lt;br /&gt;
* show and set timetable and temperatures&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| MOTOR&lt;br /&gt;
| Motor-Driver &lt;br /&gt;
* set desired valveposition &lt;br /&gt;
** quick&lt;br /&gt;
** asympthotic&lt;br /&gt;
** quiet&lt;br /&gt;
* callibrate for Valve&lt;br /&gt;
* Genereate ERROR if motor not turning (low energie)&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| TEMP&lt;br /&gt;
| Temperaturesensor-Driver &lt;br /&gt;
* init Sensor &lt;br /&gt;
* IQR driven (500ms)&lt;br /&gt;
* start A/D conversion (IQR driven)&lt;br /&gt;
* get A/D Value and calc temperature&lt;br /&gt;
* calibration for sensor (needed?)&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| PID&lt;br /&gt;
| PID Algorithm&lt;br /&gt;
* calculate desired valveposition out of&lt;br /&gt;
** last valveposition(s) &lt;br /&gt;
** last temperature(s)&lt;br /&gt;
** actual temperature&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| BOOT&lt;br /&gt;
| Bootloader&lt;br /&gt;
we need a bootloader so that the developers can flash the software &lt;br /&gt;
without a JTAG cable and without disassembling the HR20.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| LOG&lt;br /&gt;
| Datalogger&lt;br /&gt;
* Operating Hours&lt;br /&gt;
** motor in action&lt;br /&gt;
** ODOmeter&lt;br /&gt;
** since Battery Exchange&lt;br /&gt;
* Errors&lt;br /&gt;
* Logfiles (only with additional hardware)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| UID&lt;br /&gt;
| Unique ID for identification&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== API Beschreibung ==&lt;br /&gt;
=== LCD ===&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Funtion&lt;br /&gt;
! Propose&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Init(void);            &lt;br /&gt;
|Init the LCD Controller&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_All_Segments(uint8_t);&lt;br /&gt;
|Set all segments to LCD_MODE&lt;br /&gt;
| done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Clear_All(void);                       &lt;br /&gt;
|Clear all segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Clear_Hour_Bar(void);&lt;br /&gt;
|Clear 24 bar segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Clear_Symbols(void);&lt;br /&gt;
|Clear AUTO MANU PROG SUN MOON SNOW&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Clear_Numbers(void);&lt;br /&gt;
|Clear 7 Segments ans Collumns&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Print_Dec(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print DEC-val in two 7 Segments 0-99&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Print_Hex(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print HEX-val in two 7 Segments 0-ff&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Print_No(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print one ditig in one 7 Segment&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Print_Temp(uint8_t, uint8_t);&lt;br /&gt;
|Print desired temperature (val+4,9)°C&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Set_Seg(uint8_t, uint8_t);          &lt;br /&gt;
|Set one Segment to LCD_MODE (0-69)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Set_Hour_Bar_Seg(uint8_t, uint8_t);    &lt;br /&gt;
|Set one Hour Bar Segment to LCD_MODE (0-23)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Set_Hour_Bar_Val(uint8_t, uint8_t);&lt;br /&gt;
|Set all Hour Bar Segments from 0 to val to LCD_MODE (0-23)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Update(void);                        &lt;br /&gt;
|Request immidiate LCD-Update (normal only when bitplane changes)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t LCD_Contrast_Adjust (int8_t);           &lt;br /&gt;
|Adjust the contrast&lt;br /&gt;
|&#039;&#039;&#039;not tested yet&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Entwicklungsumgebung =&lt;br /&gt;
* Editor, Debugger, Compiler&lt;br /&gt;
** WinAVR version (20071221), sprich GCC 4.2.2 sowie avr-libc 1.6.0&lt;br /&gt;
** AVR Studio 4 &lt;br /&gt;
* JTAG ICE&lt;br /&gt;
** Atmel AVR JTAGICE MK2 &lt;br /&gt;
** AVR Dragon (z.B. http://elmicro.com/de/atavrdragon.html)&lt;br /&gt;
** Olimex-Seriell http://www.olimex.com/dev/avr-jtag.html  &lt;br /&gt;
** Olimex-USB http://www.olimex.com/dev/avr-usb-jtag.html &lt;br /&gt;
&lt;br /&gt;
= Sonstiges =&lt;br /&gt;
== Altes Protokoll ==&lt;br /&gt;
[[HR20_Protocol_V2 | Hier ]] hat mal einer ein Protokoll eingegeben.&lt;br /&gt;
Das scheint aber nicht zu der Version 2.04 zu passen. &lt;br /&gt;
Ich habe es nicht gelöscht, falls es jemanden interessiert.&lt;br /&gt;
== SVN Anleitung ==&lt;br /&gt;
Eine Anleitung was ein SVN ist und wie man es brauchen wir hier nicht.&lt;br /&gt;
Sonst müsste hier auch ein C-Kurs, Windows-Kurs, und Elektronik-Kurs hin.&lt;br /&gt;
&lt;br /&gt;
[[Category:Projekte|!]]&lt;/div&gt;</summary>
		<author><name>Dario</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=25963</id>
		<title>Heizungssteuerung mit Honeywell HR20</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=25963"/>
		<updated>2008-02-01T14:14:29Z</updated>

		<summary type="html">&lt;p&gt;Dario: /* Phase 1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von DarioC&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Wie alles begann =&lt;br /&gt;
&lt;br /&gt;
Nachdem von Uwe Felgentreu vor nunmehr vor über drei Jahren (genau am 17.11.2004 um 11:26) hier in diesem Forum den Thread mit dem Titel &#039;&#039;Honeywell Rondostat HR20E per AVR steuern und konfigurieren&#039;&#039; gestartet hat ist es nun langsam soweit, dass das Ganze auch ein Projekt wird. &lt;br /&gt;
&lt;br /&gt;
Den Thread dazu kann der interessierte Leser [http://www.mikrocontroller.net/topic/17603 hier nachlesen] &lt;br /&gt;
&lt;br /&gt;
= Projektziel =&lt;br /&gt;
&lt;br /&gt;
Wir konzentrieren uns in erster Linie auf den Honeywell Rondostat HR20E mit ausgelieferten Softwareversion 2.04. Dass es ähnliche andere Geräte gibt behalten wir bei der Entwicklung im Hinterkopf.&lt;br /&gt;
&lt;br /&gt;
Basierend auf dieser Hardware wollen wir eine neue Software entwickeln. &lt;br /&gt;
Dabe können wir ausser der Hardware nichts weiter verwenden, da die Originalsoftware geschützt ist und nicht ausgelesen werden kann.&lt;br /&gt;
&lt;br /&gt;
== Phase 1 ==&lt;br /&gt;
Die Software soll die Funktionen bieten, die die Originalsoftware auch bietet, später können dies dann um zusätzliche Funktionen erweitert werden. Die wichtigsten Funktionen sind:&lt;br /&gt;
&lt;br /&gt;
* Temperaturregelung&lt;br /&gt;
* Echtzeituhr&lt;br /&gt;
* Ausnutzen der Sleep Funktion&lt;br /&gt;
* Anzeige Soll-Temperatur und der Uhrzeit&lt;br /&gt;
* Einstellung der Soll-Temperatur&lt;br /&gt;
* Uhrzeitgesteuerte Einstellung der Soll-Temperatur &lt;br /&gt;
* Fenster-Offen-Erkennung&lt;br /&gt;
* Ventilfreispülungsfunktion&lt;br /&gt;
&lt;br /&gt;
== Phase 2 ==&lt;br /&gt;
&lt;br /&gt;
Hier liegt der Sinn des ganzen Projektes: Durch diese zusätzlichen Funktionen wollen wir den Nutzwert des Thermostaten erheblich steigern:&lt;br /&gt;
&lt;br /&gt;
* Programmierung der Schaltzeiten und Temperaturen über externe Schnittstelle&lt;br /&gt;
* Abfrage der Messwerte und Parameter über externe Schnittstelle&lt;br /&gt;
* Vernetzung der Thermostaten untereinander&lt;br /&gt;
* Zusätzliche externe Schnittstellen (neben UART auch CAN und Funk)&lt;br /&gt;
* Erweiterung der Anzeige um&lt;br /&gt;
** Ist-Temperatur &lt;br /&gt;
** Ventilstellung&lt;br /&gt;
** Funkschnittstelle&lt;br /&gt;
*** RFM12 http://www.hoperf.com/rf_fsk.asp&lt;br /&gt;
*** Zigbee http://www.meshnetics.com/zigbee-modules&lt;br /&gt;
** ...&lt;br /&gt;
* Bootloader, damit Leute mitarbeiten können, die keine JTAG haben. Mit einem JTAG könnte man den Bootloader Flashen, ohne den Thermostaten öffnen zu müssen. Von da an kann man über den Programmierstecker mit einem umgebauten Handykabel den Thermostaten neu flashen.&lt;br /&gt;
&lt;br /&gt;
= Subversion Repository =&lt;br /&gt;
Ein SVN Repository liegt auf dem freien SVN Server: https://opensvn.csie.org&lt;br /&gt;
== Zugangsdaten ==&lt;br /&gt;
Repository Location: https://OpenSVN.csie.org/hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
Browse Repository: https://OpenSVN.csie.org/viewcvs.cgi/?root=hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
TRAC: https://opensvn.csie.org/traccgi/hr20&lt;br /&gt;
== Policy ==&lt;br /&gt;
Anonymous check out ist erlaubt. &amp;lt;br&amp;gt;&lt;br /&gt;
Wer was committen will muss freigeschaltet werden. &amp;lt;br&amp;gt;&lt;br /&gt;
Dazu brauche ich ein &#039;&#039;Usernamen, Passwort&#039;&#039; und eine &#039;&#039;Mailadresse&#039;&#039;, dann kann ich das einrichten. &amp;lt;br&amp;gt;&lt;br /&gt;
Tragt Euch dazu einfach selber in die Tabelle ein, ich erledige dann den Rest.&amp;lt;br&amp;gt;&lt;br /&gt;
Das mache ich dann von Hand und da ich nicht alle 10 Minuten Mails bearbeite kann das auch schon mal einen oder zwei Tage dauern. &amp;lt;br&amp;gt;&lt;br /&gt;
Wenn sich ein Maintainer findet, gebe ich die Zugangsdaten gerne weiter.&lt;br /&gt;
== Entwickler ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! width=&amp;quot;150&amp;quot; | Entwickler&lt;br /&gt;
! width=&amp;quot;150&amp;quot; | svn Status&lt;br /&gt;
|-&lt;br /&gt;
| darioc&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|-&lt;br /&gt;
| louk&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|}&lt;br /&gt;
== Verzeichnisstrucktur ==&lt;br /&gt;
Eine Verzeichnisstrucktur ist auch schon angelegt und die ersten Daten auch drin. Hier die Verzeichnisse:&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
| &#039;&#039;&#039;/doc&#039;&#039;&#039;&lt;br /&gt;
| Für alles an Dokumenten, die selbst erstellt wurden. &amp;lt;br&amp;gt;&lt;br /&gt;
Specs, die man im Internet bekommen kann gehören hier nicht rein, &amp;lt;br&amp;gt;&lt;br /&gt;
die machen das alles nur unnötig gross und das auschecken dauert länger.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/playground&#039;&#039;&#039; &lt;br /&gt;
| Wie der Name schon sagt, zum rumspielen und testen. &amp;lt;br&amp;gt;&lt;br /&gt;
Hier kommt jegliche art von Codeschnipseln hin, die zu Testen da sind &amp;lt;br&amp;gt;&lt;br /&gt;
und (derzeit) noch icht Teil des Programmes sind.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/source&#039;&#039;&#039; &lt;br /&gt;
| Hier kommt die Applikation rein mit allen Modulen und makefiles.&amp;lt;br&amp;gt;&lt;br /&gt;
Bitte haltet das Repository sauber und checkt nur Dateien ein, &amp;lt;br&amp;gt;&lt;br /&gt;
die auch Sinn  machen, &amp;quot;thumbs.db&amp;quot; oder andere Temp-Dateien gehören hier nicht rein.&lt;br /&gt;
|}&lt;br /&gt;
== SVN Client und Anleitung ==&lt;br /&gt;
Windows-User nutzen am besten den Tortoise-SVN-Client, den man kostenfrei [http://tortoisesvn.tigris.org hier runterladen] kann. &amp;lt;br&amp;gt;&lt;br /&gt;
Dort gibt es auch eine Anleitung zum Arbeiten mit SVN. &lt;br /&gt;
&lt;br /&gt;
= Analyse der Hardware =&lt;br /&gt;
Die Analyse hat der Dario schon gemacht, zu finden ist die jeweils aktuelle Version &lt;br /&gt;
[http://www.carluccio.de/img/hr20/analyse.pdf als PDF hier] oder [https://opensvn.csie.org/viewcvs.cgi/doc/analyse.pdf hier im SVN].&lt;br /&gt;
&lt;br /&gt;
= Benötigte Module =&lt;br /&gt;
&lt;br /&gt;
Um das Ganze nun etwas zu koordinieren hier eine Liste der benötigten Module und deren Funktionen. &amp;lt;br&amp;gt;&lt;br /&gt;
Diese dient dazu später die Aufgaben zu verteilen:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Module&lt;br /&gt;
! Function&lt;br /&gt;
! Developer&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| LCD&lt;br /&gt;
| Display Driver:&amp;lt;BR&amp;gt;&lt;br /&gt;
* Init Display&lt;br /&gt;
* Set Segments&lt;br /&gt;
* Print HEX, DEC, TEMP&lt;br /&gt;
* Blink&lt;br /&gt;
* e.t.c&lt;br /&gt;
| dario&lt;br /&gt;
| &#039;&#039;&#039;DONE&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UART &lt;br /&gt;
| UART-Driver&lt;br /&gt;
* menue (Debug und Steuerung)&lt;br /&gt;
** show and set desired temperature &lt;br /&gt;
** show and set Time and Date&lt;br /&gt;
** show actual temperature&lt;br /&gt;
** show (and set) actual valveposition &lt;br /&gt;
** show and set timetable and temperatures&lt;br /&gt;
* optional &lt;br /&gt;
** adressierung of HR20 (for BUS, RF)&lt;br /&gt;
** authentication end encryption&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| RTC&lt;br /&gt;
| Time and Date Handler&lt;br /&gt;
* init timer&lt;br /&gt;
* use IRQ with 32kHz crystal&lt;br /&gt;
* handle time and date&lt;br /&gt;
** daylight saving&lt;br /&gt;
** consult leapyear &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| MENU&lt;br /&gt;
| Display Menu&lt;br /&gt;
* get keystate (with debounce)&lt;br /&gt;
** multi keypress (nedded for hidden menue?)&lt;br /&gt;
** longer keypress / double click (nedded?)&lt;br /&gt;
* get position of wheel (incremental counter)&lt;br /&gt;
* controll display&lt;br /&gt;
* functionality:&lt;br /&gt;
* show and set desired temperature&lt;br /&gt;
* show and set time and date &lt;br /&gt;
* show actual temperature&lt;br /&gt;
* show actual valveposition &lt;br /&gt;
* show and set timetable and temperatures&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| MOTOR&lt;br /&gt;
| Motor-Driver &lt;br /&gt;
* set desired valveposition &lt;br /&gt;
** quick&lt;br /&gt;
** asympthotic&lt;br /&gt;
** quiet&lt;br /&gt;
* callibrate for Valve&lt;br /&gt;
* Genereate ERROR if motor not turning (low energie)&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| TEMP&lt;br /&gt;
| Temperaturesensor-Driver &lt;br /&gt;
* init Sensor &lt;br /&gt;
* IQR driven (500ms)&lt;br /&gt;
* start A/D conversion (IQR driven)&lt;br /&gt;
* get A/D Value and calc temperature&lt;br /&gt;
* calibration for sensor (needed?)&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| PID&lt;br /&gt;
| PID Algorithm&lt;br /&gt;
* calculate desired valveposition out of&lt;br /&gt;
** last valveposition(s) &lt;br /&gt;
** last temperature(s)&lt;br /&gt;
** actual temperature&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| BOOT&lt;br /&gt;
| Bootloader&lt;br /&gt;
we need a bootloader so that the developers can flash the software &lt;br /&gt;
without a JTAG cable and without disassembling the HR20.&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| LOG&lt;br /&gt;
| Datalogger&lt;br /&gt;
* Operating Hours&lt;br /&gt;
** motor in action&lt;br /&gt;
** ODOmeter&lt;br /&gt;
** since Battery Exchange&lt;br /&gt;
* Errors&lt;br /&gt;
* Logfiles (only with additional hardware)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| UID&lt;br /&gt;
| Unique ID for identification&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== API Beschreibung ==&lt;br /&gt;
=== LCD ===&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Funtion&lt;br /&gt;
! Propose&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Init(void);            &lt;br /&gt;
|Init the LCD Controller&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_All_Segments(uint8_t);&lt;br /&gt;
|Set all segments to LCD_MODE&lt;br /&gt;
| done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Clear_All(void);                       &lt;br /&gt;
|Clear all segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Clear_Hour_Bar(void);&lt;br /&gt;
|Clear 24 bar segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Clear_Symbols(void);&lt;br /&gt;
|Clear AUTO MANU PROG SUN MOON SNOW&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Clear_Numbers(void);&lt;br /&gt;
|Clear 7 Segments ans Collumns&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Print_Dec(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print DEC-val in two 7 Segments 0-99&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Print_Hex(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print HEX-val in two 7 Segments 0-ff&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Print_No(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print one ditig in one 7 Segment&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Print_Temp(uint8_t, uint8_t);&lt;br /&gt;
|Print desired temperature (val+4,9)°C&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Set_Seg(uint8_t, uint8_t);          &lt;br /&gt;
|Set one Segment to LCD_MODE (0-69)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Set_Hour_Bar_Seg(uint8_t, uint8_t);    &lt;br /&gt;
|Set one Hour Bar Segment to LCD_MODE (0-23)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Set_Hour_Bar_Val(uint8_t, uint8_t);&lt;br /&gt;
|Set all Hour Bar Segments from 0 to val to LCD_MODE (0-23)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Update(void);                        &lt;br /&gt;
|Request immidiate LCD-Update (normal only when bitplane changes)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t LCD_Contrast_Adjust (int8_t);           &lt;br /&gt;
|Adjust the contrast&lt;br /&gt;
|&#039;&#039;&#039;not tested yet&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Entwicklungsumgebung =&lt;br /&gt;
* Editor, Debugger, Compiler&lt;br /&gt;
** WinAVR version (20071221), sprich GCC 4.2.2 sowie avr-libc 1.6.0&lt;br /&gt;
** AVR Studio 4 &lt;br /&gt;
* JTAG ICE&lt;br /&gt;
** Atmel AVR JTAGICE MK2 &lt;br /&gt;
** AVR Dragon (z.B. http://elmicro.com/de/atavrdragon.html)&lt;br /&gt;
** Olimex-Seriell http://www.olimex.com/dev/avr-jtag.html  &lt;br /&gt;
** Olimex-USB http://www.olimex.com/dev/avr-usb-jtag.html &lt;br /&gt;
&lt;br /&gt;
= Sonstiges =&lt;br /&gt;
== Altes Protokoll ==&lt;br /&gt;
[[HR20_Protocol_V2 | Hier ]] hat mal einer ein Protokoll eingegeben.&lt;br /&gt;
Das scheint aber nicht zu der Version 2.04 zu passen. &lt;br /&gt;
Ich habe es nicht gelöscht, falls es jemanden interessiert.&lt;br /&gt;
== SVN Anleitung ==&lt;br /&gt;
Eine Anleitung was ein SVN ist und wie man es brauchen wir hier nicht.&lt;br /&gt;
Sonst müsste hier auch ein C-Kurs, Windows-Kurs, und Elektronik-Kurs hin.&lt;br /&gt;
&lt;br /&gt;
[[Category:Projekte|!]]&lt;/div&gt;</summary>
		<author><name>Dario</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=25962</id>
		<title>Heizungssteuerung mit Honeywell HR20</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=25962"/>
		<updated>2008-02-01T14:12:23Z</updated>

		<summary type="html">&lt;p&gt;Dario: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von DarioC&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Wie alles begann =&lt;br /&gt;
&lt;br /&gt;
Nachdem von Uwe Felgentreu vor nunmehr vor über drei Jahren (genau am 17.11.2004 um 11:26) hier in diesem Forum den Thread mit dem Titel &#039;&#039;Honeywell Rondostat HR20E per AVR steuern und konfigurieren&#039;&#039; gestartet hat ist es nun langsam soweit, dass das Ganze auch ein Projekt wird. &lt;br /&gt;
&lt;br /&gt;
Den Thread dazu kann der interessierte Leser [http://www.mikrocontroller.net/topic/17603 hier nachlesen] &lt;br /&gt;
&lt;br /&gt;
= Projektziel =&lt;br /&gt;
&lt;br /&gt;
Wir konzentrieren uns in erster Linie auf den Honeywell Rondostat HR20E mit ausgelieferten Softwareversion 2.04. Dass es ähnliche andere Geräte gibt behalten wir bei der Entwicklung im Hinterkopf.&lt;br /&gt;
&lt;br /&gt;
Basierend auf dieser Hardware wollen wir eine neue Software entwickeln. &lt;br /&gt;
Dabe können wir ausser der Hardware nichts weiter verwenden, da die Originalsoftware geschützt ist und nicht ausgelesen werden kann.&lt;br /&gt;
&lt;br /&gt;
== Phase 1 ==&lt;br /&gt;
Die Software soll die Funktionen bieten, die die Originalsoftware auch bietet, später können dies dann um zusätzliche Funktionen erweitert werden. Die wichtigsten Funktionen sind:&lt;br /&gt;
&lt;br /&gt;
* Temperaturregelung&lt;br /&gt;
* Echtzeituhr&lt;br /&gt;
* Ausnutzen der Sleep Funktion&lt;br /&gt;
* Anzeige Soll-Temperatur und der Uhrzeit&lt;br /&gt;
* Einstellung der Soll-Temperatur&lt;br /&gt;
* Uhrzeitgesteuerte einstellung der Soll-Temperatur &lt;br /&gt;
* Fenster-Offen-Erkennung&lt;br /&gt;
* Ventilfreispülungsfunktion&lt;br /&gt;
&lt;br /&gt;
== Phase 2 ==&lt;br /&gt;
&lt;br /&gt;
Hier liegt der Sinn des ganzen Projektes: Durch diese zusätzlichen Funktionen wollen wir den Nutzwert des Thermostaten erheblich steigern:&lt;br /&gt;
&lt;br /&gt;
* Programmierung der Schaltzeiten und Temperaturen über externe Schnittstelle&lt;br /&gt;
* Abfrage der Messwerte und Parameter über externe Schnittstelle&lt;br /&gt;
* Vernetzung der Thermostaten untereinander&lt;br /&gt;
* Zusätzliche externe Schnittstellen (neben UART auch CAN und Funk)&lt;br /&gt;
* Erweiterung der Anzeige um&lt;br /&gt;
** Ist-Temperatur &lt;br /&gt;
** Ventilstellung&lt;br /&gt;
** Funkschnittstelle&lt;br /&gt;
*** RFM12 http://www.hoperf.com/rf_fsk.asp&lt;br /&gt;
*** Zigbee http://www.meshnetics.com/zigbee-modules&lt;br /&gt;
** ...&lt;br /&gt;
* Bootloader, damit Leute mitarbeiten können, die keine JTAG haben. Mit einem JTAG könnte man den Bootloader Flashen, ohne den Thermostaten öffnen zu müssen. Von da an kann man über den Programmierstecker mit einem umgebauten Handykabel den Thermostaten neu flashen.&lt;br /&gt;
&lt;br /&gt;
= Subversion Repository =&lt;br /&gt;
Ein SVN Repository liegt auf dem freien SVN Server: https://opensvn.csie.org&lt;br /&gt;
== Zugangsdaten ==&lt;br /&gt;
Repository Location: https://OpenSVN.csie.org/hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
Browse Repository: https://OpenSVN.csie.org/viewcvs.cgi/?root=hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
TRAC: https://opensvn.csie.org/traccgi/hr20&lt;br /&gt;
== Policy ==&lt;br /&gt;
Anonymous check out ist erlaubt. &amp;lt;br&amp;gt;&lt;br /&gt;
Wer was committen will muss freigeschaltet werden. &amp;lt;br&amp;gt;&lt;br /&gt;
Dazu brauche ich ein &#039;&#039;Usernamen, Passwort&#039;&#039; und eine &#039;&#039;Mailadresse&#039;&#039;, dann kann ich das einrichten. &amp;lt;br&amp;gt;&lt;br /&gt;
Tragt Euch dazu einfach selber in die Tabelle ein, ich erledige dann den Rest.&amp;lt;br&amp;gt;&lt;br /&gt;
Das mache ich dann von Hand und da ich nicht alle 10 Minuten Mails bearbeite kann das auch schon mal einen oder zwei Tage dauern. &amp;lt;br&amp;gt;&lt;br /&gt;
Wenn sich ein Maintainer findet, gebe ich die Zugangsdaten gerne weiter.&lt;br /&gt;
== Entwickler ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! width=&amp;quot;150&amp;quot; | Entwickler&lt;br /&gt;
! width=&amp;quot;150&amp;quot; | svn Status&lt;br /&gt;
|-&lt;br /&gt;
| darioc&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|-&lt;br /&gt;
| louk&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|}&lt;br /&gt;
== Verzeichnisstrucktur ==&lt;br /&gt;
Eine Verzeichnisstrucktur ist auch schon angelegt und die ersten Daten auch drin. Hier die Verzeichnisse:&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
| &#039;&#039;&#039;/doc&#039;&#039;&#039;&lt;br /&gt;
| Für alles an Dokumenten, die selbst erstellt wurden. &amp;lt;br&amp;gt;&lt;br /&gt;
Specs, die man im Internet bekommen kann gehören hier nicht rein, &amp;lt;br&amp;gt;&lt;br /&gt;
die machen das alles nur unnötig gross und das auschecken dauert länger.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/playground&#039;&#039;&#039; &lt;br /&gt;
| Wie der Name schon sagt, zum rumspielen und testen. &amp;lt;br&amp;gt;&lt;br /&gt;
Hier kommt jegliche art von Codeschnipseln hin, die zu Testen da sind &amp;lt;br&amp;gt;&lt;br /&gt;
und (derzeit) noch icht Teil des Programmes sind.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/source&#039;&#039;&#039; &lt;br /&gt;
| Hier kommt die Applikation rein mit allen Modulen und makefiles.&amp;lt;br&amp;gt;&lt;br /&gt;
Bitte haltet das Repository sauber und checkt nur Dateien ein, &amp;lt;br&amp;gt;&lt;br /&gt;
die auch Sinn  machen, &amp;quot;thumbs.db&amp;quot; oder andere Temp-Dateien gehören hier nicht rein.&lt;br /&gt;
|}&lt;br /&gt;
== SVN Client und Anleitung ==&lt;br /&gt;
Windows-User nutzen am besten den Tortoise-SVN-Client, den man kostenfrei [http://tortoisesvn.tigris.org hier runterladen] kann. &amp;lt;br&amp;gt;&lt;br /&gt;
Dort gibt es auch eine Anleitung zum Arbeiten mit SVN. &lt;br /&gt;
&lt;br /&gt;
= Analyse der Hardware =&lt;br /&gt;
Die Analyse hat der Dario schon gemacht, zu finden ist die jeweils aktuelle Version &lt;br /&gt;
[http://www.carluccio.de/img/hr20/analyse.pdf als PDF hier] oder [https://opensvn.csie.org/viewcvs.cgi/doc/analyse.pdf hier im SVN].&lt;br /&gt;
&lt;br /&gt;
= Benötigte Module =&lt;br /&gt;
&lt;br /&gt;
Um das Ganze nun etwas zu koordinieren hier eine Liste der benötigten Module und deren Funktionen. &amp;lt;br&amp;gt;&lt;br /&gt;
Diese dient dazu später die Aufgaben zu verteilen:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Module&lt;br /&gt;
! Function&lt;br /&gt;
! Developer&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| LCD&lt;br /&gt;
| Display Driver:&amp;lt;BR&amp;gt;&lt;br /&gt;
* Init Display&lt;br /&gt;
* Set Segments&lt;br /&gt;
* Print HEX, DEC, TEMP&lt;br /&gt;
* Blink&lt;br /&gt;
* e.t.c&lt;br /&gt;
| dario&lt;br /&gt;
| &#039;&#039;&#039;DONE&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UART &lt;br /&gt;
| UART-Driver&lt;br /&gt;
* menue (Debug und Steuerung)&lt;br /&gt;
** show and set desired temperature &lt;br /&gt;
** show and set Time and Date&lt;br /&gt;
** show actual temperature&lt;br /&gt;
** show (and set) actual valveposition &lt;br /&gt;
** show and set timetable and temperatures&lt;br /&gt;
* optional &lt;br /&gt;
** adressierung of HR20 (for BUS, RF)&lt;br /&gt;
** authentication end encryption&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| RTC&lt;br /&gt;
| Time and Date Handler&lt;br /&gt;
* init timer&lt;br /&gt;
* use IRQ with 32kHz crystal&lt;br /&gt;
* handle time and date&lt;br /&gt;
** daylight saving&lt;br /&gt;
** consult leapyear &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| MENU&lt;br /&gt;
| Display Menu&lt;br /&gt;
* get keystate (with debounce)&lt;br /&gt;
** multi keypress (nedded for hidden menue?)&lt;br /&gt;
** longer keypress / double click (nedded?)&lt;br /&gt;
* get position of wheel (incremental counter)&lt;br /&gt;
* controll display&lt;br /&gt;
* functionality:&lt;br /&gt;
* show and set desired temperature&lt;br /&gt;
* show and set time and date &lt;br /&gt;
* show actual temperature&lt;br /&gt;
* show actual valveposition &lt;br /&gt;
* show and set timetable and temperatures&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| MOTOR&lt;br /&gt;
| Motor-Driver &lt;br /&gt;
* set desired valveposition &lt;br /&gt;
** quick&lt;br /&gt;
** asympthotic&lt;br /&gt;
** quiet&lt;br /&gt;
* callibrate for Valve&lt;br /&gt;
* Genereate ERROR if motor not turning (low energie)&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| TEMP&lt;br /&gt;
| Temperaturesensor-Driver &lt;br /&gt;
* init Sensor &lt;br /&gt;
* IQR driven (500ms)&lt;br /&gt;
* start A/D conversion (IQR driven)&lt;br /&gt;
* get A/D Value and calc temperature&lt;br /&gt;
* calibration for sensor (needed?)&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| PID&lt;br /&gt;
| PID Algorithm&lt;br /&gt;
* calculate desired valveposition out of&lt;br /&gt;
** last valveposition(s) &lt;br /&gt;
** last temperature(s)&lt;br /&gt;
** actual temperature&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| BOOT&lt;br /&gt;
| Bootloader&lt;br /&gt;
we need a bootloader so that the developers can flash the software &lt;br /&gt;
without a JTAG cable and without disassembling the HR20.&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| LOG&lt;br /&gt;
| Datalogger&lt;br /&gt;
* Operating Hours&lt;br /&gt;
** motor in action&lt;br /&gt;
** ODOmeter&lt;br /&gt;
** since Battery Exchange&lt;br /&gt;
* Errors&lt;br /&gt;
* Logfiles (only with additional hardware)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| UID&lt;br /&gt;
| Unique ID for identification&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== API Beschreibung ==&lt;br /&gt;
=== LCD ===&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Funtion&lt;br /&gt;
! Propose&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Init(void);            &lt;br /&gt;
|Init the LCD Controller&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_All_Segments(uint8_t);&lt;br /&gt;
|Set all segments to LCD_MODE&lt;br /&gt;
| done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Clear_All(void);                       &lt;br /&gt;
|Clear all segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Clear_Hour_Bar(void);&lt;br /&gt;
|Clear 24 bar segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Clear_Symbols(void);&lt;br /&gt;
|Clear AUTO MANU PROG SUN MOON SNOW&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Clear_Numbers(void);&lt;br /&gt;
|Clear 7 Segments ans Collumns&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Print_Dec(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print DEC-val in two 7 Segments 0-99&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Print_Hex(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print HEX-val in two 7 Segments 0-ff&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Print_No(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print one ditig in one 7 Segment&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Print_Temp(uint8_t, uint8_t);&lt;br /&gt;
|Print desired temperature (val+4,9)°C&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Set_Seg(uint8_t, uint8_t);          &lt;br /&gt;
|Set one Segment to LCD_MODE (0-69)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Set_Hour_Bar_Seg(uint8_t, uint8_t);    &lt;br /&gt;
|Set one Hour Bar Segment to LCD_MODE (0-23)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Set_Hour_Bar_Val(uint8_t, uint8_t);&lt;br /&gt;
|Set all Hour Bar Segments from 0 to val to LCD_MODE (0-23)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Update(void);                        &lt;br /&gt;
|Request immidiate LCD-Update (normal only when bitplane changes)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t LCD_Contrast_Adjust (int8_t);           &lt;br /&gt;
|Adjust the contrast&lt;br /&gt;
|&#039;&#039;&#039;not tested yet&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Entwicklungsumgebung =&lt;br /&gt;
* Editor, Debugger, Compiler&lt;br /&gt;
** WinAVR version (20071221), sprich GCC 4.2.2 sowie avr-libc 1.6.0&lt;br /&gt;
** AVR Studio 4 &lt;br /&gt;
* JTAG ICE&lt;br /&gt;
** Atmel AVR JTAGICE MK2 &lt;br /&gt;
** AVR Dragon (z.B. http://elmicro.com/de/atavrdragon.html)&lt;br /&gt;
** Olimex-Seriell http://www.olimex.com/dev/avr-jtag.html  &lt;br /&gt;
** Olimex-USB http://www.olimex.com/dev/avr-usb-jtag.html &lt;br /&gt;
&lt;br /&gt;
= Sonstiges =&lt;br /&gt;
== Altes Protokoll ==&lt;br /&gt;
[[HR20_Protocol_V2 | Hier ]] hat mal einer ein Protokoll eingegeben.&lt;br /&gt;
Das scheint aber nicht zu der Version 2.04 zu passen. &lt;br /&gt;
Ich habe es nicht gelöscht, falls es jemanden interessiert.&lt;br /&gt;
== SVN Anleitung ==&lt;br /&gt;
Eine Anleitung was ein SVN ist und wie man es brauchen wir hier nicht.&lt;br /&gt;
Sonst müsste hier auch ein C-Kurs, Windows-Kurs, und Elektronik-Kurs hin.&lt;br /&gt;
&lt;br /&gt;
[[Category:Projekte|!]]&lt;/div&gt;</summary>
		<author><name>Dario</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=25961</id>
		<title>Heizungssteuerung mit Honeywell HR20</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Heizungssteuerung_mit_Honeywell_HR20&amp;diff=25961"/>
		<updated>2008-02-01T14:11:21Z</updated>

		<summary type="html">&lt;p&gt;Dario: /* LCD */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;von DarioC&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Wie alles begann =&lt;br /&gt;
&lt;br /&gt;
Nachdem von Uwe Felgentreu vor nunmehr vor über drei Jahren (genau am 17.11.2004 um 11:26) hier in diesem Forum den Thread mit dem Titel &#039;&#039;Honeywell Rondostat HR20E per AVR steuern und konfigurieren&#039;&#039; gestartet hat ist es nun langsam soweit, dass das Ganze auch ein Projekt wird. &lt;br /&gt;
&lt;br /&gt;
Den Thread dazu kann der interessierte Leser [http://www.mikrocontroller.net/topic/17603 hier nachlesen] &lt;br /&gt;
&lt;br /&gt;
= Projektziel =&lt;br /&gt;
&lt;br /&gt;
Wir konzentrieren uns in erster Linie auf den Honeywell Rondostat HR20E mit ausgelieferten Softwareversion 2.04. Dass es ähnliche andere Geräte gibt behalten wir bei der Entwicklung im Hinterkopf.&lt;br /&gt;
&lt;br /&gt;
Basierend auf dieser Hardware wollen wir eine neue Software entwickeln. &lt;br /&gt;
Dabe können wir ausser der Hardware nichts weiter verwenden, da die Originalsoftware geschützt ist und nicht ausgelesen werden kann.&lt;br /&gt;
&lt;br /&gt;
== Phase 1 ==&lt;br /&gt;
Die Software soll die Funktionen bieten, die die Originalsoftware auch bietet, später können dies dann um zusätzliche Funktionen erweitert werden. Die wichtigsten Funktionen sind:&lt;br /&gt;
&lt;br /&gt;
* Temperaturregelung&lt;br /&gt;
* Echtzeituhr&lt;br /&gt;
* Ausnutzen der Sleep Funktion&lt;br /&gt;
* Anzeige Soll-Temperatur und der Uhrzeit&lt;br /&gt;
* Einstellung der Soll-Temperatur&lt;br /&gt;
* Uhrzeitgesteuerte einstellung der Soll-Temperatur &lt;br /&gt;
* Fenster-Offen-Erkennung&lt;br /&gt;
* Ventilfreispülungsfunktion&lt;br /&gt;
&lt;br /&gt;
== Phase 2 ==&lt;br /&gt;
&lt;br /&gt;
Hier liegt der Sinn des ganzen Projektes: Durch diese zusätzlichen Funktionen wollen wir den Nutzwert des Thermostaten erheblich steigern:&lt;br /&gt;
&lt;br /&gt;
* Programmierung der Schaltzeiten und Temperaturen über externe Schnittstelle&lt;br /&gt;
* Abfrage der Messwerte und Parameter über externe Schnittstelle&lt;br /&gt;
* Vernetzung der Thermostaten untereinander&lt;br /&gt;
* Zusätzliche externe Schnittstellen (neben UART auch CAN und Funk)&lt;br /&gt;
* Erweiterung der Anzeige um&lt;br /&gt;
** Ist-Temperatur &lt;br /&gt;
** Ventilstellung&lt;br /&gt;
** Funkschnittstelle&lt;br /&gt;
*** RFM12 http://www.hoperf.com/rf_fsk.asp&lt;br /&gt;
*** Zigbee http://www.meshnetics.com/zigbee-modules&lt;br /&gt;
** ...&lt;br /&gt;
* Bootloader, damit Leute mitarbeiten können, die keine JTAG haben. Mit einem JTAG könnte man den Bootloader Flashen, ohne den Thermostaten öffnen zu müssen. Von da an kann man über den Programmierstecker mit einem umgebauten Handykabel den Thermostaten neu flashen.&lt;br /&gt;
&lt;br /&gt;
= Subversion Repository =&lt;br /&gt;
Ein SVN Repository liegt auf dem freien SVN Server: https://opensvn.csie.org&lt;br /&gt;
== Zugangsdaten ==&lt;br /&gt;
Repository Location: https://OpenSVN.csie.org/hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
Browse Repository: https://OpenSVN.csie.org/viewcvs.cgi/?root=hr20 &amp;lt;BR&amp;gt;&lt;br /&gt;
TRAC: https://opensvn.csie.org/traccgi/hr20&lt;br /&gt;
== Policy ==&lt;br /&gt;
Anonymous check out ist erlaubt. &amp;lt;br&amp;gt;&lt;br /&gt;
Wer was committen will muss freigeschaltet werden. &amp;lt;br&amp;gt;&lt;br /&gt;
Dazu brauche ich ein &#039;&#039;Usernamen, Passwort&#039;&#039; und eine &#039;&#039;Mailadresse&#039;&#039;, dann kann ich das einrichten. &amp;lt;br&amp;gt;&lt;br /&gt;
Tragt Euch dazu einfach selber in die Tabelle ein, ich erledige dann den Rest.&amp;lt;br&amp;gt;&lt;br /&gt;
Das mache ich dann von Hand und da ich nicht alle 10 Minuten Mails bearbeite kann das auch schon mal einen oder zwei Tage dauern. &amp;lt;br&amp;gt;&lt;br /&gt;
Wenn sich ein Maintainer findet, gebe ich die Zugangsdaten gerne weiter.&lt;br /&gt;
== Entwickler ==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! width=&amp;quot;150&amp;quot; | Entwickler&lt;br /&gt;
! width=&amp;quot;150&amp;quot; | svn Status&lt;br /&gt;
|-&lt;br /&gt;
| darioc&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|-&lt;br /&gt;
| louk&lt;br /&gt;
| angelegt: rw&lt;br /&gt;
|}&lt;br /&gt;
== Verzeichnisstrucktur ==&lt;br /&gt;
Eine Verzeichnisstrucktur ist auch schon angelegt und die ersten Daten auch drin. Hier die Verzeichnisse:&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
| &#039;&#039;&#039;/doc&#039;&#039;&#039;&lt;br /&gt;
| Für alles an Dokumenten, die selbst erstellt wurden. &amp;lt;br&amp;gt;&lt;br /&gt;
Specs, die man im Internet bekommen kann gehören hier nicht rein, &amp;lt;br&amp;gt;&lt;br /&gt;
die machen das alles nur unnötig gross und das auschecken dauert länger.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/playground&#039;&#039;&#039; &lt;br /&gt;
| Wie der Name schon sagt, zum rumspielen und testen. &amp;lt;br&amp;gt;&lt;br /&gt;
Hier kommt jegliche art von Codeschnipseln hin, die zu Testen da sind &amp;lt;br&amp;gt;&lt;br /&gt;
und (derzeit) noch icht Teil des Programmes sind.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;/source&#039;&#039;&#039; &lt;br /&gt;
| Hier kommt die Applikation rein mit allen Modulen und makefiles.&amp;lt;br&amp;gt;&lt;br /&gt;
Bitte haltet das Repository sauber und checkt nur Dateien ein, &amp;lt;br&amp;gt;&lt;br /&gt;
die auch Sinn  machen, &amp;quot;thumbs.db&amp;quot; oder andere Temp-Dateien gehören hier nicht rein.&lt;br /&gt;
|}&lt;br /&gt;
== SVN Client und Anleitung ==&lt;br /&gt;
Windows-User nutzen am besten den Tortoise-SVN-Client, den man kostenfrei [http://tortoisesvn.tigris.org hier runterladen] kann. &amp;lt;br&amp;gt;&lt;br /&gt;
Dort gibt es auch eine Anleitung zum Arbeiten mit SVN. &lt;br /&gt;
&lt;br /&gt;
= Analyse der Hardware =&lt;br /&gt;
Die Analyse hat der Dario schon gemacht, zu finden ist die jeweils aktuelle Version &lt;br /&gt;
[http://www.carluccio.de/img/hr20/analyse.pdf als PDF hier] oder [https://opensvn.csie.org/viewcvs.cgi/doc/analyse.pdf hier im SVN].&lt;br /&gt;
&lt;br /&gt;
= Benötigte Module =&lt;br /&gt;
&lt;br /&gt;
Um das Ganze nun etwas zu koordinieren hier eine Liste der benötigten Module und deren Funktionen. &amp;lt;br&amp;gt;&lt;br /&gt;
Diese dient dazu später die Aufgaben zu verteilen:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Module&lt;br /&gt;
! Function&lt;br /&gt;
! Developer&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| LCD&lt;br /&gt;
| Display Driver:&amp;lt;BR&amp;gt;&lt;br /&gt;
* Init Display&lt;br /&gt;
* Set Segments&lt;br /&gt;
* Print HEX, DEC, TEMP&lt;br /&gt;
* Blink&lt;br /&gt;
* e.t.c&lt;br /&gt;
| dario&lt;br /&gt;
| &#039;&#039;&#039;DONE&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| UART &lt;br /&gt;
| UART-Driver&lt;br /&gt;
* menue (Debug und Steuerung)&lt;br /&gt;
** show and set desired temperature &lt;br /&gt;
** show and set Time and Date&lt;br /&gt;
** show actual temperature&lt;br /&gt;
** show (and set) actual valveposition &lt;br /&gt;
** show and set timetable and temperatures&lt;br /&gt;
* optional &lt;br /&gt;
** adressierung of HR20 (for BUS, RF)&lt;br /&gt;
** authentication end encryption&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| RTC&lt;br /&gt;
| Time and Date Handler&lt;br /&gt;
* init timer&lt;br /&gt;
* use IRQ with 32kHz crystal&lt;br /&gt;
* handle time and date&lt;br /&gt;
** daylight saving&lt;br /&gt;
** consult leapyear &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| MENU&lt;br /&gt;
| Display Menu&lt;br /&gt;
* get keystate (with debounce)&lt;br /&gt;
** multi keypress (nedded for hidden menue?)&lt;br /&gt;
** longer keypress / double click (nedded?)&lt;br /&gt;
* get position of wheel (incremental counter)&lt;br /&gt;
* controll display&lt;br /&gt;
* functionality:&lt;br /&gt;
* show and set desired temperature&lt;br /&gt;
* show and set time and date &lt;br /&gt;
* show actual temperature&lt;br /&gt;
* show actual valveposition &lt;br /&gt;
* show and set timetable and temperatures&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| MOTOR&lt;br /&gt;
| Motor-Driver &lt;br /&gt;
* set desired valveposition &lt;br /&gt;
** quick&lt;br /&gt;
** asympthotic&lt;br /&gt;
** quiet&lt;br /&gt;
* callibrate for Valve&lt;br /&gt;
* Genereate ERROR if motor not turning (low energie)&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| TEMP&lt;br /&gt;
| Temperaturesensor-Driver &lt;br /&gt;
* init Sensor &lt;br /&gt;
* IQR driven (500ms)&lt;br /&gt;
* start A/D conversion (IQR driven)&lt;br /&gt;
* get A/D Value and calc temperature&lt;br /&gt;
* calibration for sensor (needed?)&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| PID&lt;br /&gt;
| PID Algorithm&lt;br /&gt;
* calculate desired valveposition out of&lt;br /&gt;
** last valveposition(s) &lt;br /&gt;
** last temperature(s)&lt;br /&gt;
** actual temperature&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| BOOT&lt;br /&gt;
| Bootloader&lt;br /&gt;
we need a bootloader so that the developers can flash the software &lt;br /&gt;
without a JTAG cable and without disassembling the HR20.&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| LOG&lt;br /&gt;
| Datalogger&lt;br /&gt;
* Operating Hours&lt;br /&gt;
** motor in action&lt;br /&gt;
** ODOmeter&lt;br /&gt;
** since Battery Exchange&lt;br /&gt;
* Errors&lt;br /&gt;
* Logfiles (only with additional hardware)&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| UID&lt;br /&gt;
| Unique ID for identification&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== API Beschreibung ==&lt;br /&gt;
=== LCD ===&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; &lt;br /&gt;
! Funtion&lt;br /&gt;
! Propose&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Init(void);            &lt;br /&gt;
|Init the LCD Controller&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_All_Segments(uint8_t);&lt;br /&gt;
|Set all segments to LCD_MODE&lt;br /&gt;
| done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Clear_All(void);                       &lt;br /&gt;
|Clear all segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Clear_Hour_Bar(void);&lt;br /&gt;
|Clear 24 bar segments&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Clear_Symbols(void);&lt;br /&gt;
|Clear AUTO MANU PROG SUN MOON SNOW&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Clear_Numbers(void);&lt;br /&gt;
|Clear 7 Segments ans Collumns&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Print_Dec(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print DEC-val in two 7 Segments 0-99&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Print_Hex(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print HEX-val in two 7 Segments 0-ff&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Print_No(uint8_t, uint8_t, uint8_t);&lt;br /&gt;
|Print one ditig in one 7 Segment&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Print_Temp(uint8_t, uint8_t);&lt;br /&gt;
|Print desired temperature (val+4,9)°C&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Set_Seg(uint8_t, uint8_t);          &lt;br /&gt;
|Set one Segment to LCD_MODE (0-69)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Set_Hour_Bar_Seg(uint8_t, uint8_t);    &lt;br /&gt;
|Set one Hour Bar Segment to LCD_MODE (0-23)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Set_Hour_Bar_Val(uint8_t, uint8_t);&lt;br /&gt;
|Set all Hour Bar Segments from 0 to val to LCD_MODE (0-23)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|void LCD_Update(void);                        &lt;br /&gt;
|Request immidiate LCD-Update (normal only when bitplane changes)&lt;br /&gt;
|done&lt;br /&gt;
|-&lt;br /&gt;
|uint8_t LCD_Contrast_Adjust (int8_t);           &lt;br /&gt;
|Adjust the contrast&lt;br /&gt;
|&#039;&#039;&#039;not tested yet&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Entwicklungsumgebung ==&lt;br /&gt;
* Editor, Debugger, Compiler&lt;br /&gt;
** WinAVR version (20071221), sprich GCC 4.2.2 sowie avr-libc 1.6.0&lt;br /&gt;
** AVR Studio 4 &lt;br /&gt;
* JTAG ICE&lt;br /&gt;
** Atmel AVR JTAGICE MK2 &lt;br /&gt;
** AVR Dragon (z.B. http://elmicro.com/de/atavrdragon.html)&lt;br /&gt;
** Olimex-Seriell http://www.olimex.com/dev/avr-jtag.html  &lt;br /&gt;
** Olimex-USB http://www.olimex.com/dev/avr-usb-jtag.html &lt;br /&gt;
&lt;br /&gt;
[[Category:Projekte|!]]&lt;br /&gt;
&lt;br /&gt;
= Sonstiges =&lt;br /&gt;
== Altes Protokoll ==&lt;br /&gt;
[[HR20_Protocol_V2 | Hier ]] hat mal einer ein Protokoll eingegeben.&lt;br /&gt;
Das scheint aber nicht zu der Version 2.04 zu passen. &lt;br /&gt;
Ich habe es nicht gelöscht, falls es jemanden interessiert.&lt;br /&gt;
== SVN Anleitung ==&lt;br /&gt;
Eine Anleitung was ein SVN ist und wie man es brauchen wir hier nicht.&lt;br /&gt;
Sonst müsste hier auch ein C-Kurs, Windows-Kurs, und Elektronik-Kurs hin.&lt;/div&gt;</summary>
		<author><name>Dario</name></author>
	</entry>
</feed>