Forum: Mikrocontroller und Digitale Elektronik Mikrokontroller -Neuling mit ein paar Fragen


von Hendrik S. (schwane)


Lesenswert?

Hallo Community,

ich bin 15 Jahre, Hobby-bastler und für mein nächstes Projetkt werde ich 
ein paar Mikrokontroller benutzen müssen. Deshalb habe ich mich mit den 
Tutorials hier mal ein bisschen eingelesen. jetzt habe ich aber noch ein 
paar Fragen.

Mein erstes Problem ist folgendes: Ein Mikrokontroller empfängt in 
unregelmäßigen Abständen Befehle über einen i/o-pin. Diese müssen dann 
ausgeführt werden. Nun kann die Ausführung eines Befehls aber ein paar 
milisekunden dauern, und der Nächste Befehl wird direkt hinter her 
geschickt. Hier würde der zweite Befehl "verschluckt" werden. Gibt es 
eine Möglichkeit, den Mikrokontroller den i/o-pin überwachen und die 
daten in eine Variable schreiben zu lassen und gleichzeitig aus dieser 
Variable zu lesen und die Befehle zu verarbeiten? So dass die Zeit in 
der kein Befehl gesendet wird, die restlichen Befehle abgearbeitet 
werden?

Das zweite was ich bräuchte ist ein Tutorial oder ähnliches zur 
datenübertragung zwischen zwei Mikrokontrollern via infrarot.

Und drittens: Wie kann ein C++ Programm, dass auf einem Windows PC 
läuft, mit einem Mikrokontroller komunizieren? Was ist einfach RS232 
oder USB?

Danke schonmal
          Schwane

von Peter (Gast)


Lesenswert?

Hallo,

Hab leider noch sehr wenig Ahnung von dem Zeug, aber der AT91SAM7P256 
gefällt mir total gut, von dem was ich bisher kenne...

Das mit der Pin-Überwachung könnte man evtl. über einen Interrupt lösen, 
der in regelmäßigen Abständen nachsieht und die Ergebnisse im RAM des MC 
ablegt...

Infrarot: habe ich keine Ahnung...

Ich hab momentan eine Kommunikation über RS232. Über .Net ist RS232 
easy. Kann mir aber vorstellen, dass es für c++ auch gute libs gibt...

MfG
Peter

von Peter (Gast)


Lesenswert?

Hendrik S. schrieb:
> Hier würde der zweite Befehl "verschluckt" werden.

was sollen den für Befehle über ein Pin empfangen werden. Ohne Protokoll 
kommt erstmal nur eine 0 oder eine 1 an - mehr nicht.

von gästle (Gast)


Lesenswert?

Den i/o per interrupt-Routine überwachen. Die Routine setzt eine 
Variable, die dann im Hauptprogramm überwacht und ggfs. die entspr. 
Aktion ausgeführt wird.

USB ist ein kompliziertes Protokoll, aber z.B. mit einem FTDI-Chip und 
der dazu verfügbaren DLL kein Problem. Mit RS232 würde ich nichts neues 
mehr anfangen.

von Lionel (Gast)


Lesenswert?

mal ein bisschen eingelesen. jetzt habe ich aber noch ein
paar Fragen.

Mein erstes Problem ist folgendes: Ein Mikrokontroller empfängt in
unregelmäßigen Abständen Befehle über einen i/o-pin. Diese müssen dann
ausgeführt werden. Nun kann die Ausführung eines Befehls aber ein paar
milisekunden dauern, und der Nächste Befehl wird direkt hinter her
geschickt. Hier würde der zweite Befehl "verschluckt" werden. Gibt es
eine Möglichkeit, den Mikrokontroller den i/o-pin überwachen und die
daten in eine Variable schreiben zu lassen und gleichzeitig aus dieser
Variable zu lesen und die Befehle zu verarbeiten? So dass die Zeit in
der kein Befehl gesendet wird, die restlichen Befehle abgearbeitet
werden?

-- ist absolut kein thema... dein uc hat interrupt eingänge, sprich 
eingänge, welche je nach konfiguration z.b. bei einer positive flanke 
(wenn sich die spannung am eingang z.b. von 0V auf 5V ändert), einen 
interrupt (sprich einten teil deiner software) abarbeiten, in diesem 
kanst du die befehle in einem buffer zwischenspeichern...) Interrupts 
unterprechen alle programme, und haben in ihrer ausführung auf dem uC 
priorität... sie werden also in jedem fall ausgeführt (solange nicht 
deaktiviert...)

Das zweite was ich bräuchte ist ein Tutorial oder ähnliches zur
datenübertragung zwischen zwei Mikrokontrollern via infrarot.

-- naja grundsätzlich brauchst du nur eine LED die im entsprechenden 
frequenzbereich sendet, einen phototransistor (mit nachgeschaltetem 
filter und verstärker) und das wars, google wird genug beispiele 
liefern...

Und drittens: Wie kann ein C++ Programm, dass auf einem Windows PC
läuft, mit einem Mikrokontroller komunizieren? Was ist einfach RS232
oder USB?

-- wenn du nicht massig daten austauschen wilst, nim rs232, ist zwar 
nicht modern, aber einfach...

von Michael K. (damichl)


Lesenswert?

