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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.