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
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
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.
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.
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...
@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
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^^
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)
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. ...
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.