hallo forianer, über processing verschicke ich vom mac (über keyspan) serielle daten an die UART des Atmega32. nun habe ich Probleme, wie ich diese korrekt über einen adc-port nach außen gebe. also genauer geht es um die übertragung von 16x8 pixeln, dich ich in 16bytes(2bytes pro reihe)zerlegt vom mac an den mikrocontroller sende, und sie dann wiederum auf 128 leds zu übertragen. die erste frage ist wie ich die daten am kompaktesten empfangen kann. man hat mir geraten neben den bytes gewisse marker zu verschicken, um die einzelnen reihen zu markieren. zudem ich auch den 16bytes zugewiesene latches über microcontroller und multiplexer enablen muss, aber das ist eine andere geschichte und auch schon gelöst. d.h. es kommen in (endlos)schleife ("a", byte1, byte2, "b", byte3, byte4, "c", byte5, byte6......"h", byte15, byte16) an der UART an. zugehörige 16latches sollen zeitgleich enabled werden. im anhang habe ich dazu etwas zusammengestellt. würde das im ansatz gehen? oder ist der ansatz falsch? weiß jemand eventuell eine einfachere lösung? also meine frage ist konkret: wie kann man, wenn inkey() den wert "a" erhält die folgenden 2bytes einlesen, und hintereinander auf porta legen und dann "b" einlesen und in der folge byte3 und byte4 einlesen und an porta geben und so weiter und so fort bis ein ganzer tv-frame(16 bytes) durch gelaufen und übertragen wurden ist und der ganze prozess dann wieder von vorne mit if inkey() = "a" beginnen kann... ich habe auch überlegt anstelle der zwei bytes pro reihe ein word einzulesen, denke aber, dass es wieder umständlicher wäre diese dann anschließend wieder in 2 bytes aufzuteilen um an den porta zu geben. bitte versucht mal euer glück, ich knusper da schon eine weile rum. danke stefanie
Da in deinen Datenbytes alle 256 Werte vorkommen können, kann natürlich auch "a".."h" vorkommen und deine Nummerierung durcheinander bringen. Ist es möglich, die Daten paketweise zu schicken? Also nach dem Senden aller Daten eine Pause zu machen, an der der AVR erkennt, dass das Telegramm zu Ende ist? Ein Timeout, der bei jedem ankommenden Zeichen (UART-RX-Interrupt) zurückgesetzt wird und nur abläuft, wenn die Pause kommt, kann dann die Daten aus einem Puffer sichern und den Pufferpointer wieder auf Anfang setzen. Der UART-Empfangs-Interrupt schreibt dann nur das neu empfangene Byte (pointer-incrementierend) in den Puffer und setzt den Timeout-Zähler auf Startwert. Der Timeout kann mittels eines Timers realisiert werden, aber auch mit einem Software-Timer, der in einem sowiso vorhandenem Timer-Interrupt behandelt wird. ...
um den timer zu umgehen, eine andere frage: es müssen nicht die werte "a" bis "h" sein. wüsstest du auch andere formen von markern? jemand anders meinte mal 255 wäre auch ganz gut als trenner..ich bin da noch newbie.. steffie
Warum willst du Timer umgehen? Bei mir nutzt fast jedes Programm einen Timer. Wozu sind die Timer denn sonst da? Da jeder der 256 möglichen Werte (0..255) in deinen Daten vorkommen kann, ist keinerlei ASCII-Zeichen als "Merker" geeignet. Alternativ wäre noch die Übertragung im Hexformat möglich, da können andere Zeichen (außer 0..9 und a..f oder A..F) als Trennzeichen vereinbart werden. Habe ich z.B. beim Feuerwerk-Zündgerät so gemacht (der Einfachheit halber ohne Interrupt): http://www.hanneslux.de/avr/zuenduhr/index.html Für deine Zwecke müsste der Empfangsbuffer vergrößert werden. ...
was sagst du zu dieser aussage(s.u.)? geht es oder geht es nicht? da war eigentlich jemand überzeugt...deswegen bringt mich das ein wenig durcheinander...ebenso meint er alle werte werden genutzt, aber er meint es ginge trotzdem. was ist nun richtig? "you logic is fine to pack a line in 2 bytes, what you have to do is to inform the microcontroller where is the begining of a TV frame and send all the bytes, usualy a byte is used as a marker but since you are using a full byte for all the lights all values will be used, so what you can do is send a first byte with number 1 and send the 2 bytes for the line then send a byte with number 2 in it and so on until all lines are sent and then back to the fisrt line again, so if your circuit misses a byte it should know which line it is" ......
Ich halte es für einfacher, auf dem PC/MAC eine Synchronisationspause einzufügen und diese im AVR auszuwerten (Timeout bei Abriss des Empfangs-Datenstroms). Auch das Rückübersetzen von HEX (zwei ASCII-Zeichen je Byte) in die Binärwerte halte ich für leicht realisierbar, das kann aber daran liegen, dass ich es bereits mal realisiert hatte, siehe obigen Link. Das Auswerten deines Formates ist sicherlich auch möglich, jedoch halte ich den Programmieraufwand für etwas höher. Das kann aber daran liegen, dass ich es noch nicht auf diese Art und Weise gemacht habe. Ich müsste mir also erst einen Algorithmus ausdenken, mit dem der eintreffende Datenstrom auf alle Merker (darauf, das jeder Merker auch an der erwarteten Position ist) überprüft wird und nach bestandener Prüfung alle Werte aus dem Empfangsbuffer (Array) extrahiert werden. Denn wie bereits geschrieben, die vereinbarten Merker-Werte (Kennungen) können auch als Daten vorkommen, bei einer ungünstigen Folge von Datenwerten könnte es zu Falschinterpretation kommen. Ich behaupte ja nicht, dass es nicht geht, ich würde es aber nicht so machen, da die anderen Lösungen aus meiner Sicht einfacher zu realisieren sind. ...
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.