• Willkommen im Geoclub - dem größten deutschsprachigen Geocaching-Forum. Registriere dich kostenlos, um alle Inhalte zu sehen und neue Beiträge zu erstellen.

Morseblinker Signale Senden und Vergleichen

dop3

Geocacher
Hi, bin grad dabei meinen Morseblinker etwas aufzumodden :) und zwar wollte ich es so machen das man mit der Taschenlampe ein Morse Signal z.b. * * * - - - * * * den Morseblinker zumorst und nur wenn das gesendete Signal mit dem des Blinkers übereinstimmt werden die Koordinaten ausgegeben. Ist sowas möglich oder wird das nicht hinhauen? Normalerweise müsste es ja gehen, das ist ja quasi so wie der "Teach in Modus" nur das das dann mit nem gespeichertem Code verglichen wird.

mfg
 

schnasemann

Geocacher
ich bin wo anders schonmal drüber gestolpert, hier http://loetstelle.net/projekte/tinycode/tinycode.php auch ein erster Denkanstoß.
Das Problem ist immer, dass Du, wenn Du weißt, welchen Code Du eingegeben haben möchtest, Du die Ungenauigkeit des Eingebenden mit berücksichtigen musst.
Wenn man z.B. ...---... eingegeben haben möchte, zählt man immer dann, wenn man ein Licht erkennt, einen Zähler. Wenn der Zähler beim ersten mal auf 14 hochgelaufen ist, beim zweiten mal auf 20 und beim dritten Mal auf 8, darfst Du Dir überlegen, ob das okay ist oder nicht.
Herr Google und Frau Wikipedia sagen z.B. folgendes:
* Ein Dah ist dreimal so lang wie ein Dit.
* Die Pause zwischen zwei gesendeten Symbolen ist ein Dit lang.
* Zwischen Buchstaben in einem Wort wird eine Pause von Dah eingeschoben.
* Die Pause zwischen Wörtern beträgt sieben Dits.

Heißt, das Dit (der Punkt) definiert die Länge der anderen Zeichen. Wenn nun ein Punkt zwischen 8-20 Zählern sein kann, darf eine Pause max. 20 sein (gutmütig wäre dann z.B. 25), ein Dah aber (3x8 bis 3x20) 24 bis 60 und dann wirds schon knapp. Machbar, wie gesagt, ist das schon.
Beim RL könnte man z.B. die Watchdogzyklen (125ms) als Zählbasis nehmen.

HTH,
schnasemann
 

Chris601

Geomaster
Hallo nach MHL!

"Alter Hut!" :). Ist schon im Kochbuch fürs Reaktivlicht beschrieben!

edit: irrtum.. dort gehts doch nur um den Teach-in-Modus.

Schade, ich dachte, diesbezüglich mal was gelesen zu haben. Ich denke aber, dass sollte sich mit der "normalen" Schaltung programmieren lassen.
 

waste1

Geocacher
Hallo dop3

ja, das gibt es schon. Hängt auch schon über 2 Jahre im Wald, hat also den Praxistest schon bestanden. Man muss "Hallo" morsen. Wird während des Morsens ein Fehler erkannt, so blinkt das Reaktivlicht sofort 8 mal kurz und es muss wieder von vorne begonnen werden. Wird alles richtig erkannt, so kommt als Antwort eine Zahl im Morsecode.

Ist nicht so einfach, wie einige morsende Kollegen auch schon feststellen durften. :D Manche Gruppen brauchen an der Station bis zu einer Stunde. Ein Wunder, dass die Batterie noch nicht leergesaugt ist.

Nachfolgend der Code. Passt aber nicht zu den Schaltungen aus dem Kochbuch, da meine RLs etwas anders aufgebaut sind. Aber als Beispielcode sollte es ausreichen.

Viele Grüße
Waste1

