{"id":115,"date":"2011-01-29T12:44:57","date_gmt":"2011-01-29T11:44:57","guid":{"rendered":"http:\/\/www.skie.info\/?p=115"},"modified":"2011-01-29T12:44:57","modified_gmt":"2011-01-29T11:44:57","slug":"mohren-frieren-nicht","status":"publish","type":"post","link":"http:\/\/www.skie.info\/?p=115","title":{"rendered":"M\u00f6hren frieren nicht"},"content":{"rendered":"<p>So als hauptberuflicher Elektronenschubser kommen einem beim Reiten ja die merkw\u00fcrdigsten Ideen. Letzten Dezember zum Beispiel fand ich es sehr unsch\u00f6n, dass der Sonnenschein die M\u00f6hren erstmal warmlutschen musste bevor sie genossen werden konnten. Da ich daheim zwei formschicke Laminatoren rumstehen hatte, von denen ich nur einen brauchte hab ich kurzerhand einen Blick in die heimische Bastelkiste geworfen und eine Spind-M\u00f6hren-Heizung zusammengel\u00f6tet.<\/p>\n<p><a href=\"http:\/\/www.skie.info\/wp-content\/uploads\/Standard-Schaltung.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-117\" title=\"Standard-Schaltung\" src=\"http:\/\/www.skie.info\/wp-content\/uploads\/Standard-Schaltung-300x183.png\" alt=\"AVR-Beschaltung\" width=\"300\" height=\"183\" srcset=\"http:\/\/www.skie.info\/wp-content\/uploads\/Standard-Schaltung-300x183.png 300w, http:\/\/www.skie.info\/wp-content\/uploads\/Standard-Schaltung-1024x625.png 1024w, http:\/\/www.skie.info\/wp-content\/uploads\/Standard-Schaltung.png 1053w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a>Einige Atmegas 88PA altern hier in der Kiste vor sich her und ich dachte zumindest einer k\u00f6nnte mal was tun f\u00fcr seine Daseinsberechtigung. Also hab ich mal ein Standardlayout auf meinem Rechner rausgesucht und ging ein wenig ans Platinen \u00e4tzen. Ein LM50 zum Temperaturmessen war leider grade nicht verf\u00fcgbar aber ein LM335z samt 2k2 Vorwiderstand an PC2 ist auch ganz hervorragend. Ein Crydom HD48125 (an PC1 angeschlossen, SSR - Solid-State-Relay) schaltet den Laminator entsprechend ein und aus.<\/p>\n<p>Der Programmcode ist sehr einfach gehalten. Das komplizierteste ist die Konfiguration des Analog-Digital-Convertes (ADC). Alle 20 Minuten misst der Atmega gleich vier mal hintereinander die Temperatur und bildet den Mittelwert aus den vier Messungen. Wird 2 \u00b0C oder weniger gemessen wird f\u00fcr 10 Minuten der Laminator eingeschaltet. Der komplette Code fordert nicht mal 1% der Kapazit\u00e4t des Atmegas. \u00dcbrigens: RS232 ist mehr schein denn sein: Ich war nur zu faul zum L\u00f6schen aus dem Plan.<\/p>\n<blockquote><p>#ifndef F_CPU<\/p>\n<p>#define F_CPU 8000000<\/p>\n<p>#endif<\/p>\n<p>#include &lt;avr\/io.h&gt;<\/p>\n<p>#include &lt;util\/delay.h&gt;<\/p>\n<p>#define Solltemp 563 \/\/entspricht ca. +2\u00b0C<\/p>\n<p>\/* ADC initialisieren *\/<\/p>\n<p>void ADC_Init(void) {<\/p>\n<p>uint16_t result;<\/p>\n<p>ADMUX = (0&lt;&lt;REFS1) | (1&lt;&lt;REFS0);\u00a0 \u00a0 \u00a0 \/\/ AVcc als Referenz benutzen<\/p>\n<p>\/\/\u00a0 ADMUX = (1&lt;&lt;REFS1) | (1&lt;&lt;REFS0);\u00a0 \u00a0 \u00a0 \/\/ interne Referenzspannung nutzen<\/p>\n<p>ADCSRA = (1&lt;&lt;ADPS1) | (1&lt;&lt;ADPS0); \u00a0 \u00a0 \/\/ Frequenzvorteiler<\/p>\n<p>ADCSRA |= (1&lt;&lt;ADEN);\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ ADC aktivieren<\/p>\n<p>\/* nach Aktivieren des ADC wird ein \"Dummy-Readout\" empfohlen, man liest<\/p>\n<p>also einen Wert und verwirft diesen, um den ADC \"warmlaufen zu lassen\" *\/<\/p>\n<p>ADCSRA |= (1&lt;&lt;ADSC);\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ eine ADC-Wandlung<\/p>\n<p>while (ADCSRA &amp; (1&lt;&lt;ADSC) ) {}\u00a0 \u00a0 \u00a0 \u00a0 \/\/ auf Abschluss der Konvertierung warten<\/p>\n<p>\/* ADCW muss einmal gelesen werden, sonst wird Ergebnis der n\u00e4chsten<\/p>\n<p>Wandlung nicht \u00fcbernommen. *\/<\/p>\n<p>result = ADCW;<\/p>\n<p>}<\/p>\n<p>\/* ADC Einzelmessung *\/<\/p>\n<p>uint16_t ADC_Read( uint8_t channel )<\/p>\n<p>{<\/p>\n<p>\/\/ Kanal waehlen, ohne andere Bits zu beeinflu\ufb02en<\/p>\n<p>ADMUX = (ADMUX &amp; ~(0x1F)) | (channel &amp; 0x1F);<\/p>\n<p>ADCSRA |= (1&lt;&lt;ADSC);\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ eine Wandlung \"single conversion\"<\/p>\n<p>while (ADCSRA &amp; (1&lt;&lt;ADSC) ) {}\u00a0 \/\/ auf Abschluss der Konvertierung warten<\/p>\n<p>return ADCW;\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ ADC auslesen und zur\u00fcckgeben<\/p>\n<p>}<\/p>\n<p>\/* ADC Mehrfachmessung mit Mittelwertbbildung *\/<\/p>\n<p>uint16_t ADC_Read_Avg( uint8_t channel, uint8_t average )<\/p>\n<p>{<\/p>\n<p>uint32_t result = 0;<\/p>\n<p>for (uint8_t i = 0; i &lt; average; ++i )<\/p>\n<p>result += ADC_Read( channel );<\/p>\n<p>return (uint16_t)( result \/ average );<\/p>\n<p>}<\/p>\n<p>int main(void) {<\/p>\n<p>uint16_t i = 0;<\/p>\n<p>DDRB = 0;<\/p>\n<p>PORTB = 0;<\/p>\n<p>DDRC = (1 &lt;&lt; PC3); \/\/PC3 als Eingang eingestellt<\/p>\n<p>PORTC = 0;<\/p>\n<p>DDRD = 0;<\/p>\n<p>PORTD = 0;<\/p>\n<p>uint16_t adcval = 0;<\/p>\n<p>ADC_Init();<\/p>\n<p>while(1) {<\/p>\n<p>adcval = ADC_Read_Avg(2, 4); \/\/4 Messungen auf Kanal 2<\/p>\n<p>if (adcval &lt;= Solltemp){<\/p>\n<p>PORTC |= (1 &lt;&lt; PC3);<\/p>\n<p>for (i = 0; i &lt; 600; i++){<\/p>\n<p>_delay_ms(1000);<\/p>\n<p>}<\/p>\n<p>PORTC &amp;= ~(1 &lt;&lt; PC3);<\/p>\n<p>for (i = 0; i &lt; 600; i++){<\/p>\n<p>_delay_ms(1000);<\/p>\n<p>}<\/p>\n<p>}<\/p>\n<p>else {<\/p>\n<p>for (i=0; i &lt; 1200; i++){<\/p>\n<p>_delay_ms(1000);<\/p>\n<p>}<\/p>\n<p>}<\/p>\n<p>}<\/p>\n<p>return 0;<\/p>\n<p>}<\/p><\/blockquote>\n<p>Ich wei\u00df, ich wei\u00df. Der Kundige AVR-Programmierer wird nun sagen:<\/p>\n<blockquote><p>\"WAS?!? Der nimmt _delay_ms() und ne for-Schleife f\u00fcr 10 Minuten warten? Sowas macht man doch mit Timern!\"<\/p><\/blockquote>\n<p>Dazu kann ich nur folgendes sagen:<\/p>\n<ol>\n<li>F\u00fcr meine Anwendung ist es v\u00f6llig wurscht ob es nun 10 Minuten sind oder 10 Minuten und 3 Sekunden<\/li>\n<li>Eine eigene Timerfunktion f\u00fcr 10 Minuten zu schreiben h\u00e4tte mich sicher mehr Zeit gekostet als das ganze Projekt (2.5h wobei 2h f\u00fcr die Platine samt L\u00f6tstopplaminat draufgegangen sind)<\/li>\n<li>delay.h war grad verf\u00fcgbar<\/li>\n<\/ol>\n<p>Den Code f\u00fcr den ADC hab ich \u00fcbrigens auch aus dem Internet gefischt, ich glaub aus dem AVR-GCC-Tutorial von\u00a0<a class=\"aligncenter\" style=\"display: inline !important;\" title=\"Mikrocontroller.net\" href=\"http:\/\/www.mikrocontroller.net\" target=\"_blank\">http:\/\/www.mikrocontroller.net<\/a>.<\/p>\n<p>Die meiste Zeit hat eigentlich die Suche nach einem passenden Beh\u00e4ltnis f\u00fcr die Heizung in anspruch genommen. Gl\u00fccklicher Weise gab es Sperrmuss und jemand hat eine K\u00fcche entsorgt deren H\u00e4ngeschr\u00e4nke genau auf meine Anforderungen passte. So steht nun in meinem Spind ein H\u00e4ngeschrank aus Kiefernholz (massiv!) in dem die M\u00f6hren lagern. Auf einen Einlegeboden wurde das Innenleben des Laminators wie die Steuerungseinheit samt Atmega geschraubt. In den letzten Tagen war es schon recht k\u00fchl und die Heizung war schon in betrieb. Weder sind bisher die M\u00f6hren eingefroren noch ist der Stall abgebrannt. Es scheint zu funktionieren, was ich mir hier \u00fcberlegt haben.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Die M\u00f6hrenheizung f\u00fcr angenehm temperierte Wurzel w\u00e4hrend der kalten Jahreszeit. Hier eine Beschreibung was ich da zusammengebaut habe. <a href=\"http:\/\/www.skie.info\/?p=115\">Weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[4,3],"tags":[],"class_list":["post-115","post","type-post","status-publish","format-standard","hentry","category-programmierung","category-reiten"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"http:\/\/www.skie.info\/index.php?rest_route=\/wp\/v2\/posts\/115","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.skie.info\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.skie.info\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.skie.info\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.skie.info\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=115"}],"version-history":[{"count":0,"href":"http:\/\/www.skie.info\/index.php?rest_route=\/wp\/v2\/posts\/115\/revisions"}],"wp:attachment":[{"href":"http:\/\/www.skie.info\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=115"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.skie.info\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=115"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.skie.info\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=115"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}