www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Puffer im Pic


Autor: Max (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Kann mir jemand sagen wie ich mit einem PIC einen Puffer von ein par 
byte im Ram schreibe und dann mit Interrupts auslese...?

Das soll aber parallel ablaufen, d.h. wenn die Haelfte des Puffers voll 
ist soll mit dem Auslesen begonnen werden und ab diesem Zeitpunkt beide 
Prozesse gleichzeitig ausgefuehrt werden..

Wie sollte man so etwas am besten machen??
Ideen, Codes,Infos, Links....

(PS: es sollen wirklich nur ein par Byte im Ram verwendet werden, nicht 
EEPROM etc.)

Danke im Vorraus
Mfg

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Max,
am Besten baust Du Dir einen Ringspeicher auf. Den Speicher verwaltest 
Du als Array.


Pseudocode:

// Dein Speicher; erster Eintrag hat Index 0, letzter Eintrag hat
// Index BUFSIZE-1
Byte Speicher[BUFSIZE]

// Initialisierung. Index auf Eintrag im Array
Schreibzeiger = 1;
Lesezeiger    = 0;

Schreiben in den Speicher:

ENTER_CRITICAL_SECTION
 if (Schreibzeiger != Lesezeiger)
 {
    Speicher[Schreibzeiger] = Eintrag;
    Schreibzeiger = (Schreibzeiger+1) modulo BUFSIZE;
 }
 else Speicher voll!
LEAVE_CRITICAL_SECTION


Lesen aus dem Speicher:
ENTER_CRITICAL_SECTION
 if (Lesezeiger+1 != Schreibzeiger)
 {
   Wert = Speicher[Lesezeiger+1];
   Lesezeiger= (Lesezeiger+1) modulo BUFSIZE;
 } else nix drin im Speicher
LEAVE_CRITICAL_SECTION


Bemerkung:
ENTER_CRITICAL_SECTION: Sperren von Interrupts
LEAVE_CRITICAL_SECTION: Freigeben von Interrupts

modulo: Angenommen der Speicher besteht aus 4 Byte, dann bewirkt der 
Modulo-Zähler folgendes: 0 1 2 3 0 1 2 3 0 1 2 3 etc.


Wenn noch was unklar sein sollte, melde Dich.

Grüße
Oliver

Autor: Max (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oliver Danke fuer Deinen Beitrag!

Es gibt da nur ein kleines Problem->Ich soll das ganze in Assembler 
programmieren!!!!

Und da hat man auch nur einen Zeiger zur verfuegung...
Dieser Puffer soll zur Kompensation von Frequenzunterschieden dienen..
Die Daten kommen herein und ich soll sie mit einem vorgegebenen Takt an 
einen Ausgang schreiben...

Danke trotzdem

Mfg
Max

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wieso nur einen Zeiger zur Verfügung?
Du kannst die Zeiger in Registern halten oder auch im Ram des 
Controllers.

Das Auslesen kannst Du ja über einen Timerinterrupt ansteuern.

Das größte Problem, daß Du hast, ist wohl eher der PIC.
Nimm lieber einen AVR, z.B. den 8515. Da hast Du 32 Register und etwa 
600 Byte RAM.

Grüße
Oliver

Autor: Peter Dannegger (peda)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Das Hauptproblem dürfte sein, daß der PIC für sowas eine sehr 
komplizierte Architektur hat.
Du hast nur ein Pointerregister und der RAM ist in Bänke unterteilt.

Beim 8051 ist das viel einfacher, da hast Du 8 Pointerregister.

Oder Du programmierst in C, da nimmt Dir der Compiler die Arbeit ab, die 
Pointer auszutauschen.

Anbei ein Beispiel für den 8051.

Die Routine uart_poll() kann natürlich auch als Interrupt verwendet 
werden, kbhit() dient zum Testen, ob mindestens 1 Byte im Puffer ist und 
mit getchar() kann dann das Byte abgeholt werden.


Peter

Autor: thkaiser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der 8051 hat 8 Pointerregister? Ich kenne nur den DPTR... Hab ich was 
verpaßt?

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mov A, @Ri
mov @Ri, A
sind die Befehle für den internen RAM, indirekt adressiert.
geht auch mit movx, allerdings nur mit 8bit-Adresse. Welche High-Adresse 
verwendet wird, weiß ich nicht mehr aus dem Kopf.

Autor: thkaiser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmpf - ich glaub, ich bin schon Atmel-geschädigt, muß unbedingt mein 
51er Board mal wieder rauskramen - Sorry fürs OT und Danke für die 
Erleuchtung... ;-)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.