PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Suche Möglichkeit einer schnellen Konvertierung eines String´s in einen Byte-Array



#fritz#
23.06.2013, 12:55
Hallo,

folgendes Problem:

Ein Atmega 16 steuert eine LED-Matrix mit 7 Spalten und 18 Zeilen = 126 LED`s
im Multiplex-Betrieb.
Bei der Multiplex-Anzeige wird der Byte-Array Anzeige(126) ausgewertet.

Die Info, welche LED zu leuchten hat, bekommt er seriell von einem Atmega 328
in Form eines 126-Zeichen langen String`s.
Die Baudrate ist 9600, wenn höher treten zu viele Fehler auf.

Zuerst habe ich den seriellen Eingang mit 126 Zeichen (0 und 1) durch die Funktion "mid" und "val"
in den Byte-Array Azeige(126) übetragen.
Das funktioniert im Prinzip, aber während des Datenempfanges und der Übertragung in den Byte-Array
flackert die Anzeige, weil das ganze den kontinuierlichen Ablauf der Multiplexanzeige unterbricht.

In der Hoffnung, dass alles schneller abläuft habe ich mit der Funktion "split" den empfangenen String in
den Array übertragen. Brachte aber keinen Vorteil, da bei "split" Trennzeichen erforderlich sind und deshalb doppelt soviele Zeichen übertragen werden müssen. Außerdem konvertiert "split nur in einen Text-Array. Dann sind wieder Umwandlungen in die Zahlen 0 und 1 notwendig.

Bisher laufen die Atmegas mit 10 MHz. Wenn ich auf 16 MHz umrüste, wird das Flackern geringer werden.

Seht Ihr eine Möglichkeit, das ganze per Software schneller zu machen?

Ich danke für jeden Hinweis.

peterfido
23.06.2013, 13:54
Mein ungetesteter Ansatz:



$baud = 9600

Dim Pos As Byte
Dim Led(126) As Byte
Dim B As Byte


Do
If Ischarwaiting() = 1 Then
B = Inkey()
If B >= 48 Then
Incr Pos
Led(pos) = B And &B00000001 'Nur 0 und 1 erlaubt
Else 'chr13 oder chr10,...
Pos = 0
End If
If Pos >= 126 Then Pos = 0 'Überlauf verhindern
End If


Loop
End

for_ro
23.06.2013, 14:29
Hallo fritz,
wenn du die Programme von beiden Megas ändern kannst, dann würde ich dir raten, von den Strings wegzugehen.
Tatsächlich hast du ja nur 126 Bit zu übertragen, schickst aber 126 Byte. Das ist ein Faktor von 8 zuviel.
Sende doch 16 Byte-Werte (128 Bit). Empfange die Zeichen dann über den URXC Interrupt und werte sie sofort aus.
Dann bist du geschätzt um den Faktor 100 schneller. Dann wäre eine 8*16 Matrix besser.
Wenn du die Matrix nicht mehr ändern kannst, würde ich 18 Byte übertragen, mit jeweils 7 signifikanten Bits. Auch die kannst du dann sofort auswerten und in die Matrix ausgeben.

peterfido
23.06.2013, 14:44
Um Fehler abzufangen nutze ich immer 7Bits "Daten" und Bit 7 (das Achte) ist immer gesetzt. So kommt es nicht bei CHR(13) oder (10) zu Fehlinterpretationen.

Klebwax
23.06.2013, 16:52
Du stellst die falsche Frage:



Seht Ihr eine Möglichkeit, das ganze per Software schneller zu machen?

Deswegen werden dir die Anrworten nicht wirklich weiterhelfen.

Die richtige Frage ist:

wie setze ich einen Timerinterrupt auf, um das Multiplexen meiner Anzeige im Hintergrund und damit unabhängig von meiner Hauptschleife zu machen?

MfG Klebwax