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)
Port verriegeln?-Sorry für die frage, aber wie geht das?
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
Also gilt "Verriegeln" <==> Flanken zählen in einer bestimmten Zeit
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
Mich würd des auch interessieren. Kanns mir mittlerweile ohne Interrupt gar nicht mehr vorstellen! Hab voll den Hänger-.-
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.
Omfg, nach diesem Projekt werde ich höchstwahrscheinlich sowieso nichts mehr in Basic programmieren. Wieso macht ihrs mir nur so schwer!?
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.
Danke vielmals für diese Ansage^^
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
Volker Schulz schrieb: > Hat jemand echtes Interesse an dem, was das Oszi zeigt? Dann wuerde ich > > mal ein Bild schiessen... Gerne^^
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: > sorry, habs grad entdeckt idiot xD mit idiot meinte ich mich. nicht das das hier in den falschen hals gekriegt wird^^
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? ;)
Volker Schulz schrieb: > Quizfrage an Eddy: Wie schnell dreht > > der Luefter im Moment der Aufnahme? ich würde auf ca. 2400 rpm tippen
Mein Tachotestprogramm sieht bislang so aus: $regfile = "m8def.dat" $crystal = 8000000 $baud = 19200 $hwstack = 32 $swstack = 16 $framesize = 40 Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2 Dim A As Byte Config Lcd = 16 * 2 Config Portd = Output Config Adc = Single , Prescaler = Auto , Reference = Avcc Start Adc Dim Analogwert As Word , Pwm1 As Byte Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 1 Start Timer1 Dim Ver1 As Byte Dim Zaehler1 As Byte Pwm1b = 0 Do Analogwert = Getadc(0) Analogwert = Analogwert / 204 Pwm1 = Analogwert * 51 Pwm1b = Pwm1 Loop Dim Zaehlen As Word Pulsein Zaehlen , Pinb , 0 , 0 Print Zaehlen End Bin ich damit auf dem richtigen Weg?
EazyEddy schrieb: > Bin ich damit auf dem richtigen Weg? Äh, nein. Das Pulsein() muss in die Loop, dahinter nützt's nix.
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
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.