- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 8 von 8

Thema: Datenwort über serielle Schnittstelle einlesen und in EEPROM

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    18.08.2005
    Beiträge
    86

    Datenwort über serielle Schnittstelle einlesen und in EEPROM

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo zusammen,

    ich habe ein Problem und bin mir nicht so recht sicher, wie man das lösen kann. Möglicherweise könnt ihr mir ein paar Tips geben.

    Ich habe ein Programm geschrieben, welches ein "Datenwort" über die serielle Schnittstelle ausgeben soll. Datenwort habe ich in Anführungszeichen geschrieben, da es in wirklichkeit ein Stringwort ist, welches jedoch aus Einzen und Nullern besteht. Also "001100101010...."

    Nun will ich dieses (nicht staunen) 8000 "Bit" lange Datenwort in den Controller bekommen (mega64) und zwar immer in 8er Päckchen.
    Der String soll also jeweils in einzelne Bytes aufgeteilt werden. Jedes Byte soll in eine Adresse des EEPROMS gespeichert werden.

    Wenn als das String-"Datenwort" wie folgt anfängt: "00011101010101010101010..."

    dann soll in Adresse 00h folgendes stehen: 00011101
    In Adresse 01h dann: 01010101
    usw.

    Die Frage ist nun, wie verbinde ich den Mega64 mit der seriellen Schnittstelle und vor allem, wie werte ich nun diesen langen String aus und teile ihn jeweils auf 8-Bit pro Adresse auf ?

    Es wäre nett, wenn ihr vielleicht einen Code hättet, der sowas macht, also einen 8000 langen Zeichenstring bestehend aus 1 und 0 in jeweils 8-Bit pro Adresse aufteilt.

    Ich hoffe, ihr habt verstanden um was es geht und könnt mir damit helfen.

    Danke schon mal im voraus.

    Grüße

    popi

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    30.12.2005
    Ort
    Tann / ZH
    Alter
    67
    Beiträge
    264
    Salü popi,

    was für eine Schaltung hast Du ?
    Willst Du die Daten ins interne EEPROM oder in ein externes
    EEPROM schreiben ?
    Ist das dein erstes Programm ?
    Willst Du es in C schreiben ?
    Was willst Du genau erreichen ?
    Was für kenntnisse in C hast Du ?
    Könntest Du mal dein Programm hier posten ?

    MfG
    Ruediw

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.11.2005
    Alter
    48
    Beiträge
    1.146
    Das ist gar nicht so schwer.
    Da Du sowieso jedes Zeichen einzeln empfängst und im Empfangs-Interrupt auswerten musst, brauchst Du nur in einer statischen Variable mitzuzählen, wie viele Zeichen schon angekommen sind.

    Ich könnte mir die Interrupt-Routine in etwa so vorstellen:

    Code:
    signal (SIG_UART0_RECV)
    {
    static unsigned char count, Data;
    unsigned char DataIn;
    
    
    DataIn = UDR0;
    
    if (count > 7)
    { 
    SaveToEeprom(Data);
    count = 0;
    Data = 0;
    }
    
    if(DataIn == "1")
    Data |= 1 << (7-count);
    
    count++;
    }
    Gruß,
    askazo

  4. #4
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Man soll einem Kollgen nix dreinreden, aber so bleibt dir das letzte Byte irgendwie über. Vorschlag: vorher zählen
    Code:
    DataIn = UDR0 & 0x01;  // der rest ist schrott
    count++; 
    if (count > 7) 
    { 
         SaveToEeprom(Data); 
         count = 0; 
         Data = 0; 
    } 
    Data <<=1;
    Data |= DataIn;
    }
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.11.2005
    Alter
    48
    Beiträge
    1.146
    Nein, da bleibt keins übrig. count läuft von 0 bis 7, also 8 Schritte... Kannst gerne noch mal durchrechnen

    Aber
    Code:
    DataIn = UDR0 & 0x01;  // der rest ist schrott
    ist Blödsinn. Er will Ascii-Zeichen einlesen, und da braucht man das ganze Byte, nicht nur ein Bit...

    askazo

  6. #6
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Lies dir den Wunsch vom Popi nochmal durch, der will Bytes mit 8 Bit draus machen. Msb to lsb. Und von 0x30 und 0x31 ist daher nur der 2^^0 interessant.
    Übrigbleiben: Da, dann probier mal. 8 x 0/1 kommt rein--> nu ?

    Ich brauch aber nix reden, mir wär es auch übrig geblieben
    Also, ein Neues
    Code:
    DataIn = UDR0 & 0x01;  // der rest ist schrott 
    Data <<=1; 
    Data |= DataIn; 
    count++; 
    if (count > 7) 
    { 
         SaveToEeprom(Data); 
         count = 0; 
         Data = 0; 
    } 
    }
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.11.2005
    Alter
    48
    Beiträge
    1.146
    Ich gebe mich geschlagen, Du hast in beiden Fällen Recht...
    Über die Ascii-Werte von 0 und 1 hatte ich nicht nachgedacht. Ist eine elegante Lösung, sich die eine if-Abfrage zu sparen.

    Und wenn man wie ich die if (count > 7) Abfrage an den Anfang stellt, geht tatsächlich das letzte von den 1000 Bytes verloren.

    Ist mir jetzt aber peinlich, das zuzugeben...

    askazo

  8. #8
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    @askazo: Ich bitte dich, tu' dir nix an. Was glaubst du, was ich in den Jahren schon für Unfug erzählt habe
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

Berechtigungen

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

LiFePO4 Speicher Test