Forum: Compiler & IDEs Morsecode mit (Attiny22)


von Thomas M. (tommark)


Lesenswert?

Hallo zusammen....

habe vor mit dem Atiny 22 durch die eingabe eines Morsecode (SOS)einen 
transistor durchschalten zu lassen. Komme aber mit der adressierung 
nicht klar. So meine Frage ist nun wie bewerkstellige ich dass:

PB0 = Eingang für den Code (SOS);
PB1 = Ausgang für Transistor;
PB4 = Ausgang LED wenn PB1 durchgesteuert ist;

IO-Ports und Datenrichtung bestimmen... wie schreibe ich das?

von Peter (Gast)


Lesenswert?

In welcher Sprache will du denn Programmieren, was hast du bist jetzt 
schon geschrieben?

von Thomas M. (tommark)


Lesenswert?

gnu gcc...

/*******************************************************/
/************** Morsecode*******************************/
/*******************************************************/

// Chip einbinden

#include <avr/io.h>            // Registernamen definieren
#include <stdint.h>
#include <util/delay.h>

#define _long
#define _short

/**********************Adressen********************************/

DDRB & = ~(1<<PB0);                   // alle ausgang ausser PB0
DDRB = 0xFF;                          //alle als ausgang
PORTB = 0xff;                         /* interne Pull-Ups an allen 
Port-Pins aktivieren */

/*****************hauptprogramm******************************/

int
main (void)
{


  return 0;
}

von Thomas M. (tommark)


Lesenswert?

Wie schreibe ich das am besten oder ist das so in ordnung?

von holger (Gast)


Lesenswert?


von Tim T. (tim_taylor) Benutzerseite


Lesenswert?

Thomas M. wrote:
> Wie schreibe ich das am besten oder ist das so in ordnung?

Was glaubst du was in dieser Reihenfolge wohl passiert?

> DDRB & = ~(1<<PB0);                   // alle ausgang ausser PB0
> DDRB = 0xFF;                          //alle als ausgang

Drehe es um!

von holger (Gast)


Lesenswert?

>Was glaubst du was in dieser Reihenfolge wohl passiert?

>> DDRB & = ~(1<<PB0);                   // alle ausgang ausser PB0
>> DDRB = 0xFF;                          //alle als ausgang

>Drehe es um!

Entscheidend ist auch wo es steht.

von Thomas M. (tommark)


Lesenswert?

danke für die schnelle Antwort.

von Thomas M. (tommark)


Lesenswert?

wie würde den die main Anweisung aussehen? Ich hab da nicht so den Plan. 
Bin anfänger in µ-controller.

-über beispiele würde ich mich freuen.
-muss ein timer hinzugezogen werden?

von Johann L. (gjlayde) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hi, ich verwende in vielen Anwendungen auch Morse-Codes.

Anbei ein Header uim definieren der Codes.

Doe Codierung sieht so aus: Bit7 codiert, ob das Zeichen mit einem 
langen (bit7=9) oder einm kurzen Strich (bit7=1) beginnt.

Bits 6..0 enthalten das eigentliche Zeichen, wobei der erste gesetzte 
Bit dem ersten Ton entspricht.

"A" ist also binär codiert als
1
A = 1 0000010
2
            ^ das zweite zeichen (lang)
3
           ^  das erste zeichen (kurz denn bit7=1)
4
    ^         erstes gesetztes bit ist "kurz"

und noch "M":
1
M = 0 0000011
2
            ^ das zweite zeichen (lang)
3
           ^  das erste zeichen (lang denn bit7=0)
4
    ^         erstes gesetztes bit ist "kurz"

Damit lassen sich also 2*127 Zeichen codieren. Eine 0 bedeutet "nichts 
ausgeben", nicht zu verwechseln mit " " oder "0".

EDIT

Da ist schon der erste Fehler.
Der Prototyp für morse muß so aussehen:
1
#include <inttypes.h>
2
3
extern void  morse (uint8_t);

von Johann L. (gjlayde) Benutzerseite


Angehängte Dateien:

Lesenswert?

Was jetzt noch fehlt, ist das C-Modul.

Die Funktion zur Ausgabe heisst morse. Um die Zeichenkette "SOS" 
auszugeben musst du die Aufrufreihenfolge.
1
#include "morse.h"
2
3
...
4
int main ()
5
{
6
   ...
7
   morse (_S_);
8
   morse (_O_);
9
   morse (_S_);
10
   ...
11
}

