Forum: Mikrocontroller und Digitale Elektronik » Geht das und wie??? Takterzeugung, 2Taster einlesen usw..


von Matthias Eller (Gast)


Lesenswert?

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

von Hubert (Gast)


Lesenswert?

Geht sicher.
Für Lösungsansätze würde ich das AVR-Tutorial und die Suchfunktion
bemühen

von Rufus T. Firefly (Gast)


Lesenswert?

Frage:

Wozu wird eine Frequenz von 46,4231Hz mit dieser Genauigkeit
benötigt?

von Matthias Eller (Gast)


Lesenswert?

@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

von ...HanneS... (Gast)


Lesenswert?

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...

von Rufus T. Firefly (Gast)


Lesenswert?

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)

von Matthias Eller (Gast)


Lesenswert?

@...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....

von Rufus T. Firefly (Gast)


Lesenswert?

Eine andere sehr präzise Referenzzeitquelle ist übrigens ein
GPS-Empfänger - den sollte man als Astronom eh' dabeihaben ...

von ...HanneS... (Gast)


Lesenswert?

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.

...

von ...HanneS... (Gast)


Lesenswert?

Achja,
nur durch Rufus' Nachfragen konnte ich das Vorhaben nachvollziehen und
diesen Vorschlag machen. Ansonsten hätte ich mich zurück gehalten.

;-)

...

von Rufus T. Firefly (Gast)


Lesenswert?

Hab' ich irgendwas falsch gemacht?

von ...HanneS... (Gast)


Lesenswert?

@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"...)

von Matthias Eller (Gast)


Lesenswert?

@ 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...... ;-)

von Matthias Eller (Gast)


Lesenswert?

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.

von ...HanneS... (Gast)


Lesenswert?

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)

von Matthias Eller (Gast)


Lesenswert?

... 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

von Matthias Eller (Gast)


Lesenswert?

... 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?

von ...HanneS... (Gast)


Lesenswert?

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.

...

von Matthias Eller (Gast)


Lesenswert?

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   ????????

von ...HanneS... (Gast)


Lesenswert?

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.

...

von ...HanneS... (Gast)


Lesenswert?

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.

...

von Matthias Eller (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.