hallo zusammen, ich bin gerade mal wieder am üben und fange nun auch ganz klein an. allerdings kann ich mir nicht erklären, warum ich auf port G0 einen eingang einlesen kann und auf den D und C ports nicht. hardware funktioniert. wenn ich die sicherungsdatei vom anlieferungszustand einspiele, kann ich über den software-porttester alle eingänge lesen. also funktioniert alles mit der hardware. kann mir hier jemand einen tipp geben an was da liegen könnte ? software: AVR programmers notepad Atmel 2561 diese dateien werden eingebunden: #include <stdio.h> #include <string.h> #include <stdlib.h> #include <avr/io.h> #include <avr/wdt.h> #include <util/delay.h> #include <math.h> #include <avr/pgmspace.h> #define LCD_DDR DDRB code: // Eingänge definieren DDRG &= ~(1 << PG0); // PG0 als Eingang festlegen PORTG |= (1 << PG0); // Pullup für PG0 aktivieren DDRC &= ~(1 << PC1); // PC1 als Eingang festlegen PORTC |= (1 << PC1); // Pullup für PC1 aktivieren {if (PING & (!(0 << PG0))) {LED_OFF_5;} // Wert von PG0 prüfen else {LED_ON_5;} } {if (PINC & (!(0 << PC1))) {LED_OFF_1;} // Wert von PC1 prüfen else {LED_ON_1;} } gruss martin
>(!(0 << PG0))) eine 0 um PG0 stellen nach links verschieben ist ziemlich sinnfrei. Da kommt immer noch 0 raus. Das "!" invertiert den nachfolgenden Ausdruck logisch, was in C zu deinem Glück eine 1 ist. Wegen PortC: Guck mal nach, ob da das JTAG-Interface mit integriert ist. Das "behindert" die normalen Portfunktionen, lässt sich aber abstellen. (Ich habe mir nicht das Datenblatt angeguckt. Atmel nutzt bei diversen Controllern PortC als JTAG-Port...)
port F4 - F7 ist für JTAG reserviert. die abfrage vom port G0 funktioniert richtig und es wird der ausgang gesetzt. die andere abfrage von C1 geht nicht. wie wenn die belegung nicht stimmt. kann es sein, dass die definitionsdatei der belegung vom 2561 falsch eingestellt ist ? wie gesagt, wenn ich meine sicherungskoie vom originalzustand übertrage gehen alle eingänge. leider habe ich davon keinen quellcode. gruss martin
>if (PINC & (!(0 << PC1))) {LED_OFF_1;} Schreib stattdessen mal if (!(PINC & ((1 << PC1))) {LED_OFF_1;} // Wert von PC1 prüfen else {LED_ON_1; Sollte das (meine Lösung) funktionieren, dann solltest du dir mal das AVR-GCC-Tutorium hier auf der Seite angucken (Du solltest es dir auf jeden Fall angucken!). Dann solltest du dir darüber klar werden, was deine Abfrage macht, und was der Unterschied zu meiner Version ist.
vielen dank...hast zwar eine klammer vergessen zu schliessen..aber das hab ich dann selber gefunden :-) jetzt funktioniert es. vielen dank für deine hilfe..dann werd ich mal zum AVR-GCC-Tutorium gehen und mich einlesen. gruss martin
>hast zwar eine klammer vergessen zu schliessen
Man kann sich mit Klammern auch totschmeissen...
Es war ein Copy'n'Paste-Fehler...
..ist ja auch nicht schlimm und ich bin froh dass du mir weitergeholfen hast.
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.