- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 17 von 17

Thema: FIFO Ringbuffer

  1. #11
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    08.10.2004
    Ort
    ferd. Waldmüllerg. 7/2
    Alter
    39
    Beiträge
    456
    Anzeige

    Powerstation Test
    Naja, alle Elemente eines Arrays sind gleich groß, da kannst du nicht viel machen. Bei dem Zugangscode kannst du ein Byte in low und high teilen (d.h. ein Byte enthält dann 2 Zeichen des Zugangscodes), dann brauchst du "nur" 4 Bytes um den ganzen Code abzuspeichern.
    Beim Datum kannst du nicht viel sparen, außer, wenn du die low-Bytes des Jahres weglässt (also statt 2004 nur 04 abspeichern). Um diese 4 Bytes kommt man nicht umhin.
    Für die Zeit brauchst du 2 Bytes (Minute, Stunde).

    Das wären insgesammt 10 Bytes, bei 50 Einträgen ergiben sich 500 Bytes. In einem PIC18F452 hast du 1536 Bytes frei. Also nimmst du damit "nur" 1/3 des vorhandenen Speichers in Anspruch.

    naja, als Pointer würde ich die "Anfangs-" und "Endszeichen" nicht bezeichnen. Weil in C ein Pointer die Andresse einer Memoryblockes beinhaltet. Eher als Laufvariable.

    Naja, wie du in C eine Structur in ein Array haust:
    Code:
    #define MAXCOUNT 50
    
    struct DATA
    {
         char ID76;
         char ID54;
         char ID32;
         char ID10;
    
         char day;
         char month;
         char year;
    
         char hour;
         char minute;
    }data;
    
    data Daten[MAXCOUNT];
    MfG
    Mobius

  2. #12
    Neuer Benutzer Öfters hier
    Registriert seit
    19.02.2005
    Beiträge
    7
    ok noch eine andere Frage. Ich habe einen DTMF-Decoder der hat 4 Anschlüsse an denen der Wert angegeben wird und ein Controll anschluss der ist high wenn ein neuer Ton dedektiert wurde.

    also wird ein Ton detektiert z.B. die 1 dann sieht das so aus:

    Q4----Q3----Q2-----Q1----Std Taste
    -0------0-----0-------1------1-- 1
    -0------0-----1-------0------1-- 2
    ... bis
    -1------0-----1-------1------1-- *
    -1------1-----0-------0------1-- #

    Wie soll ich das Lösen wenn ich 4 Zahlen hintereinander so einlesen muss und dann zu einem INT (4 Stellen) zusammen setzen muss? Die # Taste soll als eingabe bestätigung gelten. Wie kann ich das lösen? habt ihr irgend welche vorschläge wie ich das Programmieren könnte in C?

    gruss michael

    PS: schon mal vielen Dank an die die mir bis her so weitergeholfen haben.

  3. #13
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    08.10.2004
    Ort
    ferd. Waldmüllerg. 7/2
    Alter
    39
    Beiträge
    456
    Also, ich nehm mal an, das Auslesen der Tasten ist kein Problem (also TRICx richtig setten, auslesen, etc.).

    Wenn du nun eine Zahl eingelesen hast, musst du deine vorherigen mit 10 multiplizieren und die neue Zahl hinzuaddieren (zum Beispiel, hast du in dein TR 2 eingegeben, dann sag ma 5:

    2

    2*10 = 20

    20+5 =25

    genau, wie es dein TR ausschreibt )

    Code:
    short alle_zahl=0;
    
    void addchar(char chara)
    {
         if(alle_zahl==0)
         {
                 alle_zahl=chara;
                 return;
         }
         alle_zahl=alle_zahl*10+chara;
    }
    Wenn du dann ein # bekommst (die "Codierung" dafür kennst du ja), musst du nur noch die Zahl in deinem Byte mit deinem Pincode (etc.) vergleichen.

    Hier habe ich absichtlich ein "short" (also 16 bit Variable) verwendet, weil die größe von ints von Compiler zu Compiler verschieden definiert wird (ich habe schon welche gesehen, die als int 16 bits genommen haben, aber auch einen, der 32 bits dafür reserviert hat).

    MfG
    Mobius

    P.S.: Was wird darauß, wenn ich fragen dürfte? Weil die Neugierde bringt mich langsam echt um. Ein System mit Zugangskontrolle und Zahlenschloss, schätz ich mal. ^_^

  4. #14
    Gast
    Natürlich also es gibt eine "intelligente" Türsteuerung. Also die Code eingabe erfolgt über die Tastatur des eigenen Handys man muss natürlich die Tastentöne einstellen aber praktisch jedes Handy hat diese DTMF Töne. Man hält das handy einfach vor das kleine Microphon und gibt den code ein. Es gibt einen Mastercode mit dem man neue Codes hinzufügen kann löschen und den RTC stellen. Geführt wird der Benutzer über einen Lautsprecher der Ihm anweisungen zum Bedienen gibt. Der Microcontroller steuert einen Sprachspeicher auf dem diese Anweisungen gespeichert sind. Der sprachspeicher wird entweder über das Microfon das ich auf der Platine plaziert hab oder über einen normalen audio eingang (Soundkarte CD Player oder was auch immer) gefüllt. Da jeder Benutzer einen eigenen Zugangscode haben soll können spezielle nachrichten/begrüssungen ausgegeben werden. Ach ja und eben die Liste mit der 50 Letzten Zugangscodes kann ja noch über RS232 ausgegeben werden. ICh hab jetzt noch überlegt direkt ein menü über RS232 auf den PC auszugeben, das man auch so über den PC (Hypertreminal) gesteuert werden kann, sprich codes hinzufügen und löschen. Nur meine programmierkenntnisse kommen langsam aber sicher an die grenze.

    Ich hab jetzt 2 Platinen fertigen lassen, wenn du interesse hast mit zumachen würd mich natürlich freuen.

    Gruss Michael

  5. #15
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    08.10.2004
    Ort
    ferd. Waldmüllerg. 7/2
    Alter
    39
    Beiträge
    456
    Hört sich echt interessant an, doch muss ich leider verneinen, auch wenn ich Lust hätte mitzuhelfen. Leider steht die Abi vor der Tür und alles ist stressig bis zum geht-nicht-mehr. Es ist jetzt schon echt knapp mit meinem Hobby und dem Büffeln, da wäre so ein Projekt leider keine Erlösung.

    MfG
    Mobius

  6. #16
    Gast
    Tja schade vieleicht hat sonst jemand interesse

  7. #17
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    17.01.2004
    Ort
    Erlangen, Bayern
    Alter
    42
    Beiträge
    253
    Meine Güte stellt euch doch nicht so an!
    Bei einem Ringbuffer werden Daten in einen Speicherbereich geschrieben, wobei während des Befüllens gleichzeitig auch ein Lesen erlaubt ist. Kritische Punkte stellen dabei der Randpunkt, das obere Ende des Speichers und das „Überholen“ des Auslesezeigers, sowie das Auslesen, über den Speicherrand dar. Erreicht der Schreibezeiger das Ende, muss am Anfang weitergeschrieben werden. Erreicht der Lesezeiger das Ende, muss eine zusammengesetzte Zeichenkette zurückgegeben werden. Überholt der Schreibzeiger den Lesezeiger, muss dieser auf den nächsten gültigen Eintrag weitergesetzt werden, bevor eingefüllt werden kann!
    Sowas in c zu schreiben stellt nun nicht wirklich ein Problem dar oder?!
    In deinem Fall würdest du halt fixe Blockgrössen nehmen, dann tust du dir auch beim Berechnen des Weitersetzens leichter. Der Speicher sollte nach Möglichkeit ein Vielfaches der Grösse der Struktur sein.
    Mit einem Array zu arbeiten ist die andere, meines Erachtens nicht so hübsche Methode, da du sonst so abhängig von der Struktur bist. Wenn du blanken Speicher nimmst kannst du im Prinzip alles Reinschreiben. Als Leseparameter einfach nur einen Datenblock mit Grösse rein und beim Lesen eben einen Block mit bestimmter Grösse rauslesen.
    ==> Wiederverwendbarkeit

    Noch eine Alternative ist:
    Du verwendest in deiner Struktur magic Cookies. Die kann man dann leicht im Speicher finden. Stichwort Überschreiben des Auslesezeigers..


    Gruss
    Michael

    PS: Gott war der Beitrag schon alt =)

Seite 2 von 2 ErsteErste 12

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress