Forum: Mikrocontroller und Digitale Elektronik atxmega lässt Port J nicht programmieren


von Michael D. (sirs)


Lesenswert?

Hallo!

Habe hier ein kleines Problem mit meinem Atxmega128A1U:
Auf Port F funktioniert das Ansprechen meiner Pins einwandfrei. Ändere 
ich aber das F zu J funktioniert es nicht mehr (Pins bleiben auf low), 
obwohl der Port J ebenfalls existiert.
1
PORTJ.DIRSET |= ((1<<PROFILEPIN0)|(1<<PROFILEPIN1)|(1<<PROFILEPIN2));
2
PORTJ.OUT |= ((1<<PROFILEPIN0)|(1<<PROFILEPIN1)|(1<<PROFILEPIN2));
3
4
When the EBI is enabled, it will override the direction and/or value of the I/O pins where the EBI data lines are placed.

Initialwert Null heißt aber dass der EBI (für SRAM und so benutzt) 
abgeschalten sein sollte und man die Pins ganz normal als IOs verwenden 
können müsste. Gibt es eine weitere mögliche Fehlerquelle, die 
verhindert das sich den Port programmieren/ansprechen kann?

von HF Pfuscher (Gast)


Lesenswert?

Bin mir nicht sicher ob du die DIRSET und DIRCLR Register lesen
kannst so wie du es in deinem Code machst.

Probier mal:
1
PORTJ.DIRSET = ((1<<PROFILEPIN0)|(1<<PROFILEPIN1)|(1<<PROFILEPIN2));

Also kein read-modify-write sondern nur write.

oder eben
1
PORTJ.DIR |= ((1<<PROFILEPIN0)|(1<<PROFILEPIN1)|(1<<PROFILEPIN2));

von HF Pfuscher (Gast)


Lesenswert?

HF Pfuscher schrieb:
> Bin mir nicht sicher ob du die DIRSET und DIRCLR Register lesen
> kannst so wie du es in deinem Code machst.

... so jetzt hab ich mein Manual gefunden ;-). Alle Set/clr-Register
sollten auch lesbar sein .... also nix mit meiner Vermutung.

Jetzt bleibt noch die Frage ob deine Defines der PROFILEPINx
richtig sind ....

von Michael D. (sirs)


Lesenswert?

Die sind richtig. Mit Port F geht die Sache ja (leider). Nur hängt das 
was ich will an Port J.

#define PROFILEPIN0  0
#define PROFILEPIN1  1
#define PROFILEPIN2  2

von HF Pfuscher (Gast)


Lesenswert?

Michael D. schrieb:
> Gibt es eine weitere mögliche Fehlerquelle, die
> verhindert das sich den Port programmieren/ansprechen kann?

- Die Pins sind kurzgeschlossen auf Masse ....

- mit Virtual Port Mapping irgendwas angestellt ....

von Michael D. (sirs)


Lesenswert?

"PORTF.DIRCLR = ..." geht und wirkt nur auf den einen Pin
"PORTF.DIRCLR |= ..." geht nicht und wirkt irgendwie auf alle Pins
Sonderbar, dass (1<<PinDenIchWill) dann nicht das selbe Ergebnis 
liefert. Weis irgendwer warum? Das Manual liefert keine vernünftige 
Antwort.

Lasst lieber die Finger von DIRSET UND DIRCLR und beschreibt euer 
DIR-Datenfeld lieber gleich direkt. Den zu finden war harte 
Auskommentierarbeit und Rumprobiererei....

von Stefan F. (Gast)


Lesenswert?

DIRSET und DIRCLR seidn meines Wissens nach nicht für Lesezugriffe 
gedacht. Dein |= Operator tut das aber.

Außerdem gibts du hier den PIN an, den du ändern willst, nicht die 
Bitmaske.

PORTn.DIRSET=(1<<PinDenIchWill)

ist falsch, es muss heissen:

PORTn.DIRSET=PinDenIchWill

oder

PORTn.DIR |= (1<<PinDenIchWill)

www.atmel.com/images/doc8050.pdf

von HF Pfuscher (Gast)


Angehängte Dateien:

Lesenswert?

Stefan U. schrieb:
> DIRSET und DIRCLR seidn meines Wissens nach nicht für Lesezugriffe
> gedacht.

Das Manual sagt aber was anderes als du.

von HF Pfuscher (Gast)


Lesenswert?

Stefan U. schrieb:
> es muss heissen:
>
> PORTn.DIRSET=PinDenIchWill

Auch das widerspricht den Aussagen des Manuals nachdem überall
in den Registern Bitmasken anzugeben / zu schreiben sind.

von Volker B. (Firma: L-E-A) (vobs)


Lesenswert?

Michael D. schrieb:
> "PORTF.DIRCLR = ..." geht und wirkt nur auf den einen Pin

nein, das wirkt auf die Pins, deren Bit in der zugewiesenen Bitmaske 
gesetzt ist.

> "PORTF.DIRCLR |= ..." geht nicht und wirkt irgendwie auf alle Pins

Ein Blick ins Manual würde Klarheit bringen:

13.13.3 DIRCLR – Data Direction Clear register
(...)
Reading this register will return the value of the DIR register

Deine Operation löscht also alle im Direction-Register gesetzten Bits, 
da Du dessen Zustand mit Deinen Wert veroderst, was genau der Sinn des 
|= Operators ist.

> Sonderbar, dass (1<<PinDenIchWill) dann nicht das selbe Ergebnis
> liefert. Weis irgendwer warum? Das Manual liefert keine vernünftige
> Antwort.

Doch, s.o.!

> Lasst lieber die Finger von DIRSET UND DIRCLR und beschreibt euer
> DIR-Datenfeld lieber gleich direkt.

So ein Blödsinn!

Grüßle,
Volker.

von Volker B. (Firma: L-E-A) (vobs)


Lesenswert?

Kurzer Nachtrag zu Deiner Ehrenrettung: Der Blödsinn mit dem 
Read-Modify-Write-Zugriff auf die -SET und -CLR-Register findet sich 
auch in einem ansonsten ganz vernünftigen ATxmega-Tutorial. Leider 
reagiert der Autor aber nicht auf meine Hinweise...

Merke: Nicht alles, was im Netz verbreitet wird, muss korrekt sein...

Grüßle,
Volker

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.