Code:
'=============================================================
'
' ************************************************************
' ***                                                      ***
' *** Tiny-Reaktivlicht mit Fototransistor und A/D-Wandler ***
' ***   mit Watchdog-Energiesparmodus und Tagabschaltung   ***
' ***                                                      ***
' ************************************************************
'
' µC: ATtiny45V
' +Ub: 3,00 V
' I: 6 µA im Leerlauf (Nachtbetrieb)
' I: 5 µA bei Tagabschaltung
' Reichweite:
'
'=============================================================

$regfile = "ATtiny45.DAT"
$crystal = 500000                                           'Frequenz des internen Oszillators

$hwstack = 32

Config Clockdiv = 16                                        'ergibt 500kHz Clock

Config Adc = Single , Prescaler = 2
Admux = &B00000010                                          'Channel 2 für ADC
Config Portb = &B00001000                                   'Pinb.3 auf 'Ausgang', Rest auf 'Eingang' schalten
Portb = &B11100111                                          'Pullups zuschalten, außer für Pinb.3 und .4
Stop Ac                                                     'Analog-Komparator abschalten, um Strom zu sparen
Set Didr0.4                                                 'Digital Buffer für ADC2 abschalten
Set Portb.4                                                 'Pullup für PORTB.4 zuschalten

Wdtcr = &B11010011                                          'Watchdog definieren: 0.125 Sekunden, Interrupt auslösen, kein Reset
Enable Interrupts                                           'Interrupts freigeben

Const Tagschwelle = 100                                     'Schwellwert für Schlafmodus

Dim Abfrage As Byte
Dim Hell As Byte
Dim Vhell As Byte
Dim Ok As Byte
Dim B As Byte
Dim Bx As Byte
Dim Z As Byte
Dim I As Byte
Dim Lb As Byte
Dim Aus As Byte
Dim Ein As Long
Dim Count As Word
Dim Tagzaehler As Integer
Dim Schwelle As Integer
Dim Ldr As Integer                                          '0 = Hell, 1023 = Dunkel
Dim Alt As Integer
Dim Merker As Integer
Dim D1 As Integer
Dim B2 As Integer

Z = 0
Ein = &B11100100010100000                                   'Eingabezeichen: ".... .- .-.. .-.. ---" = HALLO
Schwelle = 90                                               'je größer der Schwellwert, desto unempfindlicher

Portb.3 = 1                                                 ' LED an
Waitms 300                                                  ' dit
Portb.3 = 0                                                 ' LED aus

Do
Reset Watchdog
Powerdown                                                   'prozessor bremsen da sonst lichtänderung nicht erkannt wird
'Start Adc                                                   'A/D-Wandler starten
'Ldr = Getadc(2)                                             'geht nicht
Adcsra = &B11000000                                         'startet ADC und Messung
Do
Loop Until Adcsra.6 = 0                                     'warte bis Messung fertig
Stop Adc                                                    'A/D-Wandler zum Stromsparen wieder stoppen
Lb = Adcl                                                   'Helligkeitswert einlesen
Ldr = Adch
Shift Ldr , Left , 8
Ldr = Ldr + Lb

If Abfrage = 1 Then
   If Ldr < Schwelle Then
      Hell = 1
   Else
      Hell = 0
   End If
Else
   Merker = Alt - Ldr
   If Schwelle < Merker Then
      Abfrage = 1
      Ok = 1
      B = 0
      Schwelle = Alt + Ldr
      Shift Schwelle , Right , 1                            'Schwelle = Schwelle / 2
      Hell = 1
   Else
      Abfrage = 0
      Schwelle = 90
   End If
End If
Alt = Ldr

If Abfrage = 1 Then
   If Hell = 1 Then
      If Vhell = 0 Then B = 0                               ' Übergang zu Hell
      Vhell = 1
   End If
   If Hell = 0 Then
      If Vhell = 1 Then                                     ' Übergang zu Dunkel
         If Z = 0 Then
            Bx = B + B                                      ' B * 2, Grenze für dit/dah
            B2 = 3 * Bx                                     'Grenze für Pause = 6 dit
         End If
         If B < Bx Then
            If Ein.z = 1 Then Ok = 0
         Else
            If Ein.z = 0 Then Ok = 0
         End If
         Z = Z + 1
         B = 0
      End If
      Vhell = 0
      If B > B2 Then Ok = 0                                 ' zu lange dunkel
   End If
   B = B + 1
   If B > 90 Then Ok = 0                                    ' zu langsam
   If Count = 0 Then Ok = 0                                 ' beim 1.Mal blinken
   Count = 2400                                             'macht Erkennung scharf, Pull up
   If Ok = 1 Then
      If Z = 17 Then                                        ' dann morsen
         Waitms 500                                         ' Pause
         Aus = &B00011                                      'Bits von rechts n. links = Ausgabezeichen: "--..." = 7
         Z = 4
         D1 = Bx
         Shift D1 , Left , 4                                'Bx * 16, D1 = B * 32ms
         Gosub Morsen
      End If
   Else
         Aus = &B00000000                                   'Fehler: Ausgabezeichen: "........" = Irrung
         Z = 7
         D1 = 120
         Gosub Morsen
   End If
End If

If Count > 0 Then                                           'Pullup für schnellere Detektion zuschalten
   If Count = 1 Then
      Reset Portb.4                                         'Pullup für PORTB.4 ausschalten
      Alt = 0                                               'Auslösung wegen Abschalten des Pullups vermeiden
      Portb.3 = 1                                           ' LED kurz an
      Waitms 5
      Portb.3 = 0                                           ' LED aus
   Else
      Set Portb.4                                           'Pullup für PORTB.4 zuschalten
   End If
   Decr Count
End If

If Ldr < Tagschwelle Then                                   'prüfen ob helligkeit über tagschwelle liegt
   If Tagzaehler < 2500 Then
      Incr Tagzaehler
   End If
Else
   Tagzaehler = 0                                           'wenn wieder dunkel tagzähler löschen
End If

If Tagzaehler < 2400 Then                                   ' entspricht 5min
   If Count = 0 Then
      Wdtcr = &B11010011                                    'Watchdog auf 0,125 Sekunden stellen
   Else
      Wdtcr = &B11010001                                    'Watchdog auf 0,032 Sekunde stellen
   End If
Else
   Wdtcr = &B11110001                                       'Watchdog auf 8 Sekunden stellen
End If

Loop

Morsen:
   For I = 0 To Z
      Portb.3 = 1                                           ' LED an
      Waitms D1                                             ' dit
      If Aus.i = 1 Then                                     ' dah
         Waitms D1
         Waitms D1
      End If
      Portb.3 = 0                                           ' LED aus
      Waitms D1                                             ' 1 dit Pause
   Next I
   Abfrage = 0
   Z = 0
   Schwelle = 90
Return


End
 

schnasemann

Geocacher
gut gemacht und gut kommentiert. Aber, wie schon geschrieben, das Eingeben liest sich einfacher, als es gemacht wird.
Die Codierung der Dits und Dahs gefällt mir, ist gut gemacht.
Grüße,
schnasemann
 

Kappler

Geowizard
waste1 schrieb:
Code:
'Start Adc                                                   'A/D-Wandler starten
'Ldr = Getadc(2)                                             'geht nicht
Adcsra = &B11000000                                         'startet ADC und Messung
Do
Loop Until Adcsra.6 = 0                                     'warte bis Messung fertig
Stop Adc                                                    'A/D-Wandler zum Stromsparen wieder stoppen
Lb = Adcl                                                   'Helligkeitswert einlesen
Ldr = Adch
Shift Ldr , Left , 8
Ldr = Ldr + Lb

Entschuldigung, dass ich hier mal kurz OT werde :eek:ps: :

In dem obigen Listing ist eine alternative AD-Wandlung implementiert ("geht nicht").
Ich habe momentan auch Probleme mit der AD-Wandlung, und jetzt stellt sich mir hier natürlich die Frage, was an der ursprünglichen Variante "nicht geht" und ob das sich eventuell mit meinem Problem deckt...
 

waste1

Geocacher
Die Funktion GetADC() war damals (zumindest in 2007) mit dem ATtiny45 fehlerhaft. Deshalb musste ich die AD-Wandlung mit Einzelbefehlen durchführen. Ob der Bug in einer neueren Version von Bascom bereits behoben ist, weiß ich nicht.
 

upigors

Geowizard
also irgendwo gabs da schon mal nen fertiges programm zu.... ich glaub von windi war das seinerzeit. war vielleicht im "alten" kochbuch auf jeden fall irgendwo im reaktivlichttread.....
 

Chris601

Geomaster
geenau. Im Alten Kochbuch stehts nämlich.. wusste ichs doch...

Ist es noch online? Wenn nicht, hätte ich die PDF hier.
 

schnasemann

Geocacher
na, dann bin ich doch noch nicht ganz verkalkt. Ich wähnte es nämlich auch in einem Kochbuch. Aber das von mir geschilderte Procedere und das obige Listing sollte Lösungsansätze genug bieten.
Nach wie vor die Warnung: Einfach ist das für die "Eingebenden" nicht.
Grüße,
schnasemann
 

Starglider

Geoguru
schnasemann schrieb:
Nach wie vor die Warnung: Einfach ist das für die "Eingebenden" nicht.
Wäre es mein Cache würde ich dann darüber nachdenken wie ich die Software toleranter gegenüber menschlichen Timingschwächen machen kann.
 

thomas_st

Geowizard
dop3 schrieb:
Hi, bin grad dabei meinen Morseblinker etwas aufzumodden :) und zwar wollte ich es so machen das man mit der Taschenlampe ein Morse Signal z.b. * * * - - - * * * den Morseblinker zumorst
Hat zwar nicht direkt was mit Deiner Frage zu tun, aber bei diesem Beispiel haben alle Fenix L2D Besitzer einen großen Vorteil, da deren TaLa SOS von alleine Blinken kann ;)

Bzgl. ADC ist mir folgendes aufgefallen:
waste1 schrieb:
Code:
$crystal = 500000                                           'Frequenz des internen Oszillators
[...]
Config Adc = Single , Prescaler = 2
Das ist leicht (!) außerhalb der Spez. - sollte aber vermutlich gehen. Aber vielleicht den Prescaler testweise auf 4 setzen?

Viele Grüße,
Thomas(_st)
 

waste1

Geocacher
thomas_st schrieb:
Bzgl. ADC ist mir folgendes aufgefallen:
waste1 schrieb:
Code:
$crystal = 500000                                           'Frequenz des internen Oszillators
[...]
Config Adc = Single , Prescaler = 2
Das ist leicht (!) außerhalb der Spez. - sollte aber vermutlich gehen. Aber vielleicht den Prescaler testweise auf 4 setzen?

Viele Grüße,
Thomas(_st)
Das ist ein Kompromiss zwischen Stromsparen und Genauigkeit. Du hattest ja selbst auch schon Messungen durchgeführt. Je länger die AD-Wandlung dauert, umso höher der mittlere Stromverbrauch.

Viele Grüße
Waste1
 

thomas_st

Geowizard
waste1 schrieb:
Das ist ein Kompromiss zwischen Stromsparen und Genauigkeit. Du hattest ja selbst auch schon Messungen durchgeführt. Je länger die AD-Wandlung dauert, umso höher der mittlere Stromverbrauch.
Ah, ok. Ich wusste nicht, dass es Absicht war (hätte ja auch ein Versehen sein können) - dann vergiss meinen Einwand bitte :^^:

Viele Grüße,
Thomas(_st)
 

radioscout

Geoking
thomas_st schrieb:
Hat zwar nicht direkt was mit Deiner Frage zu tun, aber bei diesem Beispiel haben alle Fenix L2D Besitzer einen großen Vorteil, da deren TaLa SOS von alleine Blinken kann ;)
Meine Fenix und fast alle Taschenlampen morsen falsch. SOS ist ein Zeichen und wird ohne Pause gegeben: ...---... und nicht ... --- ...
 
Oben