Forum: Mikrocontroller und Digitale Elektronik XMEGA einzelnen Pin eines Ports ansprechen


von Alex B. (Gast)


Lesenswert?

Hallo,

ich bin Microcontroller-Einsteiger und habe hier ein STK600 mit nem 
XMEGA128A1 liegen.

Als erstes wollte ich mal einfach alle Taster auf die Leds schalten, 
dass hat auch wunderbar geklappt. Nun möchte ich aber gerne mal mit 
Schalter0 Led3 einschalten können. Aber ich schaffe es nicht einen 
einzelnen PIN eines Eingangsports auszulesen bzw. einen einzelnen PIN 
eines Ausgangsports.

Hier mal mein Programm mit dem ich alle Schalter auf alle Leds gelegt 
habe:

#include <avr/io.h>

int main(void)
{
  uint8_t ucTaster;
  PORTA.DIR = 0xFF;
  PORTA.OUT = 0xFF;
  PORTC.DIR = 0;
  PORTC.OUT = 0xFF;
  while(1)
  {
    ucTaster = PORTC.IN;
    PORTA.OUT = ucTaster;
  }
}

Was muss ich hier ändern???

DANKE!!!!

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

>ich bin Microcontroller-Einsteiger und habe hier ein STK600 mit nem
>XMEGA128A1 liegen.

Wow - nicht schlecht für´n Einsteiger! Schon vorher mal ´was mit AVRs 
gemacht?

>Nun möchte ich aber gerne mal mit
>Schalter0 Led3 einschalten können.

Du müßtest "ucTaster" mittels einer Funktion bitweise maskieren und 
mittels eines Vergleiches die entsprechend gewünschte LED einschalten.

von dieter (Gast)


Lesenswert?

PORTC.OUT = 0xFF; --> hat keinen Sinn bei eingängen

von Alex B. (Gast)


Lesenswert?

Danke für die schnelle Antwort.

Nee, mit AVR's hab ich vorher noch nie gearbeitet, hier liegt mein 
Problem.

An maskieren hab ich auch schon gedacht, aber ich dachte das würde 
vielleicht auch irgendwie einfacher (direkter) gehen.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

>PORTC.OUT = 0xFF; --> hat keinen Sinn bei eingängen

Bei den Mega- und Tiny- und 90S- AVRs hat man damit die PullUps 
eingeschaltet. Beim XMega ist dafür ein eigenes Register zuständig.

von dieter (Gast)


Lesenswert?

nochmal ich...

hab dein Programm mal übersetzt zwar mit dem IAR aber is ja egal also 
bei mir läufts deswegen die blöde frage:

Die Ports auch mit Flachbandkabeln an die Taster und LEDs verbunden?

von Niels H. (monarch35)


Lesenswert?

Hier führen wohl wieder mehrere Wege ins ROM. Möglich wäre z.B.
1
ucTaster = PORTC.IN & 1; // Schalter 0 ausmasieren
2
usTaster >>=3; // drei Bits nach "oben" schieben
3
PORTA.OUT = ucTaster;

oder
1
if ((ucTaster = PORTC.IN & 1)) //Ist Schalter0 ein?
2
   PORTA.OUT=8;          //bitwert 8 setzen
3
else
4
   PORTA.OUT=0;

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Dieter: Das Programm läuft bei ihm auch, er will jetzt aber nicht LED1 
mit Taster1 usw. sondern LED3 mit Taster1 und andere Varianten schalten.

von Alex B. (Gast)


Lesenswert?

Danke für die vielen Vorschläge, langsam wird nun mein verstaubtes 
C-Gehirn wieder geladen ;-).

von dieter (Gast)


Lesenswert?

Oh sorry hab das falsch interpretiert...

naja in dem Fall würd ichs wie Niels Hüsken geschrieben hat machen aber 
dran denken die Schalter sind Active low

-> if ((ucTaster = PORTC.IN & 0))

von dieter (Gast)


Lesenswert?

-> if ((ucTaster = ~PORTC.IN & 1))

so ists richtig...

von Niels H. (monarch35)


Lesenswert?

1
if ((ucTaster = PORTC.IN & 0))
Eine UND-Verknüpfung mit 0 ergibt immer 0. Damit würde die If-bedienung 
niemals "true".

Wenn dann würde ich die ergebnisse einfach mit einander vertauschen.

von René (Gast)


Lesenswert?

