Forum

Einloggen | Registrieren | RSS  

basti321s

16.02.2013,
11:58
 

Variable zwischen unterprogrammen übergeben (Elektronik)

Hallo,

ich bin hier total am verzweifeln.
Ich möchte eine Variable zwischen zwei Unterprogrammen übergeben.

Im Unterprogramm umrechnen läuft ein Timer0, der die Variable min_einer jede Minute um +1 erhöht.
Diese soll dann an das andere Unterprogramm ausgabe übergeben werden.

Ich habe schon tausend tutorials probiert, aber nichts hat funktioniert, könnt ihr mir bitte weiterhelfen.

Hier der Code:

[Code]
#include <htc.h>

__CONFIG (LVP_OFF & WDTE_OFF); //Low Voltage Programming OFF

// Watch dog timer off

void ausgabe (char min_einer);



void main (void)

{

OSCCON= 0b01110111; //Unimplemented

//111 8MHz

//OSTS Internal Oszillator

//HTS HFINTOSC ist stable

//LTS LFINTOSC is stable

//SCS Internal oscillator is used for system clock

TRISC = 0; //Port C als Ausgang

TRISB1 = 0;

TRISB2 = 0;

TRISB3 = 0;

TRISD = 0; //Port D als Ausgang

ANS8 = 0;

ANS9 = 0;

ANS10 = 0;

RB1=1;

RC0=0;

RC2=1;

RB3=0;

RB2=0;

RB3=1;









}

















int umrechnen(void) // Rechnet Timer Ausgang in Minuten um, Minuten werden auf "min_einer" ausgegeben.

{

unsigned int ms;

unsigned int min_einer;

unsigned int min_zehner;

OPTION_REG= 0b11000010; //Pull up disable

//Interrupt on rising edge of INT pin

//Internal cycle clock

//Increment on Low to high transition on T0CKI

//PSA assigned to timer0

//Prescaler 1:8

INTCON= 11100100; //Enable all unmasked interrupts

//Enables all unmasked peripheral interrupts

//Enables the INT external interrupt

//Disables the INT external interrupt

//Disables the PORTB change interrupt

//TMR0 Register has overflowed (cleared in software)

//INT external interrupt did not occur

//None of the PORTB general purpose I/O pins have changed state

TMR0 = 0; //Timer0 auf 0 Setzen

T0IF = 0; //Interrupt Flag zurücksetzen

PORTC=0b00000000; //PORTC rücksetzen

TMR0 = 6;









if (T0IF)

{

ms=ms+1; //Counter bei Timerüberlauf um 1 erhöhen

T0IF=0; //Interrupt Flag zurücksetzen

TMR0=6; //Timer preload auf 6 stellen

}



if (ms==60000)

{

min_einer=min_einer+1;

ms=0;

}



if (min_einer==9)

{

min_zehner=min_zehner+1;

min_einer=0;

}



if (min_zehner==9)

{

min_zehner=0;

}



return 0;



}











//-----------------------------------------------------------------------------







void ausgabe(char min_einer)

{











if (min_einer==9) //7Segment 0

{

PORTC=0b00000000;

PORTD=0b00000000;

}

if (min_einer==8) //7Segment 1

{

PORTC=0b00010000;

PORTD=0b00010000;

}

if (min_einer==7) //7Segment 2

{

PORTC=0b00100000;

PORTD=0b00100000;

}

if (min_einer==6) //7Segment 3

{

PORTC=0b00110000;

PORTD=0b00110000;

}

if (min_einer==5) //7Segment 4

{

PORTC=0b01000000;

PORTD=0b01000000;

}

if (min_einer==4) //7Segment 5

{

PORTC=0b01010000;

PORTD=0b01010000;

}

if (min_einer==3) //7Segment 6

{

PORTC=0b01100000;

PORTD=0b01100000;

}



if (min_einer==2) //7Segment 7

{

PORTC=0b01110000;

PORTD=0b01110000;

}

if (min_einer==1) //7Segment 8

{

PORTC=0b10000000;

PORTD=0b10000000;

}



if (min_einer==0) //7Segment 9

{

PORTC=0b10010000;

PORTD=0b10010000;

}









}

[/Code]

79616363(R)

E-Mail

Leinfelden-Echterdingen,
16.02.2013,
12:13

@ basti321s

Variable zwischen unterprogrammen übergeben

