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); } } }
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
> 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...
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.