machen. Das ist zunächst etwas unkomfortabel, aber platzsparender als 
eine Zeichenkette abzubilden. Nen String rausmorsen kann man dann leicht 
unter Verwendung von morse() implementieren, wann man das gerne hätte. 
Dazu muss man dann 'A' auf A abbilden, 'B' auf B, etc.

morse() selbst ist Hardware-unabhängig geschrieben. Es braucht noch 
folgende Makros:
1
SPEAKER_ON  // Schaltet den Lautsprecher an (zB auf 1000Hz)
2
SPEAKER_OFF // Schaltet den Lautsprecher aus
und irgendwo muss eine Funktion wait_10ms (uint8_t n) implementiert 
werden, die n*10ms Zeit vertrödelt.

Diese Morse-Implementierung ist also blockierend. Dafür ist sie 
einfacher als eine nicht-blockierende IRQ-getriebene Implementierung.

Johann

von Peter (Gast)


Lesenswert?

ich glaube der Threaderstelle, braucht das  gegenstück - er will sein µC 
anmorsen.

von PJ (Gast)


Lesenswert?

Du musst Dich in die Lage des µC versetzen, der nur den blinkenden Pin 
sieht.

Und dann musst Du ihm beibringen, wie er die Längen von Biep und Boop 
messen und sich die bisherigen Längen merken kann, um sie zum richtigen 
Zeitpunkt in einer Tabelle nachzuschlagen.

Dafür brauchst Du sicherlich Zeitzählschleifen, Vergleichsfunktionen und 
Bit-Schiebefunktionen.

Der Link von Holger war schon ganz richtig, auf der Seite kann man das 
Wesentliche lernen.
So mal eben auf die Schnelle geht das nicht, wenn man sich mit 
Programmieren noch nicht so gut auskennt.
Das ist halt ein nettes Projekt, an dem Du einiges üben kannst, wenn Du 
es bis zum Erfolg durchziehst.

von Thomas M. (tommark)


Lesenswert?

Johann, vielen vielen dank für die sehr guten Vorschläge. Ich versuche 
diese einzubinden.

THX

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Peter wrote:
> ich glaube der Threaderstelle, braucht das  gegenstück - er will sein µC
> anmorsen.

hmmm. Ja, so lässt es sich auch lesen.

Dürfte aber ein harter Brocken sein, weil ja die Längen a priori nicht 
feststehen:

Ohne Kontext kann mein ein E nicht von einem T unterscheiden! Ausser 
natürlich man weiß, mit wieviel WPM das Signal reinkommt. Was man aber 
bei Morse-Zeichen eben nicht weiß in Normalfall: Man hört es eben und 
Brain 0.9 erledigt den Rest...

Johann

von Thomas M. (tommark)


Lesenswert?

THX @ all, noch irgendwelche Vorschläge? (hier werden Sie geholfen)

PB0 Eingang für ...  _  ...
PB1 Ausgang für Transistor
PB4 Status LED wenn PB1 durchgesteuert

von Peter D. (peda)


Lesenswert?

Thomas M. wrote:
> Wie schreibe ich das am besten oder ist das so in ordnung?

Nein, überhaupt nicht.

Du mußt erstmal den PC ausschalten, Papier und Bleistift nehmen und Dir 
nen Programmablaufplan erstellen.
Erst danach kannst Du anfangen, den Quelltext zu schreiben.

Dein Projekt ist allerdings nichts für Anfänger.
Schon die Erkennung der Gebegeschwindigkeit erfordert einiges 
Nachdenken.

Ich würde erstmal ne SW-UART programmieren und mir die Impulslängen 
ausgeben lassen und später dann die erkannten Zeichen.

Und zum Testen nen 2. AVR als Morsezeichengeber erstmal mit konstanter 
Geschwindigkeit und später mit einstellbarem Jitter.

Das ist also auch für nen MC-Profi definitiv kein Wochenendprojekt.


Nen ATtiny22 gibt es nicht (mehr), Du meinst wohl ATtiny25.


Peter

von PJ (Gast)


Lesenswert?

Google (mit: AVR Morsedekoder) liefert:

morsedecoder.c // for NerdKits with ATmega168:
http://www.nerdkits.com/videos/morsedecoder/morsedecoder_USB.c

bzw. Beschreibung auf:
http://www.nerdkits.com/videos/morsedecoder/

Das sieht aus wie etwas, was Du gut brauchen könntest.

von Thomas M. (tommark)


Lesenswert?

DANKE an alle nochmal, dieses Projekt ist eine herausforderung für mich

von Oliver (Gast)


Lesenswert?

