mehrere Rückgabewerte, PIC, zwei 7 Segment Anzeigen

OP #5073581
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
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
}
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.
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 ;-)
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

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.