Bastle mit typedef nen Typ (z.B. ein struct), leg in der aufrufenden Funktion eine Variable dieses Typs an, übergib beim Aufruf deiner Funktion nen Zeiger auf diese Variable und fülle diese Zielvariable in deiner Funktion mit Hilfe des übergebenen Target-Pointers - Fertisch.

Uli und die Mausen

--
„Wo kämen wir hin, wenn jeder sagte, wo kämen wir hin und keiner ginge, um zu sehen, wohin wir kämen, wenn wir gingen.“

(Kurt Marti)

geralds(R)

Homepage E-Mail

Wien, AT,
16.02.2013,
12:18

@ basti321s

bitte "7 Tipps für Fragesteller" lesen; danke

Hi,

..und wo ist der Timer eingebaut?

---

--
...und täglich grüßt der PC:
"Drück' ENTER! :wink: Feigling!"

basti321s

16.02.2013,
13:28

@ geralds

bitte "7 Tipps für Fragesteller" lesen; danke

» Hi,
»
» ..und wo ist der Timer eingebaut?
»
» ---

im programm umrechnen

geralds(R)

Homepage E-Mail

Wien, AT,
16.02.2013,
13:41

@ basti321s

bitte "7 Tipps für Fragesteller" lesen; danke

» » Hi,
» »
» » ..und wo ist der Timer eingebaut?
» »
» » ---
»
» im programm umrechnen

---
Du sprichst von einem PIC mit 4 Ports.
Welchen PIC?

---

--
...und täglich grüßt der PC:
"Drück' ENTER! :wink: Feigling!"

basti321s

16.02.2013,
15:26

@ geralds

bitte "7 Tipps für Fragesteller" lesen; danke

» » » Hi,
» » »
» » » ..und wo ist der Timer eingebaut?
» » »
» » » ---
» »
» » im programm umrechnen
»
» ---
» Du sprichst von einem PIC mit 4 Ports.
» Welchen PIC?
»
» ---

Sorry, ich programmiere den PIC16F887 mit MPLAB Compieler ist der HIG TECH PIC.

Es handelt sich dabei um den Microcontrollereinschub der IHK.

geralds(R)

Homepage E-Mail

Wien, AT,
16.02.2013,
21:56
(editiert von geralds
am 16.02.2013 um 22:01)


@ basti321s

Modul - Display

Meinst du vielleicht dieses?




Davor geschaltet ist ein F84 ... ok, bei dir der Nachfolger F887.

Bzw. ist das MC2(Baustufe 3190)V2

Bitte nähere Aufklärung, sonst wirds ein Blindflug.

-- In den Unterlagen müßte doch ein Source mit dabei sein, zB. zumindest in Assembler, oder?

Gerald
---

--
...und täglich grüßt der PC:
"Drück' ENTER! :wink: Feigling!"

basti321s

17.02.2013,
09:39

@ geralds

Modul - Display

Hier mal die Bereitstellungsunterlagen für den Einschub:
http://www.stuttgart.ihk24.de/linkableblob/962276/.5./data/3190_B0-data.pdf
Ich programmiere den Einschub mit dem PICKit (falls es euch interresiert)

Die 7 Segment anzeige wird über einen externen BCD Decoder angesteuert.
Das ist aber nicht das Problem. Wenn ich dass Unterprogramm ausgabe in das andere Programm (umrechnen) kopiere funktioniert alles.
Was meiner Meinung nach darauf hin deutet, dass ich ein Problem mit der Übergabe der Variablen habe.

Björn(R)

E-Mail

Dortmund,
17.02.2013,
20:49

@ basti321s

Modul - Display

» Das ist aber nicht das Problem. Wenn ich dass Unterprogramm ausgabe in das
» andere Programm (umrechnen) kopiere funktioniert alles.
» Was meiner Meinung nach darauf hin deutet, dass ich ein Problem mit der
» Übergabe der Variablen habe.

Das ist ja auch logisch. Wo wird denn momentan die Funktion "ausgabe" aufgerufen? Nirgendwo!

Wenn die Funktion "umrechnen" schon int als Rückgabeparameter hat, dann nutze den auch und gebe min_einer mit return zurück. Damit kannst Du dann "ausgabe" aufrufen (die in diesem Fall auch int als Parameter haben sollte und nicht char).

Dir scheint es an grundlegenden C-Kenntnissen zu mangeln. Diese lassen sich besser und nachhaltiger durch Lesen eines Tutorials z.B. http://de.wikibooks.org/wiki/C-Programmierung verbessern als durch Crosspostings in verschiedenen Foren (http://forum.electronicwerkstatt.de/).

Schöne Grüße,
Björn