Variable zwischen unterprogrammen übergeben

Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte

Elektronik Forum Nicht eingeloggt       Einloggen       Registrieren




[Registrieren]      --     [FAQ]      --     [ Einen Link auf Ihrer Homepage zum Forum]      --     [ Themen kostenlos per RSS in ihre Homepage einbauen]      --     [Einloggen]

Suchen


Serverzeit: 05 7 2024  19:48:34      TV   VCR Aufnahme   TFT   CRT-Monitor   Netzteile   LED-FAQ   Osziloskop-Schirmbilder            


Elektronik- und Elektroforum Forum Index   >>   Microcontroller        Microcontroller : Hardware - Software - Ideen - Projekte

Gehe zu Seite ( 1 | 2 Nächste Seite )      


Autor
Variable zwischen unterprogrammen übergeben

    







BID = 874284

basti2s

Gelegenheitsposter



Beiträge: 94
Wohnort: Leutkirch
 

  


Hallo,

so langsam werde ich wahnsinnig.
Ich probiere schon seit tagen herum, komme aber zu keiner Lösung.

Ich habe in meinem C Programm 2 Unterprogramme, im 1. Unterprogramm wird eine Variable durch einen Timer0 hochgezählt, diese soll dann an das 2. Unterprogramm übergeben werden. Ich bekomms einfach nicht hin.
Hier mal mein Programm:



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;
}




}


Was mach ich falsch?

Gruß

Bastian

BID = 874327

perl

Ehrenmitglied



Beiträge: 11110,1
Wohnort: Rheinbach

 

  


Offtopic :
Läuft das dann auch so wie hier? https://forum.electronicwerkstatt.d.....74283

BID = 874328

Harald73

Schreibmaschine


Falsches Format
*.gif oder *.jpg
verwenden!
Beiträge: 1016

Hi,

(habe lange nicht mehr selber programmiert...)

Die beiden Unterprogramme werden ja gar nicht im Main aufgerufen. Dort müsstest du dann die Variable an ausgabe übergeben.
Das(char min_einer) führt zu einer neuen Variable min_einer, die nur innerhalb von ausgabe sichtbar ist, stellt aber keine Verknüpfung zu der "zufällig" gleichnamigen Variable in umrechnen her.
Ich denke aber, da ist noch mehr im Argen. min_einer ist einmal unsigned int, ein ander mal char. Außerdem sollte nur das ab "if (T0IF)" zyklich durchlaufen werden, das davor nur einmal. Und das "if" passt nur, wenn du es per IRQ aufrufst (wobei dann das if überflüssig ist) , oder umrechnen "beliebig schnell/oft" aufgerufen wird (was natürlich Rechenzeit verbraucht), da du sonst Takte verpassen könntest.

Gruß
Harald




_________________
*..da waren sie wieder, meine 3 Probleme: 1)keiner 2)versteht 3)mich
* Immer die gültigen Vorschriften beachten und sich keinesfalls auf meine Aussagen verlassen!

[ Diese Nachricht wurde geändert von: Harald73 am 16 Feb 2013 15:34 ]

BID = 874440

DonComi

Inventar



Beiträge: 8605
Wohnort: Amerika

Lerne erstmal C vernünftig und erst, wenn du es einigermaßen kannst, wende es auf Mikrocontrollern an.

Debugging auf einem PC ist einfacher als auf einem µC.

UND WIE GESAGT: 0bxxx ist kein sauberes C, sowas gibt es dort einfach nicht!

_________________

BID = 874445

ffeichtinger

Schreibmaschine



Beiträge: 1050
Wohnort: Traunkirchen im Salzkammergut


Offtopic :

UND WIE GESAGT: 0bxxx ist kein sauberes C, sowas gibt es dort einfach nicht!


Leider. Denn manchmal ist das sehr praktisch. Und gcc kann damit tadellos umgehen. (und womit sollte man denn sonst C oder C++ programmieren? :D)

mfg Fritz

_________________

BID = 874453

ffeichtinger

Schreibmaschine



Beiträge: 1050
Wohnort: Traunkirchen im Salzkammergut

Uups, falsches tag, ich wollte dich nur zitieren und nicht ins OT verschieben.

_________________

BID = 874454

ElektroNicki

Inventar



Beiträge: 6429
Wohnort: Ugobangowangohousen


Offtopic :
Nicht jeder ist so ein Suchtie, dass er schneller ein Nibble korrekt (!) in ein Zeichen umrechnet und dieses eintippt als er für selbiges in Bitschreibweise braucht.
Wens Fehler gibt, fängt die Sucherei an...
MPLABX kennt diese Notation übrigens auch...
Genau wie Bascom (nicht immer brauch man Pointer, Pakete aus einer seriellen Schnittstelle einlesen, zerlegen und darstellen geht z.B. ohne...)



_________________

BID = 874459

DonComi

Inventar



Beiträge: 8605
Wohnort: Amerika


Offtopic :

Zitat :

MPLABX kennt diese Notation übrigens auch...

Kein Grund, dass sie dadurch besser wird!



Zitat :
Genau wie Bascom

Wir reden über ernsthaftes programmieren.


Zitat :
(nicht immer brauch man Pointer, Pakete aus einer seriellen Schnittstelle einlesen, zerlegen und darstellen geht z.B. ohne...)

Ja, und was passiert bitte intern bei solchen Operationen?
Da steckt mehr Pointerarithmetik hinter, als du dir vorstellen kannst.


Zitat :

Nicht jeder ist so ein Suchtie, dass er schneller ein Nibble korrekt (!) in ein Zeichen umrechnet und dieses eintippt als er für selbiges in Bitschreibweise braucht.


C bietet gleich einen ganzen Satz an Möglichkeiten, sowas schön, verständlich, portabel, leserlich, schnell änderbar etc. auf Bitebene zu realisieren, man braucht halt mehr als die Standardahnung ums zu verstehen...
Und um irgendwelche Zeichen (du meinst versch. ASCII) gehts hier eh nicht, würde so auch nicht klappen, noch ein Grund, einfach nicht zu antworten.


Und grundsätzlich gilt: Programmierer denken hexadezimal. Man kann direkt die gesetzten Bits in einer hexadezimal-kodierten Zahl sehen.
Aber 0bxxx geht gar nicht, auch wenn der GCC nicht meckert.

gcc -pedantic:
t.c:5:20: Warnung: binäre Konstanten sind eine GCC-Erweiterung [standardmäßig aktiviert]

Der GCC bietet sehr viele Erweiterungen und unter Linux etc. mag das in Ordnung sein.
Aber jemand der das nutzt tut sich und anderen nicht immer einen Gefallen.


_________________

BID = 874467

ElektroNicki

Inventar



Beiträge: 6429
Wohnort: Ugobangowangohousen


Offtopic :


Zitat :
DonComi hat am 17 Feb 2013 01:23 geschrieben :


Wir reden über ernsthaftes programmieren.


Ich bin mir nicht sicher, ob meine ~750 Zeilen in C wesentlich kürzer ausgefallen wären.
C will so mächtig sein, aber verzichtet auf diese simple und praktische Notation.
Kopf->Tisch



Zitat :
(nicht immer brauch man Pointer, Pakete aus einer seriellen Schnittstelle einlesen, zerlegen und darstellen geht z.B. ohne...)

Ja, und was passiert bitte intern bei solchen Operationen?
Da steckt mehr Pointerarithmetik hinter, als du dir vorstellen kannst.
[/quote]
Weiß ich selbst, nur zu Fuß nervts zumindest mich ziemlich...

Zitat :


C bietet gleich einen ganzen Satz an Möglichkeiten, sowas schön, verständlich, portabel, leserlich, schnell änderbar etc. auf Bitebene zu realisieren




Die da wäre?


Zitat :

Man kann direkt die gesetzten Bits in einer hexadezimal-kodierten Zahl sehen.

Also ich schaffs nur mit einer unpraktikablen Verzögerung...


_________________



[ Diese Nachricht wurde geändert von: ElektroNicki am 17 Feb 2013  2:48 ]

BID = 874479

basti2s

Gelegenheitsposter



Beiträge: 94
Wohnort: Leutkirch

ich steuere die Ports halt mit 0bxxx an, weil ich es in der Schule so gelernt habe, und für mich momentan am einfachsten ist.
Aber warum funktioniert mein Code nicht?

BID = 874484

ffeichtinger

Schreibmaschine



Beiträge: 1050
Wohnort: Traunkirchen im Salzkammergut


Zitat :

Und grundsätzlich gilt: Programmierer denken hexadezimal. Man kann direkt die gesetzten Bits in einer hexadezimal-kodierten Zahl sehen.


Also ich denke nicht hexadezimal, höchstens binär


Ich hab mal als Tutor an einem Institut gearbeitet wo sämtliche Kontrollregister (am DSP) immer hexadezimal gesetzt werden.

Warum bitte macht man sowas? Dafür gäbs doch die schöne Schreibweise mit:

(1<<BIT_SOUNDOS)|(1<<WASANDERES)

Für mich sind hex-Zahlen nur dann sinnvoll wenn sie nur aus 'F's bestehen.


Außerdem wird dort durchgängig mit C89 gearbeitet! Und das im Jahre 2013!


mfg Fritz

_________________

BID = 874486

Ltof

Inventar



Beiträge: 9306
Wohnort: Hommingberg


Offtopic :

Zitat :
DonComi hat am 17 Feb 2013 01:23 geschrieben :

C bietet gleich einen ganzen Satz an Möglichkeiten, sowas schön, verständlich, portabel, leserlich, schnell änderbar etc. auf Bitebene zu realisieren, man braucht halt mehr als die Standardahnung ums zu verstehen...

Das hat irgendwie etwas Widersprüchliches.

Und:
Wenn ich PIC-Programme in C schreiben würde, würde ich diese Notation vermutlich auch verwenden.

