Kostenloser Elektrotechnik VIDEO-Kurs


mit VIDEO-Reihen zu den Themen:
Grundlagen der Elektrotechnik
Gleichstromnetze und Berechnungsverfahren
Wechselstrom und Drehstromnetze
Elektrische Maschinen
Regelungstechnik
Digitaltechnik
Mikrocontrollertechnik und C-Programmierung


Funktionen in C, Parameterübergabe


In der letzten Folge hatte ich bereits erläutert, wie Compiler und Linker und anschließend auch das Zielsystem, der Mikrocontroller selbst, mit Variablen umgeht, also wo Variablen gespeichert werden.

Dieses Wissen hilft nun, beim Aufruf von Funktionen. Vor allem wenn es darum geht, den aufzurufenden Funktionen Parameter zu übergeben.

Da das heutige Video etwas lang geworden wäre, habe ich es in 2 Teile aufgeteilt.

Im ersten Video zeige ich den prinzipiellen Funktionsaufruf und die Parameterübergabe sozusagen als Trockenübung.

Im zweiten Video werde ich dann wieder die Entwicklungsumgebung an und zeige den Funktionsaufruf am System.

Alles geht über den Stack

Wenn es sich vermeiden lässt, globale Variablen für die Kommunikation zwischen unterschiedlichen Funktionen zu nehmen, nutzt man lokale Variablen. Da lokale Variablen eine begrenzte Sichtbarkeit und eine begrenzte Gültigkeitsdauer haben, können Programme so besser strukturiert werden.

Die Variablen für die Parameterübergabe von Funktion zu Funktion werden also über den Stack übergeben.

Im zweiten Video zeige ich die Implementierung des Funktionsaufrufes in der Entwicklungsumgebung und, am Ende des Videos, die Deklarationen von Funktionen, wenn Parameter mit übergeben werden sollen.



Nun bist Du wieder an der Reihe …

Heute gibt es wieder – endlich ;-) – eine Hausaufgabe.

Die heutige Hausaufgabe besteht aus drei Funktionen. Und zwar sollen zum einen für einen Kreis der Umfang und der Flächeninhalt berechnet werden. Zudem soll für einen Zylinder das Volumen berechnet werden.

Radius und Höhe sollen über den PORT 1 (Radius) und PORT 2(Höhe) eingegeben werden können. Der Einfachheit halber soll alles in der Grundeinheit m angegeben werden.

Die Besonderheit bei der Berechnung des Volumens für den Zylinder besteht darin, dass zur Berechnung der Grundfläche des Zylinders die vorher definierte Funktion genutzt werden soll.

Also:

Programmiere die Funktionen

  • int umfang (int radius)
  • int flaeche (int radius)
  • int volumen(int radius, int hoehe)

wobei in der Funktion volumen() die Funktion flaeche() genutzt werden soll.

Zu Beginn von main() sollen radius und hoehe über die Ports P1 und P2 eingelesen werden.

Am Ende von main sollen Umfang, Fläche und Volumen ausgegeben werden.

Hinweis:
Für unsere Übung reichen grobe Werte. Wir nehmen für PI = 3

Und zur Erinnerung ein paar Formeln:

  • U=2*PI*radius
  • A=Pi*radius²
  • V=A*hoehe

Bis zum nächsten Mal!

Dieser Artikel ist Teil des Mikrocontroller-Kurses auf ET-Tutorials.de.
[ >> Hier geht es zurück zur Übersichtsseite des Mikrocontroller-Kurses .]


Hat Dir der Artikel geholfen? - Dann hilf dem Artikel ;-)

Funktionen in C, Parameterübergabe:
1 Star2 Stars3 Stars4 Stars5 Stars
5,00 von 5 Punkten, basieren auf 1 abgegebenen Stimmen.
Stimme jetzt ab ! (auf die Sternchen klicken)
Loading ... Loading ...




Ähnliche Artikel

Folgende Artikel aus der gleichen Kategorie könnten Dich ebenfalls interessieren:

Lösung der Übungsaufgabe zu Funktionen In den vergangenen Artikeln bin ich auf die Behandlung von Funktionen und das Thema Parameterübergab...

Arrays In den vergangenen Folgen ging es ja schon um die Optimierung der Programmierung für unsren Kaffeeau...

Funktionen in C, Globale und lokale Variablen Was wären Funktionen doch langweilig, wenn sie immer nur das gleiche machen würden. Um Programme eff...

Funktionen in C, Definition und Deklaration Durch die Verwendung von Funktionen kann man Programme strukturieren und effizienter machen. In unse...

Lösung für eine Funktion zur Münzeingabe Im heutigen Artikel möchte ich eine mögliche Lösung für die Aufgabe aus dem letzten Artikel, nämlich...

{ 4 Kommentare… sie unten lesen oder einen hinzufügen }

Jens

Hallo,

ich habe die Aufgabe ansich bereits gelöst, allerding ist es mir nicht möglich den Wert des Port1 oder Port2 in eine variable zu speichern. Diese ist IMMER 0. Was mache ich denn da genau falsch ?

/*——————————————————————————
HELLO.C

Copyright 1995-2005 Keil Software, Inc.
——————————————————————————*/

#include /* special function register declarations */
/* for the intended 8051 derivative */

#include /* prototype declarations for I/O functions */

/*————————————————
The main C function. Program execution starts
here after stack initialization.
————————————————*/
void main (void)

{
int port1,port2;

/*————————————————
Setup the serial port for 1200 baud at 16MHz.
————————————————*/
#ifndef MONITOR51
SCON = 0×50; /* SCON: mode 1, 8-bit UART, enable rcvr */
TMOD |= 0×20; /* TMOD: timer 1, mode 2, 8-bit reload */
TH1 = 221; /* TH1: reload value for 1200 baud @ 16MHz */
TR1 = 1; /* TR1: timer 1 run */
TI = 1; /* TI: set TI to send first char of UART */
#endif

/*————————————————
Note that an embedded program never exits (because
there is no operating system to return to). It
must loop and execute forever.
————————————————*/
P1=0;
P2=0;
getchar();
port1=P1;
port2=P2;

printf(“Wert von Port1:%d\n”),port1;
printf(“Wert von Port2:%d\n”),port2;

while(1)
{

}

} // end main

Wolfgang Bengfort

@Jens, Du darfst keine 0 in den Port schreiben.

Siehe auch : http://et-tutorials.de/4339/lesen-aus-portpins/

Jens

Hallo Wolfgang,

aber genau das wird doch auch in dem Lösungsvideo “Funktionen Teil1″ gemacht:

Ab minute 9:30 bis 9:41.
Der Port mit “0″ beschrieben, danach wird ein Tastendruck abgewartet, sodass man bis zum drücken einer Taste gebug Zeit hat einen neuen Wert einzustellen.

DAS verstehe ich jetzt leider nicht …

Gruß
Jens

Jens

Die besten Fehler sind die, die man auch selber findet ….

Ich habe das hier geschrieben:

printf(“Umfang=%d\n”),umfang(r);
printf(“Fläche=%d\n”),flaeche(r);
printf(“Volumen=%d\n”),volumen(r,h);

war nicht so schlau, denn es muss ja so sein:

printf(“Umfang=%d\n”,umfang(r));
printf(“Fläche=%d\n”,flaeche(r));
printf(“Volumen=%d\n”,volumen(r,h));

Ich glaube das passiert mir kein zweites mal ;-)

Einen Kommentar hinterlassen