PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Abfragen von bis zu 110 Impulsen in einer 1/2sek



PCF8574P
20.11.2008, 19:45
Hallo,

ist es möglich auf einen Mega8 mit 16MHz oder einen Mega168 mit 20MHz bis zu 110 Impulse in der Sekunde abzufragen?

Diese Imulse wollte ich auf einen Interruptfähigen Port legen. Bringt das was an Speed?

Die Aufgaben:
-Jede 2. Halbe Sekunde bis zu 110 Impulse Zählen
-Rechenaufgabe
-Rechenaufgabe 2
-auf LCD oder Numerisches LED Display ausgeben

Ist dass denn Zeitlich zu schaffen?

Vorallem:Wie Zähle ich diese IMpulse????

MFG

McJenso
20.11.2008, 20:32
Hallo,

du nimmst zum Zählen den Timer0. Die Hardware zählt dann deine Impulse an T0, dem externen Impulseingang für den Zähler. Dann hast du bei der Software die ganze halbe Sekunde für die Rechenaufgaben und die Ausgabe. In der Zeit kannst du schon eine Menge berechnen.

Gruß

Jens

oberallgeier
20.11.2008, 20:48
Hi, PCF8574P,


... Mega168 mit 20MHz bis zu 110 Impulse in der Sekunde abzufragen ...In Bascom kenne ich mich nicht aus, da ich mit C programmiere. Bei meinem Dottie (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=390196#390196) bekomme ich von einem Motor in einer Sekunde max. 1500 Impulse, die ich per externen Interrupt zähle. Das braucht bei meinem mega168/20MHz CPU-Zeit im unter %-Bereich.

stefan_Z
20.11.2008, 20:52
Die Impulse sind kein Ding - überleg doch mal: 16.000.000 CPU-Zyklen/sek vs. 110 Impulse.... das sollte grad noch gehen ;-)

Die Rechnerei und das LCD sind eher potenzielle Probleme.
Das LCD würd ich nur max. 10x pro Sekunde refreshen, ansonsten erkennste da garnix mehr.
Von was für einer Rechenaufgabe reden wir hier?

wkrug
20.11.2008, 23:17
Ich hab an einem mit 8MHz getakteten Prozessor eine Drehzahlmessung laufen, die 13000 Impulse also 800000 U/min schafft.
Die Routine läuft im Interrupt, die Drehzahlberechnung wird einmal in der Sekunde in der Hauptroutine erledigt.

Die Routine ist aber in Assembler geschrieben.

Also sollten deine 110 Impulse / sek bei einem 16MHz getakteten Controller noch unter die Kategorie " Gleichstrom " fallen.

Wenn Du natürlich nach jedem Impuls eine FFT ausführen willst, könnte es eng werden. :-b

oberallgeier
20.11.2008, 23:36
... nach jedem Impuls eine FFT ausführen ...Gibts vielleicht ne kleine Cray mit I2C ? ? ? Ok, ok, [/OT]

stefan_Z
21.11.2008, 03:26
Nicht immer notwendig, so ein cray....
http://elm-chan.org/works/akilcd/report_e.html

wkrug
21.11.2008, 09:11
Nicht immer notwendig, so ein cray....
http://elm-chan.org/works/akilcd/report_e.html
Die Seite kannte ich schon, ich find das Teil auch extrem G...
Ein Grafikdisplay in blau hab ich schon zu Hause.

oberallgeier
21.11.2008, 10:05
... The fixed-point FFT library for avr-gcc avrfft.zip is also available ...Ok ok, ich sag ja schon garnix mehr gegen fixed-point. Habe selber ne hübsche, flotte Regelung mit Integer aufgebaut. Aber die library - schon cool sowas.

... No.27 B-dur KV595/MOZART ...Ein Augenschmaus für Liebhaber der klassischen Musik?

Ich finde diese ELM-Seiten ziemlich hübsch. Auch die interessante Verkabelung - und ich D..pp habe schon so viele Stunden mit SMD-Platinen-Vermurksen verbracht.

