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

Tiny13, Morsecode, Bascom und ein Anfänger

Cachehunter12

Geocacher
Hallo Cacherkollegen,

ich will mit einem Tiny13 einen Morsecode an einer Led ausgeben.
Meine Frage dazu: Kann man die Zeichen (a, b, c...) und die verschiedenen Pausezeiten irgendwo definieren, damit man einfach den Wunschtext eingeben kann und der dann selbstständig umgewandelt wird? (mit richtigen Pausezeiten etc.)

Vielen Dank im Voraus!

mfg Cachehunter12
 

chrysophylax

Geomaster
Die Idee war von jemand Anderen (ich hab sie glaub ich nur aufgegriffen) und ich hab das Ganze für PICs implementiert, das wird der Atmel-Front relativ wenig helfen....

Allerdings kann man da inzwischen im Quelltext relativ anfängerfreundlich ziemlich Klartext editieren (eigenes Include-File, damit man sich nicht aus Versehen durch Bewurstfingerung den Assembler-Teil versaut):
Code:
; #====================================================================================#
; #       Wunschkonfiguration                                                          #
; #====================================================================================#

	org 0x2100

; Generelle Konfigurationsparameter
EEGLOB
    de b'00001010'
;        |||||||+- 1= Reaktivlicht, 0= Magnetbake
;        ||||||+-- 1= "Alive-Blink" beim Aufwachen aus UL-Sleep
;        |||||+--- 1= LDR-Testmodus (dauerhafte AD-Wandler-Anzeige)
;        ||||+---- 1= "Text"anzeige als Morsecode auf SEG_DP
;        |||+----- unbenutzt
;        ||+------ unbenutzt
;        |+------- unbenutzt
;        +-------- unbenutzt
EEDLEV
	de 32	; Schwelle, unter der in Nachtmodus ("Dunkel") gewechselt wird
EEHLEV
	de 48	; Schwelle, über der in Tagmodus ("Hell") gewechselt wird
EETRIG
	de 3	; Helligkeitssprung nach oben für Auslösung
EEDCTR
	de 10	; jede wievielte Messung wird im Dunkelmodus in die Mittelwertbildung 
			; einbezogen ?
EETTOT
	de 20	; Totzeit: Anzahl mittelwertsrelevanter Messungen die durchgeführt werden
			; müssen, bevor ein Reaktivlicht im Anschluss an eine Auslösung erneut
			; ausgelöst werden kann.
EETRCTR
	de 0,0	; 16Bit-Zähler für Anzahl Auslösungen
EETACTR
	de 0,0	; 16Bit-Zähler für Anzahl Tage

; Parameter rund um die Zeichenausgabe
EEKOORD
	de LOW(EEENDE)-LOW(EEKOORD)-3	; Anzahl Zeichen
;	de 100   ; Leuchtzeit * 10ms (die das 7Seg-Zeichen leuchtet)
	de 60	; Leuchtzeit * 10ms (bei Morseausgabe = Dauer eines "Dit".)
	de 5	; Pausenzeit * 10ms (zwischen den 7Seg-Zeichen)

; eigentliche auszugebende Zeichen, am Programmstart per Include vordeklariert

;  'HALLO SUCHER'

	de MOR_H, MOR_A, MOR_L, MOR_L, MOR_O
	de MOR_leer
	de MOR_S, MOR_U, MOR_C, MOR_H, MOR_E, MOR_R

EEENDE

Das Include, in dem die Symbole (7Seg) und Zeichen (Morse) vordefiniert sind, hab ich in der Tat schonmal irgendwo hier gepostet, das dürfte auch für Atmels mehr oder weniger wiederverwurstbar sein.

chrysophylax.

P.S.: Edit: da wars.
 

upigors

Geowizard
irgendwie versteh ich glaub ich die Eingangs-Frage nicht ganz.
Was suchst du?
Es gibt doch fertige Files im Reaktivlicht-Wiki, da musst du nur noch deinen Text via "-" und "*" eintragen und fertig. Wofür ein Programm was irgendwas umwandelt. Oder steh ich nur auf dem schlauch und habs wirklich nicht verstanden?
Mit Bascom und dem controller solltest du natürlich umgehen können....
 
OP
C

Cachehunter12

Geocacher
@upigors: Du bist einfach der Beste! :2thumbs:

Habe das File vom Reaktivlicht mit Morsecodeausgabe gefunden und einfach das vom Reaktivlicht rausgelöscht! Verstanden habe ich auch den größten Teil, funktionieren tut's auch, einfach Klasse! ;)

Nochmals danke

mfg Cachehunter12
 

upigors

Geowizard
Deinen Dank gebe ich an dieser Stelle mal an den Autor des Programms weiter ;-)
Danke ..... Windi ???
 
OP
C

Cachehunter12

Geocacher
Eine Frage habe ich jetzt doch noch!

Wenn ich Spannung anlege, fängt das Programm nicht zuverlässig von vorne an, was ist da falsch?

Am Anfang steht doch ...PORTB = 0...???
 

upigors

Geowizard
Portb=0 sagt doch nur das alle Ausgänge auf Low gesetzt werden.
Ob das reaktive nach anlegen der Spannung einmalig startet oder nicht hängt damit zu sammen ob der LDR beim ersten messen hell oder dunkel ist.
 
OP
C

Cachehunter12

Geocacher
Ich habe ja gar kein Reaktivlicht, sondern ich will die Spannung zum tiny nur mit einem reedkontakt schalten, dahinter die LED die Moresezeichen ausgibt.
Nur bei dem Aufbau auf dem Steckbrett fängt die LED, wenn ich Spannung auf VCC gebe, manchmal nicht richtig zu blinken an.
 

upigors

Geowizard
aber du hast den programmcode des reaktiven genommen? und keinen fotowiderstand sondern willst das quasi tasten bzw über nen reedschalter auslösen? dann solltest du den programmcode oder die schaltung auch dementsprechend anpassen oder hast du das schon gemacht? sonst will der tiny ja irgend nen helligkeitwert haben....
ich habe es anfangs so gemacht das ich dem tiny durch einen entsprechenden widerstand (statt ldr) suggeriert hab es wäre hell. wenn man dem dann spannung gibt sollte er auch einmalig mit dem programm entsprechend starten und ich brauchte den code nicht zu verändern. nicht elegant aber seinerzeit als "beginner" die einfachste lösung.
vielleicht solltest du mal schaltplan und code hier posten damit man weiß was du wie baust oder bauen willst.
 
OP
C

Cachehunter12

Geocacher
Hier Schaltplan und Programmcode, kam leider nicht früher zum hochladen dazu!

$regfile = "ATtiny13.DAT"

$crystal = 128000 'Frequenz des internen Oszillators



Config Portb = &B00001000 'Pinb.3 auf 'Ausgang', Rest auf 'Eingang' schalten

Portb = 0 'Ausgänge auf Low setzen

Enable Interrupts

Dim Zeichen As String * 1

Morsen:

Do

Read Zeichen

Wdtcr = &B11010100 'Watchdog auf 250ms stellen

If Zeichen = "*" Then Gosub Kurz

If Zeichen = "-" Then Gosub Lang

If Zeichen = " " Then Gosub Leer

Wdtcr = &B11010011 'Watchdog wieder auf 125ms stellen

If Zeichen = "X" Then Return

Loop

Kurz:

Portb.3 = 1

Reset Watchdog

Powerdown

Portb.3 = 0

Reset Watchdog

Powerdown

Return

Lang:

Portb.3 = 1

Reset Watchdog

Powerdown

Reset Watchdog

Powerdown

Reset Watchdog

Powerdown

Portb.3 = 0

Reset Watchdog

Powerdown

Return

Leer:

Reset Watchdog

Powerdown

Reset Watchdog

Powerdown

Return

End

Daten:

Data " " , " " , " " ,

Data "*" , "*" , "*" , "*" , " " , " " ,

Data "*" , "-" , " " , " " ,

Data "*" , "-" , "-" , "*" , " " , " " ,

Data "*" , "-" , "-" , "*" , " " , " " ,

Data "-" , "*" , "-" , "-" , " " , " " ,

Data " " , " " , " " , " " ,

Data "*" , "*" , "*" , "*" , " " , " " ,

Data "*" , "*" , "-" , " " , " " ,

Data "-" , "*" , " " , " " ,

Data "-" , " " , " " ,

Data "*" , "*" , " " , " " ,

Data "-" , "*" , " " , " " ,

Data "-" , "-" , "*" , " " ,

Data "X"
 

Anhänge

  • Morseschaltung.jpg
    Morseschaltung.jpg
    7,7 KB · Aufrufe: 990

upigors

Geowizard
hmmmm nimm mal das Morsen: weg. Ich denke dann gehts.
Kann sein das der nicht richtig läuft weil du ihm ja nicht sagst das "wenn.... dann gehe nach Morsen". Kann aber auch ganz falsch liegen....
Wenn nicht definiere nen Pin als Eingang, zieh den per Drahtbrücke auf high oder low und frage am Programmanfang nach den Definitionen den Pin ab. Vielleicht nicht die eleganteste Lösung aber funktioniert.
Theoretisch könnte man wohl die Brücke auch weg lassen , den Eingang per Befehl auf high oder low und dann abfragen und sagen wenn.... dann gehe nach Morsen.
Vielleicht hat ja jemand ne einfache und saubere Lösung..... wenn nicht einfach mal etwas testen......
 

Windi

Geoguru
Der Fehler liegt hier:
If Zeichen = "X" Then Return

