Forum: Mikrocontroller und Digitale Elektronik Portabfrage mit IF Anweisung


von Det S. (juppy)


Lesenswert?

Hallo zusammen,
ich hätte mal eine Frage zu div If Anweisungen.

1. Frage
Ich habe z.B. 3 Taster
wie kann ich abfragen ob einer der drei Taster gedrückt worden ist.

Also z.B.
Wenn Taster 1 gedrückt ist ODER Taster 2 gedrückt ist ODER Taster 3
gedrückt ist, dann schalte LED ein.

2. Frage
Ist Taster 1 gedrückt und ist die Variable A = True,
dann schalte LED ein.

Sorry aber ich lerne noch ;-)

Gruß
Juppy

von Stefan (Gast)


Lesenswert?

In dem du den Port abfragst, wo
die LED dran hängt. Also welcher Pin vom IC,
und dann im Datenblatt schauen welcher Port es ist.
Meistens mit A,B,C usw. bezeichnet.
Dann in einer Schleife schreiben,
wenn PortA eins ist dann mache dies usw.

von Karl H. (kbuchegg)


Lesenswert?

Det S. schrieb:

> 2. Frage
> Ist Taster 1 gedrückt und ist die Variable A = True,
> dann schalte LED ein.

Das hängt davon ab, wie der Taster angeschlossen ist. Es ist nicht Gott 
gegeben, dass ein gedrückter Taster zu einem True führt. Auf einem AVR 
ist es schaltungstechnisch sogar meistens genau anders rum.

>
> Sorry aber ich lerne noch ;-)

Dann lernst du jetzt gleich mal, dass es verschiedene 
Programmiersprachen gibt und hier auf dieser Seite des Bildschirms 
keiner weiß, welche du benutzt.

von Det S. (juppy)


Lesenswert?

Sorry,
ich programmiere in C mit einem myAVR Board und einem Atmega8.

zu Frage 1 habe folgende Anweisung probiert:
1
if (!(PIND & (1<<Taster1))) || (!(PIND & (1<<Taster2)))
2
{
3
 ....
4
}
hier kommt die Fehlermeldung vom Atmel Studio:
Error  1  expected primary-expression before '||' token
Error  2  expected ';' before '{' token

zu Frage 2 folgende Anweisung
1
if (!(PIND & (1<<Taster1))) && (bTaster1  == True)
2
{
3
...
4
}
Error  1  expected identifier before '(' token
Error  2  expected ';' before '(' token

Hoffe jetzt wird es klarer

Gruß
Juppy

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Det S. schrieb:
> Sorry,
> ich programmiere in C mit einem myAVR Board und einem Atmega8.
>
> zu Frage 1 habe folgende Anweisung probiert:
>
1
> if (!(PIND & (1<<Taster1))) || (!(PIND & (1<<Taster2)))
2
>
> hier kommt die Fehlermeldung vom Atmel Studio:
> Error  1  expected primary-expression before '||' token
> Error  2  expected ';' before '{' token

Na dann zähl mal die Klammern bzw. verfolge mit dem Finger, welche 
schliessende Klammer zu welcher öffnenden Klammer gehört.
Und immer drann denken: der komplette Ausdruck, der die Bedingung der 
if-Abfrage ausmacht, muss in einer Klammer stehen.
1
if (!(PIND & (1<<Taster1))) || (!(PIND & (1<<Taster2)))
2
   | |       |          |||
3
   | |       +----------+||
4
   | +-------------------+|
5
   +----------------------+

Ooops. Nach der 3.ten schliessenden Klammer ist die Klammer des 
if-bedingungsteilss bereits geschlossen. Das || hängt 'in der Luft'.

Die Syntax lautet
1
     if ( Ausdruck )
2
       Anweisung
Wenn der Ausdruck aus mehreren Teilen besteht, dann ist das ok. Nichts 
desto trotz steht aber trotzdem der komplette Ausdruck innerhalb der 
Klammern.
1
  if( Ausdruck1 || Ausdruck2 || Ausdruck3 )
2
    Anweisung

Selbstverständlich kann jeder Teil-Ausdruck wieder für sich in einer 
Klammer stehen ...
1
  if( (Ausdruck1) || (Ausdruck2) || (Ausdruck3) )
2
    Anweisung
..., das ändert aber nichts daran, dass der komplette Ausdruck als 
ganzes geklammert wird.

: Bearbeitet durch User
von Wolfgang (Gast)


Lesenswert?

Det S. schrieb:
> Hoffe jetzt wird es klare

Und dir?
C ist keine Programmiersprache, die selbst erklärende Fehlermeldungen 
liefert. Nur dem Kenner der Sprache wird klar, dass schlicht und einfach 
jeweils ein Klammernpaar fehlt. Vielleicht solltest du dir ein paar 
Grundlagen in C anlesen, z.B.
http://de.wikibooks.org/wiki/C-Programmierung:_Sprachbeschreibung:_Anweisungen#if

von Karl H. (kbuchegg)


Lesenswert?

Und aus dem bisherigen solltest du für die Zukunft ein paar Dinge 
mitnehmen.

Der wichtigste lautet:
* zeige immer deinen Code.
Denn wie du selber gesehen hast, dreht sich deine Frage in Wirklichkeit 
gar nicht um die Abfrage eines Pins, sondern schlicht und ergreifend 
einfach nur um den syntaktischen Aufbau einer Anweisung - in diesem 
Fall: wie ist der genaue Aufbau einer if-Anweisung. Dein Problem hat 
nichts mit Tasterm und auch nicht mit Portpins zu tun (wie du angenommen 
hast), sondern dasselbe Problem hättest du auch gehabt, wenn du einen 
Wecker mit 3 Weckzeiten programmierst und feststellen willst, ob der 
Wecker klingeln soll oder nicht.

* in diesem Fall hat es sich als nicht relevant heraus gestellt. Aber 
gib immer deine Hardware an. Ein AVR aus der AtMega oder AtTiny Serie 
programmiert sich nun mal ein wenig anders als ein 8051 Derivat oder gar 
ein PC. Zu wissen welche Hardware ist unter anderem auch deshalb 
wichtig, damit man weiß, wie genau zb Taster angeschlossen sind. Denn je 
nachdem lautet dann die Abfrage anders :-)

* wenn du keinen Code zeigst, dann nenn wenigstens die 
Programmiersprache. Aber eigentlich ist es immer besser, Code zu zeigen. 
Und zwar möglichst vollständig

* hast du Fehlermeldungen - dann immer her damit.

von Det S. (juppy)


Lesenswert?

Hallo,
alles klar. Wußte nicht, das der komplette Ausdruck innerhalb der
Klammern stehen muss. Ist für mich noch alles relativ neu.

Ich hatte schon im Netz danach geschaut, aber irgendwie
habe ich immer nur Beispiele mit einer IF Anweisung gefunden nicht
mit mehreren. Vielleicht habe ich es aber auch nur übersehen ;-)

Gut das Problem bezog sich in der Tat nicht direkt auf die
MC Programmierung. Es stand halt im Kontext zu meinem Problem.
Daher der vielleicht etwas unglückliche Betreff :-)

Trotzdem vielen Dank an alle für die ausführlichen Antworten.

Gruß
Juppy

von Karl H. (kbuchegg)


Lesenswert?

Det S. schrieb:
> Hallo,
> alles klar. Wußte nicht, das der komplette Ausdruck innerhalb der
> Klammern stehen muss. Ist für mich noch alles relativ neu.

Sorry.
Kann nicht anders. Jetzt muss mein Standardspruch kommen:

Du brauchst ein C-Buch!
Und zwar ganz schnell und ganz dringend.

Denn all das und noch tausend andere Dinge, die du wissen musst, stehen 
da alle drinnen.

> Ich hatte schon im Netz danach geschaut, aber irgendwie
> habe ich immer nur Beispiele mit einer IF Anweisung gefunden nicht
> mit mehreren. Vielleicht habe ich es aber auch nur übersehen ;-)

Buchhandlung gehen.
Die Bücher durchstöbern. Achte darauf, mit welche Schreibstil du zurecht 
kommst
Buch aus dem Regal nehmen
zur Kasse gehen

-> ganz wichtig: Buch durcharbeiten. unter das Kopfkissen legen ist zu 
wenig.

