Hallo @all Lang, lang ist es her wo ich mich mit Assembler rum geschlagen habe. Angeblich verlernt man nix, wie das Fahrrad fahren..... aber irgendwie sieht es nicht so aus. Deshalb habe ich (bzw. wurde) mir eine Aufgabe gestellt damit ich wieder reinkomme vielleicht kann der eine oder andere mir hilfreiche Tips geben, denn mit der Suchfunktion war mir auch nicht wirklich geholfen und hoffe ich bin hier nicht ganz falsch in diesem forum: Aufgabe: 90S2313 soll der µC sein 10MHz Typ Der µC soll ein Takt mit F=46,4231Hz (t=21,541ms) erzeugen. ti:tp soll ungefähr 1:1 sein -Es sollen 2 Taster abgefragt werden. -Der eine ist "H" der ander "L" aktiv -Es können NICHT beide Taster gleichzeitig betätigt werden. (Mechanisch verriegelt) -Solange ein Taster gedrückt ist, soll ein ext. Takt eingelesen werden und an dem gleichen Pin vom erzeugten Takt ausgegeben werden -Beide sollen entprellt sein (Prellzeit ist ca. 10ms), die Takterzeugung soll beim loslassen des Tasters weiter laufen bzw. ausgegeben werden. Ist das mit dem 90S2313 überhaupt möglich, besonderst die Genauigkeit der Frequenz? Gibt es Stolperfallen die schon jetzt für den Routine sichtbar sind? Hat jemand vielleicht gerade und ganz zufällig Lösungsansätze parat G PS.: Diese Anfrage habe ich auch im Roboternetz http://www.roboternetz.de/phpBB2/viewtopic.php?t=6697 eingestellt
Frage: Wozu wird eine Frequenz von 46,4231Hz mit dieser Genauigkeit benötigt?
@firefly :) hab ich es doch geahnt, dass diese Frage kommt. Die Anwendung wird für eine Teleskopnachführung gebraucht, damit das Teleskop den Sternen folgen kann. Die Genauigkeit wird spätestens bei der Astrofotografie belohnt, wenn dann die Sterne punktförmig auf das Fotopapier bzw. CCD-Chip bekommt. Ansonsten gibt es nur sog. Strichspuren. Hierzu muß auch noch erwähnt werden, dass Belichtungszeiten von 5min - 180min und mehr!!! keine Seltenheit sind. Hier mal ein link, an dem man das sehr deutlich sieht. Kamera ist fest der Hintergrund (Sternenhimmel) bewegt sich. http://www.volkssternwarte-ennepetal.de/bilder/Astrofotos/Deepsky/pages/Strichspur%20Kaktus.html Und die Frequenz kommt da durch zustande, weil die Teleskopmontierung ein Untersetzungsverhältnis von 1:2500 hat und der Schrittmotor im Mikroschrittbetrieb angesteuert wird. 1/8 Schrittmodus. Damit es jetzt dann noch ganz abgefahren wird. Es wird nicht ein 24h Tag zur Berechnung genommen, sondern der Sternentag und der hat 23h 56min und 4 sek !!!! Hoffe ich konnte jetzt den Grund nach dem Wunsch meiner Genauigkeit nahelegen. Gruß Matthias
Du suchst Lösungsansätze... Zuerst die Erzeugung des Grundtaktes für den Sternen-Nachlauf: - 2313 mit Quarz 4,000 MHz - pb3 in ddrb als Ausgang definieren - Timer1 toggelt oc1 (com1a in tccr1a setzen) - Timer1-Vorteiler 1:1 und löschen bei Compare-Match (ctc1 und cs10 in tccr1b setzen) - Output-Compare auf 41042 einstellen (41042 in ocr1ah:ocr1al) Damit erzeugt der Timer am Pin 15 (pb3, oc1) automatisch einen Takt, der alle 41042 Quarztakte getoggelt wird, also eine Periode von 82084 Prozessortakte hat. Nun zu den Tastern: Da du nicht die Flanken der Betätigung auswerten willst sondern den Dauerdruck ("Eilgang" zum Positionieren auf ein anderes Objekt), kann wahrscheinlich auf eine hochprofessionelle Entprellung verzichtet werden. Folgendes dürfte reichen: - Den externen "Eilgang-Takt" an Int0 (Pin 6, pd2) anschließen. Er sollte prellfrei sein, also elektronisch erzeugt. - Int0 aktivieren (int0 in gimsk) - Int0 auf steigende Flanke einstellen (isc01 und isc00 in mcucr) - In der INT0-Serviceroutine: - Int-Flanke umschalten (isc00 in mcucr ändern) - Taster abfragen (sbis/sbic pind,pd?) - Wenn Taster betätigt: - Nachlauftakt deaktivieren (com1a0 in tccr1a löschen) - PB3 in Portb setzen bzw löschen - Wenn kein Taster betätigt: - Nachlauftakt wieder aktivieren (com1a in tccr1a setzen) In der Initialisierung: - Stackpointer initialisieren (auf Ramend setzen) - Timer1 und Ausgang initialisieren (siehe oben) - Int0 initialisieren - Analog-Comp. deaktivieren (acd in acsr) - Sleep-Mode aktivieren (se in mcucr) - Int freischalten (sei) In der Hauptschleife: main: sleep rjmp main Bei 4 MHz-Quarz geht das gut auf (wenn ich mich nicht verrechnet habe), bei 10 MHz würde der Output-Compare-Wert über 64k liegen, was den Vorteiler 8 erzwingen würde. Dies hätte ein groberes Teiler-Raster zur Folge, worunter die Genauigkeit leiden würde. Bei Unklarheiten im Datenblatt des 2313 nach den genannten "symbolischen Namen" suchen. Viel Erfolg. ...HanneS...
Bei der geforderten Präzision erscheint mir ein temperaturstabilisierter Quarzoszillator (TCXO) angesagt. Alternativ könnte man versuchen, mit einem DCF77-Empfänger eine alternative genaue Zeitbasis zu konstruieren. (Daher meine Frage nach der erforderlichen Präzision)
@...HanneS... vielen dank für die "starthilfe" denke damit kann ich was anfangen. Das mit dem entprellen von den 2 Tastern klingt auch logisch.... ich hätte mir da jetzt "ein Wolf entprellt"... gut das man darüber geredet hat :) @Rufus mit dem DCF77 habe ich auch schon mal geliebäugelt, aber da gibt es ein Problem: Da die Steuerung auch mal im Urlaub funktionieren soll (Traum: Astrofarm Nambia, Phoenix usw. ) und soweit reichen die Funksignale nicht. Das mit dem Oszillator nehme ich mir zu Herzen, es sind doch schon einige Kelvin Schwankungen angesagt.... -15°C in einer a....kalten Winternacht bis 20° in einer kuscheligen Sommernacht....
Eine andere sehr präzise Referenzzeitquelle ist übrigens ein GPS-Empfänger - den sollte man als Astronom eh' dabeihaben ...
Kannst ja 2 zusätzliche (entprellte) "Up/Down" Tasten dran machen, mit denen du den Output-Compare-Wert um jeweils 1 erhöhen/verringern kannst. Dann kannst du das Tempo mittels angeschlossenem Frequenzzähler (Multimeter) kalibrieren. Ein weiterer (entprellter) Taster könnte diesen Wert ins EEPROM speichern, damit er beim nächsten Reset wieder eingelesen und benutzt werden kann. Suche mal im Wiki nach "entprellung". Am besten du entprellst einen ganzen Port und nutzt dann nur die Bits, an denen du Tasten hast. Wenn der externe Takt für Eilgang ständig anliegt, kannst du die Entprellroutine auch mit in dessen ISR unterbringen, sparst dir damit einen Timer-Int. ...
Achja, nur durch Rufus' Nachfragen konnte ich das Vorhaben nachvollziehen und diesen Vorschlag machen. Ansonsten hätte ich mich zurück gehalten. ;-) ...
@Rufus: Nein, hast du nicht. Nicht hier und nicht in deinen anderen Postings. Ich finde deine (humorigen) Texte immer wieder köstlich, auch wenn sie "nur" sachlich sind. ;-) Ohne deine Nachfragen betreffs Genauigkeit hätten wir nicht erfahren, wozu das Teil dienen soll. Und wenn ich nicht weiß worum es geht, dann kann (und will) ich keine Lösungs-Vorschläge machen. Dieses "Gerät" ist sinnvoll. Ein Freund von mir hat sicher auch Bedarf. Ich werde daher nach einem Getriebe Ausschau halten, an das ich einen Stepper ankuppeln kann. Dann die Stepper-Steuerung mittels Mega8, ein Mini-Joystick (analog) für den Eilgang links-rechts, in Ruhestellung Nachführtakt. Die zweite Achse des Joysticks für Heben/Senken. ...HanneS... (wer ist "Eigentlichpaul"...)
@ Rufus Nein! Alles Bestens, nur durch Diskusion, Fragen und Vorschläge kommt man ans Ziel. Habe mir nur ursprünglich das preisgeben der Anwendung verkneifen wollen, da ich manchmal das Gefühl habe, je wissentschaftlicher ein Hobby wird, umso verstockter werden die Interessenpartner :( Ja, GPS das wäre auch eine Möglichkeit...wird auch schon von namhaften Astrogerätehersteller verwendet, ABER... ich glaube mit ersten Vorschlag von Hannes bin ich schon sehr gut beraten. Denn das Projekt soll nur unterstützen und nicht abnehmen.... Denn eines möchte ich, im Zeitalter des Erfolgsdruckes, mir nicht nehmen lassen und zwar den Pioniergeist.... ICH möchte "die Objekte der Begierde" am Nachthimmel finden und nicht so ne doofe "Elektrick". Wenn ich Sie halt nicht in der einen Nacht finde, finde ich sie vielleicht in der anderen Nacht. Es ist und soll ein Hobby bleiben. Nur was selber erkämpft wurde, ist was Wert.... deshalb bin ich mit Hannes Lösungsvorschlag mehr als nur zufrieden....(Kämpfe gerade mit dem Timer..... für heute hat er gewonnen.......) @ Hannes..... Du bist nicht zufällig Hobbyastronom?????? >> Eilgang usw...... ;-)
mist.... da war ich wohl zu spät..... @ Hannes angebermodus an heben/senken >> Declination (DEC) "Nachführung" >> Stundenachse.... (RA) angebermodus aus ;-) Ich verwende übrigens den Baustein von Nanotec IMT901, der kann den sog. Microschrittbetrieb. Ist ne feine Sache. Und je länger die Brennweite vom Teleskop wird, desto wichtiger wird der "feine" Schritt, bei der Nachführung. Mit der oben angegebenen Untersetzung im 1/2-Schrittmodus war bei meine 8"Teleskop mit F=900mm noch "ordentliche" Sprünge zusehen.
Hi Matthias... Nein, ich bin weder (Hobby-) Astronom noch Astrologe noch Astronaut. Daher schäme ich mich auch nicht, dass ich die Fachbegriffe nicht kenne. Der "Eilgang" stammt vom Umgang mit der Drehbank, ist halt schneller als der Vorschub. ;-) Das ich mal an der Drehbank stand ist aber auch schon 25...30 Jahre her. Aber ich kann mir gut vorstellen, was das Teil können muss: - Im unbetätigten Zustand dem Objekt der Begierde möglichst genau hinterherfahren. - Im betätigten Zustand schnell vorwärts oder rückwärts fahren um das zu beobachtende Objekt zu wechseln. - Die endgültige Steuerung des Steppers übernimmt eine vorhandene Technik, um die wir uns momentan keine Sorgen machen müssen. - Der Eiltakt wird von einer vorhandenen Elektronik zur Verfügung gestellt und kann wahrscheinlich im Tempo (Frequenz) verändert werden. - Das Programm sollte (vorerst) relativ einfach sein, damit man die Übersicht behält, wenn man sich nach langer ASM-Abstinenz in ein System mit völlig anderer Architektur (als damals) einarbeitet. Deshalb bin ich auch nicht auf Synchronisation mit Fremdsystemen (Uhr) eingegangen. - Up/Down-Tasten, mit denen man das Tempo des "Vorschubes" (aua, nicht hauen!), also der Sternverfolgung kalibrieren kann um Ungenauigkeiten des Quarzes zu kompensieren, halte ich für sinnvoll. Ich wünsche dir für das Projekt viel Erfolg und bin gern bereit, bei Problemen oder Fragen zu helfen. Der "Große Meister" bin ich zwar auch nicht, aber ich denke, dass ich die AVR-Architektur halbwegs begriffen habe. Gruß... ...HanneS... (www.hannes.de.md)
... nun mal wieder eine Frage zu diesem Thema. Habe es mal aus Bequemlichkeit etwas anderst als der Vorschlag von Hannes gemacht.... scheinbar rächt sich alles..... ;-( Verwende jetzt auch 2 Taster die "L" durchschalten Wenn der Timer1 läuft, kann ihn ein INT0 oder INT1 unterbrechen und eine andere Aufgabe abgearbeitet werden??? Zum Verständnis meiner Überlegung: -Alles notwendige initialisiert (erledigt) -Timer1 gestartet und toggelt fleißig den OC1 (funktioniert) -ext. Takt für Eilgang an PD4 angeschlossen (erledigt) -INT0 und INT1 mit PULLUP auf "H" gelegt (erledigt) -je ein Taster (L-Aktiv) an INT0 und INT1 (erledigt) Wenn ich jetzt einen Taster betätige sollte eigentlich (so mein Wunschgedanken) ein Interrupt duch die fallende Flanke ausgelöst werden. MACHT ER ABER NICHT rofl In der ISR habe ich: 1. die globale Interrupt freigabe gelöscht 2. die Tasten mit 10ms entprellt 3. ext. Takt einlesen und an OC1 ausgeben 4. überprüfen ob Taster noch betätigt, wenn ja zurück nach 3. 5. die globale Interrupt freigabe gesetzt 6. mit reti raus aus der ISR Wo habe ich den Knoten in meiner Vorstellung
... nun mal wieder eine Frage zu diesem Thema. Habe es mal aus Bequemlichkeit etwas anderst als der Vorschlag von Hannes gemacht.... scheinbar rächt sich alles..... ;-( Verwende jetzt auch 2 Taster die "L" durchschalten Wenn der Timer1 läuft, kann ihn ein INT0 oder INT1 unterbrechen und eine andere Aufgabe abgearbeitet werden??? Zum Verständnis meiner Überlegung: -Alles notwendige initialisiert (erledigt) -Timer1 gestartet und toggelt fleißig den OC1 (funktioniert) -ext. Takt für Eilgang an PD4 angeschlossen (erledigt) -INT0 und INT1 mit PULLUP auf "H" gelegt (erledigt) -je ein Taster (L-Aktiv) an INT0 und INT1 (erledigt) Wenn ich jetzt einen Taster betätige sollte eigentlich (so mein Wunschgedanken) ein Interrupt duch die fallende Flanke ausgelöst werden. MACHT ER ABER NICHT rofl In der ISR habe ich: 1. die globale Interrupt freigabe gelöscht 2. die Tasten mit 10ms entprellt 3. ext. Takt einlesen und an OC1 ausgeben 4. überprüfen ob Taster noch betätigt, wenn ja zurück nach 3. 5. die globale Interrupt freigabe gesetzt 6. mit reti raus aus der ISR Wo habe ich den Knoten in meiner Vorstellung?
Der externe Int ist die schlechteste Lösung, Taster abzufragen. Taster prellen, die Entprellung nach dem Int ist zwar sicher nicht unmöglich, aber doch recht schwierig. Hauptziel bei Tastendruck ist doch das "Durchreichen" des externen Eilgangtaktes zum Ausgang. Nun gibt es aber keinen "Kanal zwischen Eingang und Ausgang", den man mal schnell aktivieren kann. Man muss also den Eilgangtakt ständig überwachen, solange ein Taster gedrückt ist. Das geht am einfachsten durch einen Ext. Interrupt. Diese "Ressource" ist also hier bedeutend wichtiger als für einen Taster. Was liegt also näher, als diesen Int ständig zu nutzen und nebenbei die Taster abzufragen. Lege also lieber deinen externen Eilgangtakt an den Int (der prellt nicht) und frage in der ISR zum Ext-Int die Taster ab. Falls Entprellung gewünscht ist, dann wirst du hier fündig. http://www.mikrocontroller.net/forum/read-4-20549.html#new Aber eigentlich sollte es ohne Entprellung gehen, es wird bei Tastendruck ja nur der Takt "durchgereicht". Ich habe noch nicht getestet, ob es möglich ist, bei aktivem Timerausgang (Timer1 steuert Pin direkt) den Ausgangspin (quasi "dem Timer unter dem Hintern") per Programm zu verändern. Sollte das schadlos möglich sein, dann muss man bei Eilgang nichtmal den Timeroutput deaktivieren. Sollte das nicht möglich sein, dann muss bei Eilgang eben der Timer-Output deaktiviert werden und bei Ausbleiben des Eilgangs wieder aktiviert. ...
Danke für die schnelle Antwort,.... ich glaube heute gibts ne lange Nacht ^^... Aber wer nicht hören will, muß löten und tippen... g Was hat es eigentlich mit dem sleep-befehl auf sich??? Irgendwie bin ich da nicht schlau daraus geworden was im Datenblatt steht :(. Warum sleep , und nicht einfach loop: rjmp loop ????????
Wenn ein Int aufgerufen wird, dann wird erst der aktuell laufende Befehl abgearbeitet. Je nachdem, wie lange der braucht (1...4 Takte), dauert der Int-Aufruf unterschiedlich. In der üblichen Schleife "loop: rjmp loop" kann es mal einen Takt länger oder kürzer dauern, je nachdem in welchem der beiden Takte, die rjmp braucht, der Int ausgelöst wurde. Schickt man den AVR schlafen, dann ist die Aufrufzeit immer gleich, da immer die gleichen Bedingungen vorgefunden werden. Bei einfachen Dingen ist das nicht so wichtig, es schadet aber nicht, sich daran zu gewöhnen. ...
Achso, im Sleep-Mode braucht der AVR auch etwas weniger Strom. Die verschiedenen Sleep-Modi sind von Typ zu Typ unterschiedlich. Power-down brauch den wenigsten Strom, schaltet aber den Takt ab, was die (taktgebundenen) Timer totlegt. Aus Power-down kann der AVR nur mir dem Low-Level-Int (extern) geweckt werden, da dieser keinen Takt zur Flankenerkennung braucht. Bei den Megas kann das auch der Timer2-Int, falls dieser mit einem Uhrenquarz läuft. Im Einzelfall das Datenblatt fragen. ...
Es rennt..... Yuppppieeeeee!!!!! Jetzt muß ich noch auf ein Loch in der nächtlichen Wolkendecke warten um es nicht nur am Frequenzzähler und Oszi zusehen, sondern auch an einem Stern. Bin aber guter Dinge. Lt. Messung und Hochrechnung habe ich eine Ungenauigkeit von 540ns pro Sekunde. Das macht -17sek aufs Jahr :))))).... wehe es wird hier zukünftig auch nur ein Stern strichförmig... Habe jetzt mal, weil nix anderes im Haus, einen der billigsten 10MHz Oszillatoren genommen. War überrascht wie genau die Dinger sind. -10 bis +40°C sind kein Problem, die Trifft ging "im Rausche" unter. Fazit: Mal wieder weit über das Ziel hinausgefeuert^^ An dieser Stelle möchte ich mich auch nochmals bei allen Unterstützern bedanken, insbesondere bei HanneS, der letzendlich den entscheiden Tip gab. So macht ein Forum Spaß Gruß Matthias
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.