@Peter
Ich würde einem Anfänger nicht empfehlen, mit einem AT91SAM..., also ARM 
anzufangen. Da hat man mit einem einfachen 8-Bit-Controller, Mega32 
o.ä., schneller Erfolge. Und für die gestelle Aufgabe sollte der wohl 
auch mehr als ausreichen.


mfg

Michael

von Hendrik S. (schwane)


Lesenswert?

warscheinlich habe mich bei frage 1 falsch ausgedrückt...

also:

an einen pin am Mikrocontroller liegt entweder spannung oder eben nicht 
an (^^). Wenn eine bestimmte Zeit lang (ein paar Takte) spannung anlag, 
wird eine 0 in den Buffer geschrieben, bei der Hälfte der Zeit eine 1. 
(danach folgt immer eine gleich lange phase ohne Spannung)
Aus 40 so übertragener bits bildet sich der Besagte Befehl, wobei er 
immer mit einer 1 beginnt und endet. Zwischen den Befehlen werden nullen 
übertragen (lange spannung, lange keine spannung)

So muss der Mikrocontroller gleichzeitig diesen diesen Pin überwachen, 
und sobald eine 1 empfangen wurde die nächsten 39 Bit abspeichern, und 
gleichzeitig die Befehle im Buffer abarbeiten.
Was ich an der Sache nicht hinbekommme ist, das sich High und Low am Pin 
auch dann abwechseln, wenn eigendlich nur nullen übertragen werden. Und 
wenn ich dann ein interrupt aktiviere, sobald positive Spannung anliegt, 
wird im Hauptprogramm ja gar nicht mehr weiter gerechnet^^

von Karl H. (kbuchegg)


Lesenswert?

Hendrik S. schrieb:

> an einen pin am Mikrocontroller liegt entweder spannung oder eben nicht
> an (^^). Wenn eine bestimmte Zeit lang (ein paar Takte) spannung anlag,
> wird eine 0 in den Buffer geschrieben, bei der Hälfte der Zeit eine 1.
> (danach folgt immer eine gleich lange phase ohne Spannung)
> Aus 40 so übertragener bits bildet sich der Besagte Befehl, wobei er
> immer mit einer 1 beginnt und endet. Zwischen den Befehlen werden nullen
> übertragen (lange spannung, lange keine spannung)

In welchen Zeitabständen kommen da die Bits rein?
Wie ist das Timing?

> Was ich an der Sache nicht hinbekommme ist, das sich High und Low am Pin
> auch dann abwechseln, wenn eigendlich nur nullen übertragen werden. Und
> wenn ich dann ein interrupt aktiviere, sobald positive Spannung anliegt,
> wird im Hauptprogramm ja gar nicht mehr weiter gerechnet^^

Du sollst ja auch nicht im Interrupt alle 40 Bits in einem Rutsch 
einlesen, sondern in jedem Interrupt nur 1 Bit.

Aber selbst das ist für mich im Moment nicht gesichert.
Wie gesagt: Wie ist das Timing?

lange Zeit ist kein Begriff, mit dem man etwas anfangen kann. Wie lang 
ist lang. Sind das Nanosekunden, sind das Millisekunden oder was?


(klingt für mich nach einer Manchestercodierung was du da so ungefähr 
beschreibst)

von Hannes L. (hannes)


Lesenswert?

Wenn Du es mit kurz/lang codieren willst, dann schau Dir mal das 
DCC-Protokoll (Modellbahn-Digitalsteuerung) von Lenz an. Es ist z.B. bei 
MOROP und NMRA veröffentlicht.

Oder das Protokoll, das die Funksteckdosen verwenden. Auch dies ist 
bitsynchronisierend, läuft also auch bei nicht genauer Taktrate 
zufriedenstellend zuverlässig. Infos dazu gibts im Netz.

Der Empfang muss natürlich im Interrupt laufen, wenn der MC noch andere 
Dinge tun soll. Da gibt es z.B. den externen Interrupt oder das Pollen 
des Pins im Timer-Interrupt.

Natürlich geht es auch mit UART (RS232), dann sollte man den Controllern 
baudratentaugliche Quarze spendieren.

...

von Helmut L. (helmi1)


Lesenswert?

Hendrik S. schrieb:
> Wenn eine bestimmte Zeit lang (ein paar Takte) spannung anlag,
> wird eine 0 in den Buffer geschrieben, bei der Hälfte der Zeit eine 1.
> (danach folgt immer eine gleich lange phase ohne Spannung)

Du kannst mit dem Eingangspin einen Interrupt ausloesen lassen (Pin 
Change Interrupt). In der Interruptserviceroutine startets du einen 
Timer. Wenn der abgelaufen ist (erzeugt ebenfalls einen Interrupt) 
schaust du nach ob der Pin '1' oder '0' ist . Schon hast du ein Bit 
eingelesen. Nach 40 solcher Ereignisse haast du dann dein Datenwort im 
Speicher. Das einzigste Problem hierbei ist wie man den Start erkennen 
kann. Das kannst du eventuell mit einen doppelt solangen Zeit erkennen. 
So eine Kommunikation hatte ich letztens selber fuer einen AVR 
programmiert.

von Hendrik S. (schwane)


Lesenswert?

ok... das mit dem Signal bekomm ich jetzt hin...

außerdem bin ich auf V-USB gestoßen 
(http://www.obdev.at/products/vusb/index-de.html) hat damit jemand 
Erfahrung bzw. kennt ein gutes (wenn möglich deutsches) Tutorial?

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.