stefan_Z
21.11.2008, 13:19
Ja, der ELM geht steil... Japaner eben...
Leider bin ich ne Null in Assembler, ansonsten könnte man anstelle des exotischen LCDs einfach ne SPI-Ausgabe der Waveform basteln.
Die gibt man dann an nen 2. µC weiter und der stellts dann auf ner LED-Matrix dar... Feine Raumdeko!

PCF8574P
21.11.2008, 17:27
Hallo,

das mit dem Timer0 und am Pin T0 habe ich gewusst.
Mein Problem ist aber vielmehr der Code.
Ich kriegs einfach nicht hin das der zählht. Im Moment mache ich das einer While/For schleife. Aber dort kann ich nicht einfach nach einer halben sekunde aus der Schleife herausspringen. Oder doch?

@stefan_Z: Das LCD wird nicht 110 oder 10mal die Sekunde gerefresht. Sondern nur 1 Mal die Sekunde!

Also:
in der ersten halben sekunde:
-Impulse Zählen die in einer halben sekunde kommen
-2 Rechenaufgaben und LCD refreshen

MFG

McJenso
21.11.2008, 17:47
Hallo,

du lässt einen zweiten Timer jede 1/2 Sekunde einen Interrupt auslösen. In der ISR ließt du die Anzahl der Impulse aus und setzt den Zähler zurück. Wenn du möchtest, kannst du noch ein Flag setzen, dass dir in der Hauptschleife signalisiert, dass eine Messung abgeschlossen ist. Dann hast die nächst halbe Sekunde bis zum Interrupt Zeit für deine Rechnungen und die Ausgabe.

Gruß

Jens

wkrug
21.11.2008, 18:19
Also ich würd da eine Impulszyklenmessung machen.

Also:
Der Timer 1 läuft frei und hat zusätzlich noch einen Überlauftimer, der im Timer1 Overflow Interrupt hochgezählt wird.
Tritt nun ein Zählereignis ein wird am Besten der Input Capture Pin -> Interrupt getriggert, der den Timer 1 respektive das input capture Register + den überlauf zähler ausliest.
In dieser Routine wird der Zählerstand des vorherigen Capture Impulses vom aktuellen Zählerstand abgezogen.
Somit erhält man die Zeit in halben µs ( bei 16MHz und Prescaler 8 ).
Um eine Mittelung der gemessenen Impulse zu erhalten wird eine Variable hochgezählt und die aktuellen Zählerstände auf eine Summenvariable aufaddiert.
Der aktuelle Zählerstand wird, nachdem alles gemacht wurde in die Old Variable für die nächste Impulsdauermessung eingeschrieben.
In dieser Interruptroutine werden nur Additionen, bzw. Subtraktionen verwendet, die der Controller schnell abarbeiten kann.

In der Hauptroutine kannst Du dann jede die Summenvariable durch die Zählvariable teilen und Du erhältst eine mittlere Impulslänge daraus.
Aus dieser Impulslänge lässt sich dann alles mögliche errechnen Zeit, Drehzahl, Geschwindigkeit oder sonstwas.
Nach der Berechnung wird die Summenvariable und die Zählvariable wieder auf 0 gesetzt und das Spielchen kann von vorne beginnen.

Der Vorteil der Methode ist, das man schon mit 2 Impulsen eine Aussage über die Zeitlänge machen kann und die Werte gerade bei niedrigen Impulsraten sehr hoch auflösen.

Der Nachteil ist, wenn innerhalb der Überlaufparameter kein Impuls mehr kommt, entstehen Meßfehler.
Diesen Zustand muß man in der Software abfangen.
Ist aber eigentlich auch kein Problem, wenn man dazu die Zählvariable benutzt und alle Werte unter 2...3 als Impulse 0 ansetzt.

Diese Methode benötigt prinzipiell 2 Timer, wobei der Timer 1 frei läuft und somit auch für die 1 Sekundenintervalle verwendet werden könnte, das würde ich dann per Comparematch machen.
Wenn man noch einen Timer frei hat ist natürlich die 2 Timer Methode eleganter.