Forum: Mikrocontroller und Digitale Elektronik Prog. im Xmega128 A1 läuft nicht - Hilfe gesucht


von TT (Gast)


Lesenswert?

Hallo Leute,
ich habe schon vor längerer Zeit mein Atmel Xmega-A1 Xplained Board 
bekommen und möchte nun das Programmieren üben. Ich verwende dazu das 
AVR-Studio 5 und FLIP. Debuger habe ich leider keinen. Progammiert wird 
in C.

Als erste Aufgabe möchte ich nur ne LED Toggeln lassen sowie ich auf 
einen Taster drücke.
Ausgangszustand der LED ist an.

Hier nun mal das Prog was ich geschrieben habe.


#include <asf.h> //wird automatisch von AVRStudio eingefügt... habs 
erstmal drin gelassen.
#include <board.h>

int main (void)
{
  for(;;)
  {
  PORTE.DIRSET = (0x01);    //PortE Ausgabe
  PORTD.PIN0CTRL = (0x1A);  //Fallende Flanke und Buskeeper
  PORTD.INT0MASK = (0x01);  //Interrupt Control Mask0, Low-level
  PORTD.INTCTRL = (0x01);    //Interrupt Control = PIN0
  PORTD.DIRCLR = (0x01);    //PORTD Eingang 0 = Eingabe
  PORTE.OUTCLR = (0x01);    //PORTE Ausgang 0 = LOW -> LED0 an
sei();
  }
}
IRS(PORTD_INT0_vect)
{
PORTE.OUTTGL = (0x01);
}


Wenn ich das Prog in den µC schreibe dann passiert nichts weiter als das 
die LED angeht. Beim betätigen des Tasters passiert nichts.
Hat jemand ne Idee woran das liegen könnte?

Danke im Vorraus.
TT

von Gerhard G. (xmega)


Lesenswert?

Hallo,

wenn du mit GND schaltest....


PORTD_PIN0CTRL = PORT_OPC_PULLUP_gc; // Pullup einschalten für Taster


IRS(PORTD_INT0_vect)?

ISR(PORTD_INT0_vect)
{
.......

}

Gruß xmega

von TT (Gast)


Lesenswert?

Hi,
danke erstmal für deine Hilfe.
Beim PinCTRl hatte ich nen Denkfehler dirn.
IRS gibts natürlich auch nicht...
Leider klappt es immer noch nicht.
Ich werd es dann nochmal auf nem anderen Pin versuchen.

Wenn ich:
PORTE.DIRSET = (0x01);    //PortE Ausgabe
 stehen habe, dann hat PORTE die Farbe violett und  .DIRSET die Farbe 
blau.
Wenn ich schreibe:
 PORTE_DIRSET = (0x01);    //PortE Ausgabe
dann sind beide Violett.
Der Compiler bringt aber keine Fehlermeldung.
Wo liegt der unterschied bei den beiden befehlen???

Danke und bis später.
TT

von Gerhard G. (xmega)


Lesenswert?

Hallo,


.DIRSET -> typedef struct PORT_struct
_DIRSET -> #define Anweisung

Ist aber egal, beides funktioniert!

Bei der PIN-Deklaration würde ich dir vorschlagen, das so zuschreiben.
Es ist für alle anderen besser zu verstehen.


PORTD_DIRTGL = PIN0_bm;        // Toggle Als Ausgang
PORTD_DIRTGL = (1<<PIN0_bp);   // Toggle Als Ausgang

oder so:

PORTD.DIRTGL = PIN0_bm;        // Toggle Als Ausgang
PORTD.DIRTGL = (1<<PIN0_bp);   // Toggle Als Ausgang

Gruß xmega

von TT (Gast)


Lesenswert?

Hi,
jetzt hab ich es hinbekommen.
Hier der Code:

#include <asf.h>
#include <board.h>

int main (void)
{
  board_init();
  PORTE_DIRSET = (1<<1);    //PortE Ausgabe
  PORTD_DIRCLR = (1<<1);    //PORTD Eingang 0 = Eingabe

  PORTD_INT0MASK = (1<<1);
  PORTD_INTCTRL = (1<<0);
  PORTD_PIN1CTRL = ((3<<3)|(1<<1));//Fallende Flanke und Pull-up
  PMIC.CTRL = 7;
for(;;)
{
  sei();
}

}
ISR(PORTD_INT0_vect)
{
PORTE_OUTTGL = (1<<1);    //PORTE Ausgang 0 = LOW -> LED0 an

}



Was die schreibweise betrifft...:
Es ist durchaus nachvollziehbar das die Bitverschiebung bzw. Hexangaben 
nicht besonders leserlich sind.
Ich habe bisher noch nicht erwähnt das ich mich mit diesen Übungen 
gerade auf eine Prüfung vorbereite im Fach Microcomputertechnik.
Unser Doz. hat aber leider keine Ahnung den Stoff zu vermitteln :-( 
(Ohne Scheiß, er macht das seit 35 Jahren und ist echt ein Profi. Nur 
die Pädagogik ist sch...)
Und so muß ich mich hier quasi selbst reinarbeiten.
Ich werde (wegen der Klausur) in den nächsten 2 Wochen daher meine 
unübersichtlich schreibweise beibehalten. Für die Zukunft nach der 
Klausur werde ich deinen Rat aber dankend befolgen.
Man sieht schließlich gleich was Sache ist und braucht nicht erst in 
irgendwelche Tabellen reinschauen bzw Bitmuster auflösen.

Habe aber schon etwas dazugelernt. Es war also keinesfalls nutzlos.
Nochmals vielen Dank
TT

von pedro (Gast)


Lesenswert?

http://www.stromflo.de/dokuwiki/doku.php?id=xmega-c-tutorial

Xmegas funktionieren leicht anders, es gibt viel mehr Sachen zum 
aktivieren usw.

Z.B dein
1
PMIC.CTRL = 7;
meint eigentlich
1
//Interrupts (Highlevel,Mediumlevel und Lowlevel freigeben)
2
PMIC.CTRL |= (1<<PIN0) | (1<<PIN1)|(1<<PIN2);
Die oben genannte Seite half mir, von Atmegas zu Xmegas zu wechseln.

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.