Forum: Mikrocontroller und Digitale Elektronik C,Anfänger-taster


von Azubi (Gast)


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);
  }
} }

von coldtobi (Gast)


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

von katastrophenheinz (Gast)


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...

von Daniel S. (supernova01)


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

von Al3ko -. (al3ko)


Lesenswert?

Warum setzt und löscht du Bits nicht so wie es die anderen auch machen?

von Daniel S. (supernova01)


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

von Karl H. (kbuchegg)


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

von Azubi (Gast)


Lesenswert?

Danke euch für die Rückmeldungen aber ich denke ich arbeite mal lieber 
euer Tutorial nochmal durch ich merke das ich noch Defizite habe

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.