Forum: Mikrocontroller und Digitale Elektronik Eingänge in C "Syntax"


von Matthias K. (Gast)


Lesenswert?

Hey Leute
Ich bin mal wieder auf eure Hilfe angewiesen ;D

Wir steigen in der  Schule grade in die praktische C ++ programmierung 
mit Microcontrollern ein.

Ich bin grade bei den Grundlagen und lasse LEDs blinken.^^
Den Syntax für Ausgänge kenne ich also bereits:
DDRD=0b01100000;
PORTD = (1<<PD5);

Wie würde den die Deklaration für Eingänge aussehen und wie ließt man 
sie ein.

Am besten ganz einfach. Wenn man den  Taster drückt soll PD5 1 werden.

Ich danke euch jetzt schon mal ;D

von Max H. (hartl192)


Lesenswert?

Das entsprechende DDRx bit auf '0',
1
if(PIND&(1<<PD5))
2
{
3
  //Wird ausgeführt, wenn PD5 '1' ist
4
}

von Uwe (de0508)


Lesenswert?

Hallo,

warum setzt Du auch Bit 6 als Ausgang und überschreibst bei der 
Portausgabe alle anderen Bits (=0)?

von Matthias K. (Gast)


Lesenswert?

Danke für eure schnelle Antwort.

Das war noch von anderen Versuchen...^^

Ging mehr erst mal um den reinen Syntax DANKE ;D

von Matthias K. (Gast)


Lesenswert?

Hab das villeicht grade falsch verstanden.^^

Also Ich habe 2 LEDs die da wären an PD5, PD6
Und mein Taster Ist PD2.

Macht dieses Programm schon mal in etwas  Sinn....

#define F_CPU 20000000UL
#include <util/delay.h>
#include <avr/io.h>

int main(void)
{
  DDRD=0b01100000;
  while(1)
  {

  if (PIND& (1<<PD2) )
  {

    PORTD = (1<<PD5);

  }
  else
  {
    PORTD = (0<<PD5);
  }






  }
}

;D

von Lenny D. (le-do)


Lesenswert?

Für C mit AVR gibt es doch genau hier ein Tutorial:
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Eing.C3.A4nge_.28Wie_kommen_Signale_in_den_.C2.B5C.29

Da ist das eigentlich schon recht gut erklärt.

Es gibt die 3 Register:
DDRx = Data Direction Register -> setzt In oder Output richtung
PORTx = Output Register wenn Out, Pullup-Widerstand ja/nein wenn pin als 
Input konfiguriert.
PINx = Anliegende Inputdaten.

PD5 etc. sind nur Hilfsdefinitionen die sagen welches Bit du ansprichst 
(schau dir bitweise Operationen und Shift-Operatoren an, das ist das <<)

An sich müsste dein Code schon funktionieren, aber du schreibst das 
PORTD register mit einem festen Wert, das setzt auch die anderen 
Bits/Pins um!
Normal macht man da:
1
PORTB |= (1<<PB2); //oder ist gleich setzt genau das Bit PB2 und lässt die anderen unberührt.

Arbeite das Tutorial zumindest in Abschnitten durch, hilft glaube ich 
sehr viel zum Verständnis.

von Lenny D. (le-do)


Lesenswert?

Nachtrag: sry hab das Codebeispiel copy-pasted, in deinem Fall natürlich 
nicht B sondern PORTD, PD5.

Zum löschen eines bits geht oder-istgleicht nicht, das ist Mathematik. 
Schau da am besten wie gesagt mal ins Tutorial.

von Matthias K. (Gast)


Lesenswert?

Danke dir :)
Ich werde mich mal durch das toturial durchlesen.
Danke wie immer für die schnelle Hilfe

von der alte Hanns (Gast)


Lesenswert?

> Den Syntax

DIE SYNTAX

Die Syntax war dem Sterben nah.

