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
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
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
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
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.