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 

 Demoprogramm: Timer/PWM-Module für 8 Servo-Ports umkonfigurieren Kategorie: Open-Micro/Open-Mini/Open-Midi/Open-Macro/Open-Maxi (von Dietmar, Homepage - 17.01.2019 18:33)
Dietmar nutzt:  Open-Micro, Open-Mini, Open-Midi, Open-Macro, Open-Maxi, Open-Mini M-Unit, Open-Mini Station
' ============================================================================
' Die beiden Timer/PWM-Module der Open-Maxi für 8 Servo-Ports umkonfigurieren
' In OCBASIC 1.12a_e1 von Dietmar Harlos am 17. Januar 2019
' ============================================================================

' Die beiden Timer/PWM-Module der Open-Maxi unterstützen die Betriebsarten
' "Input Capture", "Output Compare" und "Buffered Edge-Aligned Pulse-Width
' Modulation (PWM)" an jedem Kanal. Letztere kann für Servo-, Digital-Analog-
' oder PWM-Betrieb eingesetzt werden. Dieses Beispielprogramm demonstriert,
' wie acht Servomotoren angesteuert werden können. Allerdings stehen dadurch
' folgende Funktionen des Open-Maxi-Betriebssystems nicht mehr zur Verfügung:
' PAUSE, BEEP, TEST, TIMER, DCF77, RTCTIMER, RTC (Real-Time-Clock), FREQ1,
' FREQ2, DA[1], DA[2], PORT[35] und PORT[36]. Außerdem sind FREQ1 und FREQ2
' durch diese Umkonfigurierung jetzt Ausgabeports.

' Welche Timer-Module und deren Kanäle sind für welche Pins zuständig?
'
'  Pin      | Bezeichnung im AW60-Controller
' ----------+------------------------------------------
'  PORT[35] | Timer/PWM-Module 1 - Channel 0 (TPM1CH0)
'  PORT[36] | Timer/PWM-Module 1 - Channel 1 (TPM1CH1)
'  BEEP     | Timer/PWM-Module 1 - Channel 2 (TPM1CH2)
'  TEST     | Timer/PWM-Module 1 - Channel 3 (TPM1CH3)
'  FREQ1    | Timer/PWM-Module 1 - Channel 4 (TPM1CH4)
'  FREQ2    | Timer/PWM-Module 1 - Channel 5 (TPM1CH5)
'  DA[1]    | Timer/PWM-Module 2 - Channel 0 (TPM2CH0)
'  DA[2]    | Timer/PWM-Module 2 - Channel 1 (TPM2CH1)

' Den Subroutinen zum Setzen der Position des jeweiligen Servos wird als
' Übergabe die gewünschte Position übergeben. Erlaubt sind hier die Werte 0
' bis 957, die je nach Servo variieren können. Sie wurden experimentell
' ermittelt.

' Auf der OM-Infosite gibt es bei den Downloads die Systemerweiterung
' "Servomotoren für Open-Maxi", die zeigt, wie 4 Servomotoren angesteuert
' werden können, ohne daß Funktionen des Open-Maxi-Betriebssystems
' deaktiviert werden müssen.

' Siehe auch Kapitel 10 "Timer/PWM (S08TPMV2)" im Data Sheet zum MC9S08AW60-
' Mikrocontroller:

' https://www.nxp.com/docs/en/data-sheet/MC9S08AW60.pdf

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

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

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

DIM a,b,c BYTE             'einige Variablen definieren
DIM w WORD

DEFINE POSLINKS 364        'die kleinste Pulslänge, die der Servo unterstützt
                           '364/12500*20e-3       = 0.58 ms \ experimentell
                           '(364+957)/12500*20e-3 = 2.11 ms / ermittelt

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

inittpm1                   'TPM1-Modul für Servo-Betrieb konfigurieren
inittpm2                   'TPM2-Modul für Servo-Betrieb konfigurieren

WHILE TRUE

  FOR w=0 TO 957
    set_servo_da1 w        'Zur Demonstration alle acht Servo-Motoren ansteuern
    set_servo_da2 w
    set_servo_port35 w
    set_servo_port36 w
    set_servo_beep w
    set_servo_test w
    set_servo_freq1 w
    set_servo_freq2 w
    FOR a=0 TO 49 : NEXT a
  NEXT w

  FOR w=956 TO 1 STEP -1
    set_servo_da1 w
    set_servo_da2 w
    set_servo_port35 w
    set_servo_port36 w
    set_servo_beep w
    set_servo_test w
    set_servo_freq1 w
    set_servo_freq2 w
    FOR a=0 TO 49 : NEXT a
  NEXT w

WEND

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

' --- Subroutinen zum Setzen der Servopositionen -----------------------------

' SERVO am PORT[35]-Pin setzen

PROCEDURE set_servo_port35(w)
  TPM1C0VH=(POSLINKS+w) SHR 8
  TPM1C0VL=POSLINKS+w
  RETURN
END PROCEDURE

' SERVO am PORT[36]-Pin setzen

PROCEDURE set_servo_port36(w)
  TPM1C1VH=(POSLINKS+w) SHR 8
  TPM1C1VL=POSLINKS+w
  RETURN
END PROCEDURE

' SERVO am BEEP-Pin setzen

PROCEDURE set_servo_beep(w)
  TPM1C2VH=(POSLINKS+w) SHR 8
  TPM1C2VL=POSLINKS+w
  RETURN
END PROCEDURE

' SERVO am TEST-Pin setzen

PROCEDURE set_servo_test(w)
  TPM1C3VH=(POSLINKS+w) SHR 8
  TPM1C3VL=POSLINKS+w
  RETURN
END PROCEDURE

' SERVO am FREQ1-Pin setzen

PROCEDURE set_servo_freq1(w)
  TPM1C4VH=(POSLINKS+w) SHR 8
  TPM1C4VL=POSLINKS+w
  RETURN
END PROCEDURE

' SERVO am FREQ2-Pin setzen

PROCEDURE set_servo_freq2(w)
  TPM1C5VH=(POSLINKS+w) SHR 8
  TPM1C5VL=POSLINKS+w
  RETURN
END PROCEDURE

' SERVO am DA[1]-Pin setzen

PROCEDURE set_servo_da1(w)
  da0=POSLINKS+w
  RETURN
END PROCEDURE

' SERVO am DA[2]-Pin setzen

PROCEDURE set_servo_da2(w)
  da1=POSLINKS+w
  RETURN
END PROCEDURE

' --- Subroutinen zur Initialisierung ----------------------------------------

' Das TPM1-Modul für Servo-Betrieb konfigurieren

' PORT[35] liegt an TPM1CH0
' PORT[36] liegt an TPM1CH1
' BEEP     liegt an TPM1CH2
' TEST     liegt an TPM1CH3
' FREQ1    liegt an TPM1CH4
' FREQ2    liegt an TPM1CH5

PROCEDURE inittpm1 INLASM
! mov #%00001101,TPM1SC     'TPM clock input = 20E6/32 = 625 kHz
! ldhx #12499               'Timer 1 Counter Modulo Registers (TPMxMODH:TPMxMODL)
! sthx TPM1MODH             'von 0 bis inklusive 12499 zählen (also Modulo 12500) - (kein 100% duty cycle)
! lda #%00101000            '"Edge-aligned PWM, High-true pulses" - PWM-Frequenz: 20E6/32/12500 = 50 Hz
! sta TPM1C0SC              'Timer 1 Channel 0 Status and Control Register
! sta TPM1C1SC              'Timer 1 Channel 1 Status and Control Register
! sta TPM1C2SC              'Timer 1 Channel 2 Status and Control Register
! sta TPM1C3SC              'Timer 1 Channel 3 Status and Control Register
! sta TPM1C4SC              'Timer 1 Channel 4 Status and Control Register
! sta TPM1C5SC              'Timer 1 Channel 5 Status and Control Register
! rts
END PROCEDURE

' Das TPM2-Modul für Servo-Betrieb konfigurieren

' DA[1] liegt an TPM2CH0
' DA[2] liegt an TPM2CH1

PROCEDURE inittpm2 INLASM
! mov #%00001101,TPM2SC     'TPM clock input = 20E6/32 = 625 kHz
! ldhx #12499               'Timer 2 Counter Modulo Registers (TPMxMODH:TPMxMODL)
! sthx TPM2MODH             'von 0 bis inklusive 12499 zählen (also Modulo 12500) - (kein 100% duty cycle)
! lda #%00101000            '"Edge-aligned PWM, High-true pulses" - PWM-Frequenz: 20E6/32/12500 = 50 Hz
! sta TPM2C0SC              'Timer 2 Channel 0 Status and Control Register
! sta TPM2C1SC              'Timer 2 Channel 1 Status and Control Register
! rts
END PROCEDURE

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


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

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

 Antwort schreiben

Bisherige Antworten:

Re: Demoprogramm: Timer/PWM-Module für 8 Servo-Ports umkonfigurieren (von Joachim - 17.01.2019 19:49)