Moin,
und zwar baue ich gerade eine Propeller Uhr.
Diese Funktioniert eigentlich schon einwandfrei. Einziges Problem, ich
müsste die Drehzahl verdreifachen, was ich aber nicht möchte.
So Flackert sie eben.
Im Moment läuft das Programm wie folgt ab:
Zuerst wird die Zeit von einer Realtime Clock über I2C eingelesen
Dann wird mit einer Gabellichtschranke alle 360° ein Ext. Interuppt
ausgelöst.
Zwischen zwei Interrupts wird die Zeit gemessen.
Nach dem zweiten Interrupt wird dieser abgeschaltet.
Nun wird der Timer auf 1/60 der Gemessenen Zeit eingestellt.
Jeder Timerinteruppt überprüft dann, ob der Jeweilige Zeiger an der
entsprechenden Position ist.
Nachdem 360 Grad absolviert wurden, lass ich noch mal die Zeit einlesen
(also zu diesem zeitpunkt wird nichts angezeigt!) und aktiviere wieder
den externen Interrupt. Dieser misst dann wieder die Zeit, etc...
Das heißt ich habe effektiv jede 3te Umdrehung nur ein Bild.
Kann mir vllt jemand auf die Sprünge helfen, wie ich die Zeit während
dem Anzeigen messen kann?
Hi,
wie wärs wenn du es mit einer Art hilfskonstruktion machst.
Du lösst mit dem timer interrupts aus. Sagen wir jede 1/10 millisekunde
oder sowas.
Mit diesem Interrupt lässt du dann eine Variable Inkrementieren.
Immer wenn der externe interrupt ausgelösst wird wird der zählerstand
zwischengespeichert und der zähler wieder auf null gesetzt.
mit diesen daten kannst du nun zum beispiel einen array mit anzahl von
ticks berechnen. Immer wenn dann ein stand erreicht wird kannst du dann
eine aktion ausführen.
Habs jetzt nur grob umrissen wie ich das machen würde.
hoffe es hilft dir vieleicht weiter.
Gruß
BlabLa
Die Idee ist nicht schlecht, allerdings gibt es folgendes Problem:
Ich benötige einen Timerinteruppt, damit meine Zeiger genau auf Position
sind.Wenn ich den inkrementierenden Wert überprüfe, kann es auserdem
passieren, dass ich schon dran vorbei "geflogen" bin, und dann zeigt er
an der Stelle keinen Zeiger an. Da müsste ich dann "Bereiche"
definieren, in welchen die Zeiger sind, und das dürft schwer zu
realisieren sein.
Im Moment lass ich i inkrementieren (von 0 bis 59) und frage immer ab,
ob die aktuelle Zeigerposition mit i übereinstimmt.
Habe ich mir auch schon gedacht, aber ich habe nur zwei 8 Bit Timer und
einen 16 Bit.
Für ausreichend Genauigkeit reichen mir 265 nicht aus.
Da habe ich gerade mal eine ~(12/9)° Auflösung.
Zudem kommt dazu, dass ich nur in einem stark begrenzten Drehzahlbereich
arbeiten kann.
Von daher kann ich nur einen 16 bit Timer nutzen.
Andere µC geht nicht, weil die Schaltung schon koplett aufgebaut ist.
Für das nächste mal nehme ich zwei µC ;)
Aber jetzt interessiert mich, wie andere das hinbekommen...
Wie wärs mit sowas
while(1){
if(ticks >= fire){
fire += 0,02*umlaufticks;
leuchtsequenz();
}
}
hab jetzt nur schnell hingetippelt, sind keine casts und
variablendeklarationen dabei.
ich denke diese methode sollte noch genau genug für das anzeigen sein.
Gruß
BlabLa
>Für ausreichend Genauigkeit reichen mir 265 nicht aus.
Und? Dann nimm den 16 Bit Timer zum zählen einer Umdrehung und teil
diesen Wert durch die Anzahl Spalten die Du haben möchtest bzw. die
aufgrund der Abarbeitungszeit angezeigt werden können.
Unterbreche die Lichtschranke doch einfach alle 6°!!!
Damit löst du wie bisher einen Interrupt aus und musst nur noch eine
Variable hochzählen, dann weißt du wo du gerade bist.
So bekommst du dann drehzahlunabhängig 60 Schritte auf 360° - das willst
du ja gerade!
@ Propeller Uhr (Gast)
>Habe ich mir auch schon gedacht, aber ich habe nur zwei 8 Bit Timer und>einen 16 Bit.
Das mehr als genug.
>Von daher kann ich nur einen 16 bit Timer nutzen.
Genau so macht man das. 16 Bit laufen lassen, über externen Interrupt
oder noch besser ICP die Drehzahl messen. Parallel dazu kann man per
Output Compare dann die Ticks für die Datenausgabe erzeugen, sprich
gemessene Periodendauer / Anzahl Spalten/U = Timertick.
>Andere µC geht nicht, weil die Schaltung schon koplett aufgebaut ist.>Für das nächste mal nehme ich zwei µC ;)
Käse. Sowas macht EIN uC (AVR?) locker.
>Aber jetzt interessiert mich, wie andere das hinbekommen...
So wie oben beschrieben. Damit kann man pro Umdrehung ein Bild
schreiben. Und der AVR hat noch viel Zeit nebenher.
MfG
Falk
Hallo Falk,
das mit dem ICP wusste ich nicht, dass dieses auch geht. Das ist
natürlich perfekt. Ich habe das gleich ausprobiert und es funktioniert.
Nur habe ich jetz das Problem, dass die zeit zwischen zwei
Zeigerpositionen zu gering ist um die Uhrzeit per I2C einzulesen.
Ich lass ihn im Moment jede 6te Umdrehung einlesen. Daher flackert es
jedes 6te mal. Die 8 Mhz reichen wohl doch nicht, muss wohl der 20 Mhz
Quarz hin...
Wenn du dafür noch ne elegantere Lösung hättest als nen Quarz hinlöten,
wär ich oberglücklich ;)
@ Propeller Uhr (Gast)
>Nur habe ich jetz das Problem, dass die zeit zwischen zwei>Zeigerpositionen zu gering ist um die Uhrzeit per I2C einzulesen.
Das ist auch totaler Unsinn. Du hast einen freilaufenden Timer, der ist
als Zeitbasis sehr gut geeignet. D.h. du liest EINMAL am Programmstart
deine Zeit aus der RTC und lässt dann im AVR deine Uhr laufen.
AVR - Die genaue Sekunde / RTC>Ich lass ihn im Moment jede 6te Umdrehung einlesen. Daher flackert es>jedes 6te mal. Die 8 Mhz reichen wohl doch nicht, muss wohl der 20 Mhz>Quarz hin...
Vollkommen falscher Ansatz. Du brauchst nicht mehr PS sondern mehr
Köpfchen!
Siehe Multitasking.
Deine Datenausgabe an die LEDs macht man per Timer-Interrupt,
das Auslesen der RTC, wenn es denn überhaupt sinnvoll ist, einmal pro
Sekunde in der Hauptscheife, da hat man alle Zeit der Welt.
MFG
Falk
P S. Ein AVR mit 8 MHz langweilt sich in einer Propelleruhr gewaltig.
Warum? Mal rechnen.
Nehmen wir eine schon recht hohe Drehzahl von 25U/s = 25Hz. Pro
Umdrehung wollen wir 512 Spalten erzeugen, das ist schon sehr viel.
-> 25*512 = 12,8 kHz Spaltenfrequenz.
-> 625 Takte/Spalte
D.h. ein 8 Bit Timer müsste schon mit Prescaler laufen, um das machen zu
können, erst recht bei geringerer Drehzahl.
MFG
Falk
du kannst im Berufsbildungscenter Schweiz nachfragen. Dort haben
Auszubildene eine Propelleruhr gebaut.
info@berufsbildungscenter.ch
Sie haben auch eine ausführliche Doku darüber geschrieben. Wenn du nett
fragst bekommst du sie villeicht ;)
Also ich find sowas auch sehr interessant, gibt es die Uhr nicht als
Bausatz zu kaufen??? Mich schreckt die olle Energieübertragung etwas ab
(Ja Falk, ich weiß was ein Royer Converter ist und wie er funktioniert)
aber der will ja auch erstmal gebaut werden.
Wir könnten ja auch n neues Projekt daraus machen?!
Wer hat Bock?
Gruß Knut