www.mikrocontroller.net

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


Autor: Johannes Englsberger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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))
{
.......
}
}

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Niels Hüsken (monarch35)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.