Hi Leute, erstmal mein Vorhaben: Ich möchte einen ADC-Logger programmieren. Dieser soll jede Sekunde die Spannung an ADC0 messen und ans Dataflash übergeben und dieses auch wieder auslesen und an den UART übergeben. Nun zu meinem(n) Problem(en): Ich habe da so eine tolle Libary mit der das Ansteuern des Dataflashes schon wunderbar funktioniert. In dieser Libary gibt es einen Befehl mit dem ich mehrere Bytes auf einmal in den Buffer des Dataflashes übetragen kann. Allerdings möchte dieser Befehl einen Pointer auf einen AVR internen Buffer haben. Dazu muss ich sowas erstmal anlegen (glaub ich) nur wie? Und da eröffnet sich auch gleich noch ein Problem. Wenn ich die Daten nach z.B. einem Reset wieder auslesen möchte muss er ja noch wissen wieviele Messungen im Dataflash gespeichert sind. Aber wie und wo lege ich diese Information ab? Ich könnte jetzt meine bisher geschriebenen Sachen mit anhängen. Ich glaube nur dass das nicht helfen würde. Bin für jede Hilfe dankbar. Robin T.
Da gibt es mehrere Möglichkeiten. Du solltest aber immer im Hinterkopf behalten, dass die Flashspeicher nicht unendlich viele Schreibzyklen vertragen. Die einfachste Möglichkeit ist die, das du deine Daten nach dem Auslesen löscht. Bei einem Neustart suchst du dir deinen Anfangslesepunk und Anfangsschreibpunkt und verwaltest den Speicher als Ringpuffer. Wenn du die Daten Seitenweise an die UART ausgibst, dann ist das auch sehr schonen die den Flashspeicher und es treten so wenig wie möglich unnütze Schreibzyklen auf. Einen Puffer legt man im einfachsten Fall so an: static uint8_t puffer[10]; puffer ist dann dein Zeiger auf 10 Bytes RAM.
WichtigPoPichtig wrote: > Da gibt es mehrere Möglichkeiten. Du solltest aber immer im Hinterkopf > behalten, dass die Flashspeicher nicht unendlich viele Schreibzyklen > vertragen. Ja. Aber sooo oft benutze ich das Ding ja nu' auch nicht ;) > Die einfachste Möglichkeit ist die, das du deine Daten nach dem Auslesen > löscht. Bei einem Neustart suchst du dir deinen Anfangslesepunk und > Anfangsschreibpunkt und verwaltest den Speicher als Ringpuffer. Das hatte ich sowieso vor. > Wenn du die Daten Seitenweise an die UART ausgibst, dann ist das auch > sehr schonen die den Flashspeicher und es treten so wenig wie möglich > unnütze Schreibzyklen auf. Würde ich dann so machen. > Einen Puffer legt man im einfachsten Fall so an: > > static uint8_t puffer[10]; > > puffer ist dann dein Zeiger auf 10 Bytes RAM. Hab ich jetzt mal gemacht. Aber wie kann ich jetzt einen Pointer auf diesen Puffer machen? Also dass auf jedes Array im puffer ein pointer zeigt. Damit der Befehl aus der Dataflash Libary auch den Inhalt von jedem Array von dem puffer ins Dataflash schreiben kann? Die Befehlsbeschreibung sieht übrigens so aus:
1 | /*****************************************************************************
|
2 | *
|
3 | * Function name : Buffer_Write_Str
|
4 | *
|
5 | * Returns : None
|
6 | *
|
7 | * Parameters : BufferNo -> Decides usage of either buffer 1 or 2
|
8 | * IntPageAdr -> Internal page address
|
9 | * No_of_bytes -> Number of bytes to be written
|
10 | * *BufferPtr -> address of buffer to be used for copy of bytes
|
11 | * from AVR buffer to dataflash buffer 1 (or 2)
|
12 | *
|
13 | * Purpose : Copies one or more bytes to one of the dataflash
|
14 | * internal SRAM buffers from AVR SRAM buffer
|
15 | * pointed to by *BufferPtr
|
16 | *
|
17 | ******************************************************************************/
|
Robin T.
Ach die AT45-Teile von Atmel, nehme ich mal an. Mit der Funktion schreibst du nur ins FLASH-SRAM. Die Daten müssen dann noch ins eigentliche Flash. Wenn z.B. deine Flash-Page noch etwas Speicher frei hat, kannst du die ins FLASH-SRAM lesen, deine Daten vom AVR-SRAM in das FLASH-SRAM schreiben (diese Funktion) und dann das FLASH-SRAM ins eigentliche FLASH schreiben. In der DOKU zu den ICs gibt es eine Grafik die das etwas besser erklärt. Der Vorteil der FLASH-Speicher ist ganz klar der nicht benötigte Speicher in der CPU.
WichtigPoPichtig wrote: > Ach die AT45-Teile von Atmel, nehme ich mal an. Mit der Funktion > schreibst du nur ins FLASH-SRAM. Die Daten müssen dann noch ins > eigentliche Flash. Wenn z.B. deine Flash-Page noch etwas Speicher frei > hat, kannst du die ins FLASH-SRAM lesen, deine Daten vom AVR-SRAM in das > FLASH-SRAM schreiben (diese Funktion) und dann das FLASH-SRAM ins > eigentliche FLASH schreiben. In der DOKU zu den ICs gibt es eine Grafik > die das etwas besser erklärt. Der Vorteil der FLASH-Speicher ist ganz > klar der nicht benötigte Speicher in der CPU. Ich weiß :) Da ist noch eine Funktion mit der der Buffer ans richtige Flash übergeben wird. Aber da das tadellos funktioniert hab ichs nicht erwähnt.
> Aber wie kann ich jetzt einen Pointer auf diesen Puffer machen? puffer ist der Pointer. > Also dass auf jedes Array im puffer ein pointer zeigt. Hä? Der Puffer ist ein einziges Array. Was meinst du also mit "jedes Array im puffer"?
Stefan Ernst wrote: >> Also dass auf jedes Array im puffer ein pointer zeigt. > > Hä? Der Puffer ist ein einziges Array. Was meinst du also mit "jedes > Array im puffer"? Sry. Blöd artikuliert ;) Ich meine auf jede Stelle im Array also Puffer[0], Puffer[1],... Robin T.
Ich hänge jetzt mal meinen Quelltext an. Er funktioniert zwar kein bisschen aber dann ist es leicher über die Fehler zu diskutieren. Habe ihn auch etwas Kommentiert. Robin T.
Troetoe wrote: > Lern doch erstmal, einen PC zu programmieren. Will aber keine PC's programmieren ;) Mal davon abgesehen beherrsche ich die meisten Grundlagen nur eben noch nicht alle. Habe noch nie etwas mit Pointern gemacht. Was aber nicht heißt dass ich nicht programmieren kann oder überhaupt keine Grundlagen kann. > Du kannst es natürlich auch bleiben lassen. Ich glaube nur dass das > nicht helfen würde. Bin aber auch nicht sonderlich interessiert, auf > solche unqualifizierten Fragen weitere Antworten zu geben. Hmm. Ok. Deiner Meinung nach also unqualifizierte Fragen. Aber "weitere Antorten"? Habe noch keine "qualifizierte" Antwort von dir bekommen!
>Ich meine auf jede Stelle im Array also Puffer[0], Puffer[1],...
Welchen Puffer meinst du jetzt?
Den im Flash oder den im internen SRAM?
STK500-Besitzer wrote: > Welchen Puffer meinst du jetzt? > Den im Flash oder den im internen SRAM? Den im internen SRAM.
Robin Tönniges wrote:
> Ich meine auf jede Stelle im Array also Puffer[0], Puffer[1],...
Ein Pointer auf Puffer[0] ist "&Puffer[0]" (alternativ "Puffer"),
auf Puffer[1] ist "&Puffer[1]" (alternativ "Puffer + 1"),
...
Etwas C-Lektüre zum Kapitel Arrays und Pointer würden nicht schaden, würde ich behaupten.
Simon K. wrote: > Etwas C-Lektüre zum Kapitel Arrays und Pointer würden nicht schaden, > würde ich behaupten. Da hast du wohl recht. Bzw. Arrays verstehe ich. Nur mit dem Pointern haperts noch ;) Und ich glaube ich muss die Features von meinem ADC-Logger etwas runterschraiben. Sonst wirds nichts. Einen ganz einfachen hab ich schon gemacht. Der hat einfach die Spannung gelesen und direkt auf den UART ausgegeben. Aber diesmal sollte es ein Logger sein. Und weil da so ein nettes Dataflash aufm Board ist dachte ich mir das nehme ich. Aber ich werd das schon irgendwie hinbekommen. War mit den vorherigen Sachen auch so. Danke für eure Mühen.
Toeroe Toeroe wrote: > Also wirklich: lern erstmal programmieren und kümmere dich später um > AVRs. In deinem eigenen Interesse und im Interesse aller Forumsleser, > die nicht weiter an deinen Fragen interessiert sind. Wenn du und andere nicht an meinen Fragen interresiert sind brauchen sie sie ja nicht zu lesen Augenroll.
Toeroe Toeroe wrote:
> ...
So hart würde ich es jetzt nicht ausdrücken. Er sollte sich halt nur
noch mal etwas zu Pointern in C durchlesen. Glücklicherweise findet man
dazu genug im Internetz, sodass er jetzt nicht blöd dasteht und nix mehr
zu tun hat, bis er an ein C-Buch gekommen ist o.ä.
Trotzdem stimmt es aber: Auf dem PC lässt sich so etwas um einiges
leichter ausprobieren und debuggen.
Troeteroetoetoe wrote:
>"Ich bin supertoller Programmierprofi.
Immer dieses "Fliege zum Elefanten" gemache *Augenroll(tut schon langsam
weh)*
Hier haben am WE wohl einige keine/(n) abbekommen ... static uint16_t pBuffer[60]; pBuffer ist der Pointer. Indexieren kannst du den über pBuffer[x] wobei x deine Indexnummer ist.
Stefan wrote:
> Bei Robin ist das aber ein Dauerzustand.
Mal im Ernst woher willst du das wissen?
Ich schreibe so selten mal eine Frage hier auf weil ich das wirklich nur
im äußersten Notfall mache wenn ich auch nach längerem Probieren und
suchen nicht weiterkomme. Das hat nicht zuletzt mit meiner
Schreibfaulheit zu tun. Und wenn ich etwas weniger schreiben würde heißt
es nur: "Nenn Details sonst kann man dir nicht helfen...".
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.