Noch nie hat irgendjemand auf dieser Erde durch ausschliessliches 
Stöbern im Internet die Sprache C ausreichend gut gelernt. Nicht umsonst 
hat ein ordentliches C-Buch mindestens 200 Seiten.

: Bearbeitet durch User
von Juppy (Gast)


Lesenswert?

Karl Heinz schrieb:
> Du brauchst ein C-Buch!
> Und zwar ganz schnell und ganz dringend.

Hallo,
ich weiß diese Frage wurde bestimmt schon oft gestellt,
aber kennst Du ein gutes C Buch, welches neben den
Grundlagen evt. MC Programmierung beinhaltet ?

Denn bei mir in der Umgebung wüßte ich nicht, wo man sich
mal mehrere Bücher zu C angucken kann um dann zu entscheiden
welches man nimmt.

Gruß
Juppy

von Justus S. (jussa)


Lesenswert?

Juppy schrieb:
> ich weiß diese Frage wurde bestimmt schon oft gestellt,
> aber kennst Du ein gutes C Buch, welches neben den
> Grundlagen evt. MC Programmierung beinhaltet ?

imho blöde Idee. Erst die Grundlagen von C lernen, am PC, dann den µC 
dazunehmen...

von Karl H. (kbuchegg)


Lesenswert?

Juppy schrieb:
> Karl Heinz schrieb:
>> Du brauchst ein C-Buch!
>> Und zwar ganz schnell und ganz dringend.
>
> Hallo,
> ich weiß diese Frage wurde bestimmt schon oft gestellt,
> aber kennst Du ein gutes C Buch, welches neben den
> Grundlagen evt. MC Programmierung beinhaltet ?

Wie Justus schon sagte, funktioniert der Prozess am Besten 2-stufig

Erst auf einem PC die Grundlagen der Programmierung unter 
Berücksichtigung der Sprache 'C' lernen.
Wenn du dann ein wenig fit in C bist, erfolgt der Übergang zu einem MC.

Der Grund dafür ist einfach:
C ist zwar eine genormte Sprache, aber auf einem µC, wie zb einem AVR, 
fehlt einfach eine Menge 'Infrastruktur'. Auf einem PC hast du eine 
Konsole, auf der du Ausgaben machen kannst. Diese Konsole ist von Haus 
aus für dich mit Standardmitteln der Sprache ansprechbar. Auf deinem µC 
müsste man sich diese Dinge erst mal selber machen. Auch hast du auf dem 
PC wesentlich bessere Debug-Möglichkeiten.
All das führt in Summe dazu, dass du das ca. erste Drittel des C-Buchs 
auf einem PC problemlos und schnell durcharbeiten kannst. Alles 
funktioniert in den Programmen genau so, wie es in der Literatur 
beschrieben ist. Die IDE ist dann ein anderes Thema, schon klar.
Das erste Drittel eines Buches ist so ungefähr die Grundausstattung, die 
man minimal an Wissen braucht, ehe es Sinn macht, sich dann in die 
Feinheiten und Unterschiede in der AVR Programmierung einzuarbeiten. 
Diese Unterschiede sind nicht so wild. Da geht es hauptsächlich um 
Bitmanipulationen, die auf Desktopsystemen eher stiefmütterlich 
behandelt werden. Aber mit dem Grundstock ist das alles kein Problem 
mehr, vor allen Dingen weil du dann in der Syntax schon sattelfest bist 
und grundsätzlich weißt, wie die Sprache grundlegend funktioniert. Das 
große Problem auf einem AVR ist, dass die Infrastruktur anders 
funktioniert. Das ändert aber nichts an den Grundkonzepten der Sprache, 
wie zb Syntax, Datentypen, Umwandlungsregeln, Grundlagen in Pointern, 
Stringverarbeitung, etc. etc., und dabei hab ich noch gar nicht von 
grundlegenden Algorithmen gesprochen. Da ist ein weites Feld, das da wie 
dort identisch ist.
Ein Vergleich wäre in etwa: Erst mal lernt man einen Grundstock an 
Englisch, ehe man dann die Spezialisierung auf technisches Englisch 
macht. Aber solange es Unklarheiten bei "I am, You are, He/She/It is" 
gibt, macht es keinen Sinn, sich über Details der Bezeichnungen in der 
Geodäsie zu unterhalten. Erst mal muss ein Grundstock da sein.