und wie geht das in Assembler?

out porta,temp

geht nicht da meckert das AVR Studio

von Holger M. (_holger)


Lesenswert?

Hi!

Ich habe heute meinen ersten Tag mit einem ATXMEGA32A4U hinter mir und 
eine sehr ähnliche Frage:

Ich möchte (bald) TWI (Pin 0-1) und SPI (Pin 4-7) an PortC nutzen. Pin 2 
und 3 sollen hierbei als Statusanzeige fungieren, an denen LEDs hängen, 
die anfangen zu flimmern, wenn auf dem zugehörigen Bus Daten übertragen 
werden.

Nun bin ich (in C und AVR Studio 6) so weit, dass ich mit PORTC.OUT = 
0x04 die eine und mit PORTC.OUT = 0x08 die andere LED an bekomme.

Ich überschreibe also alle Pins, an denen keine LED leuchten soll mit 0.
Was mache ich denn nun, wenn ich möchte, dass die anderen Pins ihre 
derzeitigen Zustände behalten, um mit ihren befreundeten Bauteilen zu 
kommunizieren?

Im oben genannten Beispiel würde ja auch nur auf Schalter1 reagiert und 
LED3 geschatet. Wenn aber währenddessen Schalter3 betätigt war, der LED6 
geschaltet hatte würde selbige beim Betätigen von Schalter1 erlöschen.

Oder?

Kurz: Gibt es eine Funktion ähnlich PORTC.PIN2.OUT = 1?
Unde wenn ja, in welchem Manual finde ich die?

Danke für's Lesen!

von Gerhard G. (g_g)


Lesenswert?

Hallo,


so in etwa:

PORTD.OUT |= PIN0_bm | (1 << PIN0_bp) | (1 << 2)//Ports aufeinmal setzen
PORTD.OUT |= (1 << 0) | (1 << 1) | (1 << 2); // andere schreibweise 
setzen

PORTD.OUTSET = PIN0_bm;     // das Selbe, einzeln setzen
PORTD.OUTSET = PIN1_bm;
PORTD.OUTSET = PIN2_bm;

PORTD.OUT &= ~(1<<PIN0_bp) | PIN1_bm | (1 << 2);//Ports aufeinmal 
löschen

PORTD.OUT &= ~ (1 << 0);   // einzeln löschen
PORTD.OUT &= ~ (1 << PIN0_bp); // oder
PORTD.OUT &= ~ PIN0_bm;    // oder

PORTD.OUTCLR = (1 << PIN0_bp) | (1 << 1) | PIN0_bm ;   //usw.

Hierbei das |= oder = beachten,
bei PORTD.OUTSET, PORTD.OUTCLR usw. kein |= , das ist bereits ein 
Bestandteil des Befehls!

Es gibt bei AVR eine PDF-Datei http://www.atmel.com/Images/doc8075.pdf



Gruß G.G.

von Holger M. (_holger)


Lesenswert?

Herzlichen Dank, G.G. jetzt hab auch ich das gerafft :)
Der Lesbarkeit halber werde ich wohl OUTSET, OUTCLR und OUTTGL 
verwenden.

Prinzipiell finde ich es aber sehr mühselig mich in die ganzen 
C-Bibliotheken vom XMEGA rein zu arbeiten... ist zwar alles kommentiert, 
aber am Ende läuft es doch meist auf Trial&Error hinaus.
Nicht sooo schön.

von Ingo (Gast)


Lesenswert?

Die Xmega sind schon ein großer Schritt noch vorne, die Errata hat's 
aber in sich, also aufpassen.


Ingo

von Simon M. (edimahler)


Lesenswert?

Ingo schrieb:
> Die Xmega sind schon ein großer Schritt noch vorne, die Errata hat's
> aber in sich, also aufpassen.

Er hat einen ATXMEGA32A4U. Das "U" zuhinderst zeigt, dass es sich um die 
neuere USB-Variante handelt, die hat kaum mehr Erratas!

Gruss Edi

von Holger M. (_holger)


Lesenswert?

Ingo schrieb:
> Errata

Simon Mahler schrieb:
> Erratas

Sprecht ihr jetzt von Errati im Controller selbst, im C-Code, oder in 
der Doku?

Persönlich ist mir jedenfalls bis auf die üblichen Grammatik und 
Rechtschreibfehler noch nichts gravierendes aufgefallen.

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.