XMEGA einzelnen Pin eines Ports ansprechen

Gast #993932
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!!!!
(Firma: TravelRec.) Persönliche Seite #993940
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.
Gast #993949
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.
#993953
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;
#2753030
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!
#2753188
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.
#2760647
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.

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