GPIO-Register nutzen

MikroForth für Attiny- und Atmega-Mikrocontroller
Antworten
Heinrichs
Beiträge: 183
Registriert: Do 21. Okt 2010, 18:31

GPIO-Register nutzen

Beitrag von Heinrichs » Mi 13. Nov 2019, 11:47

Immer wieder taucht beim Programmieren das Problem auf, dass ein Wert so gespeichert werden soll, dass er von verschiedenen Forth-Wörtern genutzt werden kann. Diesen Wert über den Stapel weiterzureichen, ist im Prinzip möglich, kann aber oft recht umständlich und mühselig sein.

MikroForth bietet hier - insbesondere für listenartige Werte - die Array-Struktur an; hierfür kann ein Bereich im SRAM reserviert und dann benutzt werden.

Geht es nur um wenige, einzelne Werte, kann man auf die General-Purpose-Register (GPRIOR0, GPRIOR1, …) zurückgreifen. Diese gehören zu den IO-Registern des Mikrocontrollers. Hierfür stellt MikroForth3 die Wörter SetIOReg, setBitIOReg und getIOReg zur Verfügung (vgl. Manual zu MikroForth3)


An einem einfachen Beispiel zeigen wir, wie man einen Wert in dem IO-Register GPRIO-Register GPIOR0 abspeichert und ihn wieder herausholt. Beim Atmega328 besitzt dieses Register die SRAM-Adresse $3E.

Code: Alles auswählen

: merke $3E swap setioreg ;
: hole $3E getioreg ;
: main $FF ddre 85 merke $FF porte 1 wait hole porte ;
Durch das Wort "merke" wird der TOS im Register GPIOR0 gespeichert; durch das Wort "hole" wird der Inhalt des Registers GPIOR0 aufden TOS kopiert. Im Hauptprogramm "main" werden diese Wörter getestet; hier geschieht im Einzelnen folgendes:

1. Das virtuelle PortE (vgl. Manual, s. o.) wird als Ausgang konfiguriert; an diesem Port sind 8 LEDs (mit Vorwiderstand) angeschlossen.
2. Der Wert 85=&B01010101 wird im GPIOR0 gespeichert;
3. Der Wert 255=$FF wird an PortE ausgegeben; dadurch werden alle LEDs an PortE zum Leuchten gebracht.
4. Der Mikrocontroller wartet 1 Sekunde.
5. Der Inhalt von GPIOR0 wird auf den Stack gelegt und an PortE ausgegeben. Jetzt wird an den LEDs von PortE das Bit-Muster &B01010101 ausgegeben.

.

Antworten