Die Abfrage des Drehimpulsgebers durch den "Hauptprozessor" (ATMega8) wollte allem sportlichen Ehrgeiz zum Trotz einfach nicht zuverlässig klappen und so habe ich das "Problem" irgendwann einfach ausgelagert.
Der war allerdings schon mit anderen Aufgaben gut beschäftigt und auch etliche Prozessorbaugruppen waren schon anderweitig in Benutzung.
Im wesentlichen braucht man da ja eigentlich einen Timer. Wenn kein vorhandener nativer Timer nutzbar ist (aus welchen Gründen auch immer), hier noch ein paar "alternative", unkonventionelle Ansätze:
- Der U(S)ART-Transmitter läßt sich quasi als Timer mißbrauchen, je nach gewählter Baudrate und Bit-Anzahl läßt sich die Zeit bis der IRQ zuschlägt vorgeben. Belegt (neben dem Transmitter) den TxD-Pin.
- Ebenso beim SPI, hier werden MISO, MOSI und SCK belegt. Außerdem ist der CS-Pin zu beachten (zwingt den AVR ggf in den Slave-Mode).
- Der ADC kann einen "hab fertig IRQ" triggern,
- Bei einigen Controllern kann der Watchdog alternativ zum Reset auch einen IRQ triggern.
So, jetzt mal eine andere Frage:
@Pirx urspünglicher Ansatz bezieht sich ja auf die Gatter-Verschaltung mit den Flip-Flops und ein paar XORs.
Müßte sich das nicht auch irgendwie mit der Configurable Custom Logic (und ggf des Eventsystems) der XMegas/XTinies machen lassen?
Wenn ja, ich komm nicht drauf... Es stehen quasi zwei Logik-Kanäle zur Verfügung, die je drei Eingänge mit einem Ausgang verknüpfen.
Als Eingang kann ein Pegelwechsel eines Pins genutzt werden (Event).
Interessant wäre 'ne Lösung, die "Schritt-Links" oder "Schritt-Rechts" liefert.
Da die XTinies für konventionelle AVR-Mega/Tiny-Assembler-Programmierer wie mich eh sehr ... gewöhnungsbedürftig sind (Register/Bitnamen), denke ich weiterhin über einen seperaten Encoder-Auswerte-Tiny nach.
Neben der Entlastung des Hauptcontrollers gehts mir auch um das Einsparen von Controllerpins - der Encoder-Tiny sendet die Information asynchron seriell (UART).
Mein Ansatz läuft auf den Tiny4/5/9/10 hinaus (SOT23-6), Es stehen vier Beine zur Verfügung, wenn der Reset als I/O genutzt wird. Eins als Datenausgang, zwei für den Drehgeber - bleibe eins für den eventuellen Taster. Da der Tiny über kein HW-Interface verfügt, müßte ein UART-Transmitter in Software gestrickt werden (mit einem Timer für Transmitter und Encoder-Sampling).
Halbwegs elegant scheint das ganze sich mit sechs zu übertragenden Bits handhaben zu lassen, da man Start- und Stopbit dann mit den sechs Bits in ein Register packen kann. Wegen dem Stopbit wäre ein zu sendendes Paket nie null, man könnte also im Interrup des Baudratentimers dieses Register einmal schieben. Meldet sich dabei des Z-Flag, ist nichts weiter zu tun - sonst wird das Carry "quasi auf den Sendepin gelegt".
Von den sechs Bits könnte je eins für "Links-Schritt" und eins für "Rechts-Schritt" verwendet werden, blieben vier Bits für den Taster (z.B. unterschiedliche Betätigungszeiten) - hmm... wäre die Erkennung von Schritten bei gedrücktem Taster interessant?
Interesse, daß ich diesen Ansatz weiterverfolge, und ein Resultat hier ggf mitanhänge (als Alternative)?