Hallo zusammen,
ich habe ein Problem mit scheinbar zufälligen Resets bei meiner
Lüfterreglerschaltung (Attiny13V).
Hintergrund:
Die Schaltung hat vor ein paar Jahren ein Freund für mich angefertigt -
mit seinem Assembler-code lief sie problemlos. Allerdings war die
Lüfterdrehzahl starr an Temperaturintervalle gebunden und immer an. Da
ich über gute passive Kühler(Wasserkühlung) verfüge, soll die Lärmquelle
in Form der Radiatorlüfter im Officebetrieb abgeschaltet werden. Ich
habe meinen eigenen Code geschrieben, allerdings Codefragmente
(PWM-Signal für den Motortreiber (L293D) und die Verwendung des
AD-Wandlers (Temperaturen von den NTC-Widerständen) übernommen, da ich
bei diesen noch nicht so ganz durchblicke. Ziel dieser ganzen Aktion ist
es, sich in die Mikrocontrollerprogrammierung einzuarbeiten um später
noch schönere Projekte zu realisieren - daher lese ich auch fleißig in
Euren Tutorials, Datenblättern, Codetabellen etc. Aber jetzt stehe ich
vor einem Rätzel an dem ich schon zwei Wochen herumknabbere. Für Eure
Hilfe bin ich Euch schon vorab sehr dankbar. :-)
Meine Vermutung:
Ich habe irgendwo im Code einen Anfängerfehler versteckt, der zwar nicht
die ordnungsgemäße Programmfunktion verhindert, aber bei bestimmten
Zuständen zu einem fatalen Error und damit zu einem Reset führt. Als
wesentliche Prinzpänderung gegenüber dem alten Programm werden die
Lüfter nun ausgeschaltet, indem ich den PWM-Generator vom Pin abkopple
und auf 0 setze (siehe PWMAus:). Eigentlich funktioniert das sehr gut,
aber womöglich habe ich da etwas falsch gemacht und der Fehler zeigt
sich nur unter bestimmten Umständen. Auch bei "PWMWiederAn:" könnte der
Fehler liegen. Da der "Piep"Aufruf/-Code (Eine vorübergehende "1" an
PB2) irgendwie einen Einfluss hat, frage ich mich, ob die Funktion
"ADC1" von PB2 irgendwie eine Rolle spielt.
Problembeschreibung:
Eigentlich funktioniert das Programm wie gewünscht, wären da nicht die
Resets:
- Nach "Strom an" (Stecker einstecken oder PC anschalten) fällt er
direkt in eine scheinbar endlose Resetschleife. Mit dem "Piep"-Code am
Ende des "Anfang"-Blockes schafft er es zuverlässig in die Hauptschleife
("Hauptregler"). Ohne diesen "Piep" kam der Reset irgendwo nach der
Tasterabfrage (in "Anfang"). Das weiß ich, da durch Tastendruck der
Regler in den Zustand "Manuelles Vollgas" ("SchleifeManuell") und von
dort in die "Hauptregler"-Schleife gelangen konnte und dort vorerst
stabil war.
- Ist der Regler einmal in der Hauptschleife ("Hauptregler") angekommen
verbleibt er dort scheinbar stabil - bis er irgendwann (z.B.30 Min.)
wieder in die Reset-Endlosschleife fällt (seit dem neuen Anfangs-Piep
nun keine Endlosschleife mehr). Relativ sicher tritt dies bei
Wassertemperaturen über 31°C auf, also wenn die "32°C" (Zähler H +3)-
oder "35°C"(Zähler H +4)-Verzweigungen aktiv sind und die Lüfter
anfahren. Er lässt sich dann per Tastendruck über "Manuelles Vollgas"
("SchleifeManuell") wieder in die Hauptschleife ("Hauptregler")
zurückführen und verbleibt dort dann auch scheinbar stabil bis zum
nächsten Aussetzer. Mit dem zusätzlichen "Piep" am Ende von "Anfang:"
fängt er sich nun aber direkt wieder. Ein weiterer Reset trat dann bei
der Unterschreitung von ~30°C auf. Ich tippe daher auf "PWMAus:" oder
"PWMWiederAn:" als Fehlerquellen.
Gegenmaßnahmen:
- Ich hab versucht, heraus zu finden, an welcher Stelle es zum reset
kommt. Dazu habe ich "Piep"-Signale in den Code eingebaut. Verrückter
weise lief er mit den "Piep" scheinbar stabil (länger als 10 Min. habe
ich das Gepiepe nicht ausgehalten). Ohne die Piep-Aufrufe im Code blieb
er dann direkt nach dem Start in der Reset-Endlosschleife hängen.
- Nach Durchlesen Eurer Checkliste habe ich dann den Resetpin, der zuvor
unbeschaltet war über einen 4,7k-Widerstand mit Vcc und per
100N-Keramikkondensator mit GND verbunden - hat nix gebracht.
- Ich habe auch mal den Watchdog-Reset-Befehl ("WDR") im Code verstreut
- da ich den aber soweit ich weiß eh nicht angeschaltet habe, brachte es
auch nix.
Die Fakten:
Ziel: Lüfterregler für Wakü-Radiator am PC
Controller: Attiny13V
Motortreiber: L293D
Stromversorgung: Netzteil des laufenden PCs
Schaltpläne:
1. Schaltplan
2. Platinenlayout
Programmierung: AVR-Studio 5.1, mySmartUSB light, "verify" bei
Programmierung eingeschaltet, separate Programmierplatine, also keine
ISP
Fusebits:
Selfprgen
Bodlevel: 2V7
Spien
SUT_CKSEL: Intrcosc_128kHz_14CK_64MS
(damit hatte das alte Programm jahrelang funktioniert)
Pinbelegung:
PB0: Motortreiber
PB1: Taster
PB2: Piepser, LED
PB3: NTC 2
PB4: NTC 1
PB5: - (über 4,7K auf VCC und 100N auf GND)
Programmüberblick:
Ziel des Programms:
Je Programmzyklus wird die Variable "H" abhängig von der
Temperaturmessung um +0/+2/+3/+4/+50 erhöht und dann immer um -3
verringert. Unter H=10 werden die Lüfter abgeschaltet. Für H>10 wird
sein Wert zur Erzeugung eines PWM-Signals verwendet, das über den
Motortreiber L293D die Lüftermotoren steuert. Die Kühlung soll bei
Überschreiten einer Temperaturgrenze langsam anlaufen (langsam genügt in
der Regel) und sich dann auf der benötigten Drehzahl einpendeln. Bei
unterschreiten der Temperaturgrenze sollen die Lüfter langsam runter
fahren und wenn möglich komplett aus gehen (normaler Officebetrieb).
Variablen, Konstanten
Anfang:
Stackpointer initialisieren
Lüfter 100%
2 Pieps
Tasterabfrage-> Manuelle Steuerung (Lüfter 100%)
PWM-Chip INITIALISIERUNG
zu Testzwecken: Piep (mit dem klappt's - warum auch immer)
Hauptregler:
TempMessung an NTC_1 (AD-Wandler)
Gemäß Temp-wert 6 Verzweigungen
->Alarm
-> Zählvariable "H" +0/+2/+3/+4/+50
jeweils Test ob der Wert 250 überschritten würde -> H=250
PWMsetzen:
H<10 -> PWMAus
D=0 -> PWMWiederAn
sonst D=D+H
Hverringern:
H=H-3
wenn H<0 werden würde-> HaufNull:
Sicherheit:
TempMessung an NTC_2 -> bei zugroßem oder zukleinem Wert -> Alarm
Tasterabfrage
Taster->SchleifeManuell
WarteEinWenig:
-> Wartenschleife
==> wider zum "Hauptregler"
Unterprogramme:
Alarm
Warten
AD-Wandler
SchleifeManuell
Pieptoene zu Diagnosezwecken
Programmcode:
1
.include "tn13def.inc"
2
3
.def A = r16 ;DA Wandlung ok
4
.def B = r17 ;Faktor Sicherheit,Hauptregler wozu ?
5
.def C = r18 ;Alarm Temp Sicherheit,Hauptregler wozu ?
6
.def D = r19 ;PWM Signal Alarm
7
.def H = r20 ;Zähler Hauptregler
8
.def I = r21 ;Änderungsdifferenz für Zähler
9
.def J = r22 ;temp.Variable Hauptregler
10
;r25, r26 ;temp.Variable Warten(r25)
11
12
13
14
;Stackpointer initialisieren
15
ldi r16, RAMEND ;Die Adresse der letzten Stelle im RAM in r16 laden
16
out SPL, r16 ;Die Adresse in das Register SPL ausgeben
17
clr r16
18
19
rjmp Anfang
20
21
Anfang:
22
sbi ddrb,0 ; PB0->Ausgang
23
sbi portb,0 ; Lüfter 100%
24
25
cbi ddrb,3 ; PB3(NTC2)->Eingang
26
cbi ddrb,4 ; PB4(NTC1)->Eingang
27
28
ldi r25,1 ; Wartenzähler auf _ x 188ms @1MHz
29
rcall Warten
30
31
sbi ddrb,2 ;Port2 als Ausgang
32
sbi portb,2 ;Doppel-Pieps
33
ldi r25,25 ; Dauer des Pieps
34
rcall Warten
35
cbi portb,2
36
ldi r25,250 ; Pausendauer
37
rcall Warten
38
sbi portb,2
39
ldi r25,50 ; Dauer des Pieps
40
rcall Warten
41
cbi portb,2
42
ldi r25,250 ; Pausendauer
43
rcall Warten ; Ende Doppel-Pieps
44
45
46
;MANUELLE STEUERUNG
47
cbi ddrb,1 ; Wenn Schalter bei Systemstart gedrückt wird
48
sbic pinb,1 ; dann -> Lüfter dauerhaft auf Vollgas, bis wieder umgeschaltet wird
49
rjmp SchleifeManuell
50
51
52
;PWM-Chip INITIALISIERUNG
53
sbi ddrb,0 ; PB0->Ausgang
54
ldi D,0 ;PWM initialisieren
55
out OCR0A,D
56
ldi D, 0x83 ;nur Kanal A (0x83h=100 0011b,"1"->COM0A1, WGM01, WGM00)
Danke für den Hinweis mit dem 100nF-Blockkondensator am Attiny. Damit
läuft er jetzt auch ohne den extra "Piep" in "Anfang:" stabil und es gab
bisher noch keine Resets. Ich dachte, das Netzteil vom PC würde
Spannungsschwankungen verhinden. Zumal die Schaltung jahrelang
problemlos gelaufen war. Aber anscheinend hat das neu hinzu gekommene
An- und Abschalten der Lüfter durch Spannungsschwankungen die Resets
bewirkt.
Ich werde es noch weiter beobachten, aber anscheinend ist mein Problem
gelöst - vielen Dank für die schnelle Hilfe ! :-)