Die restlichen 2 Drittel des Buches behandeln Dinge wie 
Dateiverarbeitung und dynamische Speicherverwaltung. Die sind auf einem 
AVR erst mal nicht wichtig, bleiben aber nicht aus, denn irgendwann 
wirst du in die Situation kommen, dass dein Projekt 2-gleisig fährt: ein 
Teil läuft auf dem AVR und ein Teil läuft auf dem PC, der als 
'Sichtgerät' für den AVR dient.


Mit dem Klassiker
'Kernighan & Ritchie
 Programmieren in C'
macht man erst mal nichts falsch.

Dazu noch eine der verfügbaren kostenlosen Entwicklungsumgebungen für 
den PC und dann auf dem PC die ersten Kapitel durcharbeiten. Ein 
ordentliches Buch hat am Ende eines Kapitels Übungsaufgaben. Wenn die 
gemeistert werden, dann kann man davon ausgehen, dass man den 
Kapitelinhalt so einigermassen intus hat. Probleme und Fragen werden 
natürlich auch weiterhin auftauchen - das ist schon klar. Aber eine 
Frage nach den vorgeschriebenen Syntaxelementen bei den 
Basis-Schlüsselwörtern ist indiskutabel - so weit müssen wir uns einig 
sein.

: Bearbeitet durch User
von Juppy (Gast)


Lesenswert?

Hallo Karl-Heinz,
vielen Dank für Deine detaillierte Ausführung.
Wenn Du mir jetzt noch sagen könntest, welche kostenlose IDE dafür am 
besten
geeignet ist, wäre ich total happy ;-)))

Was hälst du von video2Barin  ?

Jetzt lerne ich C++
Start ohne Vorwissen

Gruß und vielen Dank
Juppy

von Karl H. (kbuchegg)


Lesenswert?

Juppy schrieb:

> Wenn Du mir jetzt noch sagen könntest, welche kostenlose IDE dafür am
> besten
> geeignet ist, wäre ich total happy ;-)))

Wenn mich jemand nach 'am besten' fragt (egal zu welchem Thema): dann 
lautet meine Antwort meistens: am Besten ist immer das, mit dem du 
umgehen kannst.

Im Ernst. Das bischen C, dass du beim Durcharbeiten der Literatur 
brauchst, dass schaffen ALLE Entwicklungssysteme mit dem kleinen Finger.
Die Unterschiede liegen an dieser Stelle in der Bedienung des Editors, 
wie man Projekte erzeugt und verwaltet - solche Dinge.
Da gibt es aber kein 'am Besten'. 'am Besten' ist das, womit du klar 
kommst.
Goggle nach freienb Entwicklungsumgebungen (die kommen sowieso inklusive 
Compiler) und probier sie aus. Wenn du dich damit nicht wohl fühlst, 
dann nimm die nächste.

Du kannst zb auf allen Systemen, die du probierst das klassische 'Hello 
World' von 0 auf beginnend als Projekt anlegen (meist nach Handbuch oder 
Einführugnstutorial zum Umgangt mit der IDE). Dann siehst du schon, 
womit du klar kommst.
1
#include <stdio.h>
2
3
int main()
4
{
5
  printf( "Hello world!\n" );
6
}

wenn du von diesem Programmtext ausgehend, deinem Gefühl nach 
komplizierte Klimmzüge machen musst oder gar kein Fenster mit der 
Ausgabe drinnen aufgeht (kann sein, dass das Fenster gleich wieder zu 
geht, das ist ok), dann nimm die nächste IDE


> Was hälst du von video2Barin  ?
>
> Jetzt lerne ich C++
> Start ohne Vorwissen

Kenn ich nicht.
Bei Buchtiteln, die suggerieren 'alles ist ganz einfach' bin ich immer 
vorsichtig. Denn Programmieren lernen ist nicht einfach. Grundsätzlich 
nicht.

von Juppy (Gast)


Lesenswert?

Hallo Karl-Heinz,
O.K. dann weiß ich da erstmal Bescheid und werd
mal Onkel Google fragen ;-)

Trotzdem Danke nochmal für Deine Hilfe.

Gruß
Juppy

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.