Forum: Mikrocontroller und Digitale Elektronik einlesen von seriellen daten am atmega32


von Steffi R. (steffi)


Angehängte Dateien:

Lesenswert?

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

von Hannes L. (hannes)


Lesenswert?

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.

...

von Steffi R. (steffi)


Lesenswert?

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

von Hannes L. (hannes)


Lesenswert?

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.

...

von Steffi R. (steffi)


Lesenswert?

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"

......

von Hannes L. (hannes)


Lesenswert?

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
Noch kein Account? Hier anmelden.