mikrocontroller.net

Forum: Compiler & IDEs Morsecode mit (Attiny22)


Autor: Thomas M. (tommark)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In welcher Sprache will du denn Programmieren, was hast du bist jetzt 
schon geschrieben?

Autor: Thomas M. (tommark)
Datum:

Bewertung
0 lesenswert
nicht 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;
}

Autor: Thomas M. (tommark)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie schreibe ich das am besten oder ist das so in ordnung?

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Tim T. (tim_taylor)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thomas M. (tommark)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke für die schnelle Antwort.

Autor: Thomas M. (tommark)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Johann L. (gjlayde) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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
A = 1 0000010
            ^ das zweite zeichen (lang)
           ^  das erste zeichen (kurz denn bit7=1)
    ^         erstes gesetztes bit ist "kurz"

und noch "M":
M = 0 0000011
            ^ das zweite zeichen (lang)
           ^  das erste zeichen (lang denn bit7=0)
    ^         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:
#include <inttypes.h>

extern void  morse (uint8_t);

Autor: Johann L. (gjlayde) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Was jetzt noch fehlt, ist das C-Modul.

Die Funktion zur Ausgabe heisst morse. Um die Zeichenkette "SOS" 
auszugeben musst du die Aufrufreihenfolge.
#include "morse.h"

...
int main ()
{
   ...
   morse (_S_);
   morse (_O_);
   morse (_S_);
   ...
}

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:
SPEAKER_ON  // Schaltet den Lautsprecher an (zB auf 1000Hz)
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

Autor: Peter (Gast)
Datum:

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

Autor: PJ (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thomas M. (tommark)
Datum:

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

THX

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas M. (tommark)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: PJ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Google (mit: AVR Morsedekoder) liefert:

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

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

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

Autor: Thomas M. (tommark)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DANKE an alle nochmal, dieses Projekt ist eine herausforderung für mich

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thomas M. (tommark)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thomas M. (tommark)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Wie lässt sich das einbinden in die main- Anweisung?
while(1)
  if (isSOS())
    TransistorAn();

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

Oliver

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thomas M. (tommark)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke nochmal @ all...

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oliver wrote:
>
> while(1)
>   if (isSOS())
>     TransistorAn();
> 

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


Peter

Autor: PJ (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Das Array hat dann 9 Felder,

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

Oliver

Autor: Thomas M. (tommark)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Thomas M. (tommark)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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?

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas M. (tommark)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: PJ (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Thomas M. (tommark)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Kai Bruhns (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

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.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

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