mikrocontroller.net

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


Autor: Alex B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!!!!

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: dieter (Gast)
Datum:

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

Autor: Alex B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: dieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Niels Hüsken (monarch35)
Datum:

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

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

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Alex B. (Gast)
Datum:

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

Autor: dieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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))

Autor: dieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
-> if ((ucTaster = ~PORTC.IN & 1))

so ists richtig...

Autor: Niels Hüsken (monarch35)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: René (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und wie geht das in Assembler?

out porta,temp

geht nicht da meckert das AVR Studio

Autor: Holger M. (_holger)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Gerhard G. (g_g)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Holger M. (_holger)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ingo (Gast)
Datum:

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


Ingo

Autor: Simon Mahler (edimahler)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Holger M. (_holger)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.