mehrere Rückgabewerte, PIC, zwei 7 Segment Anzeigen

OP #5073581
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
#5073594
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
}
#5073597
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.
#5073744
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
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren