Forum: Mikrocontroller und Digitale Elektronik MPLAB X IDE Frage C code Programmierung


von Daniel (Gast)


Angehängte Dateien:

Lesenswert?

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.

von OMG (Gast)


Lesenswert?

Daniel schrieb:
> void main(void) ......

Was bitte ist an dem Hinweis

"Wichtige Regeln - erst lesen, dann posten!"

nicht zu verstehen?

von Wolfgang (Gast)


Lesenswert?

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?

von Daniel (Gast)


Lesenswert?

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.

von Gerhard (sgssn)


Lesenswert?

void FLASH_WriteByte(uint32_t flashAddr, uint8_t *flashRdBufPtr, uint8_t 
byte)

..
uint8_t flashadr;

FLASH_WriteByte( 182, &flashadr, 4 );

oder so

Gruß

von Wolfgang (Gast)


Lesenswert?

Daniel schrieb:
> uint8_t *flashRdBufPtr keinen plan :-(

Dann ist vielleicht ganz dringend das Kapitel über Pointer aus einem 
C-Grundlagenbuch angesagt ;-)

von Danny (Gast)


Lesenswert?

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 🙈

von Danny (Gast)


Lesenswert?

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.

von Andreas B. (andreas-ab)


Lesenswert?

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