Mit "Return" springt man aus einer "Gosub"-Routine zurück.
Da du hier aber in keiner "Gosub"-Routine bist holt er sich irgendwelche Rücksprungadressen und springt dann ins Nirvana.
Ersetzte mal das "Return" durch ein "Restore". Damit setzt er den Zeiger wieder auf den Anfang deiner Data-Zeilen und der Morsecode wird immer wieder ausgegeben.
 
OP
C

Cachehunter12

Geocacher
Ich komm einfach nicht weiter!
Weder das "Morsen" entfernen noch das "Restore" hat geholfen.

Noch mal mein Problem, wenn VCC für ein paar Sekunden weg ist, (~1-5sec. sprich der Cacher nimmt den Magnet weg und dann wieder zurück) soll das Programm von vorne starten ohne rücksicht darauf, wo es gerade war!

Gruß Cachehunter12
 

peter51d

Geocacher
Bitte nicht schlagen, aber wo sollen den die Zeichen gelesen werden?
Unten im Code sind ja die Morsezeichen, die geblinkt werden sollen hinterlegt.
In der Zeile Über den Morsezeichen steht "Daten". Kann es sein, das hier "Zeichen" stehen müsste, damit der Tiny auch was zum lesen hat?
Ist nur so eine Idee, von einem Anfänger.
 

peter51d

Geocacher
Ich nehme alles zurück und behaupte das Gegenteil.

Habe mich mal etwas mit "Data" beschäftigt.
Vergesst einfach was ich gesagt habe.
 

peter51d

Geocacher
Habe mich mal etwas mit "Data" beschäftigt.
Vergesst einfach was ich gesagt habe.

Wenn ich es richtig verstanden habe, kommt der Cacher an deine Station, hällt einen Magnet an die Station und es soll ein Morsecode über eine LED ausgegeben werden.

Da würde ich mir die ganze Sache mit Watchdog und runterfusen sparen und über den Magnetkontakt einfach die Spannungsversorgung des Tiny's schalten.
Sobalt der Tiny Spannung bekommt, rennt er los und blinkt seinen Morsecode.

Ich habe mal versucht da etwas zu schreibe.
Led ist mit einem Widerstand zwischen PB3 und GND angeschlossen.
Tiny ist Out of the Box, FuseBits auf Werkseinstellung.
Sobald er Spannung bekommt, wird die in den Daten hinterlegte Morsesequenz "abgeblinkt".

Code:
$regfile = "attiny13.dat"                                   ' Controler
$crystal = 1200000                                          'Frequenz, hier 9,6Mhz Div8
$hwstack = 2                                                'hardware Stack runtergesetzt
'$sim
Config Portb.3 = Output                                     'Port B.3 als Ausgang konfiguriert
Portb.3 = 0                                                 'Port B.3 auf low gesetzt

Dim Zeichen As String * 2                                   'Variable Zeichen als einstelligen String gesetzt


  Restore Daten                                             'Daten zurücksetzen

  Do                                                        'Schleife starten
    Read Zeichen                                            'Daten lesen?
    If Zeichen = "*" Then Gosub Kurz                        'Sprunganweisung zum kurzem blinken
    If Zeichen = "-" Then Gosub Lang                        'Sprunganweisung zum langen blinken
    If Zeichen = "P" Then Gosub Pause                       'Sprunganweisung zur Pause zwischen zwei Buchstaben
    If Zeichen = "X" Then End                               'end program
  Loop

Kurz:                                                       'Kurzes Morsezeichen
   Portb.3 = 1                                              'Port B.3 auf high
   Waitms 500                                               'warte 500 ms
   Portb.3 = 0                                              'PortB.3 auf low
   Waitms 500                                               'warte 500 ms
Return                                                      'Rücksprung in die Schleife

Lang:                                                       'Langes Morsezeichen
   Portb.3 = 1                                              'PortB.3 auf high setzen
   Waitms 1500                                              'warte 1500ms
   Portb.3 = 0                                              'Portb.3 auf low
   Waitms 500                                               'warte 500 ms
Return                                                      'Rücksprung in die Schleife

Pause:                                                      'Pausenzeichen zwischen zwei Buchstaben
   Waitms 1000                                              'warte 1000 ms
Return                                                      'Rücksprung in die Schleife

Daten:

Data "*" , "*" , "*" , "P"                                  'Zu morsende Zeichen, bei Buchstaben auf Gross und Kleinschreibung achten
Data "-" , "-" , "-" , "P"
Data "*" , "*" , "*"
Data "X"

Läuft bei mir problemlos.

Wenn du den zu morsenden Text in "Klartext" in die Daten schreiben möchtst, muss halt für jeden Buchstaben eine entsprechende Blinkroutine angelegt werden.
Ich weiss aber nicht, ob dann der Platz im Tiny13 noch reicht?
 
Oben