Forum: Mikrocontroller und Digitale Elektronik Puffer im Pic


von Max (Gast)


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

von Oliver (Gast)


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

von Max (Gast)


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

von Oliver (Gast)


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

von Peter D. (peda)


Angehängte Dateien:

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

von thkaiser (Gast)


Lesenswert?

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

von crazy horse (Gast)


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.

von thkaiser (Gast)


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... ;-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.