Forum: Mikrocontroller und Digitale Elektronik Probleme mit den Ports beim 2561


von Martin S. (paul-stanley)


Lesenswert?

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

von STK500-Besitzer (Gast)


Lesenswert?

>(!(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...)

von Martin S. (paul-stanley)


Lesenswert?

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

von STK500-Besitzer (Gast)


Lesenswert?

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

von Martin S. (paul-stanley)


Lesenswert?

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

von STK500-Besitzer (Gast)


Lesenswert?

>hast zwar eine klammer vergessen zu schliessen

Man kann sich mit Klammern auch totschmeissen...
Es war ein Copy'n'Paste-Fehler...

von Martin S. (paul-stanley)


Lesenswert?

..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
Noch kein Account? Hier anmelden.