Im übrigen steht es jedem frei, jede beliebige Programmiersprache nicht ernst zu nehmen - auch C.
( http://www.stupidedia.org/stupi/Div.....3%A4t http://www.stupidedia.org/stupi/Programmiersprache )


_________________
„Schreibe nichts der Böswilligkeit zu, was durch Dummheit hinreichend erklärbar ist.“
(Hanlon’s Razor)

[ Diese Nachricht wurde geändert von: Ltof am 17 Feb 2013 11:08 ]

BID = 874494

Ltof

Inventar



Beiträge: 9306
Wohnort: Hommingberg


Offtopic :
Ach nee:

Zitat :
Um den Wildwuchs zahlreicher Dialekte einzudämmen, wurde C mehrfach standardisiert (C89, C95, C99, ISO-C). Abgesehen vom Mikrocontrollerbereich, wo eigene Dialekte existieren, sind die meisten aktuellen PC-/Server-Implementierungen eng an den Standard angelehnt; eine vollständige Implementierung aktueller Standards ist aber selten. In den meisten C-Systemen mit Laufzeitumgebung steht auch die genormte Standard C Library zur Verfügung. Dadurch können C-Programme, die keine sehr hardware-nahe Programmierung enthalten, in der Regel gut auf andere Zielsysteme portiert werden.

( http://de.wikipedia.org/wiki/C_%28P.....blick )

Oder anders herum formuliert: Auf µC-Systemen lassen sich die Standards ohnehin nicht Dialekt-frei umsetzen und eine Anpassung an ein neues Zielsystem ist erforderlich.


_________________
„Schreibe nichts der Böswilligkeit zu, was durch Dummheit hinreichend erklärbar ist.“
(Hanlon’s Razor)

BID = 874530

Nukeman

Schriftsteller



Beiträge: 754
Wohnort: bei Kleve


Offtopic :
Ich finde die Notation 0bxxxxxxxx eigentlich auch ganz praktisch. Benutze
sie wegen der Portierbarkeit aber nicht und Hex kann ich auch alle Bits
sofort ansehen.

Aber:
Warum die Zahlensysteme Dezimal, Oktal und Hexadezimal von C nativ unterstützt
werden und ausgerechnet das Binär-System nicht, ist für mich nicht ersichtlich.
Gerade die Unterstützung des Oktal-Systems halte ich für ziemlich überflüssig
und sogar fehlerträchtig. Such mal nach so einem Fehler: x=042; Da kann man
tagelang dran sitzen, wo die Variable den Wert 34 herbekommen hat..

Es gibt eigentlich keine priviligierten und unterpriviligierten Zahlensysteme,
nur mehr oder weniger sinnvoll einsetzbare.


Zum Code selbst schreibe ich nichts mehr, fang bitte nochmal mit den Grundlagen
an oder suche Dir ein passendes Online-Tutorial.

Gruß,
Stefan


_________________
Alle sagten: Das geht nicht. Dann kam einer, der wusste das nicht und hat´s gemacht.

BID = 874541

DonComi

Inventar



Beiträge: 8605
Wohnort: Amerika


Zitat :
(1<<BIT_SOUNDOS)|(1<<WASANDERES)


Genau das meinte ich, das ist eine sehr praktikable Möglichkeit.

Und natürlich lassen sich Mikrocontroller dialektfrei programmieren, vor allem in C.
Beispielsweise nehmen wir mal den Ausdruck PORTC = 1<<PORTC4;

PORTC selbst ist ein Makro, welches auf einen volatilen Speicherbereich zeigt. Ein Zugriff erfolgt also via Dereferenzierung eines Pointers auf eine feste, durch Hardware veränderbare Adresse (volatile). Das ist völlig normaler C-Code.
1<<PORTC4 heißt in diesem Fall, schiebe eine 1 an die vierte Position, binär also 0b00010000, hex 0x10.

Wenn man ordentlich modularisiert kann man bestimmte Codezeilen durchaus ohne Änderung direkt auf einem anderen System laufen lassen. Die hardwarenahen Geschichten werden dann entsprechend gekapselt, sodass nur sie wirklich plattformabhängig sind.
Leider lernen die Wenigsten, diese Trennung wirklich ernst zu nehmen und konsequent umzusetzen.

Es gibt auch Projekte, wo das alles völlig egal ist, da muss es nur laufen. Da kann man auf Portabilität, Standardkonformität etc. gänzlich verzichten und dennoch sollte man dort Sachen wie Register = 0b11001001 vermeiden und lieber mit möglichst symbolischen Konstanten arbeiten, das erhöht die Verständlichkeit und die Chance, Änderungen schnell auch nach ein paar Jahren einpflegen zu können, erheblich.

Ich hatte grad letztens ein großes Projekt (auch für ein Institut...), wo genau diese Portabilität ein wichtiges Kriterium war. Gegeben war exakt eine Schnittstelle und die Tatsache, dass der Code auf Linux, Windows, MacOS laufen können muss.
Dank der Modularität könnte man unseren Teil hinter der Schnittstelle auch auf AVRs, ARMs und z.B. unter SymbianOS laufen lassen .
Der Aufwand war gar nicht deutlich größer, als es nur z.B. für Linux oder Windows zu schreiben.

@Ltof:

Zitat :
Im übrigen steht es jedem frei, jede beliebige Programmiersprache nicht ernst zu nehmen - auch C.

Du hast Recht, C ist nicht das Nonplusultra und BASIC wird ja tatsächlich für Embedded Systeme als Programmiersprache eingesetzt, so schlecht kann es also nicht sein.

Davon mal abgesehen: aus rein theoretischer Sicht ist es eh egal, welche Sprache man einsetzt. Am Ende geht es darum, dass der Mist das tut, was man will und die Rahmenbedingungen eingehalten werden.
Schnitzer wie eine Rakete aufgrund eines Underflows abstürzen zu lassen, bekommt man mit vielen Sprachen hin...

_________________


      Nächste Seite
Gehe zu Seite ( 1 | 2 Nächste Seite )
Zurück zur Seite 1 im Unterforum          Vorheriges Thema Nächstes Thema 


Zum Ersatzteileshop


Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!
Impressum       Datenschutz       Copyright © Baldur Brock Fernsehtechnik und Versand Ersatzteile in Heilbronn Deutschland       

gerechnet auf die letzten 30 Tage haben wir 16 Beiträge im Durchschnitt pro Tag       heute wurden bisher 8 Beiträge verfasst
© x sparkkelsputz        Besucher : 181613141   Heute : 4029    Gestern : 5862    Online : 442        5.7.2024    19:48
2 Besucher in den letzten 60 Sekunden        alle 30.00 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
xcvb ycvb
0.0562520027161