Forum: Mikrocontroller und Digitale Elektronik Könnte jemand meinen ersten "Quellcode" korrektur-lesen


von Johannes Englsberger (Gast)


Lesenswert?

Hallo,

Ich habe gerade erst angefangen, mich in die Thematik Mikrocontroller 
einzuarbeiten.
Ich habe jetzt mal eine Funktion geschrieben, mit der ich überprüfen 
kann (???), ob eine Taste (verbunden mit einem beliebigen Pin (z.B. 
PINB1) und der Erde) gedrückt wird.
Dabei möchte ich den internen Pull-Up-Widerstand benutzen.
Es würde mich freuen, wenn hier jemand die Zeit findet, um mal über 
diesen kurzen Quellcode zu sehen und mir ein entsprechendes Feed-back zu 
geben.
Ich kann mir sehr gut vorstellen, dass da noch einige Fehler drin sind.

Vielen Dank im Voraus!


Hier die Funktion:

uint8_t Gedrueckt1NichtGedrueckt0 (const volatile uint8_t *InputPort, 
const volatile uint8_t *InputDDR, const volatile uint8_t *InputPin, 
uint8_t InputBit)
{
uint8_t tempValue;      //temporäre Variable
*InputPort |= (1<<InputBit);  //Am entspr. Pin wird der interne 
Pullupwiderstand aktiviert
*InputDDR &= ~(1<<InputBit); // erst dann wird der Pin auf Eingang 
geschaltet
tempValue = *InputPin & (1<<InputBit); // der Pin-Wert wird in tempValue 
abgespeichert

//tempValue wird „invertiert“, so dass bei gedrückter Taste eine 1, bei 
nicht gedrückter Taste eine 0 zurückgegeben wird
if (tempValue == 0)
{
tempValue = 1
}
else {tempValue = 0};
return (tempValue);
}

Funktionsaufruf z.B.:
Die folgende Funktion soll etwas tun, wenn der Knopf, der mit PINB1 
verbunden ist, gedrückt wird:
void main (void)
{
if (Gedrueckt1NichtGedrueckt0(&PORTB, &DDRB, &PINB, PINB1))
{
.......
}
}

von Johannes M. (johnny-m)


Lesenswert?

Du deklarierst Zeiger (InputPort, InputDDR) als "Zeiger auf konstanten 
Wert" und versuchst, dem Ziel des Zeigers in der Funktion einen Wert 
zuzuweisen... Das kann schon mal nicht gut gehen.

von Niels H. (monarch35)


Lesenswert?

Afaik dürfte es wesentlich schneller sein, den Code einmal durch den 
Compiler zu jagen. Der sagt einem schon ziemlich genau, was falsch ist 
und was nicht geht.

von Johannes M. (johnny-m)


Lesenswert?

Und Niels hat natürlich völlig Recht: Zunächst mal den Compiler 
drüberlaufen lassen (frage mich, warum Du das noch nicht gemacht hast, 
der hätte Dir nämlich schon mal ne Reihe Fehlermeldungen um die Ohren 
gehauen wegen der o.a. Zuweisungen)... Wenn Du die Fehler, die der 
Compiler findet, behoben hast, dann kannst Du anfangen, andere Leute zu 
fragen.

von Karl H. (kbuchegg)


Lesenswert?

Dann noch:

Die übliche Vorgehensweise ist es:
Den Port einmal zu konfigurieren und dann wird
er einfach nur benutzt.

D.h. Die Datenrichtung und den Pullup-Widerstand schaltest
du einmal so wie du das brauchst, normalerweise ganz am
Programmanfang. Danach wird der Port-Pin nur noch abgefragt,
mglw. in einer Schleife in main(). Es kommt zwar manchmal
vor, dass Portpins 'on-the-fly' umgestellt werden, gerade
bei Tastern ist das aber eher unüblich.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.