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: 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)