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

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

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! 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

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! 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

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! 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

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 |