Hallo zusammen, ich hätte da, an diesem wundeschönen Sonntag, mal wieder ein Problem: Mit einem Mega8 würde ich gerne eine Drehzahl und eine analoge Spannung messen. Ich arbeite mit Bascom. Ist dieses Grundprinzip soweit richtig (???): Timer0 läuft los und zählt munter vor sich hin. Bei jedem Überlauf wird in der Interruptroutine die Variable A um 1 hochgezählt. Erfährt nun der externe Interrupt Int0 eine steigende Flanke (kommt zu Testzwecken erstmal aus einem Rechteckgenerator), so wird die Routine ausgelöst und A ist das vorläufige Ergebnis (Dreh_temp = A). Dreh_temp wird zur Beobachtung erstmal auf dem LCD ausgegeben. A wird gleich 0 gesetzt und es geht wieder von vorne los. Klappt soweit :-))) Nun möchte ich jedoch etwa alle 200ms ADC1 auslesen und den Wert zusammen mit Dreh_temp auf dem LCD ausgeben. Setzte ich diesen Vorgang mit in die Int0-Routine klappt alles einwandfrei, jedoch ist dann die "Refresh-Rate" des LCD und auch das Lesen des ADC0 abhängig von der Drehzahl. Das wollen wir ja nun nicht. Also habe ich Timer1 eingerichtet. Nun das Problem: Irgendwie kollidieren die beiden. Ich lasse erstmal nur eine LED durch Timer1 ca. alle 500ms blinken. In dem Moment, wo die LED blinkt, stimmt der Wert von Dreh_temp im LCD nicht mehr. Dort wird z.B. immer 1909 angezeit und wenn durch Timer1 die LED blickt steht da kurz z.B. 1766 Was mache ich falsch ??? Vielen Dank !!! Nadja
Grundsätzlich: die Drehzahl (oder auch Frequenz) kann man messen, indem man die Ereignisse eine feste Periode lang zählt und dann in /s oder /min umrechnet, oder aber man misst die Zeit zwischen zwei Ereignissen und rechnet das mit f=1/t um. Meines Erachtens der bessere Weg bei niedrigen Frequenzen. Zu Deinem Problem: ohne Code ?? Sollen wir hellsehen? Auf jeden Fall musst Du gewährleisten, dass während des Timer-Interrupts der die Impulse auch gezählt werden. Viel Erfolg
normalerweise macht man im interrupt auch nicht so "große" sachen wie lcd-ansteuerung. am besten ein flag setzten und dann in der hauptschleife die zeitintensiven sachen ausführen. sonst kann es nämlich mal leicht passieren, das ein interrupt nicht ausgeführt wird, weil du noch in nem anderen drinhängst. glaube ich :-)
hmm wie groß ist denn die frequenz des signals.. ich bin grad beim erfassen der drehzahl von lüftern (12v, pc) ich lasse einfach in der hauptschleife ablaufen: loop: in temp1, pinX in temp2, pinX eor temp1, old_state (was beim letzten mal da war) mov old_state, temp2 und nu sind alle änderungen der pins in temp1 gespeichert.. war ne änderung, so steht an dem bit ne 1 dann nur noch sbrc temp1, 0 inc zaehler rjmp loop und beim interrupt wird der zaehler mit so und so viel multipliziert und sogar in ascii umgerechnet und ausgegeben.. zu beachten ist, dass nen 12v lüfter 2 signale (open collektor) sendet und dass die routine hier von mir 2 signale aus jedem macht (steigende flanke 1x und fallende 1x) dave
Schönen guten Abend zusammen, kommme der Sache nun näher. Ihr habt Recht, zeitintensive Vorgänge wie das LCD sind wohl der Grund. Hab das mal rausgenommen und gebe testweise die Werte per RS232 aus. Das sieht dann schon deutlich besser aus. Wenn nachher alles klappt, sollen sie eh in ein EEprom geschrieben werden. Jetzt habe ich aber ein ganz anderes Problem: Der ADC0 wird vom Rechtecksignal am Int0 beeinflußt. Kann das sein ?? Ich gebe einfach das Rechtecksignal von einem Frequenzgenerator mit z.B. 10Hz auf den Int0. Der ADC0 bekommt eine Spannung aus einem Spannungsteiler der VCC teilt. Sehe ich mir Spannung an ADC0 auf dem Oszi an, kann man ein Rechteck entsprechend der Frequenz des Int0-Signals erkennen? Benötigen ADC0 oder Int0 eine Außenbeschaltung ? Viele Grüße Nadja
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.