Frequenzzählen mit Bascom

Gast #27820
Lesenswert?

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
Gast #27821
Lesenswert?

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
Gast #27824
Lesenswert?

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?
Gast #27825
Lesenswert?

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
Gast #27829
Lesenswert?

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
Gast #27831
Lesenswert?

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
Gast #27832
Lesenswert?

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
Gast #27834
Lesenswert?

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!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren