Hallo!
Ich möchte das Tachosignal meines Lüfters in meinem 4433 zählen.
Das klappt aber nur bedingt.
Zunächst habe ich es für ein Hardwareproblem gehalten, aber mittlerweile
denke ich das es ein Softwareproblem ist.
Denn selbst wenn ich die Leitung des Tachos gegen Masse halte,
zählt er nur jede 3. odder 4. Berührung!!
Mein programm sieht so aus.
$regfile = "4433def.dat"
$crystal = 4000000
Dim Tacho As Integer
Dim A As Byte
Dim Fan As Integer
Dim Ausgabe As Integer
Dim New_time As Byte
Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 ,
Db7 = Portd.3 , E = Portd.5 , Rs = Portd.4
Config Lcd = 24 * 2 'configure
lcd screen
Config Portd = Output 'configure
portd as output
Config Portb = Input
Config 1wire = Portb.4
Reset Portd.1 'write mode
for display
Initlcd 'init
display again
Cursor On
Const Ticks = 10
Dim Count As Integer
Config Timer0 = Counter , Edge = Rising
Load Timer0 , Ticks
On Timer0 Timer0_isr ' Jump to
Timer1 ISR
Enable Timer0 ' Enable the
timer interrupt
Enable Interrupts ' Enable
Global Interrupt
Do
If Pinb.2 = 0 Then A = 1 'Zustand 1
zwischenspeichern
If Pinb.2 = 1 Then
If A = 1 Then
Reset A
Cls
Lcd Count
End If
End If
Loop
End
Timer0_isr:
Load Timer0 , Ticks
Count = Count + 1
Return
Ich hoffe jemand kann mir da weiterhelfen.
Vielen Dank!
Gruß
Matthias
Hallo!
Ich habe das obige Programm noch mal überarbeitet, aber ich bin immer
noch nicht weitergekommen,
ich bekomme die Drehzahl nicht gezählt.
Ich habe es diesmal über einen externen Interrupt versucht,
aber bei 26 bleibt das Display stehen!
Manchmal etwas eher oder später.
Und dafür zählt er auch noch viel zu langsam.
Bin für jede Hilfe Dankbar.
$regfile = "4433def.dat"
$crystal = 4000000
Dim A As Byte
Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 ,
Db7 = Portc.3 , E = Portc.5 , Rs = Portc.4
Config Lcd = 24 * 2 'configure
lcd screen
Config Portc = Output 'configure
portd as output
Config Portb = Input
Config 1wire = Portb.4
Reset Portb.1
Dim Count As Integer 'write mode
for display
Initlcd 'init
display again
Cursor On
'Ddrd.4 = 0 'Pin PD4/T0
auf Eingang setzen
Config Portd = Input
'Portd.4 = 0 'PullUp von
PD4/T0 aktivieren
On TIMER0 OnTimer0 'Interrupt-Routine für Timer0-Overflow
Config Timer0 = Counter , Edge = Rising
Enable TIMER0 'Timer0-Overflow-Interrupt einschalten
Enable Interrupts 'Interrupts
global zulassen
Cls
'---------------------------------------------------------
Timer0 = 246 'Counter
initial voreinstellen
Cls
Do 'Hauptschleife
Lcd Count
Lowerline
Loop
'---------------------------------------------------------
OnTimer0: 'Interrupt-Routine
Timer0 = 246 'Counter
(wieder) voreinstellen
Count = Count + 1
'Cls
' Lcd Count
Return
Hi, Matthias
Wie schnell dreht sich denn der lüfter laut Hersteller Maximal?
Ist er eventuell zu schnell um mit Deinem Timer gezählt zu werden?
wenn ja, könnte da eventuell ein Frequenzteiler helfen?
MfG
Matthias Topel
Hi, Danke für die Antwort!
Der Lüfter ist von Enermax, und ist einstellbar von
1000 - 3000 R.P.M.
In einem anderen Thread hat mir schon jemand gesagt, das das kein
Problem für den Atmel seien sollte.
In einem anderem Forum (Modding), wo sie auch mit Lüfterdrehzahlen
experimentieren, meinten sie es läge an meinem Programm, da sie ohne AVR
keine Probleme hatten.
Zumindest nicht so wie ich.
Dort habe ich erfahren das der Lüfter 2 Impulse pro Umdrehung macht, und
das Problem das die hatten war, das sie viel zu viele Impulse hatten!
Das haben sie mit einem Widerstand kompensiert.
Bei mir sieht das aber so aus,
wenn ich in meinem Programm die Zeile stehen habe
tacho = tacho + 1
dann zähle ich gerade mal maximal 400 Impulse in 2 Sekunden!!
Bei so ca. 7 - 8 V.
Bei 12 V bekomme ich weniger Impulse!! Also nur so 350 oder noch
weniger!
Wie würdest du das Tachosignal denn Zählen?
Hallo,
Also Ich würde den Timer1 benutzen dafür, Prescaler nicht vergessen
einzustellen, und auch die Flanke, also Rising oder Falling.
Also irgendwie so:
Dim Drehzahl as integer
Config Timer1 = Counter , Prescale = 1 , Edge = Rising
counter1 = 0
Do
Drehzahl = Counter1
LCD Drehzahl
Counter1 = 0
wait 1
loop
End
oder dieses nochmal mit timer0 probieren.
Sven
Ich denke, hier ist nicht wichtig "Ob" ein Impuls kommt, sondern "wie
oft" ein Impuls kommt als eher einen normalen Timer, mit dem dann auch
ein Bezug zur Zeitlichen Taktrate getroffen werden kann.
Am Ende soll ja wieder "Umdrehungen in der Minute" rauskommen.
MfG
Matthias Topel
Ja, sicher Matthias hast ja Recht, aber nen bischen soll er ja auch
lernen.
Also,Für Umdrehungen pro Minute das Wait 1 durch
Wait 60 ersetzen ;-))
Sven
Hi
für eine anständige Auflösung zählt man nicht 60s lang sondern mißt die
Länge eines Pulses. Wie das in Hardware geht (ICP) kann man auf meiner
HP nachsehen (www.matwei.de)
Matthias
Danke für eure Antworten!
Aber irgendwie komm ich nicht weiter!
Ich habe mich für den Timer 0 entschieden, und scheinbar
funktioniert das auch.
Aber die Anzeige flackert bei 7V zwischen 50 und 250,
also pro Sekunde!
Bei 12V bleibt der letzte Wert stehen der vorher im Display stand bevor
ich den Regler hoch gedreht habe!!
Liegt dann scheinbar doch an den Signalen der Lüfter.
Hat jemand von euch noch ein paar Infos zu den Tachosignalen?
Also was die genau für eine Spannung ausgeben, und ob die abhängig von
der Betriebsspannung ist.
Also ob ich bei 6V UBB auch 6V Tachosignale bekomme.
Ich habe auch schon einen CPU Lüfter ausprobiert, in der Hoffnung das
die Signale nur bei meinem Enermax schlecht sind!
Aber auch da die dleichen Symtome.
Hat einer von euch noch eine andere Idee??
Gruß
Matthias
Etwas habe ich noch vergessen, gelegendlcih hängt sich der Zähler auf!!
Trotz Drehzahlveränderung von 5 - 12V bleibt die Anzeige immer gleich!
Ich denke mal der Atmel ist abgestürzt.
Gruß Matthias
Hallo Mathias,
Wie hast du den das Tachosignal abgenommen ???
Steckt das noch im Mainboard ???
Wenn nicht, Einfach das Tachosignal mal mit 10KOhm Pullup Widerstand an
+5V hängen.
Es muß schon gewährleistet sein, das das Signal maximal +5V erreicht,
wenn das Tachosignal noch im Mainboard steckt, weiß ich nicht wie es
dort weiterverarbeitet wird, eventuell beeinflusst sich dies dan
gegenseitig.
Sven
Hi,
Ne Ne, das ist ein extra Gehäuse Lüfter und den hab ich direkt auf
meiner Platine angeschlossen wo auch der 4433 ist.
Genauso wie du das beschrieben hast habe ich ihn auch angeschlossen.
Habe auch schon den 7414 dazwischen geschaltet (invertierender
Schwellwertschalter).
Den Ne555 als Monflop habe ich auch schon aufgebaut, so wie auf
Matwei.de beschrieben ist.
Aber alles hat keinen nennenswerten Einfluß gehabt.
Ich bin da echt am verzweifeln.
Matthias
Hi, habe 47pF 22nF und 100nF ausprobiert, aber keine Verbesserung.
Allerdings, wenn ich den mehrere Sekunden laufen lasse geht der
Zählstand auf 0 zurück!!
Auch ohne Kondensator.
Manchmal reicht eine Veränderung der Drehzahl, aber meistens muß ich die
Versorgungsspannung kappen, und dann gehts wieder!
Trotzdem Danke!