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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Lukas K. (totemsteiner)


Bewertung
0 lesenswert
nicht 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)


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

von Sebastian K. (sek)


Bewertung
0 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
wow, vielen dank für die schnellen Antworten.

Probiere es direkt mal aus.

lg

von Lukas K. (totemsteiner)


Bewertung
1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Lukas K. schrieb:
> Probiere es direkt mal aus.

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

von Lukas K. (totemsteiner)


Bewertung
1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.