mikrocontroller.net

Forum: HF, Funk und Felder Rfm12B 686Mhz Bascom Testprogramm.


Autor: Thomas V. (linuxer7)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

vor langer Zeit, ich denke es war so um 2005 bekam ich von einem 
bekannten 2 RFM12B 686MHZ Module.
Die Dinger verschwanden lange Zeit und sind vor kurzem wieder 
aufgetaucht, weshalb ich mich beschloss mit den Modulen zu 
experimentieren, was jedoch gar nicht mal so einfach ist. Zumindest 
nicht für mich. :(
Bin eigentlich der absolute Anfänger was Bascom betrifft und sicher 
nicht der Fortgeschrittenen-Fraktion an. Ich habe zwar einfache Sachen 
gemacht, aber das hier geht ans eingemachte.

Mein Plan ist folgender.
Ich habe mir eine kleine Drohne gebaut und möchte das Ding nun mit einem 
GPS-Modul und eben diesem Sender ausstatten.
Der Atmega liest die GPS-Daten aus und sendet im 30 Sekunden Takt 
Position und Höhe an den Empfänger auf dessen Display dann die Daten 
angezeigt werden. Das Auslesen der GPS-Daten ist kein Problem, geht ja 
alles Seriell. Der GPGGA -"Textstring" wird dann an den Empfänger 
gesendet wo sie dann ausgewertet und auf einem Display angezeigt werden 
können.
Auch die Batteriespannung der Drohne wird so übertragen.
Falls mir das Ding mal im Wald oder den Feldern landet, (haben wir eine 
Menge hier),- kann ich es auf diese Art wenigstens im engen umkreis 
Orten.

Ich habe mich im Internet schlau gemacht und einiges zu dem Thema RFM12B 
gefunden leider jedoch beziehen sich die meisten Test-Programme auf den 
433Mhz Typ und sind in C. Ich bräuchte jedoch ein Bascom File das ich 
umbauen könnte.

Leider ist das jedoch schwieriger als ich dachte. Ein paar einfache 
Sachen habe ich schon gemacht, aber das hier ist für mich ziemlich 
Komplex.
Mein Gedanke war im Internet ein Testprogramm zu finden und damit zu 
experimentieren.

Gestoßen bin ich auf dieses hier.
' ########################################################################
' generated. Take care that the chip supports all fuse bytes.
' ### RF12-Test in Bascom
' ### Basiert auf Code von Benedikt K.
' ### Joachim Fossie B�r Reiter 04/2007
' ########################################################################


$regfile = "m32def.dat"
$hwstack = 32                                               ' default use 32 for the hardware stack
$swstack = 10                                               'default use 10 for the SW stack
$framesize = 40

'$PROG &HFF,&HFF,&HD9,&H00' generated. Take care that the chip supports all fuse bytes.
                                                                                                                                                                 
$crystal = 8000000                                                                                                                                               
$baud = 19200                                                                                                                                                    
Baud = 19200                                                                                                                                                     
                                                                                                                                                                 
Declare Sub Rf12_init                                                                                                                                            
Declare Function Rf12_trans(byval Wert As Word) As Word                                                                                                          
Declare Sub Rf12_setfreq(byval Freq As Single)                                                                                                                   
Declare Sub Rf12_setbandwith(byval Bandwith As Byte , Byval Gain As Byte , Byval Drssi As Byte)                                                                  
Declare Sub Rf12_setbaud(byval Rfbaud As Long)                                                                                                                   
Declare Sub Rf12_setpower(byval Outpower As Byte , Byval Fskmod As Byte)                                                                                         
Declare Sub Rf12_ready                                                                                                                                           
Declare Sub Rf12_txdata(byval Maxchar As Byte)                                                                                                                   
Declare Sub Rf12_rxdata(byval Maxchar As Byte)                                                                                                                   
                                                                                                                                                                 
Const Rf12freq = 433.92
Const Rf12baud = 19200
Const Maxchar = 32

'config the SPI in master mode.The clock must be a quarter of the slave cpu
' Hier ggf. den SoftSPI reinmachen
Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 128 , Noss = 1

' werden ben�tigt f�r rf12_ready
Spi_cs Alias Portb.4                                        ' SS-Pin
Config Spi_cs = Output
Spi_sdo Alias Pinb.6                                        ' MOSI-PIN
Set Spi_cs

'init the spi pins
Spiinit

' was so gebraucht wird
Dim Count As Byte
Dim Temp As Word
Dim Rfdata(32) As Byte
Dim Text As String * Maxchar At Rfdata Overlay

Print "Init"
Call Rf12_init                                              ' ein paar Register setzen (z.B. CLK auf 10MHz)
Print "Set Frequenz"
Call Rf12_setfreq(rf12freq)                                 '  Sende/Empfangsfrequenz auf 433,92MHz einstellen
Print "Set Bandwith"
Call Rf12_setbandwith(4 , 1 , 4)                            '  200kHz Bandbreite, -6dB Verst�rkung, DRSSI threshold: -79dBm
Print "Set Baudrate"
Call Rf12_setbaud(rf12baud)                                 '  19200 baud
Print "Set Power"
Call Rf12_setpower(0 , 6)                                   '  1mW Ausgangangsleistung, 120kHz Frequenzshift


' ########################################################################
' ###### Hauptproggi
' ########################################################################


Text = "Dies ist ein 433MHz Test !!!!!{013}{010}"

' Je nachdem ob Sender oder Empf�nger die entsprechenden Zeilen aktivieren
Do                                                          'Ewigschleife


' Hier ist die Senderoutine
'  Print "Sende"
'  Call Rf12_txdata(maxchar)

  Wait 1

' Hier ist die Empfangsroutine
  Print "Empfange"
  Call Rf12_rxdata(maxchar)
  For Count = 1 To Maxchar
    Print Chr(rfdata(count)) ; "-";
  Next Count
  Print

Loop


End                                                         'end program


' ########################################################################
' ###### Unterroutinen
' ########################################################################

Sub Rf12_init:
  Waitms 150
  Temp = Rf12_trans(&Hc0e0)
  Temp = Rf12_trans(&H80d7)
  Temp = Rf12_trans(&Hc2ab)
  Temp = Rf12_trans(&Hca81)
  Temp = Rf12_trans(&He000)
  Temp = Rf12_trans(&Hc800)
  Temp = Rf12_trans(&Hc4f7)
End Sub


Sub Rf12_setfreq(byval Freq As Single)

  Freq = Freq - 430.00
  Temp = Freq / 0.0025
  If Temp < 96 Then
    Temp = 96
  Elseif Temp > 3903 Then
    Temp = 3903
  End If
  Temp = Temp + &HA000
  Temp = Rf12_trans(temp)
End Sub


Sub Rf12_setbandwith(byval Bandwith As Byte , Byval Gain As Byte , Byval Drssi As Byte)
  Drssi = Drssi And 7
  Gain = Gain And 3
  Temp = Bandwith And 7
  Shift Temp , Left , 2
  Temp = Temp + Gain
  Shift Temp , Left , 3
  Temp = Temp + Drssi
  Temp = Temp + &H9400
  Temp = Rf12_trans(temp)
End Sub


Sub Rf12_setbaud(byval Rfbaud As Long )
  Local Ltemp As Long

  If Rfbaud < 663 Then Exit Sub

  If Rfbaud < 5400 Then
    Temp = 43104 / Rfbaud
    Temp = Temp + &HC680
  Else
    Ltemp = 344828 / Rfbaud
    Temp = Ltemp
    Temp = Temp + &HC600
  End If
  Decr Temp
  Temp = Rf12_trans(temp)
End Sub


Sub Rf12_setpower(byval Outpower As Byte , Byval Fskmod As Byte)
  Outpower = Outpower And 7
  Temp = Fskmod And 15
  Shift Temp , Left , 4
  Temp = Temp + Outpower
  Temp = Temp + &H9800
  Temp = Rf12_trans(temp)
End Sub


Sub Rf12_txdata(byval Maxchar As Byte)
  Temp = Rf12_trans(&H8238)
  Rf12_ready
  Temp = Rf12_trans(&Hb8aa)
  Rf12_ready
  Temp = Rf12_trans(&Hb8aa)
  Rf12_ready
  Temp = Rf12_trans(&Hb8aa)
  Rf12_ready
  Temp = Rf12_trans(&Hb82d)
  Rf12_ready
  Temp = Rf12_trans(&Hb8d4)
  Rf12_ready
  For Count = 1 To Maxchar
    Rf12_ready
    Temp = &HB800 + Rfdata(count)
    Temp = Rf12_trans(temp)
  Next Count
  Rf12_ready
  Temp = Rf12_trans(&H8208)
End Sub


Sub Rf12_rxdata(byval Maxchar As Byte)
  Temp = Rf12_trans(&H82c8)
  Temp = Rf12_trans(&Hca81)
  Temp = Rf12_trans(&Hca83)
  For Count = 1 To Maxchar
    Rf12_ready
    Temp = Rf12_trans(&Hb000)
    Rfdata(count) = Temp
  Next Count
  Temp = Rf12_trans(&H8208)
End Sub



Function Rf12_trans(byval Wert As Word) As Word
  Local Lowbyte As Byte
  Local Highbyte As Byte

  Lowbyte = Wert And 255
  Shift Wert , Right , 8
  Reset Spi_cs

  Highbyte = Spimove(wert)
  Lowbyte = Spimove(lowbyte)
  Set Spi_cs

  Temp = Highbyte * 256
  Temp = Temp + Lowbyte
  Rf12_trans = Temp
End Function


Sub Rf12_ready
  Reset Spi_cs
  While Spi_sdo = 0
  Wend


Also habe ich mir auf einem Testboard eine Schaltung aufgebaut dessen 
Hauptkomponenten bestehen aus 2 Amega8 mit 8Mhz Intern getaktet
sowie 2 RFM12B 686MHz Module.

Angeschlossen habe ich es nach folgendem Beispiel:
Die Routinen für den BASCOM laufen. Ein kleiner Fehler, abgesehen von 
dem den HUMIX gemeldet hat, war noch drin (Highbyte zuerst senden) aber 
jetzt laufen sie. Ich habe sie gerade an der Hardware mit einem 
Evalboard getestet. Allerdings hab ich den MEGA32 mit 8Mhz vom Evalboard 
getaktet, also nicht mit den 10MHz vom Modul. Also aufpassen im 
Quelltext falls einer die 10Mhz nutzt. Angeschlossen hab ich das Modul 
folgendermassen:
VDD    ->  VCC
GND    ->  GND
SDI    ->  MOSI (PB5, Pin 6)
SDO    ->  MISO (PB6, Pin 7)
SCK    ->  SCK  (PB7, Pin 8)
nSel   ->  SS   (PB4, Pin 5)
FSK    ->  R 10k Pullup

Jetzt gehts weiter im Programm mit den Feinheiten und IRQ-Steuerung. 
Auch werde ich mal mit dem SPI-Clock spielen um schneller zu werden.

Datei anbei, und nicht die Fuses vergessen.


Auch dieses habe ich aus dem Forum.

Mein Problem ist nun folgendes.
Im obigen Beispiel bezieht sich die Einstellung auf den 433Mhz Typ.
Ich bräuchte aber Daten für den 686Mhz Typ.
Könnte mir jemand sagen was ich überall "WO" ändern müsste um die SW 
angepasst auf die 686Mhz zum laufen zu bekommen?


Gruß
Thomas

Autor: Christian S. (roehrenvorheizer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

das kann man im Datenblatt auf den Seiten 14 u 15 genau nachlesen.

Configuration Setting Command 8008h,
Frequency Setting Command A680h


Welche Betriebsart ist denn im oben angeführten Programm eingestellt?




http://www.mikrocontroller-elektronik.de/funkmodul...



Beispiele mit Fehlerkorrektur z.B. hier

Beitrag "bidirektionale RS232 Funkbrücke mit RFM12"


Es ist immer gut zu wissen, welche Frequenz mit welcher Reglementierung 
beaufschlagt ist:

https://de.m.wikipedia.org/wiki/Short_Range_Devices

686 MHz ist da bestimmt irgendwo dabei...

MfG

: Bearbeitet durch User
Autor: Thomas V. (linuxer7)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Christian,

ein Datenblatt habe ich keines bekommen, nur die beiden Module und einen 
Zettel, der aber nicht wirklich Hilfreich für mich ist.
Ich habe im Internet nach Informationen gesucht, aber so wirklich fündig 
bin ich nicht geworden.

Was meinst Du mit Betriebsart ?
Im obigen Programm kann ich einstellen was Sender und was Empfänger ist 
indem ich die jeweiligen Zeilen aktiviere.

Ich vermute mal das ich das Programm jeweils als Sender oder als 
Empfänger und in den jeweiligen Kontroller Flash. Einer ist dann der 
Sender und einer der Empfänger. So verstehe ich das.

Das reicht mir im Prinzip auch schon.
Das Programm soll ja immer nur eine Textzeile senden.

In der Subroutine.....

Sub Rf12_setfreq(byval Freq As Single)

  Freq = Freq - 430.00
  Temp = Freq / 0.0025
  If Temp < 96 Then
    Temp = 96
  Elseif Temp > 3903 Then
    Temp = 3903
  End If
  Temp = Temp + &HA000
  Temp = Rf12_trans(temp)
End Sub

.... ist von den 430Mhz die Rede. Schätze mal das hier die Einstellung 
auf die 686Mhz gemacht werden.
Was da aber genau alles geändert werden muss weis ich nicht.


Vielleicht kann mir ja der Entwickler des Programmes sagen was ich "WO" 
noch ergänzen/ändern müsste damit es funktioniert.

Der thread ist halt schon 10 Jahre alt.
Beitrag "Beispielprogramm für RFM12 433MHz Funk-Module"

Gruß
Thomas

Autor: Christian S. (roehrenvorheizer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Thomas,

mit dem Datenblatt meine ich das hier:

https://www.google.de/url?sa=t&source=web&rct=j&ur...


Man kann das Fifo benutzen oder direkt ein Signal zur Modulation drauf 
geben.

Im Code ist die Formel Seite 17 oben zum frequency setting command 
angegeben. Diese müsstest Du ins Programm einpflegen.




//#define RF12FREQ(freq)  ((freq-430.0)/0.0025)    // 433 MHz macro for 
calculating frequency value out of frequency in MHz


//auf 868MHz-Modul angepasst:
//#define RF12FREQ(freq)  ((freq/20-43.0)*4000)      // 868 MHz macro 
for calculating frequency value out of frequency in MHz
//#define RF12FREQ(freq)  ((freq-20*43.0)/20*4000)              // 433 
MHz macro for calculating frequency value out of frequency in MHz
#define RF12FREQ(freq)  ((freq-860.0)*200)              // 433 MHz macro 
for calculating frequency value out of frequency in MHz
//ergibt mit Werten zwischen 868,48 MHz und 879,515MHz einen Bereich von 
genau 96...3903

________


void rf12_setfreq(unsigned short freq)    //Wichtig! den richtigen 
Bereich in Register 0x80 einstellen
{  if (freq<96)        // 430,2400MHz  //860,48
    freq=96;
  else if (freq>3903)      // 439,7575MHz  //879,515
    freq=3903;
  rf12_trans(0xA000|freq);
}



mfG

: Bearbeitet durch User
Autor: Torsten (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Thomas,

meinst du manchmal das 868 MHz ISM-Band (860.48 - 879.515 MHZ)?
Wie weit soll deine Drohne fliegen?
Die SPI-Schnittstelle muss von der HF gut abgeschirmt sein und
braucht ein sehr gutes Timeing beim Auslesen des Buffers.
Über die Software könnte man sich streiten.
Funktionen wie diese sind einfach schrecklich.

Sub Rf12_init:
  Waitms 150
  Temp = Rf12_trans(&Hc0e0)
  Temp = Rf12_trans(&H80d7)
  Temp = Rf12_trans(&Hc2ab)
  Temp = Rf12_trans(&Hca81)
  Temp = Rf12_trans(&He000)
  Temp = Rf12_trans(&Hc800)
  Temp = Rf12_trans(&Hc4f7)
End Sub

Und da ist es schwer und fehleranfällig was zu ändern.
Das müsste erst mal so etwa aussehen.

 e_configure:
 e_cmd_set_conf:     .dw (CMD_SET_CONF   | CAPACITOR_12_5   | EN_TX_REG 
| EN_RX_BUF | FREQ_BAND_868)
 e_cmd_set_power:    .dw (CMD_SET_POWER  | EN_CRYSTAL       | DI_CLK_PIN 
| EN_SYNTH)
 e_cmd_set_freq:     .dw (CMD_SET_FREQ   | FREQ_869_525)
 e_cmd_set_br:       .dw (CMD_SET_BR     | BIT_RATE_1_2)
 e_cmd_rx_config:    .dw (CMD_RX_CONFIG  | BAND_WIDTH_134   | PIN_16_VDI 
| DRSSI_103 | VDI_SLOW | LNA_GAIN_0)
 e_cmd_set_filter:   .dw (CMD_SET_FILTER | CLK_REC_AUTO     | DIG_FILTER 
| DQD_7)
 e_cmd_fifo_reset:   .dw (CMD_FIFO_RESET | FIFO_SYNC_WORD   | EN_HI_SENS 
| FIFO_INT_LEVEL_8)
 e_cmd_sync_pat:     .dw (CMD_SYNC_PAT   | FRAME_START_L)
 e_cmd_afc:          .dw (CMD_AFC        | EN_AFC_ACCURACY  | EN_AFC_REG 
| AFC_INDEPEND | EN_AFC_FUNC)
 e_cmd_tx_config:    .dw (CMD_TX_CONFIG  | OUTPUT_POWER_21  | 
FREQ_DEVIATION_30 )
 e_cmd_set_pll:      .dw (CMD_SET_PLL    | DI_DITHERING_PLL)
 e_cmd_wake_up_time: .dw (CMD_WAKE_UP_TIME) ; disable
 e_cmd_low_duty:     .dw (CMD_LOW_DUTY)     ; disable
 e_cmd_batt_clk_div: .dw (CMD_BATT_CLK_DIV) ; disable
 e_configure_end:

 Die Headerdatei dafür hänge ich mal mit an.

 Gruß Torsten

Autor: Marc Horby (marchorby)
Datum:

Bewertung
-2 lesenswert
nicht lesenswert
Müssen es unbedingt 686MHz sein? Normalerweise kenn ich die als 433 und 
868MHz. Für 686MHz sind die Filter wohl nicht ausgelegt. Zudem weis ich 
nicht ob dieses Band freigegeben ist!

Autor: Thomas V. (linuxer7)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Morgen Leute,

ich komme nicht immer gleich zum Antworten, habe noch zuviel anderes um 
die Ohren. Habt bitte Nachsicht Wenns den etwas länger dauert :)

686 Mhz sind natürlich Blödsinn. Gemeint habe ich natürlich die 868 Mhz.
Sorry Zahlendreher.

Ich möchte mich auf das von mir gepostete Programm nicht festlegen. 
Verstehen tue ich das sowieso nur zur Hälfte, dafür kenne ich mich in 
Bascom zuwenig aus.
Ich brauche nur eine Subroutine oder eine Variable der ich meinen 
Ascii-Text übergebe und die dann in einem bestimmten Intervall das an 
den Sender gibt.
Am Empfänger dann der umgekehrte Fall. Ich bekomme eine Variable mit dem 
Empfangenen Text, den ich dann weiter verarbeiten kann. Das ist das 
kleinste Problem. Mir macht die Sende Empfangs-Geschichte Probleme, 
damit kenne ich mich nicht aus.

Das Auslesen des GPS-Moduls ist kein Problem. Die Daten in eine Variable 
zu Packen und dem Sender zur Verfügung zu stellen auch nicht.

Das Programm von Bendikt und Joachim wäre Perfekt, nur bekomme ich es 
nicht zum laufen. Ich bin jetzt schon ein paar Wochen dran aber am 
Empfänger kommt nix an.

Die Reichweite liegt glaube sowas um die 100-200 Meter habe ich gelesen, 
im günstigsten Fall. Das Reicht mir. Ich Wohne auf dem Land.
Hauptgrund der Aktion ist den Copter wieder zu finden wenn er mal 
verloren geht.
Wenn er dabei im Flug auch noch anzeigt wo er ist und Höhe und Akkustand 
durch gibt ist das klasse. Mehr will ich nicht.

Mein Sohn hat seinen Anfang des Jahres verloren das war echt sch....
Wir haben 3 Tage nach dem Ding gesucht und nicht mehr gefunden.
Tracker kosten einen haufen Geld was ich nicht habe und was mein 
"Finanzminister" auch nie befürworten würde.

Deswegen die Aktion mit den beiden Modulen die ich hier hatte.
Das GPS-Modul hat bei Banggood gerade mal 8€ gekostet und die beiden 
Atmega8 sowie ein Display hatte ich noch hier herum liegen.


@Thorsten:
Vielleicht ne blöde Frage, aber wie binde ich die Header Datei ein ?

Gruß
Thomas

Autor: Torsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Thomas,

das war natürlich nicht zum Einbinden und alles wird gut gedacht.
Du must dir schon deine eigenen Konstanten definieren und damit
arbeiten. Es gibt auch nicht das Universalprogramm was überall
funktioniert. Habe mich genau wie du auch erst mal mit verschieden
Codevarianten beschäftigt und musste leider feststellen das selbst
Firmen mit nur sehr begrenzt brauchbaren Code arbeiten. Das präzise
lesen und schreiben der Daten in den Buffer ist nur mit Interrupt
Funktionen ordentlich machbar. Ein Polling-Betrieb geht da begrenzt,
wenn nur wenige Bytes übertragen werden. Meiner Ansicht nach ist
Assembler für diese Aufgabe am besten geeignet.

Gruß Torsten

Autor: eloka (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas V. schrieb:
> vor langer Zeit, ich denke es war so um 2005 bekam ich von einem
> bekannten 2 RFM12B 686MHZ Module.
Du weisst nicht zufällig noch die Quelle, oder?

Autor: Thomas V. (linuxer7)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Thorsten,

okay dann muss ich passen. Das bekomme ich nicht zum laufen,
dazu ist mein Wissensstand zu gering. Ich bin "Gelegenheitsbastler".
Dann wandern die Dinger wieder erstmal wieder in die Kiste.
Danke Trotzdem :)

@eloka
Der hat damals oft beim Pollin bestellt. Das steht auch auf dem Beiblatt 
was ich habe.

Gruß
Thomas

Autor: rfm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier gibt es noch Demoprogramme für Bascom:

http://www.ledstyles.de/index.php/Thread/15597-Cod...

Autor: Thomas V. (linuxer7)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für den Link. :)
Werde ich mir mal ansehen.

Gruß
Thomas

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.