Gast
#3237970
Die angehängte "QCNT_6LED.A90" wertet mit einem ATmega48/88 Signale von Inkrementalgebern per Interrupt aus. In der vorliegenden Version werden Signale eines Längenmeßstabes mit 40µm Teilung erwartet. Diese werden auf 'mm' skaliert auf einer 6-stell. 7-Segmentanzeige angezeigt. Der angezeigte Wert wird zusätzlich per UART ausgegeben. Die Grundschaltungen sind hier dargestellt: Beitrag "7-Segm.-LED-Anzeige, 6-stellig, statische Ansteuerung mit (74HC)4094" Die um 90° phasenverschobenen Eingangssignale werden an INT0 (PD2) und INT1 (PD3)angelegt. Jede Flankenänderung wird mit einer schnellen Interruptroutine erfaßt. Bei 20MHz CPU-Takt werden Flankenänderungen bis 2µs Abstand erfaßt, was einer Signalfrequenz von 125kHz entspricht: siehe Datei "qcnt_6sub.s" Für die Assemblerroutinen sind einige Register des ATmega reserviert, um schnellste Interruptverarbeitung zu erreichen. Dies muß allerdings vom C-Compiler unterstüzt werden, wie es die Kickstart Version eines IAR-EW für AVR bietet. Achtung: Es müssen die Register R6 - R15 reserviert werden. CSTACK sollte >= 0x30 sein! Das Hauptprogramm ist in C geschrieben: "qcnt_6led.c" In der Regel werden Rechtecksignale von magnetischen oder optischen Gebern angelegt, die nicht prellen. Falls dies nicht garantiert werden kann, können die Eingangssignale per externen 2 x D-FF synchronisiert werden. An PD6 wird hierzu ein 500kHz Signal ausgegeben. Ferner kann die Signalerfassung auch intern synchronisiert werden (Timer0), wodurch jedoch die max. Eingangsänderungen auf >=2,5µs reduziert werden. Damit lassen sich auch mechanische Impulsgeber sauber erfassen. Ein '0'-Signal an PD5 beim Einschalten stellt diesen Modus ein, der den µC jedoch permanent zu 30% -> 50% auslastet. Weiterhin können auch Sinus-Signale erfaßt werden, sofern ihre Amplituden >2Vss sind und der 0-Punkt der Signale bei Vcc/2 liegt. Hier haben die Eingangsschmitttrigger der ATmega48/88 ihre Schaltschwellen (siehe Datenblatt: Pin Threshold and Hysteresis).

