-
-
Erfahrener Benutzer
Fleißiges Mitglied
m@rkus33
Eine letzte Anmerkung (bevor der Admin mich wegen off-topic ermahnt):
Wir dürfen nicht vergessen, welchen Nutzen wir selber aus der Community beziehen.
...übrigens ist ein Code allein noch kein Nachbau-Projekt.
-
Erfahrener Benutzer
Fleißiges Mitglied
@Hanni
erstmal Danke für Deinen Vorschlag.
Wenn ich das jetzt richtig verstanden habe, dann müsste ich Hardwaretechnisch an den PIN des INT0 den RC-Impuls legen und an den bisherigen RC-Impuls den Durchflussimpuls. Richtig? Also nur tauschen.
Damit wäre der Durchflussmesser an einem Pin den ich für den Timer proggen kann und der RC-Impuls am Hardware INT0 Pin.
Das ginge ohne Probleme, einfach die Stecker tauschen 
Wenn ich die Datenübertragung ins Main-Loop lege müsste ich dann mit "Waitms250" arbeiten. Dann wäre der Sendetakt in etwa gleich.
Was ich jetzt noch nicht ganz verstanden habe ist die Geschichte mit den beiden Timern. Ich vermute mal, den Timer0 über die Durchflussimpulse als Counter verwenden. Bei jedem Überlauf den Wert sichern und mit dem nächsten Überlaufwert addieren. Zus. beim Überlauf die Impulsbreite messen.
Hmm... mit dem Thema Flankenwechsel und Impulsbreitenmessung, da muss ich glaub ich noch etwas hier im Forum stöbern und die Hilfe von Bascom noch etwas in Anspruch nehmen. 
Toll wäre es, wenn es ohne Hardwareänderungen ginge. Ok Stecker tauschen wäre kein Thema.
Merci und Gruß
Markus
-
Erfahrener Benutzer
Roboter Experte
Hmm, das Waitms könnte man auch weglassen.
Hier mal ein möglicher Lösungsansatz für die oben beschriebene Vorgehensweise:
Timer0 = Durchflusszähler (den Durchflussimpuls als Takt missbrauchen - T0 Eingang - PIN PD 4)
Timer1 = ein Referenz Zeit Zähler mit einer Schrittweite von z.B. 8µs und einer Gesamtdurchlaufdauer, die sich leicht zum Weiterrechen verwenden lässt (z.B. 0,5 Sek).
INT0 = RC Impuls
Am Anfang den INT0 aus steigende Flanke konfigurieren.
Irgendwann kommt die steigende Flanke des RC Impulses -> der Interupt löst aus und man landet in der ISR vom INT0.
In dieser den Zählerstand von Timer 1 sichern und den INT0 auf die fallende Flanke konfigurieren.
Irgendwann ist der RC Impuls beendet. (fallende Flanke). diese löst wiederum einen Interupt aus und man landet in der ISR.
in dieser dann den gesicherten Zählerstand vom aktuellem Zählerstand des Timer1 abziehen, das Ergebniss abspeichern und den Interupt anschliessend wieder auf die steigende Flanke konfigureren.
Der Referenzzeit Zähler erreicht irgendwann einen Überlauf.
Dieser löst einen Interupt aus. In der ISR Prüft man nun, ob insgesamt schon 25 Sekunden rum sind (mittels eines Zählbytes). Wenn nicht, Zählbyte = Zählbyte+1, wenn ja, Zählbyte = 0 und ein Flag zum Starten der Übertragung setzen.
Main Loop:
Wenn das Flag zum Starten der Datenübertragung gesetzt ist:
- Durchflusszähler auslesen und reseten
- die Durchflussdaten auswerten
- sonstige notwendige Daten errechnen
- Daten übertragen.
- das Flag löschen.
Wenn das Flag nicht gesetzt ist:
- warten, bis das Flag gesetzt ist.
Ansonsten kann ich dir nur empfehlen, das Datenblatt vom ATMEGA 8 mal wieder rauszukramen und dort mal die Seiten 67 (externer Interupt 0) und die Seiten 69 ff. (Timer 0) mal durchzulesen.
Grüße,
da Hanni.
-
Erfahrener Benutzer
Fleißiges Mitglied
Hallo Hanni,
ja das klingt wirklich gut! Das hab ich kapiert
. Die Referenzzeit habe ich umgesetzt und funktioniert prima. Jetzt muss ich nur noch schauen wie ich am einfachsten den Durchflusszähler auf TO bekomme. Den habe ich dummerweise nicht mit einem Lötpad versehen. Das war wirklich dumm von mir, alle anderen freien Pins haben eins, nur der nicht. Ok, mache ich halt ne neue LP.
Das mit RC auf INT0 werde ich heute mal ausprobieren.
Vielen, vielen Dank für den Lösungsansatz ich denke das funktioniert.
-
Erfahrener Benutzer
Roboter Experte
Na dann viel Erfolg.
Grüße,
da Hanni.
-
Erfahrener Benutzer
Fleißiges Mitglied
Hi Hanni,
konnte mal etwas spielen. Jetzt habe ich nur eine (ganz dumme) Frage:
Ich habe den Timer0 als Counter konfiguriert, leider zählt er nicht. Was hab ich falsch gemacht. Ich möchte das er bei jedem Impuls den Wert nur um eins erhöht.
Impuls liegt nun an Pind.4
So sieht der Timerteil im Code aus:
Dim Impulse as Long
Config Pind.4 = Input
Portd.4 = 1
Config Timer0 = Counter, Edge = Falling, Prescale = 1024
Timer0 = 254
On Timer0 dfm
Enable Interrups
Enable Timer0
Do
"Hauptschleife"...bla,bla
Loop
dfm:
Incr Impulse
Timer0 = 254
Return
Bin ich jetzt doof? Ich kann da keinen Fehler erkennen ????
Gruß
Markus
-
Erfahrener Benutzer
Roboter Experte
Ne, doof biste nicht. Du hast nur einen kleinen Denkfehjler drin.
Wenn der Timer als Counter konfiguriert ist, hast du den Prescaler nicht zur Verfügung.
Dieses liegt darin begründet, das du auch dieses defakto im TCCR Register mit den Bits CS?0 - CS?2 einstellst. Schau mal ins Datenblatt, dann siehst du sofort was ich meine.
Grüße,
Da Hanni.
-
Erfahrener Benutzer
Fleißiges Mitglied
Mensch, ich bin doch doof.... Prescaler raus und schon gehts. Hmm, jetzt hab ich alles umgebaut aber mit dem Pulsein werde ich nicht glücklich.
Jetzt läuft der Durchflussmesser auf dem Timer1, der Sendetakt der RS232 Daten kommt vom Timer0, den INT0 habe ich komplett entfern.
Komisch ist, das der Pulsein ab ca. 500 I/min vom Durchflussmesser gar nicht mehr misst. Ich habe die Vermutung, das die Zeit die zwischen den Impulsen vom Durchflussmesser ab dieser Grenze einfach zu kurz wird um die RC-Impulsmessung per Pulsein zu erlauben. Kann das sein?
Ich dachte das die Zählung der Durchflussmesser Impulse jetzt über den Timer1 "nebenbei" laufen kann.
Auch eine Änderung des Quarzes auf 7.3728 Mhz hat nix gebracht. Da macht der Pulsein gar nicht mehr mit. ?????
Ich werd noch verrückt, irgendwas mach ich doch da falsch... oder nicht?
Gruß
Markus
-
Erfahrener Benutzer
Roboter Experte
Wie gesagt: Versuch den RC Impuls auf den INT0 zu legen und miss die Impulsbreite.
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
-
Foren-Regeln
Lesezeichen