Variablenname und Programmgröße

In dieses Forum gehören all deine Fragen rund um die Elektrotechnik und im Speziellen zum Bereich der Mikrocontrollertechnik.

Variablenname und Programmgröße

#1

Ungelesener Beitrag Herbert » 2. Mär 2019, 15:41

Hallo,

ich denke über Programmgröße und Vergebung eines Variablennamen in einem C Programm für PIC nach.

Woher wisst Ihr welchen Variablennamen ihr vergebt? Man weiß doch bei einer Programmentwicklung gar nicht welche Größe und Umfang das Programm haben wird. Das man immer so klein wie möglich die Variablennamen nehmen sollte ist mir klar aber wie geht ihr da vor? Wie kann man z.B. feststellen wie groß (Byte bzw kByte) ein Fertiges C Programm hat. Irgendwie muss man doch eine Vorstellung der Größe haben oder bekommen, weil man doch danach auch seinen PIC auswählen muss.

Gruß Herbert

Re: Variablenname und Programmgröße

#2

Ungelesener Beitrag Nico » 2. Mär 2019, 16:56

Hallo Herbert,

ich habe ehrlich gesagt etwas Schwierigkeiten deine Frage zu verstehen.

Grundsätzlich zur Auswahl des PIC bzw. die Festlegung wie viel Speicher er haben sollte, damit das Programm, welches es noch zu entwickeln gilt, auch in ihn hinein passt: Hier ist es (zumindest bei mir) so, dass ich grundsätzlich erst einmal notiere welche Peripherie ich aller Voraussicht nach brauchen werde (1x I²C, 2x UART, 7x GPIO ...). Dazu kommen weitere Dinge wie Gehäuseform, Möglichkeit der Taktung (intern/extern, Frequenzbereich), verfügbare Interruptquellen und und und.

Wenn ich dann irgendwann eine halbwegs konkrete Vorstellung davon habe, was ich definitiv alles brauchen werde, schnappe ich mir meist die filterbare Microchip Tabelle, gebe dort meine Parameter vor und sehe mir an, welche PICs in der Liste raus purzeln.

Die geeigneten Typen, die bei der Suche rauskommen sortiere ich dann nach verfügbarer Speichergröße und nehme i.d.R. den ersten Typen mit größtem Speicher, den man a) gut beziehen kann und der b) nicht unverhältnismäßig teuer ist.

Ich schätze damit ist deine Frage nicht vollständig beantwortet - ggfs. versuchst du deine Frage nochmal etwas zu präzisieren oder jemand anderes hat sie direkt verstanden ;)

Gruß Nico

Re: Variablenname und Programmgröße

#3

Ungelesener Beitrag Peter » 2. Mär 2019, 18:03

Vielleicht meint er den Variablentyp.
Ob Byte oder Word usw. (in C entsprechend andere Namen).
Ich nehme meistens den kleinsten Typ und wenn ich wärend des programmierens
merke das der Typ nicht passt, dann nehme ich den Typ der zu dem Programm passt.
Ich weis ja welche Werte der Typ haben kann und wähle so die richtige dimmensionierung
des Types. Sollte ich einmal den falschen Typ genommen habe und der Wertebereich der
Variable verläst den Wertebereich, so meckert eh der Compiler und weist mich darauf hin,
das die Dimensionierung falsch ist.
Welchen µC ich nehme hängt, wie Nico schon schrieb, von verschiedenen Kriterien ab.
Ich schaue meistens noch, welche Spannung ich zur verfügung habe und wie groß darf die Platine
werden. Dementsprechend nehme ich dann einen µC.
Die Speichergröße eines µC zu erraten ist fast unmöglich, besonders wenn man Grafikdisplays hat,
da weis man nie wieviel Speicher man braucht. Ist aber auch nicht so wichtig, dann nimmt man
halt einen größeren µC. Das anpassen an den neuen µC ist dann nicht mehr so kopliziert und
geht auch recht schnell. Solange man in der selben Familie bleibt. Also PIC16 zu PIC 16 und nicht
Pic 16 zu Pic32. Da hat man dann schon einiges mehr zu ändern.

Re: Variablenname und Programmgröße

#4

Ungelesener Beitrag Herbert » 2. Mär 2019, 18:45

Hallo,

ja meine Fragen sind wirklich nicht immer verständlich sorry, aber Trotz allem habt Ihr fast alles rausgelesen und Beantwortet was für mich unverständlich war.

Wie ist es denn wenn ich in MPLABX mit XC8 Compiler zb. eine Variable mit unsigned char deklariere diese aber zu klein ist, meldet dann MPLABX schon im Editor einen Fehler oder wird der Fehler erst beim Compilieren gemeldet?

Würde ein PICKIT3 Debugger oben genannten Fehler einem Programmierer Anzeigen?

Danke Gruß
Herbert

Re: Variablenname und Programmgröße

#5

Ungelesener Beitrag Peter » 2. Mär 2019, 19:23