>habe vor mit dem Atiny 22 durch die eingabe eines Morsecode (SOS)einen
>transistor durchschalten zu lassen.

Wenn man diese Anforderung wörtlich nimmt, steht da nichts vom gesamten 
Morsealphabet. Es soll nur SOS erkannt werden. Eine Lösung wäre, den 
Ausgang zu setzen, wenn von den letzten neun Impulsen die mittleren drei 
erkennbar länger waren, als die anderen 6, und zwischen den 9 Impulsen 
keine allzulange Pause war.

Oliver

von Karl H. (kbuchegg)


Lesenswert?

Oliver wrote:

> Wenn man diese Anforderung wörtlich nimmt, steht da nichts vom gesamten
> Morsealphabet. Es soll nur SOS erkannt werden. Eine Lösung wäre, den
> Ausgang zu setzen, wenn von den letzten neun Impulsen die mittleren drei
> erkennbar länger waren, als die anderen 6, und zwischen den 9 Impulsen
> keine allzulange Pause war.

Das sieht mir nach einer halbwegs vernünftigen Strategie aus. Das ganze 
so aufzuziehen, dass tatsächlich die einzelnen Buchstaben erkannt 
werden, hmmm, ich denke ich bin kein schlechter Entwickler ... aber 
damit hätt ich auch so meine Probleme.

von Thomas M. (tommark)


Lesenswert?

Oliver hat es verstanden...

>Wenn man diese Anforderung wörtlich nimmt, steht da nichts vom gesamten
 Morsealphabet. Es soll nur SOS erkannt werden. Eine Lösung wäre, den
 Ausgang zu setzen, wenn von den letzten neun Impulsen die mittleren 
drei
 erkennbar länger waren, als die anderen 6, und zwischen den 9 Impulsen
 keine allzulange Pause war.

von Thomas M. (tommark)


Lesenswert?

Wie lässt sich das einbinden in die main- Anweisung? wie würde der Code 
aussehen?

von Peter D. (peda)


Lesenswert?

Thomas M. wrote:
> Wie lässt sich das einbinden in die main- Anweisung?

Was willst Du denn einbinden, Du hast doch noch garnichts.

Hast Du überhaupt schonmal programmiert?
Dann solltest Du eigentlich wissen, daß man so nicht programmieren kann 
(zumindest nicht effektiv).

> wie würde der Code
> aussehen?

Weiß ich nicht, da ich diese Aufgabe bisher noch nicht bearbeitet habe.


Du hast ein paar Ideen geliefert bekommen, mach daraus nen Ablaufplan.
Erst dann weißt Du, was Du wie einbinden mußt.


Peter

von Oliver (Gast)


Lesenswert?

>Wie lässt sich das einbinden in die main- Anweisung?
1
while(1)
2
  if (isSOS())
3
    TransistorAn();

Jetzt musst du dir nur noch überlegen, wann der Transistor wieder 
ausgeschaltet werden soll :-)

Oliver

von Karl H. (kbuchegg)


Lesenswert?

Thomas M. wrote:
> Wie lässt sich das einbinden in die main- Anweisung? wie würde der Code
> aussehen?

Ich denke, diese Aufgabe ist noch deutlich zu schwer für dich. Du 
solltest mit einfacheren Dingen anfangen.

> IO-Ports und Datenrichtung bestimmen... wie schreibe ich das?

Wer solche Fragen stellt, hat noch mindestens 2 Monate lernen vor sich, 
ehe er sich über die gewählte Aufgabenstellung drübertrauen kann.

Wenn ich so zwischen den Zeilen lese, dann denke ich, du solltest erst 
mal auf einem PC anfangen, deine ersten C-Programme zu schreiben. Dort 
ist das deutlich einfacher. Alleine die Möglichkeit sich mittels printf 
unkompliziert Zwischenwerte ausgeben zu lassen, ist für einen Anfänger 
Gold wert.

von Thomas M. (tommark)


Lesenswert?

Danke nochmal @ all...

von Peter D. (peda)


Lesenswert?

Oliver wrote:
>
1
> while(1)
2
>   if (isSOS())
3
>     TransistorAn();
4
>

Stimmt, hast recht, Programmieren ist ja ganz einfach.
Da muß nur noch die Zeile:
1
#include <diverse_secret_black_boxes/isSOS.h>
mit rein und schon läuft das Programm.


Peter

von PJ (Gast)


Lesenswert?

Du kannst die Länge eines Impulses mit einer Zählschleife messen, die so 
lange zählt, wie der Impuls auf "An" ist.

Wenn der Impuls wieder weg ist, speicherst Du das in einem Array ("eine 
Liste von Werten"). Das Array hat dann 9 Felder, und bei jedem Speichern 
der beendeten Zeit schiebst Du alle bisherigen Werte eine Position 
weiter.

Sobald der neue Wert dann in dem Array ist, musst Du eine Funktion die 
Werte prüfen lassen, ob sie dem SOS-Kriterium entsprechen. Also die drei 
mittleren Array-Werte ca. 3 mal so groß wie die 3 ersten und die 3 
letzten. Wenn das der Fall ist - Transistor schalten.

Wie genau Du dieses "ca." festlegst, bleibt Dir überlassen, damit kannst 
Du die Unterscheidungsgenauigkeit gegenüber schlecht gemorsten Codes 
festlegen.

Wann Du den Transistor wieder ausschaltest und wovon das abhängen soll 
(Zeit? Ein anderer Code? Bestätigung des SOS-Alarms über eine Taste? 
Kein neues SOS nach soundsoviel Zeit?), hast Du noch nicht geschrieben.

Dieses Verfahren ist ein vereinfachtes Verfahren, weil die 
Zeichenzwischenräume nicht ausgewertet werden. Man kann den SOS-Code 
wahrscheinlich auch mit anderen Zeichen geben, die zusammengenommen 
dasselbe . - Muster geben, aber eben aus anderen Zeichen bestehen. Aber 
das kannst Du später noch einbauen, wenn die vereinfachte Version 
erstmal funktioniert.

Willst Du mit der Klingel automatisch die Tür öffnen? Oder ist das für 
irgendeine Art von Spiel oder Joke? Oder was tatsächlich sehr Ernstes?

von Oliver (Gast)


Lesenswert?

>Das Array hat dann 9 Felder,

Wenn da eine mechanische Morsetaste dranhängt, hat das Array gefühlte 
287 Felder...

Oliver

von Thomas M. (tommark)


Lesenswert?

Willst Du mit der Klingel automatisch die Tür öffnen? Oder ist das für
irgendeine Art von Spiel oder Joke? Oder was tatsächlich sehr Ernstes?

Möchte an meinem Roller einen Bremshebelcode einbauen (CDI)dass dieser 
von 45- auf 25 KM/h drosselt. Mit ..._  ...(SOS) soll der Transistor 
durchschalten welcher einen Kondensator ansteuert und drosselt 
(Phasenverschiebung des zündens). Das ist der Plan...

von Thomas M. (tommark)


Angehängte Dateien:

Lesenswert?

kennt sich da jemand mit aus? Habe was in Bascom gefunden. siehe 
anhang...
kennt sich jemand damit aus, wie ich .bas in eine .hex compiliere?

von Oliver (Gast)


Lesenswert?

>kennt sich jemand damit aus, wie ich .bas in eine .hex compiliere?

Tante google

>Das ist der Plan...

den die grünen (oder jetzt blauen) Jungs und Mädels von der Rennleitung 
auch kennen.

Oliver

von Thomas M. (tommark)


Lesenswert?

@ Oliver, mir ist das schon bewust... aber könnte mir jemand nen link 
schicken, wo ich eine .bas in hex. compiliere. Bei Tante google finde 
ich nix! Hab es schon aufgegeben.

THX Thomas

von PJ (Gast)


Lesenswert?

Das hört sich ja nun an wie ein Projekt, mit dem Du dich in Teufels 
Küche katapultieren könntest.

Wenn Du damit einen schweren Personenschaden verursachen solltest, den 
Deine Haftpflicht nicht deckt, dann hast Du damit ja wohl Dein Leben 
ruiniert.

Das kann es ja wohl nicht wert sein, oder?

von Thomas M. (tommark)


Lesenswert?

Wo du recht hasst, hasst du recht, so habe ich das noch nicht gesehen. 
Immerhin sind DZB nicht umsonnst da... Hasste recht, Danke. Da muss ein 
anderes Projekt her. Bye

von Oliver (Gast)


Lesenswert?

>... aber könnte mir jemand nen link
>schicken, wo ich eine .bas in hex. compiliere. Bei Tante google finde
>ich nix! Hab es schon aufgegeben.

Wenn du schon daran scheiterst, ist das wohl eine kluge Entscheidung.

Oliver

von Kai Bruhns (Gast)


Lesenswert?

http://loetstelle.net/projekte/tinycode/tinycode.php

Ich denke das kommt dem nahe.
ist zwar asm aber en das auf dem 22 übertragbar ist...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.