Forum: Mikrocontroller und Digitale Elektronik PIC18F47Q43 - Schleife geht nicht


von Ingo S. (schicki)


Lesenswert?

Hallo Zusammen,

Ich habe einen PIC18F47Q43 mit einem ENC28J60 verbunden, funktioniert 
soweit. Die IDE ist die MPLAB IDE v6.20. Der C-Compiler der XC8 Version 
2.46.

Ich möchte ich die MAC-Adresse wie zuvor die IP-Adressen aus dem EEPROM 
auslesen. wenn ich die Speicher manuell nacheinander abfrage, dann geht 
das auch. sobald ich hier eine Schleife einsetze, ist diese immer in 
einer Endlosschleife.

1. manuelles Einlesen der MAC-Adresse, Code funktioniert
1
    // MAC-Adresse auslesen        
2
    MC.NW_MAC[0] = DATAEE_ReadByte(0xFA);
3
    MC.NW_MAC[1] = DATAEE_ReadByte(0xFB);
4
    MC.NW_MAC[2] = DATAEE_ReadByte(0xFC);
5
    MC.NW_MAC[3] = DATAEE_ReadByte(0xFD);
6
    MC.NW_MAC[4] = DATAEE_ReadByte(0xFE);
7
    MC.NW_MAC[5] = DATAEE_ReadByte(0xFF);

2. Schleife funktioniert nicht, wird kompiliert und übertragen. Sie 
bleibt jedoch laut Debugger und ein paar Tests hier hängen, und befindet 
sich dort auch in eine Endlos-Schleife.
1
    int_Offset = 0;
2
    for (int_Adresse = 0xFA; int_Adresse <= 0xFF; int_Adresse++) 
3
    {
4
        MC.NW_MAC[int_Offset] = DATAEE_ReadByte(int_Adresse);
5
        int_Offset++;
6
    }

3. Diese modifizierte Schleife funktioniert. Dies entspricht nicht der 
Norm einer Schleife,
1
    int_Offset = 0;
2
    for (int_Adresse = 0xFA; int_Adresse <= 0xFF; int_Adresse++) 
3
    {
4
        MC.NW_MAC[int_Offset] = DATAEE_ReadByte(int_Adresse);
5
        int_Offset++;
6
        
7
        if (int_Offset == 0xFF)
8
        {
9
            break;  
10
        }
11
    }

Bin mal auf Eure Rückmeldungen gespannt. Ich bin glücklich dass ich ein 
funktionierendes Projekt, allerdings würde ich gerne den Grund kennen. 
Die Schleife geht bei den IP-Adressen ja auch.

Viele Grüße
Ingo

: Bearbeitet durch User
von Max D. (max_d)


Lesenswert?

Ist dein int_Adresse zufällig nur 8 bit groß?
Dann kann der nie größer als 0xff werden...

von Harald K. (kirnbichler)


Lesenswert?

Alternative:
1
    for (int_Offset = 0; int_Offset < 6; int_Offset++) 
2
       MC.NW_MAC[int_Offset] = DATAEE_ReadByte(0xFA + int_Offset);

von Ingo S. (schicki)


Lesenswert?

Perfekt funktioniert, das ist der beste Beweis, das man die ein oder 
andere Funktion auf verschiedene Art und Weisen schreiben kann. Alle 
Variablen sind eigentlich als
1
int int_Adresse, int_Offset;
 deklariert. Sei es drum.

Vielen Dank uns schönes Wochenende
Ingo

von Adam P. (adamap)


Lesenswert?

Ingo S. schrieb:
> Alle Variablen sind eigentlich als int int_Adresse, int_Offset;
> deklariert. Sei es drum.

Nur so als Info an dich, damit du nicht nochmal über das Problem 
stolperst.

Klar kannst du die Schleife auf mehrere Arten schreiben, aber das löst 
nicht dein eigentliches Problem.

Du verwendest den PIC18F47Q43 und das ist ein 8-bit Controller.
Laut Spezifikation nimmt "int" immer die Systemweite an, also 8 Bit (in 
deinem Fall).

Und wenn du dann schreibst
1
int_Adresse <= 0xFF
dann inkrementiert er bei 0xFF nochmal und zack ist er wieder bei 0 und 
rüdelt dann bis in alle Ewigkeit in der Schleife.

Daher verwende ich lieber:
1
uint8_t
2
uint16_t
3
...usw

Umschreiben und sich freuen das es läuft ist das eine, aber das Problem 
erkennen und lösen ist der sicherere Weg.

von Franko P. (sgssn)


Lesenswert?

@Adam P "Laut Spezifikation nimmt "int" immer die Systemweite an, also 8 
Bit (in
deinem Fall)."

stimmet (leider) nicht.

https://onlinedocs.microchip.com/pr/%20GUID-BB433107-FD4E-4D28-BB58-9D4A58955B1A-en-US-1/index.html?GUID-3A37A613-2364-4965-9519-E79FE101ECC3

Für den XC8 gilt int=16Bit
Daher vrwende ich auch lieber die Definitionen:

int8_t, int16_t...
damit einem das selber klar ist, was man da definiert hat.

Gruß

: Bearbeitet durch User
von Adam P. (adamap)


Lesenswert?

Franko P. schrieb:
> Für den XC8 gilt int=16Bit

Ah Misst, ok, hast Recht.
Aber irgendwie hatte ich das beim GCC so im Hinterkopf.

Hab da nachgeschaut und finde auch die Info mit 16bit für integer.
Jetzt frage ich mich selbst woher ich diesen falschen Gedanke hatte...?

: Bearbeitet durch User
von Rolf (rolf22)


Lesenswert?

Ingo S. schrieb:
> Alle Variablen sind eigentlich als int int_Adresse, int_Offset;
> deklariert

Eigentlich sind es aber uint's. Was kommt raus, wenn du sie so 
deklarierst und die Konstanten passend dazu schreibst, also z. B. 0x00ff 
?

von Franko P. (sgssn)


Lesenswert?

Adam P. schrieb:
> Jetzt frage ich mich selbst woher ich diesen falschen Gedanke hatte...?

War in der Anfangszeit von C so definiert: Datenbreite des uP = int. Hat 
sich wohl nicht bewährt. Mir ist aber auch entgangen, ab wann das anders 
definiert wurde.

Gruß

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.