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 

 Verbesserung für die Open-Maxi Kategorie: Open-Micro/Open-Mini/Open-Midi/Open-Macro/Open-Maxi (von Dietmar, Homepage - 9.03.2016 20:30)
 Als Antwort auf Mit Ultraschall messen von Norbert - 3.03.2016 17:19
Dietmar nutzt:  Open-Micro, Open-Mini, Open-Midi, Open-Macro, Open-Maxi, Open-Mini M-Unit, Open-Mini Station
Hallo zusammen!

Nach dem Austausch mehrerer E-Mails mit Norbert Klein stellte sich heraus, daß die Meßabweichungen auf der Open-Maxi nicht vom Controller, sondern vom Ultraschall-Modul HC-SR04 stammen.

Hier einmal der von mir leicht verbesserte Sourcecode für die Open-Maxi.

Viel Spaß und Erfolg mit den OM-Mikrocontrollern!

Dietmar

' ----------------------------------------------------------------------------
' Entfernungen per Ultraschall-Modul HC-SR04 ermitteln.
' In OCBASIC 1.09a für Open-Maxi von Norbert Klein und Dietmar Harlos.

' Der 'Echo'-Ausgang des Moduls muß mit DA[2] verbunden werden.

' Berechnung der Entfernung in Zentimetern:
' OnZeit * 1/5000*34,3/2 = OnZeit * 0.00343 = OnZeit / 291.5451895
' ----------------------------------------------------------------------------

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

DIM OnZeit WORD            'Ergebnis der Messung des HIGH-Impulses an DA[2]
DIM letzte_flanke  WORD    'die letzte steigende Flanke merken
DEFINE entfernung  WORD    'Entfernung in cm
DEFINE Trigger PORT[41]    'mit 'Trig'-Eingang vom Modul verbinden (=BEEP-Port)

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

' Die folgende Assembler-Interruptroutine befindet sich im Timer/PWM-2-
' Channel-1-Interrupt und wird gestartet, wenn eine Flanke detektiert wird.

' Die folgenden Subroutinen sollten sinnvollerweise 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 iiar_tpm2c1 INLASM
! cbeqa #iTPM2C1,iiar_tpm2c1_is 'Falls kein Aufruf durch TPM2C1-Interrupt,
! jmp iiar_tpm2c1_ende+2   'dann zur nächsten IIAR in der Kette.
#iiar_tpm2c1_is
! ldhx TPM2C1VH
! brset bELS1A,TPM2C1SC,iiar_tpm2c1_rising  'steigende oder fallende Flanke?
! txa                      'OnZeit = TPM2C1V - letzte_flanke
! sub letzte_flanke+1
! sta OnZeit+1
! pushh
! popa
! sbc letzte_flanke
! sta OnZeit
! mov #&b01000100,TPM2C1SC 'Input capture, Capture on rising edge only
! clc
! rts                      'Rücksprung ins Betriebssystem

#iiar_tpm2c1_rising
! sthx letzte_flanke
! mov #&b01001000,TPM2C1SC 'Input capture, Capture on falling edge only
! clc
! rts                      'Rücksprung ins Betriebssystem
END PROCEDURE

' Mit der folgenden Assemblerroutine wird das TPM2-Modul vom Controller
' passend umkonfiguriert.

PROC init_tpm2 INLASM
! BSET bCH1IE,TPM2C1SC     'IR freischalten
'! mov #%00000000,TPM2SC   'TPM stop ist nicht notwendig
! clr TPM2MODH
! clr TPM2MODL
! lda #%01000100           'Input capture, Capture on rising edge only, IR frei
! sta TPM2C1SC             'Timer 2 Channel 1 Status and Control Register
'! mov #%01001000,TPM2SC    'TPM clock input = BUSCLK/1 = 20000kHz, 50ns   (geht bis Pulsbreite 5us)
! mov #%01001010,TPM2SC    'TPM clock input = BUSCLK/4 = 5000kHz, 200ns
! rts
END PROC

' Das TPM2-Modul wieder so setzen, wie vom OS erwartet.

PROCEDURE reset_tpm2 INLASM
! mov #%00000000,TPM2SC    'TPM stop
! ldhx #$00ff              'Timer 2 Counter Modulo Registers (TPMxMODH:TPMxMODL)
! sthx TPM2MODH            'von 0 bis inklusive 255 zählen (also Modulo 256) - (kein 100% duty cycle)
! lda #%00101000
! sta TPM2C1SC             'Timer 2 Channel 1 Status and Control Register /  High-true pulses
! mov #%00001101,TPM2SC    'TPM clock input = 20E6/32 = 625 kHz -> PWM-Frequenz 2441 Hz
! clc
! rts                      'Rücksprung ins Betriebssystem
end proc

#iiar_tpm2c1_ende          'hier hinter folgt die nächste IIAR
                           '(sofern vorhanden)

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

#main                      'Label für Hauptprogramm

UIRTpm2C1=ON               'User-Assemblerroutine für Timer 2, Kanal 1, DA[2] aktivieren
init_tpm2                  'Timer-Modul passend initialisieren

WHILE TRUE
  Trigger=ON               'Trigger zum Modul senden
  PAUSE 5
  Trigger=OFF
  PAUSE 5

  PRINT OnZeit             'ON-Zeit an DA[2]

  IF OnZeit<=3276 THEN
    entfernung=OnZeit*10/291 'mit Nachkommastelle geht nur bis 10 cm Entfernung
    PRINT entfernung/10;",";entfernung MOD 10;" cm"
  ELSE
    entfernung=OnZeit/291  'ansonsten ohne Nachkomma
    PRINT entfernung;" cm"
  END IF
WEND

reset_tpm2                 'Timer-Modul wieder auf Defaultkonfiguration
UIRTpm2C1=OFF              'User-Assemblerroutine deaktivieren

End2Host=ON                'nach dem Programmende in den Host-Modus
END                        'Programmende

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


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

 Antwort schreiben

Bisherige Antworten: