- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 5 von 5

Thema: Suche Möglichkeit einer schnellen Konvertierung eines String´s in einen Byte-Array

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    14.09.2011
    Beiträge
    32

    Suche Möglichkeit einer schnellen Konvertierung eines String´s in einen Byte-Array

    Anzeige

    Praxistest und DIY Projekte
    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.

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2007
    Ort
    Berlin
    Alter
    53
    Beiträge
    765
    Mein ungetesteter Ansatz:

    Code:
    $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
    Wenn das Herz involviert ist, steht die Logik außen vor! \/

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    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.

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2007
    Ort
    Berlin
    Alter
    53
    Beiträge
    765
    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.
    Wenn das Herz involviert ist, steht die Logik außen vor! \/

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.03.2011
    Beiträge
    1.899
    Du stellst die falsche Frage:

    Zitat Zitat von #fritz# Beitrag anzeigen
    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
    Strom fließt auch durch krumme Drähte !

Ähnliche Themen

  1. Wie kann ich einen String "1-200" in ein Byte setzen?
    Von Typer im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 03.10.2012, 21:29
  2. Compact C: Konvertierung von Int nach String
    Von Fabian E. im Forum Robby RP6
    Antworten: 4
    Letzter Beitrag: 24.05.2010, 01:12
  3. Funktion um einen String Array zu leeren "loeschen"
    Von sato im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 8
    Letzter Beitrag: 16.06.2009, 13:32
  4. int Array in einen String wandeln
    Von Hotte Meyer im Forum C - Programmierung (GCC u.a.)
    Antworten: 6
    Letzter Beitrag: 28.12.2008, 12:45
  5. Serielle Übertragung eines Byte Array
    Von Peter_M im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 11.05.2006, 09:39

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress