XMEGA einzelnen Pin eines Ports ansprechen

Gast #993932
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
>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
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.
Gast
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?
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;
Gast
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))
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!
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.
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

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.