C,Anfänger-taster

Gast #2971664
Lesenswert?

hallo

ich programmiere meinen Atmega 8 controller mit dem STK500 von Atmel in 
der Hochsprache C. Ich wollte eigentlich nur ein einfaches Programm 
schreiben welches durch einen tastendruck einfach eine LED leuchten läßt 
kann mal einer über mein Programm überprüfen?:

#include <avr/io.h>
#include <stdint.h>



int main (void)
{

DDRD = (1<<PD5); //Data Direction Register auf Ausgang
DDRC = (0<<PC3); // "......" auf Eingang
PORTC = (1<<PC3);// Pull- up aktivieren
while(1) {

  if(PINC& (0<<PINC3)) {

    PORTD = (0<<PD5);
  }
} }
Gast #2971672
Lesenswert?

Hallo Azubi,

klar, aller Anfang ist schwer.
Ich möchte Dir aber nicht die Lösung verraten, sondern nur Denkanstöse 
geben...

0<<PINC3
Kuck mal genau hin... Was "schiebt" der shift-operator, was ist das 
Ergebnis der Operation? Was kommt raus, wenn das Ergebnis dann mit PINC 
verglichen wird?


PORTD = (0<<PD5);
Wo schaltest Du die LED ein?


Im übrigen empehle ich Dir das AVR-Studio ... Die haben einen sehr guten 
(Software)-Simulator. Damit kannst Du (einfach) überrpüfen ob der Code 
das tut was Du Dir vorgestellt hast.

coldtobi
Gast #2971677
Lesenswert?

> if(PINC& (0<<PINC3))

Was ist das Ergebnis von ( 0 << <egal> ), unabhängig von <egal> ?
Was ist das Ergebnis von ( 0 &  <egal> ), unabhängig von <egal> ?
Wann wird also der Inhalt der if-clause ausgeführt?
Na also...
#2971681
Lesenswert?

DDRD = (1<<PD5);

an dieser Stelle setzt du nicht das eine Bit, sondern du schreibst in 
das Register 0010 0000 hinein. Wenn du also vorher schon mal etwas 
anderes hineingeschrieben hättest, wäre das damit weg.


DDRC = (0<<PC3);

hier schreibst du 0000 0000 in das DDRC, du setzt nicht PC3 auf null, 
sondern das ganze Register.

if(PINC& (0<<PINC3))

Das du PINC abfragst, ist schon gut aber du verknüpfst  es dann bitweise 
UND mit 0000 0000, also das ganze Register. Diese Bedinung kann niemal 
"wahr" werden.

und sollte die das jemals werden, weil du sie geändert hast dann würde

PORTD = (0<<PD5);

ausgeführt. Also:

PORTD = b00000000;

halt 0, aus.....

DS
#2971686
Lesenswert?

vorweg solltest du immer beschreiben was wie woran angeschlossen ist:

In diesem Fall ein Taster und eine LED.

Wann geht die LED an, LOW-aktiv oder HIGH-aktiv?
Was passiert wenn Taste gedrückt, PIN auf LOW, oder PIN auf HIGH ?

Da du den Pullup einschaltest, könnte man sich das denken, aber es wäre 
besser soetwas vorher zu beschreiben...

DS
#2971689
Lesenswert?

Und noch ein Hinweis.
An dieser Stelle kann man die Schiebe-Operation als eine Art 
Multiplikation auffassen. Tatsächlich ist links schieben um 1 Stelle 
identisch zu einer Multiplikation mit 2 (um 2 Stellen schieben wäre 'mal 
4', um 3 Stellen wäre 'mal 8' etc.)

PD5, PB3 und wie sie alle heißen sind einfach nur Zahlenkonstanten. PD5 
ist nur eine andere Schreibweise für 5. Mehr steckt da nicht dahinter. 
Man möchte einfach mit einem Namen etwas besser ausdrücken, dass man vom 
Pin 5 redet und die 5 in

   1 << 5

nicht einfach irgendwo aus der dünnen Luft gekommen ist, sondern mit 
einem Port-Pin zu tun hat.

Wenn du als schreibst

   0 << PD5

dann kann man das auch als

   0  mal  (2 hoch 5)

auffassen. Also eine Multiplikation. Und mit 0 kann man multiplizieren 
was man will, das Ergebnis ist immer .....


In a nutshell.
Auch wenn es naheliegend erscheint, dass wenn man mittels

   DDRD = 1<<PD5;

das Bit 5 auf 1 setzt (und alle anderen auf 0), dass man dann auch 
mittels

   DDRC = 0<<PC3

das Bit 3 auf 0 setzt. In einem gewissen Sinne stimmt das schon, auch 
wenn es nicht beabsichtigt ist (und bei der PIN Abfrage fällt es dir 
dann auf den Kopf). Hier setzt du DDRC auf 0. Aber nicht deswegen, weil 
du 0<<PC3 geschrieben hast, sondern weil man mit einer Zuweisung einer 
glatten 0 alle Bits im Register auf jeden Fall auf 0 gesetzt hat. Was du 
hier geschrieben hast, ist nichts anderes als ein komplizierter Weg für

   DDRC = 0;

nicht mehr und nicht weniger. Denn 0 mal irgendeine andere Zahl ergibt 
wieder 0. Egal was diese andere Zahl ist.


Bitmanipulation
AVR-GCC-Tutorial

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