Das Open-Control-Projekt - Die Alternative zur C-Control-I


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 

 Demoprogramm: Freilaufender 32-Bit-Zähler Kategorie: Open-Micro/Open-Mini/Open-Midi/Open-Macro/Open-Maxi (von Dietmar, Homepage - 9.09.2024 17:33)
Dietmar nutzt:  Open-Micro, Open-Mini, Open-Midi, Open-Macro, Open-Maxi, Open-Mini Station
' ===========================================================================
' Demoprogramm: Freilaufender 32-Bit-ZĂ€hler
' In OCBASIC 1.12a_e1 fĂŒr Open-Maxi von Dietmar Harlos am 7. September 2024
' ===========================================================================

' Der AW60-Controller, auf dem die Open-Maxi basiert, besitzt unter anderem
' das freilaufende "Timer 1 Counter Register" (TPM1CNTH:TPM1CNTL), das mit
' einem Takt von 20e6/32 = 625 kHz um eins hochgezÀhlt/inkrementiert wird.

' Da das Register eine Auflösung von nur 16 Bit hat, zÀhlt es nur von 0 bis
' 65535 und lĂ€uft alle 65536/(20e6/32) = 104.8576 ms ĂŒber. Beim Überlauf
' wird der Interrupt "Timer/PWM-Module 1 - Overflow (TPM1OVF)" ausgelöst.

' In diesem Beispielprogramm wird gezeigt, wie man den Timer auf 32 Bit
' erweitert und so Zeitintervalle bis 114.5324612 Minuten messen kann.

' --- Definitionen ----------------------------------------------------------

INCLUDE "omax.def"         'Definitionen fĂŒr die Open-Maxi

DIM TIMER32 LONG           '32-Bit-ZĂ€hler

DIM TIMER32lw AS WORD[1] OF TIMER32 'LSW \ Low-Word
DIM TIMER32hw AS WORD[2] OF TIMER32 'MSW / High-Word

DIM temphw WORD            'temporĂ€re Variable (Highword)

' --- Unsere eigene Assembler-Interruptroutine ------------------------------

' Die folgende Assembler-Interruptroutine befindet sich im "Timer-Overflow-
' Interrupt" (genauer: "Timer/PWM-Module 1 - Overflow (TPM1OVF)"). Der
' Interrupt wird immer dann aufgerufen, wenn das "Timer 1 Counter Register"
' (TPM1CNTH:TPM1CNTL) von 65535 nach 0 ĂŒberlĂ€uft.

' Die folgende Subroutine muß am Anfang des Programms, vor dem ersten Befehl
' stehen und sollte zusammen mit den anderen Subroutinen bis inklusive
' UIRTOFL_iiar_next in einer INCLUDE-Datei untergebracht werden.

' Das SchlĂŒsselwort INLASM kennzeichnet die folgende PROCEDURE als
' Assemblerroutine (IAR). Dadurch, und daß sie unmittelbar am Anfang
' des Programms steht, wird sie zu einer IIAR, also zu einer Assembler-
' Interruptroutine, die bei einem aktivierten User-Interrupt gestartet wird.

PROCEDURE UIRTOFL_iiar INLASM

! cbeqa #iTOFL,isiTOFL     'Falls kein Aufruf durch TOFL-Interrupt,
! jmp UIRTOFL_iiar_next+2  ' dann zur nĂ€chsten IIAR in der Kette.

#isiTOFL
! ldhx temphw              'temporĂ€res Highword inkrementieren
! aix #1
! sthx temphw

' Durch Setzen des Carry-Flags (SEC) kann der User signalisieren, daß die
' Betriebssystemroutinen des Interrupts nachfolgend nicht aufgerufen werden,
' sondern der Interrupt unmittelbar beendet wird. Andernfalls ist das Flag
' mit dem Befehl CLC zu löschen.

! clc                      'Betriebssystemfunktion soll aktiviert bleiben
! rts                      'RĂŒcksprung zum Betriebssystem

END PROCEDURE

' TIMER32-Variable aktualisieren

' Aus CPU08RM.pdf:

'"The next instruction after a CLI will not be executed if there was an
' interrupt pending prior to execution of the CLI instruction."

'"If an interrupt is pending upon exit from the original interrupt service
' routine, it will also be serviced before the next instruction is executed."

PROCEDURE getTIMER32 INLASM
! sti
! ldhx TPM1CNTH            'TPM1CNTH:TPM1CNTL lesen
! sthx TIMER32lw           'und als Lowword speichern
! bne getTIMER32_keintof   'springen, wenn es ungleich 0 ist
! cli                      'Interrupts kurz aktivieren, um
! sti                      '  den TOFL-Interrupt aufzurufen
#getTIMER32_keintof
! ldhx temphw              'temporĂ€res Highword lesen
! sthx TIMER32hw           'und als Highword speichern
! cli
! rts
END PROCEDURE

' TPM1-Modul initialisieren

PROCEDURE initTIMER32 INLASM
! bset bTOIE,TPM1SC        'TOFL-Interrupt aktivieren
! rts
END PROCEDURE

#UIRTOFL_iiar_next         'hier hinter folgt die nĂ€chste IIAR
                           '(sofern vorhanden)

' --- Hauptprogramm ---------------------------------------------------------

#main          'durch die IIAR am Programmbeginn wird ein "GOTO main" erzeugt

PrintSpc=ON    'Bei PRINT dezimale Zahlen mit fĂŒhrendem Leerzeichen ausgeben
End2Host=ON    'Bei Programmende (siehe END) gleich in den Host-Modus wechseln

PRINT
PRINT "Demoprogramm: Freilaufender 32-Bit-ZĂ€hler"
PRINT "========================================="
PRINT

IF NOT IiarFnd THEN ?"INLINE-Interrupt-Assemblerroutine nicht gefunden!" : END

RunOnErr=ON                'Fehler-Handling aktivieren

IF ERR THEN                'Fehler-Handling (siehe Doku)
  WHILE TRUE
    ?"Fehler Nr. ";ERR
    PrintHex=ON
    ?"Adresse: $";ERRADR-UPROGBASE
    PrintHex=OFF
    PAUSE 25
  WEND
END IF

UIRTofl=ON                 'Timer-Overflow-Interrupt fĂŒr IIAR aktivieren
initTIMER32                'Timer32 initialisieren

WHILE NOT RXD
  PAUSE 25

  getTIMER32               'Timer32-Variable aktualisieren
  ?TIMER32hw;TIMER32lw     'Timer32-Variablen auf Ser. Schnittstelle ausgeben
WEND

?:?"Programmende."
END            'ZurĂŒck in den Hostmodus. Neustart mit RETURN-Taste.

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


Passender Link: Infosite zu den OM-Mikrocontrollern

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

 Antwort schreiben

Bisherige Antworten: