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

Reaktivlicht nur mit LED - Morsecode mit Pausen -

Hallo zusammen,

habe schon die Suche benutzt, vieles gelesen und wenig verstanden.... Ich habe mir Reaktivlichter zusammengebaut, bei denen die LED zugleich die Lichtmessung vornimmt.

Programmiert gemäß dem Kochbuch. Funktioniert auch alles wunderbar, aber bezüglich des Morsens hätte ich gerne kleine Pausen zwischen den Zeichen/Buchstaben

z.b. ABC = "*_ _ ***_*_*"

Dies wird aber hintereinander geblinkt, hätte gerne zwischen den Buchstaben kurze Pausen, also "*_ pause _*** pause _*_*", damit man die einzelnen Buchstaben besser erkennen kann.

Mir fehlen total die Kenntnisse im Programmieren :-( wo muss ich ansetzen?

Vielen Dank für Eure Hilfe

62 Morsen:
63 Morse$ = "--***--***" 'String aus 10 Zeichen * = kurz - = lang
64 For A = 1 To 10 '10 Zeichen auslesen und auswerten
65 S$ = Mid(morse$ , A , 1) 'Teilstring auslesen
66 If S$ = "*" Then 'wenn kurz Blinken
67 Portb.3 = 1 'LED AN
68 Waitms 30 'kurz warten
69 Portb.3 = 0 'LED AUS
70 Waitms 1000 'lang warten
71 Else 'sonst lang blinken
72 Portb.3 = 1 'LED AN
73 Waitms 300 'lange warten
74 Portb.3 = 0 'LED AUS
75 Waitms 1000 'lang warten
76 End If
77 Next A
78 Return
 

TeamAdolzfurt

Geomaster
Schnittlauchmann schrieb:
[...]
hätte gerne zwischen den Buchstaben kurze Pausen, also "*_ pause _*** pause _*_*", damit man die einzelnen Buchstaben besser erkennen kann.

Mir fehlen total die Kenntnisse im Programmieren :-( wo muss ich ansetzen?

Mir war schon vorher klar, daß Baskom allergrottigeste Schrottsoftware ist, aber diesen unstrukturierte Spaghetticode kann ein Anfänger auch nicht verstehen.

Hier das ganze mal bisschen strukturiert, dann verstehst Du vielleicht, wo man was einbauen muss:

Code:
Morsen:
    Morse$ = "--***--***" 'String aus 10 Zeichen * = kurz - = lang
    For A = 1 To 10 '10 Zeichen auslesen und auswerten
        S$ = Mid(morse$ , A , 1) 'Teilstring auslesen
        If S$ = "*" 
        Then 'wenn kurz Blinken
            Portb.3 = 1 'LED AN
            Waitms 30 'kurz warten
            Portb.3 = 0 'LED AUS
            Waitms 1000 'lang warten
        Else 'sonst lang blinken
            Portb.3 = 1 'LED AN
            Waitms 300 'lange warten
            Portb.3 = 0 'LED AUS
            Waitms 1000 'lang warten
        End If
    Next A
Return
Die Routine wandert durch den String "Morse$" und testet jedes Zeichen ab. Wenn es ein "*" ist, wird die LED 30ms lang eingeschaltet und dann 1000ms ausgeschaltet. Das soll dann ein Punkt sein. Bei jedem andern Zeichen wird die LED 300ms lang eingeschaltet und dann 1000ms lang ausgeschaltet. Danach springt die Schleife sofort zum nächsten Zeichen, und da fehlt Deine Pause.

Also: Vor das "Next A" und hinter das "End If" eine Zeile "Waitms 1000" oder so einfügen, das ist dann die Pause zwischen den Zeichen.

Wenn Du Dich da eh schon verkünstelst, kannst Du gleich richtigen Morsecode draus machen:

* Ein Strich ist dreimal so lange wie ein Punkt.
* Die Pausen innerhalb eines Zeichens ist so lang wie ein Punkt.
* Die Pause am Ende eines Zeichens ist so lange wie drei Punkte
* Die Pause zwischen zwei Worten ist sieben Punkte lang

Einfach die "Waitms" anpassen, z.B. Punkt 100ms und Strich 300. Die Pause nach dem Zeichen auch 300ms.

Gruß MaJa
 
OP
S

Schnittlauchmann

Geocacher
Hallo Maja,

vielen Dank! Ich glaube ich habe es kapiert um mir 100% sicher zu sein, kurz noch eine Frage

Morse$ = "--***--***"

Verstehe ich das dann richtig dass mit der "Then" und "Else" Abfrage jeder einzelne _ oder * abefragt wird und es dann wieder von vorne anfängt, bis die Reihe "Morse$" zu ende ist?

Wenn ja, mach ich nen Luftsprung :)
 

TeamAdolzfurt

Geomaster
Schnittlauchmann schrieb:
Morse$ = "--***--***"

Verstehe ich das dann richtig dass mit der "Then" und "Else" Abfrage jeder einzelne _ oder * abefragt wird und es dann wieder von vorne anfängt, bis die Reihe "Morse$" zu ende ist?

Yep. Ist aber bisschen doof programmiert, weil man auch die Länge des Strings "Morse$" bestimmen und die Schleife über diese Länge rennen lassen könnte. Dadurch könnte man den String länger oder kürzer machen, ohne den Rest des Programms anfassen zu müssen. Kann sein, daß Bascom das aus Platzgründen nicht kann.

Martin
 
OP
S

Schnittlauchmann

Geocacher
Hallo Martin,

vielen Dank auch Dir.

Allerdings wollte ich jetzt gerade loslegen mit dem Programmieren und da ist mir jetzt noch aufgefallen, dass ja nach jedem Zeichen jetzt eine Pause ist.

Allerdings brauch ich ja erst nach (siehe Beispiel ABC) *_ pause _*** pause _*_* :/

:hilfe:

Also müsste ich noch ein Zeichen für Pause definieren und es in den String einbauen?
 

fockel007

Geocacher
jepp, richtig interpretiert. es müßte ein extra Zeichen integreiert werden das die Pause definiert. Wäre dann aber eine 2te IF Bedingung und ich bin mir ncit ganz sicher ob das mit Bascom klappt; muss das mal austesten.

Nebenbei wie viele Zeichen willst du denn insgesamt morsen?
Je nach Anzahl wäre es u.U. einfacher die einzeln mit An aus zu programmieren.
 

TeamAdolzfurt

Geomaster
Schnittlauchmann schrieb:
Allerdings wollte ich jetzt gerade loslegen mit dem Programmieren und da ist mir jetzt noch aufgefallen, dass ja nach jedem Zeichen jetzt eine Pause ist.

Allerdings brauch ich ja erst nach (siehe Beispiel ABC) *_ pause _*** pause _*_* :/

:hilfe:

Also müsste ich noch ein Zeichen für Pause definieren und es in den String einbauen?

Ja. Habe eben gesehen, daß Bascom das Switch-Statement kann.

Code:
SELECT CASE Variable
  CASE wert1:
  CASE wert2:
  CASE ELSE
END SELECT

In Deinem Fall statt des ganze IF S$... END IF etwas in der Art

Code:
SELECT CASE S$
  CASE "*":
     [Der Code, der hinter dem IF steht]
  CASE "_":
     [Code, der jetzt hinter ELSE steht]
  CASE ELSE
     [ Pause abwarten]
END SELECT

In Deinem String definierst Du irgendwas anderes (z.B. !) als Pause.
MaJa/Martin
 
OP
S

Schnittlauchmann

Geocacher
Vielen Dank!!!!

Das hat mir wirklich sehr geholfen.

Werde mich morgen gleich an die Arbeit machen, der Nachtcache kann kommen :)

Gruß :^^:
 

chrysophylax

Geomaster
Um Platz in RAM und Flash zu sparen ermpfehle ich dringend, Morsezeichen in Bytes und nicht in Strings abzulegen. Ein 8bittiges Byte drängt sich geradezu auf für 5 Symbole und 3 Längenbits, ich glaube, die Idee hab ich sogar hier gesehen und dann auch in meiner Implementierung im Microchip-Assembler übernommen. Falls jemand noch eine Codetabelle guttenbergen will:
Code:
; +--------------------------------------------------------+
; |     Vordefinierte Zeichen zur Morse-Ausgabe auf PC7    |
; +--------------------------------------------------------+

; Definition:
; B7..B3= Auszugebendes Zeichen, linksbündig, links rausschiebend, 0=kurz, 1=lang
; B2..B0= Anzahl genutzer Symbole im Zeichen

MOR_A	= b'01000010' ; .-      2 Symbole
MOR_B	= b'10000100' ; -...    4 Symbole
MOR_C	= b'10100100' ; -.-.    4 Symbole
MOR_D	= b'10000011' ; -..     3 Symbole
MOR_E	= b'00000001' ; .       1 Symbol
MOR_F	= b'00100100' ; ..-.    4 Symbole
MOR_G	= b'11000011' ; --.     3 Symbole
MOR_H	= b'00000100' ; ....    4 Symbole
MOR_I	= b'00000010' ; ..      2 Symbole
MOR_J	= b'01110100' ; .---    4 Symbole
MOR_K	= b'10100011' ; -.-     3 Symbole
MOR_L	= b'01000100' ; .-..    4 Symbole
MOR_M	= b'11000010' ; --      2 Symbole
MOR_N	= b'10000010' ; -.      2 Symbole
MOR_O	= b'11100011' ; ---     3 Symbole
MOR_P	= b'01100100' ; .--.    4 Symbole
MOR_Q	= b'11010100' ; --.-    4 Symbole
MOR_R	= b'01000011' ; .-.     3 Symbole
MOR_S	= b'00000011' ; ...     3 Symbole
MOR_T	= b'10000001' ; -       1 Symbol
MOR_U	= b'00100011' ; ..-     3 Symbole
MOR_V	= b'00010100' ; ...-    4 Symbole
MOR_W	= b'01100011' ; .--     3 Symbole
MOR_X	= b'10010100' ; -..-    4 Symbole
MOR_Y	= b'10110100' ; -.--    4 Symbole
MOR_Z	= b'11000100' ; --..    4 Symbole

MOR_0	= b'11111101' ; -----   5 Symbole (Ziffer Null)
MOR_1	= b'01111101' ; .----   5 Symbole
MOR_2	= b'00111101' ; ..---   5 Symbole
MOR_3	= b'00011101' ; ...--   5 Symbole
MOR_4	= b'00001101' ; ....-   5 Symbole
MOR_5	= b'00000101' ; .....   5 Symbole
MOR_6	= b'10000101' ; -....   5 Symbole
MOR_7	= b'11000101' ; --...   5 Symbole
MOR_8	= b'11100101' ; ---..   5 Symbole
MOR_9	= b'11110101' ; ----.   5 Symbole

; Morse-"Sonderzeichen"

MOR_KA	= b'10101101' ; -.-.-   5 Symbole ("Spruchanfang")
MOR_AR	= b'01010101' ; .-.-.   5 Symbole ("Spruchende")
MOR_BT	= b'10001101' ; -...-   5 Symbole ("Pause")
MOR_VE	= b'00010101' ; ...-.   5 Symbole ("Verstanden")

MOR_gleich = b'10001101' ; -...- 5 Symbole ("[mathematisch] ist gleich")
MOR_plus   = b'01010101' ; .-.-. 5 Symbole ("[mathematisch] plus")
MOR_slash  = b'10010101' ; -..-. 5 Symbole ("Schrägstrich")

; einzige lebensnotwendige Ausnahme mit mehr als 5 Symbolen
; und daher hardcodiert als "alles, was 7 Symbole hat" in der Sw:

MOR_leer   = b'00000111' ; 7 Symbole gar nichts ("Leerzeichen zwischen Worten")

chrysophylax.
 

TeamAdolzfurt

Geomaster
Naja, wer Bascom verwendet hat eh' mit platzsparen nichts im Sinn... andererseits sind solche Teile meist Unikate und werden nicht in Millionenstückzahlen hergestellt. Im Zweifelsfall halt den nächstgrößeren Attiny für 30 Cent mehr verwenden.

Trotzdem gute Idee.

Martin
 

chrysophylax

Geomaster
TeamAdolzfurt schrieb:
Naja, wer Bascom verwendet hat eh' mit platzsparen nichts im Sinn... andererseits sind solche Teile meist Unikate und werden nicht in Millionenstückzahlen hergestellt. Im Zweifelsfall halt den nächstgrößeren Attiny für 30 Cent mehr verwenden.
Mir deuchte, ich hätte hier schon gelegentliches Jammern gehört die beliebte Demo-Version von Bascom würde regelmässig gegen ihre Begrenzungen rennen - gegen die auch keine grösseren Chips helfen ;)

chrysophylax.
 

TeamAdolzfurt

Geomaster
Kann ich mir gut vorstellen. Zum Glück gibt's ja vernünftige Entwicklungssysteme und eigentlich keinerlei Grund, was anderes als den GCC zu nehmen.

Mal 'ne Frage zum Thema: hast Du Erfahrung mit One-Wire Debugging von AVR? Ich programmiere die Teile mit einem AVR Dragon (sehr nett, kann vor allem parallel und HV-Programmierung). Meine Versuche mit One-Wire waren aber bislang vergeblich: was ich mit dem Ding erreichen wollte, war Auslesen der Variablen bei einem Breakpoint. Da geht gar nix, vermutlich weil ich nicht verstanden habe, wie das geht. Wenn man mit Symbolen übersetzen muss, platzen ja kleinste Progrämmchen schnell aus allen Nähten (des vorhandenen RAM und Flash). Das mag auf einem Mega128 noch gehen, aber auf einem Tiny?

Gruß Martin
 

chrysophylax

Geomaster
Äh, nein. Ich bin hier die Volksfront von Judäa und nur extrem selten wenn man mich mit ordentlichem Masochismuszuschlag dafür bezahlt mit AVRs unterwegs (Mega8535 in Assembler). 95% meiner µC-Projekte mache ich mit PICs.....Von daher kann ich mich wenn dann nur im Umgang mit AVRStudio 4.12 und dem MK2 als Programmiergerät nützlich machen...

chrysophylax.
 

stonewood

Geowizard
chrysophylax schrieb:
TeamAdolzfurt schrieb:
Naja, wer Bascom verwendet hat eh' mit platzsparen nichts im Sinn... andererseits sind solche Teile meist Unikate und werden nicht in Millionenstückzahlen hergestellt. Im Zweifelsfall halt den nächstgrößeren Attiny für 30 Cent mehr verwenden.
Mir deuchte, ich hätte hier schon gelegentliches Jammern gehört die beliebte Demo-Version von Bascom würde regelmässig gegen ihre Begrenzungen rennen - gegen die auch keine grösseren Chips helfen ;)
chrysophylax.
Moin,

'im zweifelsfall den nächstgrößeren nehmen' ist manchmal gar nicht so einfach. Der Tiny13 mag ein wenig anders programmiert werden als der Tiny45, da kann man also nicht 1:1 das gleiche Programm verwenden. Das gilt für einen großteil der Tiny/Mega-Serie, jeder hat da so seine eigenheiten.

Ach ja, wie sieht das eigentlich bei den PICs damit aus? Sind die nicht auch alle mehr oder weniger unterschiedlich?

Übrigens: die Demo-Version von bascom hat eine Begrenzung auf 4K erzeugtem Code. Bei 'nem Mega644 ist das natürlich sehr dürftig, aber selbst der Tiny45 mit 4K läßt sich damit noch voll programmieren. Andere Begrenzungen hat die Vollversion auch, Interrupthandling unter Bascom würd' ich mal eher als Abenteuer bezeichnen ...
 

jennergruhle

Geoguru
chrysophylax schrieb:
95% meiner µC-Projekte mache ich mit PICs.....
Wie sieht's da eigentlich mit vernünftigen Compilern aus? Ich hatte mal einen µC-Podcast gehört (Chaosradio Express 67) wo der Interviewte meinte, nur für Atmel-µC gäbe es vernünftige freie Compiler und Libraries, und Microchip wolle alles zu Apothekerpreisen einzeln verkaufen.
Hat sich das mittlerweile geändert? Nicht dass das meine Entscheidung für Atmel beeinflussen würde, aber falls mal jemand fragt...
 

Teddy-Teufel

Geoguru
Es ist immer wieder erstaunlich, eine gewisse Zeit ist Ruhe und dann entdecken ein paar Newcomer die Reaktivlichter und die ganze Sache mit den LED's als Sensor und Signalgeber wird von Neuem diskutiert. Sehr merkwürdig, denn das Kochbuch von Ralph hat immer noch Gültigkeit und man braucht das "Fahrrad" nicht neu erfinden.
Es gibt genügend getestete Codes, Upigors ist Fertigungs- und Vertriebsspezialist, die Gehäuse- und Größenfragen sind geklärt und sogar im Geoshop werden schon Reaktivlichter angeboten :shocked:
Was das Morsen betrifft, hat Windi schon 2006 ordentliche Codes geschrieben und vernünftig auslesen konnte man es 2007 hier auch schon.
 

stonewood

Geowizard
Teddy-Teufel schrieb:
Es ist immer wieder erstaunlich, eine gewisse Zeit ist Ruhe und dann entdecken ein paar Newcomer die Reaktivlichter und die ganze Sache mit den LED's als Sensor und Signalgeber wird von Neuem diskutiert. Sehr merkwürdig, denn das backbuch von Ralph hat immer noch Gültigkeit und man braucht das "Fahrrad" nicht neu erfinden.
[..]
Was das Morsen betrifft, hat Windi schon 2006 ordentliche Codes geschrieben und vernünftig auslesen konnte man es 2007 hier auch schon.
... und wie schon von mir zig mal geschrieben: LED als Lichtsensor mag mal funktionieren, hängt aber immer wieder an der verwendeten LED. Daher benutze ich nur noch LDRs für den Lichtsensor, da weiß ich wenigstens wie der reagiert und muß das nicht jedesmal anhand der Liefercharge einpendeln.

Ach ja, der Morsecode aus dem Kochbuch berücksichtigt keine Wortpausen, und das EEPROM ist auch nicht so ganz einfach zu beschreiben. Bei meinen Varianten hab ich das als Konstante im Flash abgelegt, dann braucht man sich mit dem EEPROM nicht abplagen. Ja, damit wird der nutzbare Programmspeicher kleiner, aber wenn das wirklich soweit ist sollte man z.B. folgenden Code ersetzen:

Code:
Reset watchdog
Powerdown
ersetze durch
Code:
gosub resetpowerdown
[..]
resetpowerdown:
Reset watchdog
Powerdown
Return
Das 'reset watchdog - powerdown'-Gespann braucht jedesmal ca. 10 Byte Speicher, wenn man das mehrfach im Code hat sprengt das schnell den Rahmen. Das gosub ist da wesentlich sparsamer, speziell wenn die Blinksequenz recht kompliziert wird.
 

Teddy-Teufel

Geoguru
LDR benutze ich nicht mal mehr bei 7-Segmentanzeigen und Morsecode im EEprom ablegen ist schon lange out.
Genau genommen ging es mir nur ums Prinzip, weil "alle Jahre" wieder.
Falls das nicht so rüber gekommen ist, bitte ich um Entschuldigung, daß ichs Maul aufgerissen habe. :D
 
Oben