atxmega lässt Port J nicht programmieren

OP #4980991
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?
Gast #4981003
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));
Gast #4981055
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 ....
OP #4981158
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....
Gast #4981167
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
(Firma: L-E-A) #4981345
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.
(Firma: L-E-A) #4981356
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren