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: Entfernung mit C-Control-1 und US-Modul "Linker SEN-US01" ermitteln Kategorie: C-Control I V1.1 (von MaPi - 6.09.2021 23:16)
MaPi nutzt:  CC1-Unit V1.1, CC1-M-Unit V1.1, CC1-Station V1.1, C-Control 2
Werte Community,
bezugnehmend auf den Forumbeitrag "Demoprogramm: Entfernung per Ultraschall-Modul HC-SR04" von Dietmar Harlos m├Âchte ich zur Vollst├Ąndigkeit auch eine entsprechende L├Âsung f├╝r die C-Control-1 V1.1 anbieten.

F├╝r die Arbeit wurde ein Ultraschall-Modul "Linker SEN-US01" (Vertrieb ├╝ber Fa. Pollin, Best. Nr. 819481) genutzt, welches baugleich zum US-Modul HC-SR04 ist.

Bei der C-Control-1 V1.1 ist es notwendig, ├╝ber ein separat zu ladendes Maschinenprogramm die Laufzeit des Schalls zu messen. Das ├╝bergeordnete CCBASIC-Programm ermittelt die aus der gemessenen Laufzeit resultierende Entfernung.

Hier das CCBASIC-Programm:

Das CCBASIC-Programm bindet zun├Ąchst die Maschinenroutine in den TCAP1-Interrupt ein.
├ťber ein Kontrollflag "VALECHO" erkennt das Basic-Programm, ob eine g├╝ltige Laufzeit-Messung abgeschlossen ist. ├ťber dieses Flag kann die Maschinenroutine auch inaktiv gehalten werden, die Maschinenroutine im Interrupt wird dann wieder verlassen, ohne eine Messung durchzuf├╝hren.

Soll eine Entfernungsmessung durchgef├╝hrt werden, gibt die CC1 zun├Ąchst auf dem Trigger-Pin des US-Moduls einen kurzen Puls aus und startet somit die Ausgabe des US-Signals.
Die vorher im TCAP1-Interrupt eingebundene Maschinenroutine misst nun die Zeit zwischen einer steigenden und der darauffolgenden fallenden Flanke am ECHO-Pin des US-Moduls.
Sobald die Messung beendet ist, wird das Kontrollflag gesetzt und das CCBASIC-Programm kann auf die gemessene Laufzeit (16bit Wert, verf├╝gbar als Lo/Hi-Byte, mit 2us Aufl├Âsung) zugreifen.

Auf Basis des herk├Âmmlichen 4MHz Quarzes der CC1, der daraus resultierenden Aufl├Âsung des Timers von 2us und der Tatsache, dass die CC1 ganzzahlige Werte rechnet, ergibt sich eine vereinfachte Formel zur Berechnung der Entfernung wie im Kommentar des CCBASIC-Programms ersichtlich.
Ein Bereich von 3...450cm konnte so zuverl├Ąssig gemessen werden. Der erwartete Fehler der Messung liegt bei <1cm (ohne Temperatureinfluss).


'************************************************
'*                                              *
'* Programm: HC_SR04_Ultraschall-Messung        *
'* Version:  0.2 *
'* System:   Conrad C-Control 1.1       *
'* Author:   MaPi         *
'* Datum:    04.01.2021                         *
'* Funktion: Programm zur Messung der ECHO-Dauer*
'*           eines HC-SR04 Ultraschall-Moduls   *
'*                                              *
'*                                              *
'* Kommentar:funktioniert mit 4MHz Quartz,      *
'*           entspr. SR04_xxx.ASM Routine und   *
'*           Speicherbelegung notwendig *
'*       *
'************************************************
'Messung der ECHO-Dauer einer US-Sende-/Empfangseinheit HC-SR04
'Triggern des US-Moduls mittels PULSE Befehl (erm├Âglicht Triggerpuls>=10us sicher)
'Da PULSE Befehl mehrere Millisekunden dauern kann, sollte Messroutine bereits vor Triggern scharf
'geschalten werden
'
'CC1 Bedingungen:
'fosc = 4MHz, Interner Bustakt = fosc/2 = 2MHz, fester Timer prescaler %4 --> 2MHz/4 = 500Hz --> 2us
'
'Entfernung [cm] = Wert * 0.5 * 2us * 34400cm/s = Wert * 0.0344cm =~ Wert/29 (Fehler<=1cm bei 450cm)
'
'History:
'03.01.2021 Rev.0.1      Erste Version.
'04.01.2021 Rev.0.2      Ports von Byteport1 k├Ânnen als Trigger genutzt werden, nachdem der Port mit
'                        "ON" statt mit "OFF" initialisiert
'                        werden kann. Berechne Entfernung mit Nachkommastelle. Messintervall von 2s
'                        auf 0.5s verkuerzt. Entfernungsnmessung
'                        funktioniert zuverlaessig zwischen 3cm und 450cm.

