Variablenname und Programmgröße

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

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

Re: Variablenname und Programmgröße

#16

Ungelesener Beitrag Nico » 10. Mär 2019, 07:33

Mit der Zeit hat man das alles auf dem Kasten, ja. Kommt ganz drauf an wie regelmäßig man sich damit auseinandersetzt (Hobby, Beruf ..).

Re: Variablenname und Programmgröße

#17

Ungelesener Beitrag pic18 » 10. Mär 2019, 11:31

Ich weiß, dass __delay_ms() sich teilweise nicht sauber verhält
ich habe so gute Erfahrung gemacht: (alte MPLAB IDE)

Code: Alles auswählen

#include "delays.h"
#define CLOCK_RATE 40000000L
#define wait_1ms(t)   Delay1KTCYx (CLOCK_RATE / 4 * t / 1000 / 1000)
#define wait_100us(t) Delay100TCYx(CLOCK_RATE / 4 * t / 1000 / 1000)
#define wait_10us(t)  Delay10TCYx (CLOCK_RATE / 4 * t / 1000 / 1000)
#define wait_1us(t)   Delay10TCYx (CLOCK_RATE / 4 * t / 1000 / 10000)
dieses Makro benutze ich nur bei ganz kurze genaue Wartezeiten wie zum Beispiel beim DS18B20. Ansonsten arbeite ich über Interrupt. Dort setze ich aber nur eine Flagge und arbeite diese im Hauptprogramm ab.

Antworten