Ich benutze den Compiler nicht aber probiere es doch
einfach aus. Also bei mir wird wärend der Eingabe nur überprüft
ob es den Befehl gibt. Erst beim Compilieren wird überprüft
ob die Variable richtig ist.

Re: Variablenname und Programmgröße

#6

Ungelesener Beitrag Nico » 2. Mär 2019, 20:27

Herbert hat geschrieben:Wie ist es denn wenn ich in MPLABX mit XC8 Compiler zb. eine Variable mit unsigned char deklariere diese aber zu klein ist, meldet dann MPLABX schon im Editor einen Fehler oder wird der Fehler erst beim Compilieren gemeldet?
Das kann man so pauschal nicht beantworten, denn es kommt darauf an, welche Art der Zuweisung vorliegt.

Ein Beispiel (uint8_t ist identisch zu unsigned char):

Code: Alles auswählen

#include <stdint.h>
uint8_t a = 100;
uint8_t b = 1000;
Hier würde der Compiler für die Zeile uint8_t b = 1000; einen Fehler ausgeben, da der Wertebereich (0 bis 255) für den Wert 1000 nicht ausreichen würde.

Anders sieht es hier aus:

Code: Alles auswählen

#include <stdint.h>

// ...
uint16_t i;
uint8_t a = 0;

for(i=0; i<1000; i++)
{
   a++;
}
Der Compiler würde hier keinen Fehler ausgeben. Du solltest dir jedoch im Klaren sein, dass am Ende der for Schleife nicht 1000 sondern 232 in a stehen wird, denn die Variable a wird dreimal überlaufen (von 255 auf 0).

Diese Art von Fehlern haben nicht selten wirklich schwerwiegenden Folgen. Hier ist dein Grips gefragt, zu überprüfen ob der Wertebereich ausreichen wird.

Gruß Nico

Re: Variablenname und Programmgröße

#7

Ungelesener Beitrag Herbert » 4. Mär 2019, 21:19

Hallo und danke für die Erklärungen.

Aber noch Fragen zu dem Code von Nico. Das verstehe ich noch nicht wie nun a im Ergebnis 232 wird, und die Variable hier dreimal durchlaufen wird. Da hast du recht Nico man muß seinen Grips anstrengen und vor allem Grips haben Ha...Ha. Vielleicht kann mal einer oder Nico versuchen diesen Code für mich verständlich zu machen, wenn das überhaupt noch weiter zu erklären ist.

Danke Gruß Herbert


Unnötiges Zitat entfernt (da direkte Antwort) - Nico

Re: Variablenname und Programmgröße

#8

Ungelesener Beitrag pic18 » 4. Mär 2019, 21:59

Was ist hier unklar?

a ist als unsigned char definiert, das heißt es können nur 8 Bits dargestellt werden
2^8 = 256 das heißt 1 Byte kann nur eine Zahl von 0 bis 255 darstellen
Bei dez. 1000 ist 256 3 mal enthalten, Rest = 232
3*256+232 =1000
dez 1000 ist hex 0x3e8

Re: Variablenname und Programmgröße

#9

Ungelesener Beitrag pic18 » 4. Mär 2019, 22:48

Was ich nicht verstehe ist wie man in C ein Array definiert welches eine RAM-Bank überschreitet. Ich hatte kürzlich beim Compilieren ständig eine Fehlermeldung bekommen obwohl noch genug freier Speicher in den restlichen Banken vorhanden war.

Re: Variablenname und Programmgröße

#10

Ungelesener Beitrag Nico » 5. Mär 2019, 07:06

@pic18 Am besten einen separaten Thread mit Beispielcode erstellen, dann können wir dort darüber diskutieren ;)

Re: Variablenname und Programmgröße

#11

Ungelesener Beitrag Nico » 5. Mär 2019, 14:45

Herbert hat geschrieben:
4. Mär 2019, 21:19
Das verstehe ich noch nicht wie nun a im Ergebnis 232 wird, und die Variable hier dreimal durchlaufen wird.
Die gezeigte for Schleife hat die Bedingung i<1000 und die Anweisung i++. Also wird die Schleife 1000 mal durchlaufen wobei i von 0 bis 999 gezählt wird. Sobald i den Wert 1000 annimmt, wird die Schleife beendet bzw. verlassen.

So und in der Schleife steht a++; als einzige Codezeile. Also werden wir a in jedem (der 1000 Durchläufe) um eins erhöhen. Wir haben a mit dem Wert 0 initialisiert. Also wird sie den folgenden Verlauf nehmen:

Code: Alles auswählen

  i    a -->   a
----------------
000: 000 --> 001
001: 001 --> 002
...
254: 254 --> 255
255: 255 --> 000
256: 000 --> 001
...
510: 254 --> 255
511: 255 --> 000
512: 000 --> 001
...
766: 254 --> 255
767: 255 --> 000
768: 000 --> 001
...
999: 231 --> 232

Re: Variablenname und Programmgröße

#12

Ungelesener Beitrag Herbert » 8. Mär 2019, 11:04

Danke wieder bin ich ein Stück weiter!
Gruß Herbert

Re: Variablenname und Programmgröße

#13

Ungelesener Beitrag Herbert » 9. Mär 2019, 13:40

Hallo Nico,

du und pic18 habt mir meine Frage sehr gut erklärt. Ich stelle hier mal einen Code "for Schleife" rein und würde mich freuen wenn ihr mir diesen Teil genauso wie zuvor Stück für Stück erklären könntet. Stört euch bitte nicht an blöden Fragen von mir, denn nur so verstehe ich die Programmierung und komme Langsam weiter. Danke

Code: Alles auswählen

void delay_ms(unsigned char value)
{
    unsigned char k = 0;
    for(k=0; k<value; k++)
    {
        __delay_ms(1);
    }
}
Guß Herbert


Angehängtes Word Dokument gelöscht und Code direkt eingefügt - Nico

Re: Variablenname und Programmgröße

#14

Ungelesener Beitrag Nico » 9. Mär 2019, 14:34

Hallo Herbet,

du scheinst mit dem Programmieren noch relativ weit am Anfang zu sein, daher frage ich mal ob du das C-Tutorial schon kennst? Wenn nicht, lohnt es sich sicher, dort mal einen Blick rein zu werfen.

Zu deiner Frage: Der gezeigte Code ist eine Funktion, der ein Wert übergeben werden kann, siehe value. Die Funktion ist dafür vorgesehen den Mikrocontroller eine gewisse Anzahl an Millisekunden warten zu lassen (z.B. 15ms mit folgendem Aufruf: delay_ms(15);). Da eine Variable des Typs unsigned char einen Wertebereich von 0 bis 255 hat (wie wir ja in den letzten Beiträgen schon erläutert haben), kann diese Funktion demnach dafür genutzt werden den Controller zwischen 0 und 255ms warten zu lassen.

Die for Schleife wird so oft durchlaufen, wie k kleiner als value ist. Je Durchlauf wird die Zeile __delay_ms(1); ausgeführt. Diese Zeile ist eine Funktion, die vom XC8 Compiler bereitgestellt wird (kann nur genutzt werden, wenn xc.h eingebunden wurde). Mit dem Übergabewert 1 wird der Controller 1ms lang nichts tun.

Wichtig hierbei ist, dass der Controller wissen muss mit welchem Takt er arbeitet. Ansonsten weiß er nämlich nicht wie viele Arbeitstakte er pausieren muss um die gewünschte Wartezeit zu erreichen. Das kann man dem Compiler mitteilen, indem man das folgende Define in seinen Quellcode einbaut (hier am Beispiel, wenn der PIC mit 4MHz Takt betrieben wird):

Code: Alles auswählen

#define _XTAL_FREQ 4000000 /*Clock frequency in Hz*/
Kleiner Exkurs:

1) Es ist in der Regel keine gute Idee einen Mikrocontroller wirklich warten zu lassen, denn so wird Rechenzeit verschwendet. Zu Beginn bzw. für Anfänger ist es jedoch völlig in Ordnung ;-)
2) Die gezeigte Funktion (oben) ist nicht besonders elegant geschrieben, denn die Variable k könnte problemlos eingespart werden, siehe:

Code: Alles auswählen

void delay_ms(unsigned char value)
{
   while(value)
   {
      __delay_ms(1);
      value--;
   }
}
Noch etwas: Ich weiß, dass __delay_ms() sich teilweise nicht sauber verhält. Je nachdem wie groß der mit _XTAL_FREQ definierte Takt des PIC ist, kann die gewünschte Wartezeit nicht realisiert werden. Man könnte ja auch direkt sagen __delay_ms(100) um 100ms zu warten. Aber wie gesagt geht das unter bestimmten Umständen in die Hose (zumindest als ich mal mit der Funktion gearbeitet habe). Daher die Funktion mit for Schleife drum herum.

Gruß Nico

Re: Variablenname und Programmgröße

#15

Ungelesener Beitrag Herbert » 9. Mär 2019, 19:11

Hallo Nico,
du hast es richtig erkannt ich bin mit dem Programmieren ganz am Anfang, auch PC Erfahrung habe ich noch nicht allzuviel.

ja das C-Totural von dir kenne ich, obwohl du da alles sehr gut für Anfänger erklärst, habe ich wie du an meinen Fragen siehst Probleme es zu verstehen, daher bin ich froh hier bei euch im Forum nachzufragen zu können. Denn wie ihr mir das dann erklärt und zb. die Code auseinander pult, klingelt es auch bei mir.

Nun noch eine Frage eventuell auch blöde Frage, habt ihr die Schlüsselwörter, Präprozessor Anweisungen und vieles mehr von Ansi C alles im Kopf?

Danke Gruß Herbert

Antworten