Hi,
Hatte letzte Woche das Problem mit dem Thema "Pwm über Poti mit Mega8 in
Bascom". Dabei wurde mir hier saugut geholfen und die Regelung funtzt
jetzt einwandfrei. Jetzt geht es um das Tacho Signal des Lüfters. Hab
keine Ahnung wie ich da anfangen soll zu programmieren. Hab mir überlegt
das ganze irgendwie über nen Interrupt zu machen. Das Problem ist nur,
dass meine Portd-Pins die die interrupt Funktion haben schon für das LCD
Display vergeben sind (war ne Grund Config von AVR!). Hab das Signal das
vom Lüfter kommt nun auf PINC.1 (ADC) gelegt. Die Frage ist, ob auch an
diesem Pin ein Interrupt möglich ist?
Im vorraus vielen Dank für euren Support.
MfG
Eddy
EazyEddy schrieb:> Die Frage ist, ob auch an> diesem Pin ein Interrupt möglich ist?
Neuere AVRs können Pin Change Interrupt an nahezu jedem Pin. Beim Mega8
wirst du allerdings mit intX auskommen müssen.
Du kannst nen Timer laufen lassen und den Pin in der ISR abfragen
lassen. Nur wird das den Controller ordentlich auslasten...
EazyEddy schrieb:> Hab das Signal das> vom Lüfter kommt nun auf PINC.1 (ADC) gelegt. Die Frage ist, ob auch an> diesem Pin ein Interrupt möglich ist?
Da bietet es sich förmlich an den ACI (analog comparartor int) zu
nehmen.
Den kannst du über AMUX auf einen beliebigen ADC Eingang legen.
Gruss Klaus
EazyEddy schrieb:> Hatte letzte Woche das Problem mit dem Thema "Pwm über Poti mit Mega8 in> Bascom". Dabei wurde mir hier saugut geholfen und die Regelung funtzt> jetzt einwandfrei.
Wenn die "Regelung" funktioniert, dann erfasst du doch schon die Ist
Drehzahl. Also nur noch ausgeben.
Mir ist aufgefallen das ich das Signal auch auf den PinB.0 legen könnte.
Ist der Timer/Counter 1 Input Capture Pin. Wie müsste ich daran gehen,
wenn ich das signal darauf gebe?
Hallo Eddy!
Dafür brauchst Du kein Interrupt, das Tachosignal ist lang genug um es
mit einen Digitalport zu erfassen. Du musst den Port legendlich
verriegeln, damit High und Low erkannt wird.
LG Jens
(Beispiel: http://www.pcfilter.de/AVR-Ecke/Page15.html)
Hallo Eddy!
Ich kenne die Schreibweise von Bascom nicht, aber im Großen und Ganzen
sollte der Sinn erkennbar sein.
Define Ver1 Byte
Define Zähler1 Byte
Do
...
IF (PortX = 0) AND (Ver1 = 0) THEN
Ver1 = 1
Zähler1 = Zähler1 + 1
ENDIF
IF (PortX = 1) AND (Ver1 = 1) THEN
Ver1 = 0
ENDIF
...
Loop
Danach nach einer Zeit X (ich verwende 2 Sekunden) den Zähler1 auslesen,
zurücksetzen und am Display anzeigen lassen.
LG Jens
Jens schrieb:> Define Ver1 Byte>> Define Zähler1 Byte>> Do
...
>> IF (PortX = 0) AND (Ver1 = 0) THEN>> Ver1 = 1>> Zähler1 = Zähler1 + 1>> ENDIF>> IF (PortX = 1) AND (Ver1 = 1) THEN>> Ver1 = 0> ENDIF>> ...>> Loop
Im großen und ganzen klar, aber für was steht die Variable Ver1?
Hat einer ne Ahnung wie der Bascom Befehl für ne "Zeit warten" bzw. das
er nen Befehl (hier Zählen) ne Zeit lang ausführt ist? Find in der
Bascom Hilfe nix passendes-.-
Jens schrieb:> [...]> Dafür brauchst Du kein Interrupt, das Tachosignal ist lang genug um es> mit einen Digitalport zu erfassen. [...]
Das ist interessant. Wie lang ist denn so ein Tachosignal? Und kann man
das wirklich so pauschal sagen?
Volker
Jens schrieb:> Danach nach einer Zeit X (ich verwende 2 Sekunden) den Zähler1 auslesen,>> zurücksetzen und am Display anzeigen lassen.
Und könnte mir bitte jemand zeigen, wie das dann in Bascom als Code
aussehen soll?
EazyEddy schrieb:> Jens schrieb:>> Danach nach einer Zeit X (ich verwende 2 Sekunden) den Zähler1 auslesen,>>>> zurücksetzen und am Display anzeigen lassen.>> Und könnte mir bitte jemand zeigen, wie das dann in Bascom als Code> aussehen soll?Das koenntest Du Dir nach den ganzen Vorschlaegen und Hinweisen doch
nun wirklich selbst erarbeiten. Ich wuerde allerdings an Deiner Stelle
vorher nochmal alle Beitraege verinnerlichen und mir Gedanken ueber das
generelle Vorgehen machen. Sinnvoll auch eine kurze Berechnung ob Du bei
der Loesung Deiner Wahl dann wirklich keine Flanke verpassen kannst (was
natuerlich auch vom Rest Deinem Programms abhaengt).
Volker
Naja, der Ansatz ist ja schon da, aber ich hab immer noch keinen plan
wie der Befehl, der während dem Zählen die Zeit angibt lautet! (in
Basic)
Statt dessen bekomme ich hier nur bilder von Schwulen Senioren. War
wahrscheinlich eines der letzten Urlaubsfotos xD
> aber ich hab immer noch keinen plan> wie der Befehl
Genau das ist der springende Punkt.
Es gibt nicht den Befehl, den du einfach benutzt und alls funktioniert
ganz von alleine.
Du bist scheinbar als BASCOM Verwender zu verwöhnt. Jetzt beginnt für
dich der Ernst des Programmierer Lebens. Die Kombination von Befehlen,
die Kombination von Techniken machts! Und in deinem Stadium ist es nicht
wirklich ungewöhnlich, wenn das ein paar Tage dauert. Grundvoraussetzung
ist aber, dass man sein Handwerkszeug, sprich seine Befehle kennt!
Hinweis: Dein Weg führt über Timer. Wenn du Flankenzählen probieren
willst, dann brauchst du eine (beispielsweise) 2 Sekunden Basis. Und die
machst du mit einem Timer. Also gilt es jetzt erst mal die Grundlagen
von Timern zu lernen.
Hallo alle miteinander!
EazyEddy schrieb:
> Im großen und ganzen klar, aber für was steht die Variable Ver1?
Die Variable „Ver1“ ist die Verriegelung für den einen Port, an dem Du
das Tachosignal angeschlossen hast. Sie wird quasi immer hinterher
gezogen und ermöglicht Dir die IF Anweisung nur 1x aus zu führen. Das
ist wichtig, damit die Variable „Zähler1“ auch nur eine Low-Flanke vom
Tachosignal erfasst...
> Hat einer ne Ahnung wie der Bascom Befehl für ne "Zeit warten" bzw.> das er nen Befehl (hier Zählen) ne Zeit lang ausführt ist?
Den Befehl für „Zeit warten“ darfst Du in Deinem gesamten Programm nicht
verwenden. Wenn Dein Programm wartet, denn kann es logischerweise keine
Tachosignale zählen. Hier musst Du mit einem Timer arbeiten, der nach
einer Zeit X die Variable „Zähler1“ ausliest, zurücksetzt und
gegebenenfalls auch noch am Display anzeigt.
Volker schrieb:
> Das ist interessant. Wie lang ist denn so ein Tachosignal?> Und kann man das wirklich so pauschal sagen?
Die Tachosignale sind stark vom Lüfter abhängig, je kleiner der Lüfter
desto mehr Signale prasseln rein. Da der Trend aber immer mehr zu großen
Lüftern geht (> 80mm), kommt einen das hier sehr entgegen. Bei meinen
140mm Lüftern gehen ca. 15 Impulse pro Sekunde bei ca. 4V ein. Bei 12V
sind es ca. 45 Impulse pro Sekunde. Die Fehlerquote läst sich dann auch
noch künstlich puschen, indem man z.B. nur alle 2 Sekunden den Zähler
ausliest.
LG Jens
Karl Heinz Buchegger schrieb
> Du bist scheinbar als BASCOM Verwender zu verwöhnt. Jetzt beginnt für> dich der Ernst des Programmierer Lebens.
Im Falle keine Interrupts dazwischenspucken könnte er als einfache
Lösung Pulsein() zur Messung der Periodenendauer verwenden.
Ich würde das Zählen ehrlich gesagt mit einem externen Interrupt machen,
den ich auf Flanke einstelle.
Bei jeder Flanke wird ein Zähler hochgezählt.
Dazu noch ein Timer, der ebenfalls regelmässig einen Interrupt auslöst.
Variablen:
**********
1
Flanken
2
Drehzahl
externer Interrupt
******************
1
Flanken = Flanken + 1
Timer Interrupt
***************
1
if 2 Sekunden sind rum
2
Drehzahl = Flanken
3
Flanken = 0
Hauptschleife
*************
1
do
2
mach was anderes
3
Drahzahl anzeigen
4
Loop
so ungefähr als genereller Plan. Aber näher will ich das jetzt nicht
ausführen, damit CrazyEddie nicht einfach nur abschreibt sondern sich
selbst weiterbildet.
Jens schrieb:> Volker schrieb:>>> Das ist interessant. Wie lang ist denn so ein Tachosignal?>> Und kann man das wirklich so pauschal sagen?>> Die Tachosignale sind stark vom Lüfter abhängig, je kleiner der Lüfter> desto mehr Signale prasseln rein. Da der Trend aber immer mehr zu großen> Lüftern geht (> 80mm), kommt einen das hier sehr entgegen. Bei meinen> 140mm Lüftern gehen ca. 15 Impulse pro Sekunde bei ca. 4V ein. Bei 12V> sind es ca. 45 Impulse pro Sekunde. Die Fehlerquote läst sich dann auch> noch künstlich puschen, indem man z.B. nur alle 2 Sekunden den Zähler> ausliest.
Ich meinte nicht die Frequenz der Signale (die ja eher proportional zur
Drehzahl als zur Lueftergroesse sein sollte), sondern die Laenge eines
Signals. Deine Funktion muss ja (ungeachtet dessen, was der µC sonst
noch erledigt) mindestens einmal innerhalb des Zeitraums aufgerufen
werden.
Als einzige "Universalloesung" sehe ich nur einen Interrupt mit Messung
der Periodendauer.
Volker
Karl Heinz Buchegger schrieb:> Ich würde das Zählen ehrlich gesagt mit einem externen Interrupt machen,> den ich auf Flanke einstelle.>> Bei jeder Flanke wird ein Zähler hochgezählt.> Dazu noch ein Timer, der ebenfalls regelmässig einen Interrupt auslöst.> [...]
Wenn wir schon externen Interrupt und Timer benutzen, fehlt zur Messung
der Periodendauer aber auch nicht mehr viel. ;)
Und ich persoenlich haette meine Messergebnisse gerne schnell und
akkurat anstatt verzoegert und interpoliert. Gerade auch wenn z.B. ein
Luefterausfall erkannt werden soll.
Volker
Volker Schulz schrieb:> Ich meinte nicht die Frequenz der Signale (die ja eher proportional zur> Drehzahl als zur Lueftergroesse sein sollte),
Nitpicking:
Ich würde mal schätzen, dass sich größere Lüfter tendentiell langsamer
drehen.
> sondern die Laenge eines> Signals.
Jep. Das wäre interessant. Das andere was interessant ist: muss mit
Prellen gerechnet werden.
Beides kann ich nicht beantworten. Hab mich damit noch nie beschäftigt.
Volker Schulz schrieb:>> Bei jeder Flanke wird ein Zähler hochgezählt.>> Dazu noch ein Timer, der ebenfalls regelmässig einen Interrupt auslöst.>> [...]>> Wenn wir schon externen Interrupt und Timer benutzen, fehlt zur Messung> der Periodendauer aber auch nicht mehr viel. ;)
Natürlich nicht.
Aber der Vorschlag, der kam, war nun mal, Pulse in einer gewissen Zeit
zu zählen. Ausserdem schadet es Eddie sicher nicht, wenn er ein paar
Techniken kennen lernt :-)
> Und ich persoenlich haette meine Messergebnisse gerne schnell und> akkurat anstatt verzoegert und interpoliert. Gerade auch wenn z.B. ein> Luefterausfall erkannt werden soll.
Schon klar. Hängt immer vom Anwendungsfall ab.
Bei der Messung der Pulslänge hast du dafür dann wieder das Problem,
dass du eine zeitliche Obergrenze einbauen musst (keine Ahnung ob PULSIN
das kann), sonst misst sich der wieder zu Tode.
EazyEddy schrieb:> Omfg, nach diesem Projekt werde ich höchstwahrscheinlich sowieso nichts> mehr in Basic programmieren. Wieso macht ihrs mir nur so schwer!?
Weil es DEIN Projekt ist.
Also machst auch DU die Arbeit.
Wenn wir hier DEIN Projekt für DICH lösen sollen, dann will ich auch die
Stunden dafür abgegolten haben. Ich muss ja schliesslich auch von etwas
leben. Du rufst ja auch nicht beim Zahnarzt an, er soll dir haarklein
und genau erklären, wie man eine Brücke baut. Und wenn du es dann nicht
hinkriegst, soll er das dann unentgeltlich fertig stellen.
Geht das hier schon mal in die richtige Richtung:
Config Timer0 = Timer , Prescale = 1024
On Ovf0 Tim0_isr
Enable Timer0
Enable Interrupts
Do
If Portb.0 = 0 And Ver1 = 0 Then
Ver1 = 1
Zaehler1 = Zaehler1 + 1
If Portb.0 = 1 And Ver1 = 1 Then
Ver1 = 0
End If
End If
Loop
Tim0_isr:
Lcd Zaehler1
Return
End
???????
EazyEddy schrieb:> Tim0_isr:>> Lcd Zaehler1>> Return
Genau anders rum.
Als Faustregel:
Du packst niemals Dinge wie LCD Ausgaben oder Ausgaben über die serielle
Schnittstelle in eine ISR. ISR sollen schnell abgearbeitet werden.
Ausgaben dauern aber vergleichsweise lange.
Du kannst dir aber natürlich in der ISR den auszugebenden Wert zb in
eine andere Variable umkopieren, die in der Hauptschleife ausgegeben
wird. Genau das hab ich weiter oben in der 'Programmskizze' gemacht.
Dadurch wird die ISR schnell abgearbeitet und trotzdem wird nur der
letzte Messwert ausgegeben.
Karl Heinz Buchegger schrieb:> dass du eine zeitliche Obergrenze einbauen musst (keine Ahnung ob PULSIN> das kann),
Zitat aus der Hilfe:
> ERR variable will be set to 1 in case of a time out. A time out will> occur after 65535 unit counts. With 10 uS units this will be after> 655.35 mS.
@MWS
OK. Danke
Können wir uns trotzdem einig werden, welche Technik Eddie vorgeschlagen
wird und ihn dann da durchlotsen.
(Pulse zählen ist nicht auf meinem Mist gewachsen. Ich hab das Thema nur
aufgegriffen)
Karl Heinz Buchegger schrieb:> Können wir uns trotzdem einig werden, welche Technik Eddie vorgeschlagen> wird und ihn dann da durchlotsen.
Hatte den Eindruck, daß Eddie der typische
Bastel-mir-was-will-aber-nix-lernen-Hauptsache-fertig Bascom-Anwender
ist. Mit Pulsein() lässt sich die Angelegenheit problemlos und schnell
erschlagen.
So wie ich den ADC/PWM-Code in Erinnerung hab', geht das hier mit
Pulsein(), da keine Interrupts genutzt werden.
Ich will Dir sicher nicht den Spaß verderben, jemand etwas beibringen zu
wollen. Nur sollte man wissen, hier geht's einfacher, und zwar viel
einfacher.
MWS schrieb:> Ich will Dir sicher nicht den Spaß verderben, jemand etwas beibringen zu> wollen. Nur sollte man wissen, hier geht's einfacher, und zwar viel> einfacher.
Nö, ist kein Problem für mich.
Wir müssen uns nur einig werden, welche Messstrategie verfolgt werden
soll. Sonst verwirren wir ihn nur mehr als notwendig.
Karl Heinz Buchegger schrieb:> Nö, ist kein Problem für mich.> Wir müssen uns nur einig werden, welche Messstrategie verfolgt werden> soll. Sonst verwirren wir ihn nur mehr als notwendig.
Gut, dann würd' ich sagen, er soll sich selbst die Richtung aussuchen.
Die Funktion ist genannt, nun als Alternative bekannt und sollte soweit
auch selbsterklärend sein.
Karl Heinz Buchegger schrieb:> Volker Schulz schrieb:>>> Ich meinte nicht die Frequenz der Signale (die ja eher proportional zur>> Drehzahl als zur Lueftergroesse sein sollte),>> Nitpicking:> Ich würde mal schätzen, dass sich größere Lüfter tendentiell langsamer> drehen.
Ok. Gehen wir halt davon aus, dass das (zumindest innerhalb einer
Luefter-Gruppe wie z.B. PC-Luefter) der Fall sei und es kaum Ausnahmen
gaebe. Ich rechne trotzdem lieber mit realen Werten anstatt mit
Tendenzen. Sollte aber auch eigentlich nur dem TO als Info dienen,
nachdem ich ihm zum Durchrechnen animiert habe. Nicht dass er noch
versucht, die Lueftergroesse in eine Formel zu quetschen. ;)
>> sondern die Laenge eines>> Signals.>> Jep. Das wäre interessant. Das andere was interessant ist: muss mit> Prellen gerechnet werden.>> Beides kann ich nicht beantworten. Hab mich damit noch nie beschäftigt.
Ich habe gerade mal einen Tachoausgang auf dem Oszi bestaunt. Ist ein
ziemlich perfektes Rechtecksignal mit 50% Duty-Cycle (halbe Umdrehung
GND, halbe Umdrehung hochohmig). Die Frequenz aendert sich mit der
Drehzahl. Die Flanken sind sauber, kein Prellen, kaum Ueberschwingen.
Das heisst dann auch, man koennte es ganz genau und kompliziert machen
und eine Aenderung in der Drehzahl schon nach einer halben Umdrehung
erkennen. ;)
Habe natuerlich keine Ahnung ob das jetzt fuer alle Luefter gilt.
Hat jemand echtes Interesse an dem, was das Oszi zeigt? Dann wuerde ich
mal ein Bild schiessen...
Volker
Das mit dem Pulsein hört sich nicht schlecht an, aber in der Bascom
Hilfe gibts dazu nicht mal ein example. beim pulsout ist ein example
aufgeführt, dass folgendermaßen aussieht:
Dim A As Byte
Config Portb = Output 'PORTB all
output pins
Portb = 0 'all pins 0
Do
For A = 0 To 7
Pulseout Portb , A , 60000 'generate
pulse
Waitms 250 'wait a bit
Next
Loop 'loop for
ever
EazyEddy schrieb:> aber in der Bascom> Hilfe gibts dazu nicht mal ein example.
Doch, gibt's schon, ist nur sehr winzig, schau' genauer hin, es sind nur
4 Zeilen.
EazyEddy schrieb:> Das mit dem Pulsein hört sich nicht schlecht an, aber in der Bascom>> Hilfe gibts dazu nicht mal ein example.
sorry, habs grad entdeckt idiot xD
Dim w As Word
pulsein w , PIND , 1 , 0 'detect time from 0 to 1
print w
End
EazyEddy schrieb:> Volker Schulz schrieb:>> Hat jemand echtes Interesse an dem, was das Oszi zeigt? Dann wuerde ich>> mal ein Bild schiessen...>> Gerne^^
Siehe Anhang. X=5ms/Div; Y=2V/Div. Quizfrage an Eddy: Wie schnell dreht
der Luefter im Moment der Aufnahme?
Volker
P.S.: Welches Bildformat muss ich eigentlich waehlen wenn es sich per
Definition sowohl um einen Screenshot wie auch ein Foto handelt? ;)
EazyEddy schrieb:> Volker Schulz schrieb:>> Quizfrage an Eddy: Wie schnell dreht>> der Luefter im Moment der Aufnahme?> ich würde auf ca. 2400 rpm tippen
Du solltest nicht tippen! Wenn Du den korrekten Rechenweg aufgeschrieben
haettest, haette ich Dir trotz des falschen Ergebnisses eventuell noch
einen halben Punkt geben koennen... ;)
Volker
Hallo!
Karl Heinz Buchegger schrieb:
> muss mit Prellen gerechnet werden.
Nein. Die Impulse werden elektronisch durch einen Hallsensor generiert,
der prellt nicht.
-----------------
Anbei noch mal die Tachosignale von einem 60mm, einem 80mm und einem
120mm PC-Lüfter. Bauartbedingt werden immer zwei Impulse pro Umdrehung
ausgegeben (das sollte man nachher beim hochrechnen berücksichtigen).
LG Jens