- LiFePO4 Speicher Test         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 17

Thema: FIFO Ringbuffer

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    19.02.2005
    Beiträge
    7

    FIFO Ringbuffer

    Anzeige

    Praxistest und DIY Projekte
    Hallo zusammen ich hab folgendes Problem:

    Also ich habe ein CCS Compiler mit dem PIC 18F452 und ich brauche für diesen einen FIFO ich weiss aber nicht wie ich diesen realisieren muss. Also als erstes wüsste ich gerne ob der irgend wie Hardware mässig in einem PIC integrierrt ist oder man den rein Software mässig realisiert?
    Ich brauche einen Struct oder ein Variabelnfeld der ein Zuganscode(dem Zugangscode der max. int16 ist ) mit folgenden Daten verknüpft: dem Datum und der Zeit verknüpft.


    Das Datum und die Zeit werden mit diesem void ausgelesen :

    Code:
    void rtc_get_date(BYTE& day, BYTE& mth, BYTE& year, BYTE& dow) //Void

    Code:
    
    rtc_get_date(day,mth,year,dow)  //Das ist die funktion fürs auslesen 
    
    und die Zeit mit: 
    
    
    
    void rtc_get_time(BYTE& hr, BYTE& min, BYTE& sec)    // Void 
    
    rtc_get_time(hr,min,sec)  // Funktion für die Zeit
    So und dann noch ein Bit ob dieser Benutzer einen Alarm ausgelöst hat.

    Dann sollten die letzten 50 Benutzer über RS232 ausgeben werden etwa so


    Benutzer:..................Datum:................. ...Zeit:..................... Alarm:
    -----------------------------------------------------------------------------------
    98457998................16.05.2005.............17. 30 Uhr..............Nein
    45235345................16.05.2005.............17. 00 Uhr..............Nein
    34523452................14.05.2005.............12. 30 Uhr..............JA
    32454567................13.05.2005.............09. 30 Uhr..............Nein


    Also so ungefähr sollte das Aussehen kann mir da jemand weiterhelfen? Hab schon n paar theaders gelesen aber bin noch nicht so ganz schlau draus geworden.

    Gruss Michael

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    08.10.2004
    Ort
    ferd. Waldmüllerg. 7/2
    Alter
    39
    Beiträge
    456
    Also, ich weiß nicht ganz, was du mit FIFO meinst (auch google hat nicht wirklich etwas ausgespuckt...). Ich schätz mal, es ist ein Sicherheitssystem (oder etwas in der Art).
    Wenn du in CCS arbeitest, kannst du Structs erstellen und musst dich nicht mit dem Assembler herumschlagen. Dann erstellst du ein Array mit 50 solchen Structuren und füllst diese auf (für eine Structur brauchst du 9 Bytes + 1 bit, also werden es ~450 Bytes all in all; vielleicht musst die das Array spalten, damit es in die Memory-Banken passen). Der PIC18F452 verfügt über einen RS232-Schnittstelle, über welchen du:

    a) Einfach die Daten, getrennt durch ein ;/#/etc. an den PC schickst, der dann diese Daten schön ausgibt.
    b) die ganze Tabelle schön ausgibt indem du errechnest, wie viele Punkte, Striche, etc. du brauchst.

    Bei einem Frequenz von 40MHz/4 müsste diese Errechnung kein Problem sein.

    Leider hab ich noch nie mit dem CCS gearbeitet (ich mach mir nicht die Mühe, die spezifischen Befehle zu erlernen, wenn das Demo schon nach 30 Tagen abläuft und ich ca. die Hälfte der Zeit mit Lernen herumschlage).

    MfG
    Mobius

    P.S.: Also, das Thema wäre im PIC-Forum besser aufgehoben, aber egal ^^

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    17.10.2004
    Ort
    PB
    Beiträge
    123
    Hallo!

    Ich hab zwar von PICs keine Ahnung, dafür weiß ich was FIFO bedeutet!
    Und zwar ist FIFO eine Abkürzung für First In, First Out.
    Wenn man also zum Beispiel ein Byte an erster Stelle im Speicher speichert, wird man dieses Byte auch als erstes wieder auslesen müssen.

    Grüße,
    Jonas

  4. #4
    Gast
    FIFO heisst first in first out. Das gibt ein Protokoll in dem immer die letzten 50 User die sich angemeldet haben speichert. Das heisst also wenn sich nun 50 Leute angemeldet haben kommt der 51 an die erste stelle und alle rutschen eins nach, wobei der sich als 1 angemeldet hat rausfliegt. Man kann das natürlich mit einem überschreiben machen und alle werte im speicher um eine Position überschreiben, was jedoch hohe Rechenleistung benötigt. Die elegantere Lösung ist da der FIFO auch Ringbuffer genannt der Speichert das ganze in einem Virtullen Ring der mit 2 Zeigern die erste und letze Position angibt ... nur ich weiss nicht wie ich das im C umsetzen muss und wie dann die ganze Liste über RS232 ausgeben. Das ist mein Hauptproblem.

    PIC Forum hmm ja das wärs wohl hab ich irgendwie übersenen

  5. #5
    Gast
    Ok Jonas du warst wohl schneller

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    27.08.2004
    Beiträge
    159
    wie wärs mit nem array [of structs, in denen deine Daten drinne stehen].
    Dann noch ne int: pointer. diese zeigt immer auf das zuletzteingefügte Array-field, wenn neue daten reinsollen, pointer +1 und diese arrayfeld nehmen, falls pointer = 50 pointer = 0, fertig!
    Ausgabe:
    wenn du den pointer (oder besser einen anderen, da bleibst konsistenter) einmal durchwandern lässt von "aktueller pointer" +1 bis aktueller pointer (mit dem Übergang bei pointer = 50 => pointer = 0, werden alle DAten in Eingabereihenfolge ausgegeben.
    Soviel zum Ringpuffer, zur seriellen Ausgabe kann ich dir nciht viel sagen.

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    08.10.2004
    Ort
    ferd. Waldmüllerg. 7/2
    Alter
    39
    Beiträge
    456
    falls pointer = 50 pointer = 0, fertig
    Naja, dann hast das Problem, dass der neuste Eintrag plötzlich an erster Stelle steht. Eleganter ist:
    Code:
    if(pointer==50)
    for(int i=0;i<50;i++)
    {
           array[i]=array[i+1];
    }
    array[50]=new_val;
    Wir schieben alle Einträge einz nach unten und ersetzten den letzten Eintrag mit dem neuen Wert.

    @Ringbuffer: Achso... Naja, man lernt nie aus ... Ist ein interessant Konzept. Also, Hardwaremäßig ist in einem PIC sowas net verankert. Bleibt nur die softwaremäßige Lösung. Ich hab mal ein wenig gesucht. Vielleicht hilft dir diese Seite ein wenig weiter... Eigentlich ist es nichts anderes, als du zwei Laufvariablen hast, die durch das Array laufen (einer liest, der andere schreibt). Wenn die schreib/lese-Variable den maximalen Wert erreicht wird sie auf null decrementiert und sie läuft wieder von forme los.
    Dabei hast du das oben beschriebene Problem, dass plötzlich der neuste Eintrag am Anfang steht (meist kein Problem, aber es macht einige nervende Sort-Probleme). Ansonsten köntest du eine 3. Variable einführen, die den ältesten Eintrag enthält. Wenn die Schreibe-Variable überläuft, musst du diese oldest-Var um eins (1) incrementieren und immer im Kopf behalten, dass, wenn du die Sachen ausliest, immer bei dieser anzufangen.


    MfG
    Mobius

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    19.02.2005
    Beiträge
    7
    Hat ein Arry nicht in jeder Zeile gleichviele Zeichen? Weil ich brauch ja für den Zuganscode ca. 8 Zeichen, für den Tag,Monat, und Wochen Tag 2 Zeichen u.s.w. es wäre ja Speicherverschwendung wenn ich dann für alle 8 Zeichen reserviere. Der Pointer wäre dann ja trozdem ein INT?

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    27.08.2004
    Beiträge
    159
    @mobius:
    und was soll dran schlimm sein, wenn am Anfang der zuletzt eingefügte Eintrag steht?
    Bei deinem Ansatz macht man für Anzahl der Elemente > 50, in jedem Einfügeschritt 50 Arrayzugriffe, was vlt etwas aufwendig ist.
    Sortieren muss man ja nichts, da man sich die Daten ja wie oben von mir beschrieben in Einfügereihenfolge ausgeben lassen kann.
    @michi
    Also du hast ein struct in dem es eben die felder (zugangscode, datum, alarm) gibt. Von diesen Structs ist in jedem Arrayfeld eins gespeichert.
    Der Pointer gibt die Nummer vom Arrayfeld an.
    Bsp: Arraygröße 3
    -volles Array
    pointer=3
    A[0]=(12345,01.03.2005,no)
    A[1]=(23456,03.04.2005,yes)
    A[2]=(34567,04.04.2005,no)
    -neues Element hinzufügen:
    pointer erhöhen => pointer = 3
    pointer = Arraygröße!!! => pointer = 0
    Array nach einfügen in A[0]
    A[0]=(45678,01.05.2005,yes)
    A[1]=(23456,03.04.2005,yes)
    A[2]=(34567,04.04.2005,no)
    Prinzip verstanden?

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    19.02.2005
    Beiträge
    7
    Ja prinzip ist klar danke nur versteh ich noch nicht ganz wie ich das Array/Struct definieren muss. Also das Struct ist das selbe wie Array?

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad