Forum: Mikrocontroller und Digitale Elektronik mehrere Rückgabewerte, PIC, zwei 7 Segment Anzeigen


von Lukas K. (totemsteiner)


Lesenswert?

Hallo,

ich habe zwei 7 Segment Anzeigen, die ich per Tastendruck hochzählen 
lasse, funktioniert auch alles soweit ganz gut. Nun möchte ich die 
"hochzählenFunktion" gerne auslagern, mit hochzaehlen.h und 
hochzaehlen.c.

Folgendes habe ich probiert, leider funktioniert es mit meinem 
PIC16F1937 und dem Taster nicht.
hier die main.c:
1
int einersekunde=1 ;
2
int zehnersekunde=1;
3
int startwerteiner=0;
4
int startwertzehner=0;
5
#include "mcc_generated_files/mcc.h"
6
#include "hochzaehlen.h"
7
...//alle weiteren #includes sind natürlich vorhanden
8
...
9
10
while (1)
11
    {
12
        while (PORTCbits.RC1==1)
13
        {   
14
            AnzeigeEiner(einersekunde);
15
            AnzeigeZehner(zehnersekunde);
16
            if(!Taster1_GetValue())
17
            { 
18
                __delay_ms(200);
19
                hochzaehlen(); //hier rufe ich die Funktion auf
20
               
21
                startwerteiner=einersekunde;
22
                startwertzehner=zehnersekunde;
23
            }
24
        ....//usw.

hier meine hochzaehlen.h:
1
void hochzaehlen (int einersekunde, int zehnersekunde);

und hier die hochzaehlen.c:
1
#include "mcc_generated_files/pin_manager.h"
2
3
4
5
void hochzaehlen(int einersekunde, int zehnersekunde)
6
{            
7
                einersekunde++;
8
                if(einersekunde==11)
9
                {
10
                    einersekunde=1;
11
                    zehnersekunde++;
12
                    if(zehnersekunde==10)
13
                    {
14
                        einersekunde=1;
15
                        zehnersekunde=1;
16
                    }
17
                }  
18
               
19
}

Dass man mehrere Rückgabewerte über Zeiger auf die jeweiligen Adressen 
zurückgeben kann, ist mir bekannt. Leider weiß ich nicht, wie ich das 
hier anwenden kann, da ich ja eigentlich nichts zurückgeben muss oder?
Jemand eine Idee wie sich die Auslagerung realisieren lässt?
Ich arbeite mit MPLAB v.3.6.
LG
totem

: Bearbeitet durch User
von Karl M. (Gast)


Lesenswert?

Ein Struktur mit den benötigten Daten, dann eine Variable mit diesem 
Datentyp und einen Zeiger darauf.

von Sebastian K. (sek)


Lesenswert?

Lukas K. schrieb:


> Leider weiß ich nicht, wie ich das
> hier anwenden kann, da ich ja eigentlich nichts zurückgeben muss oder?

Naja, du willst doch die neuen Werte von einersekunde und zehnersekunde 
zurückgeben, oder nicht? So wie die hochzaehlen Funktion derzeit 
ausgestaltet ist, bewirkt sie rein praktisch garnichts. Sie zählt die 
Variablen auf dem Stack hoch, was genauso effektiv ist wie die CPU Zeit 
in einer Warteschleife zu verbraten :-)

hochzaehlen müsste so in der Art aussehen:
1
void hochzaehlen(int* einersekunde, int* zehnersekunde)
2
{            
3
                *einersekunde++;
4
                if(*einersekunde==11)
5
                {
6
                    *einersekunde=1;
7
                    *zehnersekunde++;
8
                    if(*zehnersekunde==10)
9
                    {
10
                        *einersekunde=1;
11
                        *zehnersekunde=1;
12
                    }
13
                }  
14
               
15
}

von Teo D. (teoderix)


Lesenswert?

Lukas K. schrieb:
> da ich ja eigentlich nichts zurückgeben muss oder?

So schon, du veränderst so nur die Lokalen-Variablen, in der Funktion. 
Hat also keinerlei Auswirkungen nach außen!
Stichworte: "Call by Value" (das was du machst) und "Call by Reference"

http://www.lerneprogrammieren.com/blog/praxis/call-value-und-call-reference-bei-der-parameteruebergabe

von Volker S. (vloki)


Lesenswert?

Wenn du die Variablen schon übergibst, dann musst die Adresse der 
Variablen (by reference) übergeben und nicht eine Kopie ihres Wertes. 
Die Funktion sieht dann wohl so aus
1
void hochzaehlen(unsigned char *esek, unsigned char *zsek)
2
{            
3
                *esek++;

Aufgerufen wird sie mit hochzaehlen(&einersekunde, ...

BTW:
Der Name der Funktion ist nicht sehr aussagekräftig. Irgendwas wird 
hochgezählt,. wichtig wäre was wir hochgezählt.

von Volker S. (vloki)


Lesenswert?

Ach ja, int ist keine gute Wahl. Verschwendet Speicherplatz und 
Rechenzeit.
Zählen tust du auch merkwürdig ;-)
Oder zeigst du etwa bei 1 eine Null an und bei 10 eine 9?

von Lukas K. (totemsteiner)


Lesenswert?

wow, vielen dank für die schnellen Antworten.

Probiere es direkt mal aus.

lg

von Lukas K. (totemsteiner)


Lesenswert?

Volker S. schrieb:

> Zählen tust du auch merkwürdig ;-)
> Oder zeigst du etwa bei 1 eine Null an und bei 10 eine 9?

so ist es :)

von Teo D. (teoderix)


Lesenswert?

Lukas K. schrieb:
> Probiere es direkt mal aus.

Besser wäre es, zu Lesen und zu Lernen!

von Lukas K. (totemsteiner)


Lesenswert?

Teo D. schrieb:
> Lukas K. schrieb:
>> Probiere es direkt mal aus.
>
> Besser wäre es, zu Lesen und zu Lernen!

probieren geht über studieren ;)

von Teo D. (teoderix)


Lesenswert?

Lukas K. schrieb:
> probieren geht über studieren ;)

Das hat dich aber ganz schön im stich gelassen.
Siehe: Beitrag "mehrere Rückgabewerte, PIC, zwei 7 Segment Anzeigen"
:P


PS: Las solch Sprüche lieber. Kommt hier selten gut an, trotz 
Zwinker-Smiley.

von Volker S. (vloki)


Lesenswert?

Teo D. schrieb:
> PS: Las solch Sprüche lieber. Kommt hier selten gut an, trotz
> Zwinker-Smiley.

Hier vielleicht schon. Mir geht das Studieren ohne Probieren meist 
ziemlich schnell auf den Geist. Reines Raten und eine fertige Lösung 
(an)nehmen ohne zu irgendwas verstanden zu haben allerdings noch 
schneller ;-)

von Peter D. (peda)


Lesenswert?

Es gibt keinen Grund, überhaupt für jedes Digit separate Variablen zu 
verschwenden.
Ein char kann bequem 0..99 zählen und ein int 0..9999.
Und nur für die Ausgabe zerlegt man es:
1
void out_number( char val )
2
{
3
  display_tens( val / 10 );
4
  display_ones( val % 10 );
5
}

von Volker S. (vloki)


Lesenswert?

Peter D. schrieb:
> Es gibt keinen Grund, überhaupt für jedes Digit separate Variablen zu
> verschwenden.

Jetzt mal nicht zu schnell, sonst sind wir ja gleich bei der BCD 
Codierung von zwei Stellen in den zwei Nibbles eines Bytes ... ;-)

: Bearbeitet durch User
von Teo D. (teoderix)


Lesenswert?

Peter D. schrieb:
> Es gibt keinen Grund, überhaupt für jedes Digit separate Variablen zu
> verschwenden.

Deine Variante frisst aber relativ viel Speicher. Könnte also doch 
Gründe geben.
(die vom TO hab ich mir nicht angesehen)

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.