
|
INFO - FAQ - CC2-Forum - CCPro-Forum |
|
||
|
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 |