Eingänge in C "Syntax"

Gast #3707440
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
Gast #3707498
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
#3707546
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.
Gast #3707612
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
Gast #3707628
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?
Gast #3707664
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  ;)
Gast #3707774
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 ;-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren