Die meiner Meinung nach beste Möglichkeit des Lüfter-Betriebs ist eine automatische Lüfterregelung. Das bedeutet:
Es gibt bereits eine Vielzahl von "Lüfterreglern", "Lüfter-Controllern". Diese haben den Namen Regelung fast ausnahmslos nicht verdient, weil sie nur Temperaturen messen können oder eine manuelle Einstellung der Lüfter erlauben, aber keinen Lüfter ansteuern, also die Drehzahl der Lüfter beeinflussen können. Momentan habe ich nur einen einzigen Lüfter-Controller gefunden, der eine echte Regelung vornimmt: Der Revoltec Fan-O-Matic. Leider kostet dieses edle Gerät 160-180 EUR. Daher habe ich mich entschlossen, eine billige Variante für 5 EUR Bauteilkosten mit einem Mikrocontroller zu bauen.
Übrigens: Einen Bauplan für einen einfachen Programmieradapter für den verwendeten Mikrocontroller sowie passende Software gibt's im Kapitel Funkuhr.
NEU: Eine weitere Lüfterregelung ist unter dem gleichnamigen getrennten Kapitel aufgeführt.
Funktionen der Eigenkonstruktion
Nach einigem Testen verschiedener Ideen habe ich letztlich folgenden Regelalgorithmus verwirklicht:
Zu erwähnen ist noch, dass alle Werte natürlich im Quelltext als Konstanten zu finden sind. So kann man leicht mit verschiedenen Werten testen, falls die Regelung nicht das gewünschte Verhalten zeigt.
Die 10-LED-Balkenanzeige zeigt den momentanen Wert für die Lüfteransteuerung an. Zusätzlich gibt es einige Signale:
Eine veränderte CPU-Last (man startet oder Beendet ein Spiel etc.) resultiert in verändertet CPU-Temperatur. Es dauert einige Zeit, bis diese geänderte Temperatur sich am Temperaturfühler bemerkbar macht. Zusätzlich dauert es auch bei geänderter Drehzahl des Lüfters einige Zeit, bis diese eine Auswirkung zeigt. Durch diese Trägheit (die nicht zu vermeiden ist) kommt es prinzipiell leicht zu einem Schwanken der Drehzahl um den eigentlich passenden Wert.
Um die Schwankungen möglichst gering zu halten, ist einerseits der Fühler möglichst dicht am Die (CPU-Kern) zu befestigen, z.B. mit einem besonders flachen Fühler zwischen CPU-Platine und Kühlkörper (ich habe soeinen von einem Thermaltake Volcano 9 Kühler genommen). Andererseits muss die Regelung mit einer gewissen Verzögerung stattfinden. Ist die Verzögerung zu größ, könnte nicht schnell genug nachgeregelt werden und die CPU könnte zu heiß werden. Ist die Verzögerung zu klein, "überregelt" das System und der Lüfter würde z.B. beim Temperaturanstieg deutlich aufheulen.
Der von mir verwendete Mittelwert führt zu einer schwingungsarmen Regelung und die Temperatur steigt nur kurzzeitig um ein paar Grad über die Solltemperatur. Natürlich sollte und kann man die Werte im Programm anpassen, falls das Verhalten nicht wie gewünscht ist.
![]() |
|
Verhalten bei ansteigender Temperatur
(Der Sollwert war hier 52°C. Die Temperatur war am Anfang nur so niedrig, weil der Lüfter bereits mit minimaler Drehzahl ausreichend kühlte.) |
![]() |
|
Verhalten bei absteigender Temperatur
|
![]() |
|
Verhalten bei dauerhafter Vollast
|
Und nun zum interessanten Teil. ;-)
Um auch unerfahrenen Bastlern das Aufbauen zu erleichtern, habe ich einen Schaltplan abgebildet, mit dem ein stufenweiser Aufbau leicht möglich ist. So kann eigentlich nichts schief gehen.
Zunächst baut man den Mikrocontroller und die rot markierten Teile auf. Beim Anlegen der Spannung muß bereits die erste LED blinken. Wenn dies soweit funktioniert, kommen die grün markierten Teile hinzu. Nun muß die Schaltung auf eine unterschiedliche Temperatur am Fühler reagieren und die LED unterschiedlich blinken, wenn man am Poti dreht oder den Fühler anfaßt. Nach dem Aufbau der gelb markierten Teile sollte der Lüfter angesteuert und dessen Drehzahl geregelt werden. Am Ende kommen noch die restlichen Anschlüsse für die LEDs hinzu.
Den Schaltplan gibt es auch noch ohne farbliche Markierungen zum Ausdrucken.
Für die technisch interessierten nun noch eine genauere Beschreibung der Schaltung:
Die meisten Ausgänge schalten die einzelnen LEDs. Diese haben einen gemeinsamen Masseanschluß. Die Messung der Temperatur findet über die Spannungsvergleicher-Eingänge AIN1 und AIN2 statt. Die grün eingezeichneten Widerstände bilden zwei Spannungsteiler. D.h. "im Normalfall" liegt beispielsweise an AIN1 und AIN2 die halbierte Spannung zwischen (oben) 5V und (unten) 0V an. Steigt die Temperatur, sinkt der Widerstand des Temperaturfühlers. Die Spannung an AIN2 ist damit geringer als an AIN1. Umgekeht verhält es sich bei niedrigerer Temperatur. Über das Poti ist der Sollwert einstellbar. Die Justage macht man dadurch, dass man die Temperatur z.B. der CPU mit einem Programm unter Last anzeigen läßt und das Poti so lange verstellt, bis die Schaltung wie gewünscht regelt.
![]() |
![]() |
|
|
BC547C
|
BD136
|
78L05 |
Die Transistoren sind zum pulsweisen Schalten des Lüfters zuständig. Wird an den ersten Transistor an der Basis die Ausgangsspannung des Controllers angelegt, bekommt der Lüfter seine Versorgungsspannung. Die Pulsfrequenz liegt übrigens bei etwa 12 Hz, was mir ausreichend erschien. Durch einen Kondensator wird die Spannung zum Lüfter geglättet.
| 1x | Atmel AT 90S2313 PDIP | 2,10 € |
| 1x | Quarz 4 MHz | 0,35 € |
| 2x | 10 pF Kondensator | 0,08 € |
| 1x | Poti 10K | 0,21 € |
| 11x | Widerstand 330 Ohm 1/4 W | 0,33 € |
| 2x | Widerstand 100 k 1/4 W | 0,06 € |
| 2x | Widerstand 4k7 1/4 W | 0,06 € |
| 2x | Widerstand 3k3 1/4W | 0,06 € |
| 1x | Transistor BC 547C | 0,03 € |
| 1x | Transistor BD 136 | 0,15 € |
| 1x | Temperaturfühler NTC 10k | 0,29 € |
| 1x | Spannungsregler 78L05 100mA | 0,15 € |
| 1x | 10-LED-Balkenelement 3xrot 7x grün | 0,69 € |
| 1x | 20 Pin-IC-Fassung DIP | 0,23 € |
|
Gesamt
|
4,79 € |
Die Teile sind günstig z.B. bei Reichelt Elektronik zu bestellen. Unter 5 EUR für eine Lüfterregelung! Das ist doch mal ein ganz anderer Preis als die 160 EUR vom Fan-O-Matic. :-)
; #####################################################################
; ### Lüfterregelung 1.0 07/2004 (c) Uwe Freese ###
; ### http://www.uwe-freese.de mail@uwe-freese.de ###
; ### ###
; ### You can use this program freely, but please always include ###
; ### this copyright information when you share it. ###
; ### ###
; ### Diese Software kann frei verwendet werden, aber bitte immer ###
; ### diesen Copyright-Hinweis hinzufügen, wenn es weitergegeben ###
; ### wird! ###
; #####################################################################
.CSEG
.ORG 0x00
.include "2313def.inc"
; ------------------ Diese Werte dürfen geändert werden ------------------
.equ MotorThrMIN = 40 ; min. Lüfterleistung x/255 (im Bereich 1..254)
; Muss kleiner als MotorThrMAX sein. So einstellen, dass der Motor bei dem Wert nicht stehenbleibt.
.equ MotorThrMAX = 254 ; max. Lüfterleistung x/255 (im Bereich 1..254)
.equ MotorThrSTART = 150 ; Lüfterleistung am Anfang x/255
.equ anatest_every = 60 ; alle x Schleifendurchgänge nur Temperatur messen
; ein Schleifendurchgang dauert ca. 43,5 ms
; bei Wert von 150 also Messung alle 6,5 s
; damit dauert einmal komplett herunter (Maximal- zu Minimaldrehzahl) ca. 12,6 Min.
; damit dauert einmal komplett herauf (Minimal- zu Maximaldrehzahl) ca. 5 Min.
; Der Wert ist abhängig vom verwendeten Lüfter. Bei einem Lüfter mit hoher Luftleistung z.B. 200 nehmen.
; bei einem Lüfter mit niedriger Luftleistung (Papst 4412F/GL) niedrigen Wert nehmen (80).
.equ STARTUPDELAY = 60 ; Wie lange am Anfang Motor komplett einschalten? (x * 50 ms)
; ------------------ Für die Regelung irrelevante Werte (dürfen geändert werden) ------------------
.equ LEDBLINK_LOOPVAL = 7 ; in welchem Rythmus blinken (Taktverhältnis LEDBLINK_LOOPVAL/LEDBLINK_LOOPVALMAX)
.equ LEDBLINK_LOOPVALMAX = 14 ; in welchem Rythmus blinken (Taktverhältnis LEDBLINK_LOOPVAL/LEDBLINK_LOOPVALMAX)
.equ LEDBLINKQUICK_LOOPVAL = 2 ; in welchem Rythmus blinken (Taktverhältnis LEDBLINKQUICK_LOOPVAL/LEDBLINKQUICK_LOOPVALMAX)
.equ LEDBLINKQUICK_LOOPVALMAX = 4 ; in welchem Rythmus blinken (Taktverhältnis LEDBLINKQUICK_LOOPVAL/LEDBLINKQUICK_LOOPVALMAX)
; ------------------ Folgende Werte möglichst nicht ändern ------------------
;Port B pins
.equ AIN0 = 0
.equ AIN1 = 1
.equ MOTOR = 5
; Bargraph:
; 0-6 ist PortD Pin 0-6
; 7-8 ist PortB Pin 2-3
;Belegung PortD
; Pin 0 = LED 0 (Bargraph)
; Pin 1 = LED 1 (Bargraph)
; Pin 2 = LED 2 (Bargraph)
; Pin 3 = LED 3 (Bargraph)
; Pin 4 = LED 4 (Bargraph)
; Pin 5 = LED 5 (Bargraph)
; Pin 6 = LED 6 (Bargraph)
;Belegung PortB
; Pin 0 = AIN0
; Pin 1 = AIN1
; Pin 2 = LED 7 (Bargraph)
; Pin 3 = LED 8 (Bargraph)
; Pin 4 = LED 9 (Bargraph) (ROT)
; Pin 5 = Motor-Ausgang
; Pin 6 = Temperatur-Test Pin 0 (Standard = aus)
; Pin 7 = Temperatur-Test Pin 1 (Standard = ein)
; Temperatur-Test-Pins
; normale Einstellung ist: Pin 0 ein, Pin 1 aus
; durch Schalten von beiden Pins auf aus, kann überprüft werden, ob die Temperatur gerade "stark" fällt
; durch Schalten von beiden Pins auf ein, kann überprüft werden, ob die Temperatur gerade "stark" steigt
; Werte, ab denen die LEDs an sind
.equ LED0_on_if_higher = 23
.equ LED1_on_if_higher = 46
.equ LED2_on_if_higher = 70
.equ LED3_on_if_higher = 93
.equ LED4_on_if_higher = 116
.equ LED5_on_if_higher = 139
.equ LED6_on_if_higher = 162
.equ LED7_on_if_higher = 185
.equ LED8_on_if_higher = 209
.equ LED9_on_if_higher = 232
.def temp = r16 ; allgemein verwendbare temp-Variable
.def temp2 = r17 ; Level zur Anzeige von Geschwindigkeit für 10 LEDs (0..10)
.def mydelay = r18
.def startuploopcounter = r19
.def motorloopcounter = r20 ; Motor-Schleifenzähler
.def MotorThr = r21 ; momentaner Wert, bis zu dem Motor ein ist
.def anatest_loop = r22
.def history = r23 ; von den letzten 8 Messungen abspeichern, ob current_motor_thr
; erhöht (1) oder erniedrigt (0) wurde
.def history_quick = r24 ; von den letzten 8 Messungen abspeichern, ob current_motor_thr
; schnell erhöht/erniedrigt (1) oder nur normal erhöht/erniedrigt wurde (0)
.def LED_loop = r25
.def LED0_on = r26
.def LED9_on = r27
.def ledblink_loopval_current = r28 ; für tatsächliches Blinkverhalten verwendet (abhängig von Temp-Differenz stark/schwach)
.def ledblink_loopvalmax_current = r29 ; für tatsächliches Blinkverhalten verwendet (abhängig von Temp-Differenz stark/schwach)
; --------- Initialisierung ---------
; Stack initialisieren
ldi temp, 0xB5; RAMEND == 0xDF
out SPL, temp
; Watchdog einschalten
ldi temp, 0b00001111
out WDTCR, temp
; Rest
ldi LED0_on,0
ldi LED9_on,0
ldi LED_loop, LEDBLINK_LOOPVALMAX
ldi anatest_loop,1 ; gleich nach Start die erste Messung machen
ldi temp,0b11111100 ; initialise port B as I/O, 6 OUT 2 IN
out DDRB,temp
ldi temp,0b00101111 ; key columns all low and
out PORTB,temp ; active pull ups on rows enabled
ldi temp,0b01111111 ; initialise port D as I/O, 7 OUT
out DDRD,temp
rcall RESET_HIGH_TEMP_DIFF_PINS
; damit der Motor anläuft 5 Sek. einschalten
ldi temp,0b01111111 ; alle LEDs an PORT D
out PORTD,temp
sbi PORTB,2 ; LED an Port B
sbi PORTB,3 ; LED an Port B
sbi PORTB,4 ; LED an Port B
ldi MotorThr,MotorThrMAX ; volle Drehzahl
rcall STARTUPLOOP ; 3 sec Motor komplett einschalten
; history mit "normal höher" oder "normal niedriger" füllen, damit auch gleich PRO_ADJUST anspringen kann, wenn es stark unterschiedlich ist.
ldi history_quick,0b00000000; clear history
sbic ACSR,ACO ; skip next instruction if output is low
rjmp INIT_HOEHER
ldi history,0b00000000 ; clear history
rjmp MOTOR_SLOWDOWN
INIT_HOEHER:
ldi history,0b11111111 ; clear history
; Motor langsam von Maximalwert auf Default stellen
MOTOR_SLOWDOWN:
subi MotorThr,3 ; mit 3-facher Geschwindigkeit herunterregeln (ergibt etwa 2-3 Sek für's Herunterregeln)
rcall BARGRAPH
rcall MOTORLOOP
cpi MotorThr,MotorThrSTART ; schon auf Defaultwert?
brlo MAINLOOP ; dann nicht verringern
rjmp MOTOR_SLOWDOWN
MAINLOOP:
; --------- Spannung vergleichen ---------
rcall MOTORLOOP
rcall LEDBLINK
; nur von Zeit zu Zeit einen anatest machen
dec anatest_loop
cpi anatest_loop,0
brne MAINLOOP
ldi anatest_loop,anatest_every
lsl history ; Platz in History schaffen (Bit 0 auf 0)
lsl history_quick ; Platz in History schaffen (Bit 0 auf 0)
ldi ledblink_loopval_current, LEDBLINK_LOOPVAL ; Blinkwerte auf Standard
ldi ledblink_loopvalmax_current, LEDBLINK_LOOPVALMAX ; Blinkwerte auf Standard
sbic ACSR,ACO ; skip next instruction if output is low
rjmp HOEHER
; Ist-Temperatur stark höher -> MotorThr um 5 erhöhen
; Ist-Temperatur normal höher -> MotorThr um 1 erhöhen
; Ist-Temperatur stark niedriger -> MotorThr um 2 verringern
; Ist-Temperatur normal niedriger -> MotorThr um 1 verringern
NIEDRIGER:
; Auswertung, ob "stark fallend"
; Wenn Temperatur fallend, dann hat Temp.fühler höheren Widerstand. Spannung an AIN2 ist dann höher.
; Jetzt also Spannung an AIN1 auch höher machen, um zu sehen, ob sie dann an AIN2 immer noch höher ist.
; Spannung an AIN1 wird erhöht, in dem Temp 0 auch EINgeschaltet wird.
sbi PORTB, 6
rcall MY_DELAY ; ca 1 ms warten, damit die Spannung sich anpasst, falls Kapazitäten
rcall MY_DELAY
rcall MY_DELAY
rcall MY_DELAY
rcall MY_DELAY
sbic ACSR,ACO ; skip next instruction if output is high
rjmp NIEDRIGER_NORMAL
NIEDRIGER_STARK:
sbr history_quick,1 ; setze Bit 0 auf 1 in history_quick
ldi ledblink_loopval_current, LEDBLINKQUICK_LOOPVAL ; Blinkwerte auf schnell-blinkend
ldi ledblink_loopvalmax_current, LEDBLINKQUICK_LOOPVALMAX ; Blinkwerte auf schnell-blinkend
rcall DEC_MOTORTHR
NIEDRIGER_NORMAL:
rcall DEC_MOTORTHR
rjmp HISTORY ; und springe dann zu HISTORY
HOEHER:
sbr history,1 ; setze Bit 0 auf 1 in history
; Auswertung, ob "stark steigend"
; Wenn Temperatur steigend, dann hat Temp.fühler niedrigeren Widerstand. Spannung an AIN2 ist dann niedriger.
; Jetzt also Spannung an AIN1 auch niedriger machen, um zu sehen, ob sie an AIN2 dann immer noch niedriger ist.
; Spannung an AIN1 wird erniedrigt, in dem Temp 1 auch AUSgeschaltet wird.
cbi PORTB, 7
rcall MY_DELAY ; ca 1 ms warten, damit die Spannung sich anpasst, falls Kapazitäten
rcall MY_DELAY
rcall MY_DELAY
rcall MY_DELAY
rcall MY_DELAY
sbis ACSR,ACO ; skip next instruction if output is low
rjmp HOEHER_NORMAL
HOEHER_STARK:
sbr history_quick,1 ; setze Bit 0 auf 1 in history_quick
ldi ledblink_loopval_current, LEDBLINKQUICK_LOOPVAL ; Blinkwerte auf schnell-blinkend
ldi ledblink_loopvalmax_current, LEDBLINKQUICK_LOOPVALMAX ; Blinkwerte auf schnell-blinkend
rcall INC_MOTORTHR
rcall INC_MOTORTHR
rcall INC_MOTORTHR
rcall INC_MOTORTHR
HOEHER_NORMAL:
rcall INC_MOTORTHR
; --------- History-Auswertung ---------
HISTORY:
; zunächst HighTempDiff-Pins wieder auf Normalzustand
rcall RESET_HIGH_TEMP_DIFF_PINS
ldi LED0_on,0 ; LED 0 Blinkmodus AUS (default)
ldi LED9_on,0 ; LED 10 Blinkmodus AUS (default)
mov temp,history
andi temp,0b01111111 ; letzte 7 Bits betrachten
cpi temp,0b01111111 ; wenn alle 6 Bits EIN
breq LEVEL_HOCH
rjmp LEVEL_WEITER
LEVEL_HOCH:
ldi LED9_on,1 ; LED 10 EIN
rjmp HISTORY_END
LEVEL_WEITER:
mov temp,history
andi temp,0b01111111 ; letzte 7 Bits betrachten
cpi temp,0b00000000 ; wenn alle 6 Bits AUS
breq LEVEL_RUNTER
rjmp HISTORY_END
LEVEL_RUNTER:
ldi LED0_on,1 ; LED 0 EIN
HISTORY_END:
rcall BARGRAPH
rjmp MAINLOOP
; ---------- ENDE -----------
; --------- Bargraph-Anzeige ---------
BARGRAPH:
; Anzahl LEDs = (MotorThr - MotorThrMIN) / 20
; dadurch max = (254 - 25) / 24 = 9,6
; dadurch min = (25 - 25) / 24 = 0
BARGRAPH_LEDCHECK0:
; Test, ob LED0 gerade blinkt (dann nichts ändern)
cpi LED0_on,0
brne BARGRAPH_LEDCHECK1
; normaler Check (wie bei anderen LEDs)
cbi PORTD,0
cpi MotorThr,LED0_on_if_higher
brlo BARGRAPH_LEDCHECK1
sbi PORTD,0
BARGRAPH_LEDCHECK1:
cbi PORTD,1
cpi MotorThr,LED1_on_if_higher
brlo BARGRAPH_LEDCHECK2
sbi PORTD,1
BARGRAPH_LEDCHECK2:
cbi PORTD,2
cpi MotorThr,LED2_on_if_higher
brlo BARGRAPH_LEDCHECK3
sbi PORTD,2
BARGRAPH_LEDCHECK3:
cbi PORTD,3
cpi MotorThr,LED3_on_if_higher
brlo BARGRAPH_LEDCHECK4
sbi PORTD,3
BARGRAPH_LEDCHECK4:
cbi PORTD,4
cpi MotorThr,LED4_on_if_higher
brlo BARGRAPH_LEDCHECK5
sbi PORTD,4
BARGRAPH_LEDCHECK5:
cbi PORTD,5
cpi MotorThr,LED5_on_if_higher
brlo BARGRAPH_LEDCHECK6
sbi PORTD,5
BARGRAPH_LEDCHECK6:
cbi PORTD,6
cpi MotorThr,LED6_on_if_higher
brlo BARGRAPH_LEDCHECK7
sbi PORTD,6
BARGRAPH_LEDCHECK7:
cbi PORTB,2
cpi MotorThr,LED7_on_if_higher
brlo BARGRAPH_LEDCHECK8
sbi PORTB,2
BARGRAPH_LEDCHECK8:
cbi PORTB,3
cpi MotorThr,LED8_on_if_higher
brlo BARGRAPH_LEDCHECK9
sbi PORTB,3
BARGRAPH_LEDCHECK9:
; Test, ob LED9 gerade blinkt (dann nichts ändern)
cpi LED9_on,0
brne BARGRAPH_LEDCHECK10
; normaler Check (wie bei anderen LEDs)
cbi PORTB,4
cpi MotorThr,LED9_on_if_higher
brlo BARGRAPH_LEDCHECK10
sbi PORTB,4
BARGRAPH_LEDCHECK10:
ret
; MotorThr erhöhen
INC_MOTORTHR:
cpi MotorThr,MotorThrMAX ; wenn schon Maximalwert
breq INC_MOTORTHR_RET ; dann nicht erhöhen
inc MotorThr ; sonst erhöhe Wert
INC_MOTORTHR_RET:
ret
; MotorThr verringern
DEC_MOTORTHR:
cpi MotorThr,MotorThrMIN ; wenn schon Minimalwert
breq DEC_MOTORTHR_RET ; dann nicht verringern
dec MotorThr ; sonst verkleinere Wert
DEC_MOTORTHR_RET:
ret
; TempDiff-Pins auf Standard setzen
RESET_HIGH_TEMP_DIFF_PINS:
cbi PORTB, 6
sbi PORTB, 7
ret
MOTORLOOP: ; Dauer ca. 90 ms
;von current_motor_thr bis 0 runterzählen
mov motorloopcounter,MotorThr
sbi PORTB,MOTOR ; Motor ein
MOTORLOOP_EIN:
rcall MY_DELAY
dec motorloopcounter
brne MOTORLOOP_EIN
cbi PORTB,MOTOR ; Motor aus
; von (255-current_motor_thr) bis 0 runterzählen und Motor aus
ldi motorloopcounter,255
sub motorloopcounter,MotorThr
MOTORLOOP_AUS:
rcall MY_DELAY
dec motorloopcounter
brne MOTORLOOP_AUS
ret
LEDBLINK:
; Schleifenzähler immer modulo 256 zählen
dec LED_loop
brne LED0BLINK ; ist = 0?
; LED_loop zurücksetzen. Dabei high_temp_diff beachten.
mov LED_loop, ledblink_loopvalmax_current
LED0BLINK:
cpi LED0_on,0 ; Test, ob Blinken (LED 0 für "Temperatur runter") überhaupt erwünscht
breq LED9BLINK
; LED einschalten?
cp LED_loop, ledblink_loopval_current
brlo LED0_EIN
LED0_AUS:
cbi PORTD,0
rjmp LED9BLINK
LED0_EIN:
sbi PORTD,0
LED9BLINK:
cpi LED9_on,0 ; Test, ob Blinken (LED 9 für "Temperatur rauf") überhaupt erwünscht
breq LEDBLINK_ENDE
; LED einschalten?
cp LED_loop, ledblink_loopval_current
brlo LED9_EIN
LED9_AUS:
cbi PORTB,4
rjmp LEDBLINK_ENDE
LED9_EIN:
sbi PORTB,4
LEDBLINK_ENDE:
ret
MY_DELAY: ; Dauer: 193,25 us
wdr ; Watchdog zurücksetzen
ldi mydelay,255
MY_DELAY_LOOP:
dec mydelay
brne MY_DELAY_LOOP
ret
STARTUPLOOP:
ldi startuploopcounter,STARTUPDELAY
STARTUPLOOP_INNER:
rcall MOTORLOOP
dec startuploopcounter
brne STARTUPLOOP_INNER
ret