Der Nachfolger des WDR-Computerclub mit Wolfgang Back und Wolfgang Rudolph - ...und immer ein Bit übrigbehalten!


Das Forum zur C-Control-1
Welche C-Control-Varianten existieren?
Übersicht - Suchen - Neueste 50 Beiträge - Neuer Beitrag - Login - Registrieren
INFO - FAQ - CC2-Forum - CCPro-Forum 

 Verzögerungsschleife mit Vielfachen von 100 µs Kategorie: Open-Micro/Open-Mini/Open-Midi/Open-Macro/Open-Maxi (von Dietmar, Homepage - 23.10.2018 15:07)
Dietmar nutzt:  Open-Micro, Open-Mini, Open-Midi, Open-Macro, Open-Maxi, Open-Mini M-Unit, Open-Mini Station
' ============================================================================
' Verzögerungsschleife mit Vielfachen von 100µs auf den kleinen OM-Controllern
' In OCBASIC 1.12a_e1 für Open-Macro von Dietmar Harlos am 22. Oktober 2018
' ============================================================================

' Zu diesem Zweck kann man eine FOR..NEXT-Schleife oder ein entsprechendes
' Äquivalent in Assembler einsetzen. Nur richtig exakt wird das ganze nur
' dann, wenn für die Dauer der Schleife die Interrupts deaktiviert werden.

' Auf den kleinen OM-Controllern entsprechen 100µs:
' 3.2e6*100e-6 = 320 Taktzyklen.
' Somit ist nur eine Implementierung in Assembler sinnvoll.

' Durch Aufruf der Verzögerungsroutine per SYS statt per GOSUB können einige
' Taktzyklen eingespart werden. Ansonsten ist natürlich zu beachten, daß auch
' für die Ausführung des Hauptprogramms einige Zeit benötigt wird.

' Die Open-Micro, Open-Mini und Open-Midi unterstützen keine WORD-Variablen.

' --- Definitionen für das System --------------------------------------------

INCLUDE "omac.def"         'Definitionen für die Open-Macro

' --- Definitionen des Anwenders ---------------------------------------------

DIM a,b,c BYTE             'einige Variablen
DIM wa,wb WORD

' --- Das Hauptprogramm ------------------------------------------------------

PrintSpc=ON                'SPACE vor einem dezimalen PRINT ausgeben

' "TIM Counter Register (TCNT)"-Takt: 3.2e6/64 = 50 kHz, ist aber modulo 1000

a=TIMER : wa=TCNTH SHL 8 OR TCNTL
SYS hundertmikrosekunden 100 '100*100µs = 0.01 Sekunden = 10 ms
b=TIMER : wb=TCNTH SHL 8 OR TCNTL
?a;wa                      '" 0 9"   \ (527-9)/50e3 =
?b;wb                      '" 0 527" /   0.01036 Sekunden

End2Host=ON                'Nach Programmende in den Host-Modus
END                        'Programmende, Neustart mit der Enter-Taste

' --- Subroutinen ------------------------------------------------------------

' Anzahl 100-µs-Einheiten warten.

' Anzahl Taktzyklen: (2+105*3+3)*anzahl = 320*anzahl
' das sind: 320/3.2e6 = 0.0001 Sekunden = 100 µs

PROC hundertmikrosekunden(anzahl) INLASM
! sei                                 'Interrupts deaktivieren
#hundertmikrosekunden_bigloop
! ldx #105                            '2 TZ
#hundertmikrosekunden_100us
! dbnzx hundertmikrosekunden_100us    '3 TZ
! dbnza hundertmikrosekunden_bigloop  '3 TZ
! cli                                 'Interrupts wieder aktivieren
! rts
END PROC

' --- Programmende ----------------------------------------------------------


Passender Link: Bedienungsanleitung zur Open-Macro und Open-Maxi

Meine Homepage: http://ccintern.dharlos.de

 Antwort schreiben

Bisherige Antworten: