Grüße, ich probiere gerade den EEPROM im PIC18F4580 zu lesen und schreiben mit einer unit32_t Zahl void main(void) { . uint32_t DistTotal; // total mileage counter uint8_t address = 0xE5; // adress 229 DistTotal = FLASH_ReadByte(address); . while(1) . if(TimerEEPROM ==30) { TimerEEPROM =0; FLASH_WriteByte(address, DistTotal); } . main.c:282:35: error: (187) too few function arguments ist die Fehlermeldung, welche ich bekommen für die FLASH_WriteByte Funktion. Hat jemand mehr Plan als ich mit C und kann mir hier bitte sagen, was ich wie machen muss. Hab mal die MCC generierte Vorlage angehangen. Vielen Dank.
Daniel schrieb: > void main(void) ...... Was bitte ist an dem Hinweis "Wichtige Regeln - erst lesen, dann posten!" nicht zu verstehen?
Daniel schrieb: > ... too few function arguments ... Was ist an dieser Fehlermeldung so schwer zu verstehen? Hast du dir mal die Deklaration von FLASH_WriteByte() angesehen?
Wolfgang schrieb: > Daniel schrieb: >> ... too few function arguments ... > > Was ist an dieser Fehlermeldung so schwer zu verstehen? > Hast du dir mal die Deklaration von FLASH_WriteByte() angesehen? Grüße, ja hab ich.. Da müssen irgendwie drei Sachen rein uint32_t flashAddr hm? Uint32_t ? Adresse, dachte der Pic hat nur 1024 Plätze The 10-bit range of the pair can address a memory range of 1024 bytes (00h to 3FFh). uint8_t *flashRdBufPtr keinen plan :-( uint8_t byte für meine uint32_t Zahl müsste da 4 rein, richtig? Bin über jede Hilfe/ Lösung dankbar. Danke.
void FLASH_WriteByte(uint32_t flashAddr, uint8_t *flashRdBufPtr, uint8_t byte) .. uint8_t flashadr; FLASH_WriteByte( 182, &flashadr, 4 ); oder so Gruß
Daniel schrieb: > uint8_t *flashRdBufPtr keinen plan :-( Dann ist vielleicht ganz dringend das Kapitel über Pointer aus einem C-Grundlagenbuch angesagt ;-)
Wolfgang schrieb: > Daniel schrieb: > >> uint8_t *flashRdBufPtr keinen plan :-( > > Dann ist vielleicht ganz dringend das Kapitel über Pointer aus einem > C-Grundlagenbuch angesagt ;-) Ja, scheinbar. Zeiger gabs bei mir bisher nur auf der Uhr 🙈
Hallo zusammen, vielleicht ist ja jemand so nett und kann mir die erforderlichen 3 Inhalte in der Klammer mal für diesen Fall näher erläutern? Danke.
Sorry wenn es wie eine Widerholung klingt, aber das Lernen einer Programmiersprache können wir Dir nicht abnehmen. Also wie schon erwähnt, am besten mal ein Grundlagenbuch C durchackern und mit kleinen Beispielen anfangen. Es gibt einige Fallstricke, vorallem wenn man das mit den Pointern nicht verstanden hat. Das kannst du alles auch auf dem PC üben, da kann man auch viel einfacher debuggen. Wenn du die C-Grundlagen verstanden hast, tust du dir mit den µC leichter, und kannst dich auf die eigentlichen Probleme konzentrieren. Ich befürchte es hilft dir nicht viel weiter aber hier noch Hinweise zu deinem Problem. Der Source-Code hat zwar keinen Kommentar aber schau Dir einfach mal an, was genau in der Funktion passiert.
1 | void FLASH_WriteByte(uint32_t flashAddr, uint8_t *flashRdBufPtr, uint8_t byte) |
2 | {
|
3 | uint32_t blockStartAddr = (uint32_t)(flashAddr & ((END_FLASH-1) ^ (ERASE_FLASH_BLOCKSIZE-1))); |
4 | uint8_t offset = (uint8_t)(flashAddr & (ERASE_FLASH_BLOCKSIZE-1)); |
5 | uint8_t i; |
6 | |
7 | // Entire row will be erased, read and save the existing data
|
8 | for (i=0; i<ERASE_FLASH_BLOCKSIZE; i++) |
9 | {
|
10 | flashRdBufPtr[i] = FLASH_ReadByte((blockStartAddr+i)); |
11 | }
|
12 | |
13 | // Load byte at offset
|
14 | flashRdBufPtr[offset] = byte; |
15 | |
16 | // Writes buffer contents to current block
|
17 | FLASH_WriteBlock(blockStartAddr, flashRdBufPtr); |
18 | }
|
Der Name gibt schon mal einen Hinweis: es soll genau ein Byte in den Flash-Speicher geschrieben werden! Bei einem Flash-Speicher geht aber nicht so einfach sondern es kann immer nur ein kompletter Block geschrieben werden. Also wird zuerst die Startadresse des zugehörigen Blocks berechnet (Zeile 3). Dann wird in der for() Schleife der ganzen Block in den (von außen gesetzen) Zwischenspeicher kopiert (Zeile 8..11) und schließlich das zu schreibende Byte an die richtige Adresse im Zwischenpuffer eingetragen (Zeile 14). Der so vorbereite Zwischenspeicher wird dann quasi in einem Rutsch ins Flash geschrieben (Zeile 17). Die drei Argumente der FLASH_WriteByte() Funktion sind also so zu verstehen:
1 | flashAddr = Zieladresse im Flash, |
2 | *flashRdBufPtr = Zeiger auf den Zwischenspeicher von außerhalb |
3 | byte = das zu schreibende einzelne Byte |
Wenn du die Funktion benutzen willst, musst du also einen Zwischenspeicher zur Verfügung stellen, damit die FLASH_WriteByte() Funktion den Block auslesen und irgendwo hin kopieren kann. Der muss natürlich so groß sein, dass auch ein Block ERASE_FLASH_BLOCKSIZE reinpasst. Und zweitens schreibt die Funktion genau ein Byte in den Flash-Speicher. Daher musst du aus deiner 32 Bit Variablen die einzelnen Bytes extrahieren und dann die Funktion viermal aufrufen. Ich hab das hier nicht getestet aber ungefähr so sollte es gehen, Buffer anlegen, und in einer Schleife die vier Bytes rauspopeln und die Funktion viermal aufrufen.
1 | uint32_t flash_addr = 0xE5; // address in flash memory |
2 | uint_8 block_buf[ERASE_FLASH_BLOCKSIZE]; // buffer for a single block |
3 | uint_8 ic=0; // counter |
4 | |
5 | ...
|
6 | |
7 | for(ic=0; ic<4; ic++) { |
8 | uint_8 idx = ic*8; |
9 | uint_8 wr_byte = (unit_8) ((DistTotal >> idx) & 0xff); |
10 | FLASH_WriteByte(flash_addr+ic, block_buf, wr_byte); |
11 | }
|
Beim Auslesen des DistTotal Wertes aus dem Flash, musst du natürlich auch vier Bytes einzeln auslesen und dann wieder einem 32 Bit Wert verheiraten. Die komplette Geschichte ist halt nicht ganz so optimal weil beim Schreiben des 32 Bit Werts, der betreffende Block gleich viermal geflasht wird. Da wäre vielleicht eine Funktion FLASH_WriteUint32() analog zu FLASH_WriteByte() sinnvoll, die den Block nur einmal liest, alle vier Bytes einträgt und dann nur einmal den Flashspeicher quält. Also vielleicht auch darüber nachdenken wie oft du den Wert überhaupt speichern willst. Irgendwann legen die Flash Bausteine die Ohren an.
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.