'Port definieren
DEFINE Trigger PORT[1]                          'Digitalport zum Triggern der US-Messung durch SR04

'Variablen definieren
DEFINE Wert WORD[1]                             'Doppelbelegung - Nutzung von Byte1 und Byte2 ECHO
                                                'Dauer
DEFINE HiByte BYTE[1]                           'Speicher fuer High-Byte der ECHO-Dauer
DEFINE LoByte BYTE[2]                           'Speicher fuer Low-Byte der ECHO-Dauer
DEFINE Status BYTE[3]                           'Speicher fuer Status-Byte
DEFINE VALECHO BIT[24]                          'Bit7 des Status-Bytes zur Steuerung der ASM-Messroutine

'******** Hauptprogramm ********

#Start
   Trigger = ON
   PRINT "Lade Messroutine..."
   GOSUB PrepareTCAP1                           'Messroutine in TCAP Interrupt einbinden
   PRINT "Messroutine geladen."
   PAUSE 100                                    'Kunstpause
   PRINT "Starte Ultraschallmessung"

#Messung
   VALECHO = 0                                  'Messroutine scharf schalten
   PULSE Trigger                                'Ultraschallmessung am SR04 triggern
   WAIT VALECHO                                 'stur auf Ende der ECHO-Messung warten
   PRINT "Entfernung [cm]: ";                   'Entfernung mit Nachkommastelle oder Warnung
                                                'ausgeben
   IF Wert > 20000 THEN PRINT "Over Range" ELSE PRINT Wert/29;".";(Wert MOD 29)*10/29
   PAUSE 25                                     'Kunstpause
   GOTO Messung                                 'naechste Messung

'******** Unterprogramme ********

#PrepareTCAP1                                   'Routine zum Laden der Messroutine
   GOSUB InitTCAP1Interrupt                     'Messroutine in TCAP-Interrupt einbinden (Vektorzeiger eintragen)
   VALECHO = 1                                  'Messroutine erstmal deaktiviert halten
   RETURN                                       'und Routine beenden

#InitTCAP1Interrupt                             'Initialisieren der User-Routine im TCAP-Interrupt
                                                'per Assemblerroutine im Stack
   SYS &H91 &H819d,&H1212,&Hb751,&Hb601,&H3fa3 'Einbinden der Messroutine in den TCAP-Interrupt in
                                                'Vektor an Adresse $51
   RETURN                                       'und zurueck

#UnloadTCAP1Interrupt                           'Userroutine im TCAP-Interrupt per Assemblerprogamm
                                                'im Stack aus Interrupt rausschmeissen
   SYS &H91 &H819d,&H3f51                       'Loeschen von TCAP-Vektor an Adresse $51
   RETURN                                       'und zurueck

'SYSCODE "SR04_002.s19"          'Maschinencode ins interne EEPROM

END


Und hier das Assemblerprogramm zur Schall-Laufzeitmessung.
Es basiert auf den Routinen zur "433MHz Wetterstation".


*************************************************
*                                               *
* Programm: USECHO.ASM *
* Version:  0.2                                 *
* System:   Conrad C-Control 1.1                *
* Author:   MaPi         *
* Datum:    04.01.2021                          *
* Funktion: Messung des ECHO-Pulses einer       *
*           HC-SR04 Ultraschall-TX/RX-Einheit   *
*           ECHO-Puls ist an DCF-LED sichtbar   *
* Kommentar:Initialisieren, Trigger der Messung *
*           und Ergebnisabruf der US_Messung    *
*           durch CCBasic                       *
*           Routine auf Basis TXCAP095.ASM      *                                    *
*************************************************

;History:
;03.01.2021 Rev.0.1   Erste Version.
;04.01.2021 Rev.0.2   Korrigiere Handling der DCF-LED. Laengerer Echo-Puls = Laengeres Leuchten der
;                     DCF-LED.

;Deklarationen

;PortA Register
PORTA   equ $00 ;Portadresse DCF-LED
DCFLED   equ 4   ;Bit4 DCF-LED

;Timerregister 6805
TCR     equ $12 ;Timer Control Register
TSR     equ $13 ;Timer Status Register
ICR1Hi   equ $14 ;Highbyte Input Capture Register 1
ICR1Lo   equ $15 ;Lowbyte Input Capture Register 1
ICF1     equ 7   ;TCAP1 Input Capture Flag
IEDG1   equ 1                   ;TCAP1 Input Edge Bit

;Speicher                       ;
ByteHi          equ $a1                         ;High-Byte
ByteLo          equ $a2                         ;Low-byte der gemessenen ECHO-Dauer
Status   equ $a3 ;Status: Flag (bit7)

;Speicher jenseits des User-Rams
CopyICR1Hi      equ $b9 ;Highbyte aktueller ICR Kopie
CopyICR1Lo      equ $ba ;Lowbyte aktueller ICR Kopie
OldCopyICR1Hi   equ $bb ;Highbyte alter ICR Kopie
OldCopyICR1Lo   equ $bc ;Lowbyte alter ICR Kopie

;Flags des Status-Byte
VALECHO   equ 7   ;Flag fuer gueltige ECHO-Dauer

;Interruptprogramm zum Empfang eines Echo-Pulses einer HC-SR04 Ultraschall-TX/RX-Einheit
;Initialisierung des Interrupts wird durch spezielle Routine innerhalb CCBasic vorgenommen

        org $101

TCAP1Interrupt
        brclr ICF1,TSR,FinishTCAP1Int           ;kein TCAP1 aufgetreten
        brset VALECHO,Status,FinishTCAP1Int     ;Speicherbytes (ByteHi...ByteLo)
                              ;wurden von BASIC noch nicht ausgelesen
SetEdge
        brset IEDG1,TCR,ClearEdge       ;wenn aktuell sensitiv fuer steigende Flanke, dann
                                                ;aendern                                
        bset IEDG1,TCR                   ;ansonsten steigende Flanke aktivieren
        bset DCFLED,PORTA               ;DCF-LED ausschalten
        bra SaveTimerReg                 ;und weiter

ClearEdge
        bclr IEDG1,TCR                   ;fallende Flanke aktivieren
        bclr DCFLED,PORTA               ;DCF-LED einschalten

SaveTimerReg
        lda CopyICR1Hi   ;alten (vorherigen) Timer-Registerstand
                                                ;(High+Lowbyte) sichern
        sta OldCopyICR1Hi
        lda CopyICR1Lo
        sta OldCopyICR1Lo

        lda ICR1Hi       ;aktuellen Timerstand lesen und speichern
        sta CopyICR1Hi
        tax
        lda ICR1Lo
        sta CopyICR1Lo

TestAdjustedEdge
        brset IEDG1,TCR,CalcDifference          ;springe, wenn sensitiv fuer naechste steigende
                                                ;Flanke (spart Bit-Variable)
                                       ;aktuell wird also fallende Flanke behandelt
                                                ;also Differenz rechnen
FinishTCAP1Int
        jmp TCAP1IntBypass       ;bei aktuell steigender Flanke raus hier

CalcDifference                                  ;nach fallender Flanke ist ECHO-Puls beendet,
                                                ;Differenz kann berechnet werden
        sub OldCopyICR1Lo       ;alten Timerstand von aktuellem abziehen
        sta ByteLo                           ;Differenz des LoBytes speichern
        txa
        sbc OldCopyICR1Hi       ;das gleiche mit HiByte incl. C-Flag
        sta ByteHi                             ;und speichern

ValidateMeasurement
        bset VALECHO,Status               ;ansonsten die Nachricht gueltig erklaeren

TCAP1IntBypass       ;TCAP1 Timerreg-Lowbyte wird nicht von CControl-OS
                                                ;ausgelesen,
        lda ICR1Lo ;muss also beruecksichtigt werden
        lda #0   ;TCAP1/TCAP2-Interruptroutinen des CControl-OS
                                                ;deaktivieren
        rts     ;und ab durch die Mitte

        end

 Antwort schreiben

Bisherige Antworten:

Re: Demoprogramm: Entfernung mit C-Control-1 und US-Modul "Linker SEN-US01" ermitteln (von Dietmar - 7.09.2021 19:13)
    Re: Demoprogramm: Entfernung mit C-Control-1 und US-Modul "Linker SEN-US01" ermitteln (von MaPi - 7.09.2021 21:20)
        TABS im Quelltext mit Leerzeichen ersetzen (von das |_ Team - 8.09.2021 15:58)
            Re: TABS im Quelltext mit Leerzeichen ersetzen (von MaPi - 8.09.2021 18:35)
                Re: TABS im Quelltext mit Leerzeichen ersetzen (von das |_ Team - 9.09.2021 15:31)
                    Re: TABS im Quelltext mit Leerzeichen ersetzen (von Dietmar - 9.09.2021 16:31)
                Re: TABS im Quelltext mit Leerzeichen ersetzen (von Dietmar - 8.09.2021 21:08)
        Re: Demoprogramm: Entfernung mit C-Control-1 und US-Modul "Linker SEN-US01" ermitteln (von Dietmar - 7.09.2021 21:52)