"Ich bin, mein himmlischer Papa,"
so rief sie, tränenvoll unendlich,
"nun selbst Experten unverständlich.
Du kannst ja sonst doch jedem raten -
schick mir 'nen Doktor, Lizentiaten,
noch besser und für dich bequem:
schnür du mich selbst in ein System!"

Dem Herrn war dies Geschäft zu schwer,
er sandt' - Professor Chomski her.

Es gibt seitdem die Chomski-Klassen,
in die die meisten Sprachen passen.


(aus 'Palmström als Programmierer')

in memoriam KLEN

von Rolf Magnus (Gast)


Lesenswert?

Matthias K. schrieb:
> Also Ich habe 2 LEDs die da wären an PD5, PD6
> Und mein Taster Ist PD2.
>
> Macht dieses Programm schon mal in etwas  Sinn....

Ich vermute, du hast noch nicht wirklich verstanden, was die Ausdrücke 
tun.

>   if (PIND& (1<<PD2) )
>   {
>
>     PORTD = (1<<PD5);
>
>   }
>   else
>   {
>     PORTD = (0<<PD5);
>   }

PORTD = (0<<PD5) ist das gleiche wie PORTD = 0.
PORTD = (1<<PD5) ist das gleiche wie PORTD = 32.

Kannst du erklären, warum, und was genau die Auswirkung ist?

von Matthias K. (Gast)


Lesenswert?

Rolf Magnus schrieb:
> Matthias K. schrieb:
>> Also Ich habe 2 LEDs die da wären an PD5, PD6
>> Und mein Taster Ist PD2.
>>
>> Macht dieses Programm schon mal in etwas  Sinn....
>
> Ich vermute, du hast noch nicht wirklich verstanden, was die Ausdrücke
> tun.
>
>>   if (PIND& (1<<PD2) )
>>   {
>>
>>     PORTD = (1<<PD5);
>>
>>   }
>>   else
>>   {
>>     PORTD = (0<<PD5);
>>   }
>
> PORTD = (0<<PD5) ist das gleiche wie PORTD = 0.
> PORTD = (1<<PD5) ist das gleiche wie PORTD = 32.
>
> Kannst du erklären, warum, und was genau die Auswirkung ist?

Hey Ho
Also ich habe das so verstanden, dass ich hier die einzelnen Bits 
beeinflusse und nicht das ganze Byte.
Mit dem Befehl PORTD = 0 würde ich doch 0..7 besteuern oder?

Ich habe Eingänge und Ausgänge auf meinem PORTD und deswegen  spreche 
ich da jedes Bit einzelt an...

"Angaben  ohne Gewähr"^^

So habe ich das bis jetzt verstanden ...korigiere mich wenn ich daneben 
liege.

Danke für eure Zeit ..und das aufm Sonntag  ;)

von Rolf Magnus (Gast)


Lesenswert?

Matthias K. schrieb:
> Also ich habe das so verstanden, dass ich hier die einzelnen Bits
> beeinflusse und nicht das ganze Byte.

Links steht "PORTD =", und das heißt, du beschreibst PORTD - und zwar 
den ganzen. In C kann man eigentlich gar keine einzelnen Bits 
beschreiben, deshalb muß man einen Trick anwenden. Was musst du tun, 
wenn du nur genau ein Bit ändern willst, aber immer nur den ganzen PORT 
auf einmal schreiben kannst?

> Mit dem Befehl PORTD = 0 würde ich doch 0..7 besteuern oder?

Ja, richtig. Jetzt mußt du also rausfinden, was (0<<PD5) bedeutet.

> Ich habe Eingänge und Ausgänge auf meinem PORTD und deswegen  spreche
> ich da jedes Bit einzelt an...

Das würdest du vielleicht gerne, aber du tust es nicht ;-)

von Dietrich L. (dietrichl)


Lesenswert?

Hier ist jetzt der Hinweis auf
http://www.mikrocontroller.net/articles/Bitmanipulation
bestimmt sehr sinnvoll ...

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.