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