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!!!!
>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.
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.
>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.
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; |
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.
Danke für die vielen Vorschläge, langsam wird nun mein verstaubtes C-Gehirn wieder geladen ;-).
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))
-> if ((ucTaster = ~PORTC.IN & 1)) so ists richtig...
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.
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.
Die Xmega sind schon ein großer Schritt noch vorne, die Errata hat's aber in sich, also aufpassen. Ingo
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.